File: done.txt

package info (click to toggle)
ble.sh 0.4.0~git20250321.d4c812b-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 12,516 kB
  • sloc: sh: 71,367; awk: 1,316; cpp: 750; ansic: 186; javascript: 43; makefile: 35
file content (82396 lines) | stat: -rw-r--r-- 5,242,238 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
4809
4810
4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
4831
4832
4833
4834
4835
4836
4837
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847
4848
4849
4850
4851
4852
4853
4854
4855
4856
4857
4858
4859
4860
4861
4862
4863
4864
4865
4866
4867
4868
4869
4870
4871
4872
4873
4874
4875
4876
4877
4878
4879
4880
4881
4882
4883
4884
4885
4886
4887
4888
4889
4890
4891
4892
4893
4894
4895
4896
4897
4898
4899
4900
4901
4902
4903
4904
4905
4906
4907
4908
4909
4910
4911
4912
4913
4914
4915
4916
4917
4918
4919
4920
4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938
4939
4940
4941
4942
4943
4944
4945
4946
4947
4948
4949
4950
4951
4952
4953
4954
4955
4956
4957
4958
4959
4960
4961
4962
4963
4964
4965
4966
4967
4968
4969
4970
4971
4972
4973
4974
4975
4976
4977
4978
4979
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991
4992
4993
4994
4995
4996
4997
4998
4999
5000
5001
5002
5003
5004
5005
5006
5007
5008
5009
5010
5011
5012
5013
5014
5015
5016
5017
5018
5019
5020
5021
5022
5023
5024
5025
5026
5027
5028
5029
5030
5031
5032
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045
5046
5047
5048
5049
5050
5051
5052
5053
5054
5055
5056
5057
5058
5059
5060
5061
5062
5063
5064
5065
5066
5067
5068
5069
5070
5071
5072
5073
5074
5075
5076
5077
5078
5079
5080
5081
5082
5083
5084
5085
5086
5087
5088
5089
5090
5091
5092
5093
5094
5095
5096
5097
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
5121
5122
5123
5124
5125
5126
5127
5128
5129
5130
5131
5132
5133
5134
5135
5136
5137
5138
5139
5140
5141
5142
5143
5144
5145
5146
5147
5148
5149
5150
5151
5152
5153
5154
5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
5170
5171
5172
5173
5174
5175
5176
5177
5178
5179
5180
5181
5182
5183
5184
5185
5186
5187
5188
5189
5190
5191
5192
5193
5194
5195
5196
5197
5198
5199
5200
5201
5202
5203
5204
5205
5206
5207
5208
5209
5210
5211
5212
5213
5214
5215
5216
5217
5218
5219
5220
5221
5222
5223
5224
5225
5226
5227
5228
5229
5230
5231
5232
5233
5234
5235
5236
5237
5238
5239
5240
5241
5242
5243
5244
5245
5246
5247
5248
5249
5250
5251
5252
5253
5254
5255
5256
5257
5258
5259
5260
5261
5262
5263
5264
5265
5266
5267
5268
5269
5270
5271
5272
5273
5274
5275
5276
5277
5278
5279
5280
5281
5282
5283
5284
5285
5286
5287
5288
5289
5290
5291
5292
5293
5294
5295
5296
5297
5298
5299
5300
5301
5302
5303
5304
5305
5306
5307
5308
5309
5310
5311
5312
5313
5314
5315
5316
5317
5318
5319
5320
5321
5322
5323
5324
5325
5326
5327
5328
5329
5330
5331
5332
5333
5334
5335
5336
5337
5338
5339
5340
5341
5342
5343
5344
5345
5346
5347
5348
5349
5350
5351
5352
5353
5354
5355
5356
5357
5358
5359
5360
5361
5362
5363
5364
5365
5366
5367
5368
5369
5370
5371
5372
5373
5374
5375
5376
5377
5378
5379
5380
5381
5382
5383
5384
5385
5386
5387
5388
5389
5390
5391
5392
5393
5394
5395
5396
5397
5398
5399
5400
5401
5402
5403
5404
5405
5406
5407
5408
5409
5410
5411
5412
5413
5414
5415
5416
5417
5418
5419
5420
5421
5422
5423
5424
5425
5426
5427
5428
5429
5430
5431
5432
5433
5434
5435
5436
5437
5438
5439
5440
5441
5442
5443
5444
5445
5446
5447
5448
5449
5450
5451
5452
5453
5454
5455
5456
5457
5458
5459
5460
5461
5462
5463
5464
5465
5466
5467
5468
5469
5470
5471
5472
5473
5474
5475
5476
5477
5478
5479
5480
5481
5482
5483
5484
5485
5486
5487
5488
5489
5490
5491
5492
5493
5494
5495
5496
5497
5498
5499
5500
5501
5502
5503
5504
5505
5506
5507
5508
5509
5510
5511
5512
5513
5514
5515
5516
5517
5518
5519
5520
5521
5522
5523
5524
5525
5526
5527
5528
5529
5530
5531
5532
5533
5534
5535
5536
5537
5538
5539
5540
5541
5542
5543
5544
5545
5546
5547
5548
5549
5550
5551
5552
5553
5554
5555
5556
5557
5558
5559
5560
5561
5562
5563
5564
5565
5566
5567
5568
5569
5570
5571
5572
5573
5574
5575
5576
5577
5578
5579
5580
5581
5582
5583
5584
5585
5586
5587
5588
5589
5590
5591
5592
5593
5594
5595
5596
5597
5598
5599
5600
5601
5602
5603
5604
5605
5606
5607
5608
5609
5610
5611
5612
5613
5614
5615
5616
5617
5618
5619
5620
5621
5622
5623
5624
5625
5626
5627
5628
5629
5630
5631
5632
5633
5634
5635
5636
5637
5638
5639
5640
5641
5642
5643
5644
5645
5646
5647
5648
5649
5650
5651
5652
5653
5654
5655
5656
5657
5658
5659
5660
5661
5662
5663
5664
5665
5666
5667
5668
5669
5670
5671
5672
5673
5674
5675
5676
5677
5678
5679
5680
5681
5682
5683
5684
5685
5686
5687
5688
5689
5690
5691
5692
5693
5694
5695
5696
5697
5698
5699
5700
5701
5702
5703
5704
5705
5706
5707
5708
5709
5710
5711
5712
5713
5714
5715
5716
5717
5718
5719
5720
5721
5722
5723
5724
5725
5726
5727
5728
5729
5730
5731
5732
5733
5734
5735
5736
5737
5738
5739
5740
5741
5742
5743
5744
5745
5746
5747
5748
5749
5750
5751
5752
5753
5754
5755
5756
5757
5758
5759
5760
5761
5762
5763
5764
5765
5766
5767
5768
5769
5770
5771
5772
5773
5774
5775
5776
5777
5778
5779
5780
5781
5782
5783
5784
5785
5786
5787
5788
5789
5790
5791
5792
5793
5794
5795
5796
5797
5798
5799
5800
5801
5802
5803
5804
5805
5806
5807
5808
5809
5810
5811
5812
5813
5814
5815
5816
5817
5818
5819
5820
5821
5822
5823
5824
5825
5826
5827
5828
5829
5830
5831
5832
5833
5834
5835
5836
5837
5838
5839
5840
5841
5842
5843
5844
5845
5846
5847
5848
5849
5850
5851
5852
5853
5854
5855
5856
5857
5858
5859
5860
5861
5862
5863
5864
5865
5866
5867
5868
5869
5870
5871
5872
5873
5874
5875
5876
5877
5878
5879
5880
5881
5882
5883
5884
5885
5886
5887
5888
5889
5890
5891
5892
5893
5894
5895
5896
5897
5898
5899
5900
5901
5902
5903
5904
5905
5906
5907
5908
5909
5910
5911
5912
5913
5914
5915
5916
5917
5918
5919
5920
5921
5922
5923
5924
5925
5926
5927
5928
5929
5930
5931
5932
5933
5934
5935
5936
5937
5938
5939
5940
5941
5942
5943
5944
5945
5946
5947
5948
5949
5950
5951
5952
5953
5954
5955
5956
5957
5958
5959
5960
5961
5962
5963
5964
5965
5966
5967
5968
5969
5970
5971
5972
5973
5974
5975
5976
5977
5978
5979
5980
5981
5982
5983
5984
5985
5986
5987
5988
5989
5990
5991
5992
5993
5994
5995
5996
5997
5998
5999
6000
6001
6002
6003
6004
6005
6006
6007
6008
6009
6010
6011
6012
6013
6014
6015
6016
6017
6018
6019
6020
6021
6022
6023
6024
6025
6026
6027
6028
6029
6030
6031
6032
6033
6034
6035
6036
6037
6038
6039
6040
6041
6042
6043
6044
6045
6046
6047
6048
6049
6050
6051
6052
6053
6054
6055
6056
6057
6058
6059
6060
6061
6062
6063
6064
6065
6066
6067
6068
6069
6070
6071
6072
6073
6074
6075
6076
6077
6078
6079
6080
6081
6082
6083
6084
6085
6086
6087
6088
6089
6090
6091
6092
6093
6094
6095
6096
6097
6098
6099
6100
6101
6102
6103
6104
6105
6106
6107
6108
6109
6110
6111
6112
6113
6114
6115
6116
6117
6118
6119
6120
6121
6122
6123
6124
6125
6126
6127
6128
6129
6130
6131
6132
6133
6134
6135
6136
6137
6138
6139
6140
6141
6142
6143
6144
6145
6146
6147
6148
6149
6150
6151
6152
6153
6154
6155
6156
6157
6158
6159
6160
6161
6162
6163
6164
6165
6166
6167
6168
6169
6170
6171
6172
6173
6174
6175
6176
6177
6178
6179
6180
6181
6182
6183
6184
6185
6186
6187
6188
6189
6190
6191
6192
6193
6194
6195
6196
6197
6198
6199
6200
6201
6202
6203
6204
6205
6206
6207
6208
6209
6210
6211
6212
6213
6214
6215
6216
6217
6218
6219
6220
6221
6222
6223
6224
6225
6226
6227
6228
6229
6230
6231
6232
6233
6234
6235
6236
6237
6238
6239
6240
6241
6242
6243
6244
6245
6246
6247
6248
6249
6250
6251
6252
6253
6254
6255
6256
6257
6258
6259
6260
6261
6262
6263
6264
6265
6266
6267
6268
6269
6270
6271
6272
6273
6274
6275
6276
6277
6278
6279
6280
6281
6282
6283
6284
6285
6286
6287
6288
6289
6290
6291
6292
6293
6294
6295
6296
6297
6298
6299
6300
6301
6302
6303
6304
6305
6306
6307
6308
6309
6310
6311
6312
6313
6314
6315
6316
6317
6318
6319
6320
6321
6322
6323
6324
6325
6326
6327
6328
6329
6330
6331
6332
6333
6334
6335
6336
6337
6338
6339
6340
6341
6342
6343
6344
6345
6346
6347
6348
6349
6350
6351
6352
6353
6354
6355
6356
6357
6358
6359
6360
6361
6362
6363
6364
6365
6366
6367
6368
6369
6370
6371
6372
6373
6374
6375
6376
6377
6378
6379
6380
6381
6382
6383
6384
6385
6386
6387
6388
6389
6390
6391
6392
6393
6394
6395
6396
6397
6398
6399
6400
6401
6402
6403
6404
6405
6406
6407
6408
6409
6410
6411
6412
6413
6414
6415
6416
6417
6418
6419
6420
6421
6422
6423
6424
6425
6426
6427
6428
6429
6430
6431
6432
6433
6434
6435
6436
6437
6438
6439
6440
6441
6442
6443
6444
6445
6446
6447
6448
6449
6450
6451
6452
6453
6454
6455
6456
6457
6458
6459
6460
6461
6462
6463
6464
6465
6466
6467
6468
6469
6470
6471
6472
6473
6474
6475
6476
6477
6478
6479
6480
6481
6482
6483
6484
6485
6486
6487
6488
6489
6490
6491
6492
6493
6494
6495
6496
6497
6498
6499
6500
6501
6502
6503
6504
6505
6506
6507
6508
6509
6510
6511
6512
6513
6514
6515
6516
6517
6518
6519
6520
6521
6522
6523
6524
6525
6526
6527
6528
6529
6530
6531
6532
6533
6534
6535
6536
6537
6538
6539
6540
6541
6542
6543
6544
6545
6546
6547
6548
6549
6550
6551
6552
6553
6554
6555
6556
6557
6558
6559
6560
6561
6562
6563
6564
6565
6566
6567
6568
6569
6570
6571
6572
6573
6574
6575
6576
6577
6578
6579
6580
6581
6582
6583
6584
6585
6586
6587
6588
6589
6590
6591
6592
6593
6594
6595
6596
6597
6598
6599
6600
6601
6602
6603
6604
6605
6606
6607
6608
6609
6610
6611
6612
6613
6614
6615
6616
6617
6618
6619
6620
6621
6622
6623
6624
6625
6626
6627
6628
6629
6630
6631
6632
6633
6634
6635
6636
6637
6638
6639
6640
6641
6642
6643
6644
6645
6646
6647
6648
6649
6650
6651
6652
6653
6654
6655
6656
6657
6658
6659
6660
6661
6662
6663
6664
6665
6666
6667
6668
6669
6670
6671
6672
6673
6674
6675
6676
6677
6678
6679
6680
6681
6682
6683
6684
6685
6686
6687
6688
6689
6690
6691
6692
6693
6694
6695
6696
6697
6698
6699
6700
6701
6702
6703
6704
6705
6706
6707
6708
6709
6710
6711
6712
6713
6714
6715
6716
6717
6718
6719
6720
6721
6722
6723
6724
6725
6726
6727
6728
6729
6730
6731
6732
6733
6734
6735
6736
6737
6738
6739
6740
6741
6742
6743
6744
6745
6746
6747
6748
6749
6750
6751
6752
6753
6754
6755
6756
6757
6758
6759
6760
6761
6762
6763
6764
6765
6766
6767
6768
6769
6770
6771
6772
6773
6774
6775
6776
6777
6778
6779
6780
6781
6782
6783
6784
6785
6786
6787
6788
6789
6790
6791
6792
6793
6794
6795
6796
6797
6798
6799
6800
6801
6802
6803
6804
6805
6806
6807
6808
6809
6810
6811
6812
6813
6814
6815
6816
6817
6818
6819
6820
6821
6822
6823
6824
6825
6826
6827
6828
6829
6830
6831
6832
6833
6834
6835
6836
6837
6838
6839
6840
6841
6842
6843
6844
6845
6846
6847
6848
6849
6850
6851
6852
6853
6854
6855
6856
6857
6858
6859
6860
6861
6862
6863
6864
6865
6866
6867
6868
6869
6870
6871
6872
6873
6874
6875
6876
6877
6878
6879
6880
6881
6882
6883
6884
6885
6886
6887
6888
6889
6890
6891
6892
6893
6894
6895
6896
6897
6898
6899
6900
6901
6902
6903
6904
6905
6906
6907
6908
6909
6910
6911
6912
6913
6914
6915
6916
6917
6918
6919
6920
6921
6922
6923
6924
6925
6926
6927
6928
6929
6930
6931
6932
6933
6934
6935
6936
6937
6938
6939
6940
6941
6942
6943
6944
6945
6946
6947
6948
6949
6950
6951
6952
6953
6954
6955
6956
6957
6958
6959
6960
6961
6962
6963
6964
6965
6966
6967
6968
6969
6970
6971
6972
6973
6974
6975
6976
6977
6978
6979
6980
6981
6982
6983
6984
6985
6986
6987
6988
6989
6990
6991
6992
6993
6994
6995
6996
6997
6998
6999
7000
7001
7002
7003
7004
7005
7006
7007
7008
7009
7010
7011
7012
7013
7014
7015
7016
7017
7018
7019
7020
7021
7022
7023
7024
7025
7026
7027
7028
7029
7030
7031
7032
7033
7034
7035
7036
7037
7038
7039
7040
7041
7042
7043
7044
7045
7046
7047
7048
7049
7050
7051
7052
7053
7054
7055
7056
7057
7058
7059
7060
7061
7062
7063
7064
7065
7066
7067
7068
7069
7070
7071
7072
7073
7074
7075
7076
7077
7078
7079
7080
7081
7082
7083
7084
7085
7086
7087
7088
7089
7090
7091
7092
7093
7094
7095
7096
7097
7098
7099
7100
7101
7102
7103
7104
7105
7106
7107
7108
7109
7110
7111
7112
7113
7114
7115
7116
7117
7118
7119
7120
7121
7122
7123
7124
7125
7126
7127
7128
7129
7130
7131
7132
7133
7134
7135
7136
7137
7138
7139
7140
7141
7142
7143
7144
7145
7146
7147
7148
7149
7150
7151
7152
7153
7154
7155
7156
7157
7158
7159
7160
7161
7162
7163
7164
7165
7166
7167
7168
7169
7170
7171
7172
7173
7174
7175
7176
7177
7178
7179
7180
7181
7182
7183
7184
7185
7186
7187
7188
7189
7190
7191
7192
7193
7194
7195
7196
7197
7198
7199
7200
7201
7202
7203
7204
7205
7206
7207
7208
7209
7210
7211
7212
7213
7214
7215
7216
7217
7218
7219
7220
7221
7222
7223
7224
7225
7226
7227
7228
7229
7230
7231
7232
7233
7234
7235
7236
7237
7238
7239
7240
7241
7242
7243
7244
7245
7246
7247
7248
7249
7250
7251
7252
7253
7254
7255
7256
7257
7258
7259
7260
7261
7262
7263
7264
7265
7266
7267
7268
7269
7270
7271
7272
7273
7274
7275
7276
7277
7278
7279
7280
7281
7282
7283
7284
7285
7286
7287
7288
7289
7290
7291
7292
7293
7294
7295
7296
7297
7298
7299
7300
7301
7302
7303
7304
7305
7306
7307
7308
7309
7310
7311
7312
7313
7314
7315
7316
7317
7318
7319
7320
7321
7322
7323
7324
7325
7326
7327
7328
7329
7330
7331
7332
7333
7334
7335
7336
7337
7338
7339
7340
7341
7342
7343
7344
7345
7346
7347
7348
7349
7350
7351
7352
7353
7354
7355
7356
7357
7358
7359
7360
7361
7362
7363
7364
7365
7366
7367
7368
7369
7370
7371
7372
7373
7374
7375
7376
7377
7378
7379
7380
7381
7382
7383
7384
7385
7386
7387
7388
7389
7390
7391
7392
7393
7394
7395
7396
7397
7398
7399
7400
7401
7402
7403
7404
7405
7406
7407
7408
7409
7410
7411
7412
7413
7414
7415
7416
7417
7418
7419
7420
7421
7422
7423
7424
7425
7426
7427
7428
7429
7430
7431
7432
7433
7434
7435
7436
7437
7438
7439
7440
7441
7442
7443
7444
7445
7446
7447
7448
7449
7450
7451
7452
7453
7454
7455
7456
7457
7458
7459
7460
7461
7462
7463
7464
7465
7466
7467
7468
7469
7470
7471
7472
7473
7474
7475
7476
7477
7478
7479
7480
7481
7482
7483
7484
7485
7486
7487
7488
7489
7490
7491
7492
7493
7494
7495
7496
7497
7498
7499
7500
7501
7502
7503
7504
7505
7506
7507
7508
7509
7510
7511
7512
7513
7514
7515
7516
7517
7518
7519
7520
7521
7522
7523
7524
7525
7526
7527
7528
7529
7530
7531
7532
7533
7534
7535
7536
7537
7538
7539
7540
7541
7542
7543
7544
7545
7546
7547
7548
7549
7550
7551
7552
7553
7554
7555
7556
7557
7558
7559
7560
7561
7562
7563
7564
7565
7566
7567
7568
7569
7570
7571
7572
7573
7574
7575
7576
7577
7578
7579
7580
7581
7582
7583
7584
7585
7586
7587
7588
7589
7590
7591
7592
7593
7594
7595
7596
7597
7598
7599
7600
7601
7602
7603
7604
7605
7606
7607
7608
7609
7610
7611
7612
7613
7614
7615
7616
7617
7618
7619
7620
7621
7622
7623
7624
7625
7626
7627
7628
7629
7630
7631
7632
7633
7634
7635
7636
7637
7638
7639
7640
7641
7642
7643
7644
7645
7646
7647
7648
7649
7650
7651
7652
7653
7654
7655
7656
7657
7658
7659
7660
7661
7662
7663
7664
7665
7666
7667
7668
7669
7670
7671
7672
7673
7674
7675
7676
7677
7678
7679
7680
7681
7682
7683
7684
7685
7686
7687
7688
7689
7690
7691
7692
7693
7694
7695
7696
7697
7698
7699
7700
7701
7702
7703
7704
7705
7706
7707
7708
7709
7710
7711
7712
7713
7714
7715
7716
7717
7718
7719
7720
7721
7722
7723
7724
7725
7726
7727
7728
7729
7730
7731
7732
7733
7734
7735
7736
7737
7738
7739
7740
7741
7742
7743
7744
7745
7746
7747
7748
7749
7750
7751
7752
7753
7754
7755
7756
7757
7758
7759
7760
7761
7762
7763
7764
7765
7766
7767
7768
7769
7770
7771
7772
7773
7774
7775
7776
7777
7778
7779
7780
7781
7782
7783
7784
7785
7786
7787
7788
7789
7790
7791
7792
7793
7794
7795
7796
7797
7798
7799
7800
7801
7802
7803
7804
7805
7806
7807
7808
7809
7810
7811
7812
7813
7814
7815
7816
7817
7818
7819
7820
7821
7822
7823
7824
7825
7826
7827
7828
7829
7830
7831
7832
7833
7834
7835
7836
7837
7838
7839
7840
7841
7842
7843
7844
7845
7846
7847
7848
7849
7850
7851
7852
7853
7854
7855
7856
7857
7858
7859
7860
7861
7862
7863
7864
7865
7866
7867
7868
7869
7870
7871
7872
7873
7874
7875
7876
7877
7878
7879
7880
7881
7882
7883
7884
7885
7886
7887
7888
7889
7890
7891
7892
7893
7894
7895
7896
7897
7898
7899
7900
7901
7902
7903
7904
7905
7906
7907
7908
7909
7910
7911
7912
7913
7914
7915
7916
7917
7918
7919
7920
7921
7922
7923
7924
7925
7926
7927
7928
7929
7930
7931
7932
7933
7934
7935
7936
7937
7938
7939
7940
7941
7942
7943
7944
7945
7946
7947
7948
7949
7950
7951
7952
7953
7954
7955
7956
7957
7958
7959
7960
7961
7962
7963
7964
7965
7966
7967
7968
7969
7970
7971
7972
7973
7974
7975
7976
7977
7978
7979
7980
7981
7982
7983
7984
7985
7986
7987
7988
7989
7990
7991
7992
7993
7994
7995
7996
7997
7998
7999
8000
8001
8002
8003
8004
8005
8006
8007
8008
8009
8010
8011
8012
8013
8014
8015
8016
8017
8018
8019
8020
8021
8022
8023
8024
8025
8026
8027
8028
8029
8030
8031
8032
8033
8034
8035
8036
8037
8038
8039
8040
8041
8042
8043
8044
8045
8046
8047
8048
8049
8050
8051
8052
8053
8054
8055
8056
8057
8058
8059
8060
8061
8062
8063
8064
8065
8066
8067
8068
8069
8070
8071
8072
8073
8074
8075
8076
8077
8078
8079
8080
8081
8082
8083
8084
8085
8086
8087
8088
8089
8090
8091
8092
8093
8094
8095
8096
8097
8098
8099
8100
8101
8102
8103
8104
8105
8106
8107
8108
8109
8110
8111
8112
8113
8114
8115
8116
8117
8118
8119
8120
8121
8122
8123
8124
8125
8126
8127
8128
8129
8130
8131
8132
8133
8134
8135
8136
8137
8138
8139
8140
8141
8142
8143
8144
8145
8146
8147
8148
8149
8150
8151
8152
8153
8154
8155
8156
8157
8158
8159
8160
8161
8162
8163
8164
8165
8166
8167
8168
8169
8170
8171
8172
8173
8174
8175
8176
8177
8178
8179
8180
8181
8182
8183
8184
8185
8186
8187
8188
8189
8190
8191
8192
8193
8194
8195
8196
8197
8198
8199
8200
8201
8202
8203
8204
8205
8206
8207
8208
8209
8210
8211
8212
8213
8214
8215
8216
8217
8218
8219
8220
8221
8222
8223
8224
8225
8226
8227
8228
8229
8230
8231
8232
8233
8234
8235
8236
8237
8238
8239
8240
8241
8242
8243
8244
8245
8246
8247
8248
8249
8250
8251
8252
8253
8254
8255
8256
8257
8258
8259
8260
8261
8262
8263
8264
8265
8266
8267
8268
8269
8270
8271
8272
8273
8274
8275
8276
8277
8278
8279
8280
8281
8282
8283
8284
8285
8286
8287
8288
8289
8290
8291
8292
8293
8294
8295
8296
8297
8298
8299
8300
8301
8302
8303
8304
8305
8306
8307
8308
8309
8310
8311
8312
8313
8314
8315
8316
8317
8318
8319
8320
8321
8322
8323
8324
8325
8326
8327
8328
8329
8330
8331
8332
8333
8334
8335
8336
8337
8338
8339
8340
8341
8342
8343
8344
8345
8346
8347
8348
8349
8350
8351
8352
8353
8354
8355
8356
8357
8358
8359
8360
8361
8362
8363
8364
8365
8366
8367
8368
8369
8370
8371
8372
8373
8374
8375
8376
8377
8378
8379
8380
8381
8382
8383
8384
8385
8386
8387
8388
8389
8390
8391
8392
8393
8394
8395
8396
8397
8398
8399
8400
8401
8402
8403
8404
8405
8406
8407
8408
8409
8410
8411
8412
8413
8414
8415
8416
8417
8418
8419
8420
8421
8422
8423
8424
8425
8426
8427
8428
8429
8430
8431
8432
8433
8434
8435
8436
8437
8438
8439
8440
8441
8442
8443
8444
8445
8446
8447
8448
8449
8450
8451
8452
8453
8454
8455
8456
8457
8458
8459
8460
8461
8462
8463
8464
8465
8466
8467
8468
8469
8470
8471
8472
8473
8474
8475
8476
8477
8478
8479
8480
8481
8482
8483
8484
8485
8486
8487
8488
8489
8490
8491
8492
8493
8494
8495
8496
8497
8498
8499
8500
8501
8502
8503
8504
8505
8506
8507
8508
8509
8510
8511
8512
8513
8514
8515
8516
8517
8518
8519
8520
8521
8522
8523
8524
8525
8526
8527
8528
8529
8530
8531
8532
8533
8534
8535
8536
8537
8538
8539
8540
8541
8542
8543
8544
8545
8546
8547
8548
8549
8550
8551
8552
8553
8554
8555
8556
8557
8558
8559
8560
8561
8562
8563
8564
8565
8566
8567
8568
8569
8570
8571
8572
8573
8574
8575
8576
8577
8578
8579
8580
8581
8582
8583
8584
8585
8586
8587
8588
8589
8590
8591
8592
8593
8594
8595
8596
8597
8598
8599
8600
8601
8602
8603
8604
8605
8606
8607
8608
8609
8610
8611
8612
8613
8614
8615
8616
8617
8618
8619
8620
8621
8622
8623
8624
8625
8626
8627
8628
8629
8630
8631
8632
8633
8634
8635
8636
8637
8638
8639
8640
8641
8642
8643
8644
8645
8646
8647
8648
8649
8650
8651
8652
8653
8654
8655
8656
8657
8658
8659
8660
8661
8662
8663
8664
8665
8666
8667
8668
8669
8670
8671
8672
8673
8674
8675
8676
8677
8678
8679
8680
8681
8682
8683
8684
8685
8686
8687
8688
8689
8690
8691
8692
8693
8694
8695
8696
8697
8698
8699
8700
8701
8702
8703
8704
8705
8706
8707
8708
8709
8710
8711
8712
8713
8714
8715
8716
8717
8718
8719
8720
8721
8722
8723
8724
8725
8726
8727
8728
8729
8730
8731
8732
8733
8734
8735
8736
8737
8738
8739
8740
8741
8742
8743
8744
8745
8746
8747
8748
8749
8750
8751
8752
8753
8754
8755
8756
8757
8758
8759
8760
8761
8762
8763
8764
8765
8766
8767
8768
8769
8770
8771
8772
8773
8774
8775
8776
8777
8778
8779
8780
8781
8782
8783
8784
8785
8786
8787
8788
8789
8790
8791
8792
8793
8794
8795
8796
8797
8798
8799
8800
8801
8802
8803
8804
8805
8806
8807
8808
8809
8810
8811
8812
8813
8814
8815
8816
8817
8818
8819
8820
8821
8822
8823
8824
8825
8826
8827
8828
8829
8830
8831
8832
8833
8834
8835
8836
8837
8838
8839
8840
8841
8842
8843
8844
8845
8846
8847
8848
8849
8850
8851
8852
8853
8854
8855
8856
8857
8858
8859
8860
8861
8862
8863
8864
8865
8866
8867
8868
8869
8870
8871
8872
8873
8874
8875
8876
8877
8878
8879
8880
8881
8882
8883
8884
8885
8886
8887
8888
8889
8890
8891
8892
8893
8894
8895
8896
8897
8898
8899
8900
8901
8902
8903
8904
8905
8906
8907
8908
8909
8910
8911
8912
8913
8914
8915
8916
8917
8918
8919
8920
8921
8922
8923
8924
8925
8926
8927
8928
8929
8930
8931
8932
8933
8934
8935
8936
8937
8938
8939
8940
8941
8942
8943
8944
8945
8946
8947
8948
8949
8950
8951
8952
8953
8954
8955
8956
8957
8958
8959
8960
8961
8962
8963
8964
8965
8966
8967
8968
8969
8970
8971
8972
8973
8974
8975
8976
8977
8978
8979
8980
8981
8982
8983
8984
8985
8986
8987
8988
8989
8990
8991
8992
8993
8994
8995
8996
8997
8998
8999
9000
9001
9002
9003
9004
9005
9006
9007
9008
9009
9010
9011
9012
9013
9014
9015
9016
9017
9018
9019
9020
9021
9022
9023
9024
9025
9026
9027
9028
9029
9030
9031
9032
9033
9034
9035
9036
9037
9038
9039
9040
9041
9042
9043
9044
9045
9046
9047
9048
9049
9050
9051
9052
9053
9054
9055
9056
9057
9058
9059
9060
9061
9062
9063
9064
9065
9066
9067
9068
9069
9070
9071
9072
9073
9074
9075
9076
9077
9078
9079
9080
9081
9082
9083
9084
9085
9086
9087
9088
9089
9090
9091
9092
9093
9094
9095
9096
9097
9098
9099
9100
9101
9102
9103
9104
9105
9106
9107
9108
9109
9110
9111
9112
9113
9114
9115
9116
9117
9118
9119
9120
9121
9122
9123
9124
9125
9126
9127
9128
9129
9130
9131
9132
9133
9134
9135
9136
9137
9138
9139
9140
9141
9142
9143
9144
9145
9146
9147
9148
9149
9150
9151
9152
9153
9154
9155
9156
9157
9158
9159
9160
9161
9162
9163
9164
9165
9166
9167
9168
9169
9170
9171
9172
9173
9174
9175
9176
9177
9178
9179
9180
9181
9182
9183
9184
9185
9186
9187
9188
9189
9190
9191
9192
9193
9194
9195
9196
9197
9198
9199
9200
9201
9202
9203
9204
9205
9206
9207
9208
9209
9210
9211
9212
9213
9214
9215
9216
9217
9218
9219
9220
9221
9222
9223
9224
9225
9226
9227
9228
9229
9230
9231
9232
9233
9234
9235
9236
9237
9238
9239
9240
9241
9242
9243
9244
9245
9246
9247
9248
9249
9250
9251
9252
9253
9254
9255
9256
9257
9258
9259
9260
9261
9262
9263
9264
9265
9266
9267
9268
9269
9270
9271
9272
9273
9274
9275
9276
9277
9278
9279
9280
9281
9282
9283
9284
9285
9286
9287
9288
9289
9290
9291
9292
9293
9294
9295
9296
9297
9298
9299
9300
9301
9302
9303
9304
9305
9306
9307
9308
9309
9310
9311
9312
9313
9314
9315
9316
9317
9318
9319
9320
9321
9322
9323
9324
9325
9326
9327
9328
9329
9330
9331
9332
9333
9334
9335
9336
9337
9338
9339
9340
9341
9342
9343
9344
9345
9346
9347
9348
9349
9350
9351
9352
9353
9354
9355
9356
9357
9358
9359
9360
9361
9362
9363
9364
9365
9366
9367
9368
9369
9370
9371
9372
9373
9374
9375
9376
9377
9378
9379
9380
9381
9382
9383
9384
9385
9386
9387
9388
9389
9390
9391
9392
9393
9394
9395
9396
9397
9398
9399
9400
9401
9402
9403
9404
9405
9406
9407
9408
9409
9410
9411
9412
9413
9414
9415
9416
9417
9418
9419
9420
9421
9422
9423
9424
9425
9426
9427
9428
9429
9430
9431
9432
9433
9434
9435
9436
9437
9438
9439
9440
9441
9442
9443
9444
9445
9446
9447
9448
9449
9450
9451
9452
9453
9454
9455
9456
9457
9458
9459
9460
9461
9462
9463
9464
9465
9466
9467
9468
9469
9470
9471
9472
9473
9474
9475
9476
9477
9478
9479
9480
9481
9482
9483
9484
9485
9486
9487
9488
9489
9490
9491
9492
9493
9494
9495
9496
9497
9498
9499
9500
9501
9502
9503
9504
9505
9506
9507
9508
9509
9510
9511
9512
9513
9514
9515
9516
9517
9518
9519
9520
9521
9522
9523
9524
9525
9526
9527
9528
9529
9530
9531
9532
9533
9534
9535
9536
9537
9538
9539
9540
9541
9542
9543
9544
9545
9546
9547
9548
9549
9550
9551
9552
9553
9554
9555
9556
9557
9558
9559
9560
9561
9562
9563
9564
9565
9566
9567
9568
9569
9570
9571
9572
9573
9574
9575
9576
9577
9578
9579
9580
9581
9582
9583
9584
9585
9586
9587
9588
9589
9590
9591
9592
9593
9594
9595
9596
9597
9598
9599
9600
9601
9602
9603
9604
9605
9606
9607
9608
9609
9610
9611
9612
9613
9614
9615
9616
9617
9618
9619
9620
9621
9622
9623
9624
9625
9626
9627
9628
9629
9630
9631
9632
9633
9634
9635
9636
9637
9638
9639
9640
9641
9642
9643
9644
9645
9646
9647
9648
9649
9650
9651
9652
9653
9654
9655
9656
9657
9658
9659
9660
9661
9662
9663
9664
9665
9666
9667
9668
9669
9670
9671
9672
9673
9674
9675
9676
9677
9678
9679
9680
9681
9682
9683
9684
9685
9686
9687
9688
9689
9690
9691
9692
9693
9694
9695
9696
9697
9698
9699
9700
9701
9702
9703
9704
9705
9706
9707
9708
9709
9710
9711
9712
9713
9714
9715
9716
9717
9718
9719
9720
9721
9722
9723
9724
9725
9726
9727
9728
9729
9730
9731
9732
9733
9734
9735
9736
9737
9738
9739
9740
9741
9742
9743
9744
9745
9746
9747
9748
9749
9750
9751
9752
9753
9754
9755
9756
9757
9758
9759
9760
9761
9762
9763
9764
9765
9766
9767
9768
9769
9770
9771
9772
9773
9774
9775
9776
9777
9778
9779
9780
9781
9782
9783
9784
9785
9786
9787
9788
9789
9790
9791
9792
9793
9794
9795
9796
9797
9798
9799
9800
9801
9802
9803
9804
9805
9806
9807
9808
9809
9810
9811
9812
9813
9814
9815
9816
9817
9818
9819
9820
9821
9822
9823
9824
9825
9826
9827
9828
9829
9830
9831
9832
9833
9834
9835
9836
9837
9838
9839
9840
9841
9842
9843
9844
9845
9846
9847
9848
9849
9850
9851
9852
9853
9854
9855
9856
9857
9858
9859
9860
9861
9862
9863
9864
9865
9866
9867
9868
9869
9870
9871
9872
9873
9874
9875
9876
9877
9878
9879
9880
9881
9882
9883
9884
9885
9886
9887
9888
9889
9890
9891
9892
9893
9894
9895
9896
9897
9898
9899
9900
9901
9902
9903
9904
9905
9906
9907
9908
9909
9910
9911
9912
9913
9914
9915
9916
9917
9918
9919
9920
9921
9922
9923
9924
9925
9926
9927
9928
9929
9930
9931
9932
9933
9934
9935
9936
9937
9938
9939
9940
9941
9942
9943
9944
9945
9946
9947
9948
9949
9950
9951
9952
9953
9954
9955
9956
9957
9958
9959
9960
9961
9962
9963
9964
9965
9966
9967
9968
9969
9970
9971
9972
9973
9974
9975
9976
9977
9978
9979
9980
9981
9982
9983
9984
9985
9986
9987
9988
9989
9990
9991
9992
9993
9994
9995
9996
9997
9998
9999
10000
10001
10002
10003
10004
10005
10006
10007
10008
10009
10010
10011
10012
10013
10014
10015
10016
10017
10018
10019
10020
10021
10022
10023
10024
10025
10026
10027
10028
10029
10030
10031
10032
10033
10034
10035
10036
10037
10038
10039
10040
10041
10042
10043
10044
10045
10046
10047
10048
10049
10050
10051
10052
10053
10054
10055
10056
10057
10058
10059
10060
10061
10062
10063
10064
10065
10066
10067
10068
10069
10070
10071
10072
10073
10074
10075
10076
10077
10078
10079
10080
10081
10082
10083
10084
10085
10086
10087
10088
10089
10090
10091
10092
10093
10094
10095
10096
10097
10098
10099
10100
10101
10102
10103
10104
10105
10106
10107
10108
10109
10110
10111
10112
10113
10114
10115
10116
10117
10118
10119
10120
10121
10122
10123
10124
10125
10126
10127
10128
10129
10130
10131
10132
10133
10134
10135
10136
10137
10138
10139
10140
10141
10142
10143
10144
10145
10146
10147
10148
10149
10150
10151
10152
10153
10154
10155
10156
10157
10158
10159
10160
10161
10162
10163
10164
10165
10166
10167
10168
10169
10170
10171
10172
10173
10174
10175
10176
10177
10178
10179
10180
10181
10182
10183
10184
10185
10186
10187
10188
10189
10190
10191
10192
10193
10194
10195
10196
10197
10198
10199
10200
10201
10202
10203
10204
10205
10206
10207
10208
10209
10210
10211
10212
10213
10214
10215
10216
10217
10218
10219
10220
10221
10222
10223
10224
10225
10226
10227
10228
10229
10230
10231
10232
10233
10234
10235
10236
10237
10238
10239
10240
10241
10242
10243
10244
10245
10246
10247
10248
10249
10250
10251
10252
10253
10254
10255
10256
10257
10258
10259
10260
10261
10262
10263
10264
10265
10266
10267
10268
10269
10270
10271
10272
10273
10274
10275
10276
10277
10278
10279
10280
10281
10282
10283
10284
10285
10286
10287
10288
10289
10290
10291
10292
10293
10294
10295
10296
10297
10298
10299
10300
10301
10302
10303
10304
10305
10306
10307
10308
10309
10310
10311
10312
10313
10314
10315
10316
10317
10318
10319
10320
10321
10322
10323
10324
10325
10326
10327
10328
10329
10330
10331
10332
10333
10334
10335
10336
10337
10338
10339
10340
10341
10342
10343
10344
10345
10346
10347
10348
10349
10350
10351
10352
10353
10354
10355
10356
10357
10358
10359
10360
10361
10362
10363
10364
10365
10366
10367
10368
10369
10370
10371
10372
10373
10374
10375
10376
10377
10378
10379
10380
10381
10382
10383
10384
10385
10386
10387
10388
10389
10390
10391
10392
10393
10394
10395
10396
10397
10398
10399
10400
10401
10402
10403
10404
10405
10406
10407
10408
10409
10410
10411
10412
10413
10414
10415
10416
10417
10418
10419
10420
10421
10422
10423
10424
10425
10426
10427
10428
10429
10430
10431
10432
10433
10434
10435
10436
10437
10438
10439
10440
10441
10442
10443
10444
10445
10446
10447
10448
10449
10450
10451
10452
10453
10454
10455
10456
10457
10458
10459
10460
10461
10462
10463
10464
10465
10466
10467
10468
10469
10470
10471
10472
10473
10474
10475
10476
10477
10478
10479
10480
10481
10482
10483
10484
10485
10486
10487
10488
10489
10490
10491
10492
10493
10494
10495
10496
10497
10498
10499
10500
10501
10502
10503
10504
10505
10506
10507
10508
10509
10510
10511
10512
10513
10514
10515
10516
10517
10518
10519
10520
10521
10522
10523
10524
10525
10526
10527
10528
10529
10530
10531
10532
10533
10534
10535
10536
10537
10538
10539
10540
10541
10542
10543
10544
10545
10546
10547
10548
10549
10550
10551
10552
10553
10554
10555
10556
10557
10558
10559
10560
10561
10562
10563
10564
10565
10566
10567
10568
10569
10570
10571
10572
10573
10574
10575
10576
10577
10578
10579
10580
10581
10582
10583
10584
10585
10586
10587
10588
10589
10590
10591
10592
10593
10594
10595
10596
10597
10598
10599
10600
10601
10602
10603
10604
10605
10606
10607
10608
10609
10610
10611
10612
10613
10614
10615
10616
10617
10618
10619
10620
10621
10622
10623
10624
10625
10626
10627
10628
10629
10630
10631
10632
10633
10634
10635
10636
10637
10638
10639
10640
10641
10642
10643
10644
10645
10646
10647
10648
10649
10650
10651
10652
10653
10654
10655
10656
10657
10658
10659
10660
10661
10662
10663
10664
10665
10666
10667
10668
10669
10670
10671
10672
10673
10674
10675
10676
10677
10678
10679
10680
10681
10682
10683
10684
10685
10686
10687
10688
10689
10690
10691
10692
10693
10694
10695
10696
10697
10698
10699
10700
10701
10702
10703
10704
10705
10706
10707
10708
10709
10710
10711
10712
10713
10714
10715
10716
10717
10718
10719
10720
10721
10722
10723
10724
10725
10726
10727
10728
10729
10730
10731
10732
10733
10734
10735
10736
10737
10738
10739
10740
10741
10742
10743
10744
10745
10746
10747
10748
10749
10750
10751
10752
10753
10754
10755
10756
10757
10758
10759
10760
10761
10762
10763
10764
10765
10766
10767
10768
10769
10770
10771
10772
10773
10774
10775
10776
10777
10778
10779
10780
10781
10782
10783
10784
10785
10786
10787
10788
10789
10790
10791
10792
10793
10794
10795
10796
10797
10798
10799
10800
10801
10802
10803
10804
10805
10806
10807
10808
10809
10810
10811
10812
10813
10814
10815
10816
10817
10818
10819
10820
10821
10822
10823
10824
10825
10826
10827
10828
10829
10830
10831
10832
10833
10834
10835
10836
10837
10838
10839
10840
10841
10842
10843
10844
10845
10846
10847
10848
10849
10850
10851
10852
10853
10854
10855
10856
10857
10858
10859
10860
10861
10862
10863
10864
10865
10866
10867
10868
10869
10870
10871
10872
10873
10874
10875
10876
10877
10878
10879
10880
10881
10882
10883
10884
10885
10886
10887
10888
10889
10890
10891
10892
10893
10894
10895
10896
10897
10898
10899
10900
10901
10902
10903
10904
10905
10906
10907
10908
10909
10910
10911
10912
10913
10914
10915
10916
10917
10918
10919
10920
10921
10922
10923
10924
10925
10926
10927
10928
10929
10930
10931
10932
10933
10934
10935
10936
10937
10938
10939
10940
10941
10942
10943
10944
10945
10946
10947
10948
10949
10950
10951
10952
10953
10954
10955
10956
10957
10958
10959
10960
10961
10962
10963
10964
10965
10966
10967
10968
10969
10970
10971
10972
10973
10974
10975
10976
10977
10978
10979
10980
10981
10982
10983
10984
10985
10986
10987
10988
10989
10990
10991
10992
10993
10994
10995
10996
10997
10998
10999
11000
11001
11002
11003
11004
11005
11006
11007
11008
11009
11010
11011
11012
11013
11014
11015
11016
11017
11018
11019
11020
11021
11022
11023
11024
11025
11026
11027
11028
11029
11030
11031
11032
11033
11034
11035
11036
11037
11038
11039
11040
11041
11042
11043
11044
11045
11046
11047
11048
11049
11050
11051
11052
11053
11054
11055
11056
11057
11058
11059
11060
11061
11062
11063
11064
11065
11066
11067
11068
11069
11070
11071
11072
11073
11074
11075
11076
11077
11078
11079
11080
11081
11082
11083
11084
11085
11086
11087
11088
11089
11090
11091
11092
11093
11094
11095
11096
11097
11098
11099
11100
11101
11102
11103
11104
11105
11106
11107
11108
11109
11110
11111
11112
11113
11114
11115
11116
11117
11118
11119
11120
11121
11122
11123
11124
11125
11126
11127
11128
11129
11130
11131
11132
11133
11134
11135
11136
11137
11138
11139
11140
11141
11142
11143
11144
11145
11146
11147
11148
11149
11150
11151
11152
11153
11154
11155
11156
11157
11158
11159
11160
11161
11162
11163
11164
11165
11166
11167
11168
11169
11170
11171
11172
11173
11174
11175
11176
11177
11178
11179
11180
11181
11182
11183
11184
11185
11186
11187
11188
11189
11190
11191
11192
11193
11194
11195
11196
11197
11198
11199
11200
11201
11202
11203
11204
11205
11206
11207
11208
11209
11210
11211
11212
11213
11214
11215
11216
11217
11218
11219
11220
11221
11222
11223
11224
11225
11226
11227
11228
11229
11230
11231
11232
11233
11234
11235
11236
11237
11238
11239
11240
11241
11242
11243
11244
11245
11246
11247
11248
11249
11250
11251
11252
11253
11254
11255
11256
11257
11258
11259
11260
11261
11262
11263
11264
11265
11266
11267
11268
11269
11270
11271
11272
11273
11274
11275
11276
11277
11278
11279
11280
11281
11282
11283
11284
11285
11286
11287
11288
11289
11290
11291
11292
11293
11294
11295
11296
11297
11298
11299
11300
11301
11302
11303
11304
11305
11306
11307
11308
11309
11310
11311
11312
11313
11314
11315
11316
11317
11318
11319
11320
11321
11322
11323
11324
11325
11326
11327
11328
11329
11330
11331
11332
11333
11334
11335
11336
11337
11338
11339
11340
11341
11342
11343
11344
11345
11346
11347
11348
11349
11350
11351
11352
11353
11354
11355
11356
11357
11358
11359
11360
11361
11362
11363
11364
11365
11366
11367
11368
11369
11370
11371
11372
11373
11374
11375
11376
11377
11378
11379
11380
11381
11382
11383
11384
11385
11386
11387
11388
11389
11390
11391
11392
11393
11394
11395
11396
11397
11398
11399
11400
11401
11402
11403
11404
11405
11406
11407
11408
11409
11410
11411
11412
11413
11414
11415
11416
11417
11418
11419
11420
11421
11422
11423
11424
11425
11426
11427
11428
11429
11430
11431
11432
11433
11434
11435
11436
11437
11438
11439
11440
11441
11442
11443
11444
11445
11446
11447
11448
11449
11450
11451
11452
11453
11454
11455
11456
11457
11458
11459
11460
11461
11462
11463
11464
11465
11466
11467
11468
11469
11470
11471
11472
11473
11474
11475
11476
11477
11478
11479
11480
11481
11482
11483
11484
11485
11486
11487
11488
11489
11490
11491
11492
11493
11494
11495
11496
11497
11498
11499
11500
11501
11502
11503
11504
11505
11506
11507
11508
11509
11510
11511
11512
11513
11514
11515
11516
11517
11518
11519
11520
11521
11522
11523
11524
11525
11526
11527
11528
11529
11530
11531
11532
11533
11534
11535
11536
11537
11538
11539
11540
11541
11542
11543
11544
11545
11546
11547
11548
11549
11550
11551
11552
11553
11554
11555
11556
11557
11558
11559
11560
11561
11562
11563
11564
11565
11566
11567
11568
11569
11570
11571
11572
11573
11574
11575
11576
11577
11578
11579
11580
11581
11582
11583
11584
11585
11586
11587
11588
11589
11590
11591
11592
11593
11594
11595
11596
11597
11598
11599
11600
11601
11602
11603
11604
11605
11606
11607
11608
11609
11610
11611
11612
11613
11614
11615
11616
11617
11618
11619
11620
11621
11622
11623
11624
11625
11626
11627
11628
11629
11630
11631
11632
11633
11634
11635
11636
11637
11638
11639
11640
11641
11642
11643
11644
11645
11646
11647
11648
11649
11650
11651
11652
11653
11654
11655
11656
11657
11658
11659
11660
11661
11662
11663
11664
11665
11666
11667
11668
11669
11670
11671
11672
11673
11674
11675
11676
11677
11678
11679
11680
11681
11682
11683
11684
11685
11686
11687
11688
11689
11690
11691
11692
11693
11694
11695
11696
11697
11698
11699
11700
11701
11702
11703
11704
11705
11706
11707
11708
11709
11710
11711
11712
11713
11714
11715
11716
11717
11718
11719
11720
11721
11722
11723
11724
11725
11726
11727
11728
11729
11730
11731
11732
11733
11734
11735
11736
11737
11738
11739
11740
11741
11742
11743
11744
11745
11746
11747
11748
11749
11750
11751
11752
11753
11754
11755
11756
11757
11758
11759
11760
11761
11762
11763
11764
11765
11766
11767
11768
11769
11770
11771
11772
11773
11774
11775
11776
11777
11778
11779
11780
11781
11782
11783
11784
11785
11786
11787
11788
11789
11790
11791
11792
11793
11794
11795
11796
11797
11798
11799
11800
11801
11802
11803
11804
11805
11806
11807
11808
11809
11810
11811
11812
11813
11814
11815
11816
11817
11818
11819
11820
11821
11822
11823
11824
11825
11826
11827
11828
11829
11830
11831
11832
11833
11834
11835
11836
11837
11838
11839
11840
11841
11842
11843
11844
11845
11846
11847
11848
11849
11850
11851
11852
11853
11854
11855
11856
11857
11858
11859
11860
11861
11862
11863
11864
11865
11866
11867
11868
11869
11870
11871
11872
11873
11874
11875
11876
11877
11878
11879
11880
11881
11882
11883
11884
11885
11886
11887
11888
11889
11890
11891
11892
11893
11894
11895
11896
11897
11898
11899
11900
11901
11902
11903
11904
11905
11906
11907
11908
11909
11910
11911
11912
11913
11914
11915
11916
11917
11918
11919
11920
11921
11922
11923
11924
11925
11926
11927
11928
11929
11930
11931
11932
11933
11934
11935
11936
11937
11938
11939
11940
11941
11942
11943
11944
11945
11946
11947
11948
11949
11950
11951
11952
11953
11954
11955
11956
11957
11958
11959
11960
11961
11962
11963
11964
11965
11966
11967
11968
11969
11970
11971
11972
11973
11974
11975
11976
11977
11978
11979
11980
11981
11982
11983
11984
11985
11986
11987
11988
11989
11990
11991
11992
11993
11994
11995
11996
11997
11998
11999
12000
12001
12002
12003
12004
12005
12006
12007
12008
12009
12010
12011
12012
12013
12014
12015
12016
12017
12018
12019
12020
12021
12022
12023
12024
12025
12026
12027
12028
12029
12030
12031
12032
12033
12034
12035
12036
12037
12038
12039
12040
12041
12042
12043
12044
12045
12046
12047
12048
12049
12050
12051
12052
12053
12054
12055
12056
12057
12058
12059
12060
12061
12062
12063
12064
12065
12066
12067
12068
12069
12070
12071
12072
12073
12074
12075
12076
12077
12078
12079
12080
12081
12082
12083
12084
12085
12086
12087
12088
12089
12090
12091
12092
12093
12094
12095
12096
12097
12098
12099
12100
12101
12102
12103
12104
12105
12106
12107
12108
12109
12110
12111
12112
12113
12114
12115
12116
12117
12118
12119
12120
12121
12122
12123
12124
12125
12126
12127
12128
12129
12130
12131
12132
12133
12134
12135
12136
12137
12138
12139
12140
12141
12142
12143
12144
12145
12146
12147
12148
12149
12150
12151
12152
12153
12154
12155
12156
12157
12158
12159
12160
12161
12162
12163
12164
12165
12166
12167
12168
12169
12170
12171
12172
12173
12174
12175
12176
12177
12178
12179
12180
12181
12182
12183
12184
12185
12186
12187
12188
12189
12190
12191
12192
12193
12194
12195
12196
12197
12198
12199
12200
12201
12202
12203
12204
12205
12206
12207
12208
12209
12210
12211
12212
12213
12214
12215
12216
12217
12218
12219
12220
12221
12222
12223
12224
12225
12226
12227
12228
12229
12230
12231
12232
12233
12234
12235
12236
12237
12238
12239
12240
12241
12242
12243
12244
12245
12246
12247
12248
12249
12250
12251
12252
12253
12254
12255
12256
12257
12258
12259
12260
12261
12262
12263
12264
12265
12266
12267
12268
12269
12270
12271
12272
12273
12274
12275
12276
12277
12278
12279
12280
12281
12282
12283
12284
12285
12286
12287
12288
12289
12290
12291
12292
12293
12294
12295
12296
12297
12298
12299
12300
12301
12302
12303
12304
12305
12306
12307
12308
12309
12310
12311
12312
12313
12314
12315
12316
12317
12318
12319
12320
12321
12322
12323
12324
12325
12326
12327
12328
12329
12330
12331
12332
12333
12334
12335
12336
12337
12338
12339
12340
12341
12342
12343
12344
12345
12346
12347
12348
12349
12350
12351
12352
12353
12354
12355
12356
12357
12358
12359
12360
12361
12362
12363
12364
12365
12366
12367
12368
12369
12370
12371
12372
12373
12374
12375
12376
12377
12378
12379
12380
12381
12382
12383
12384
12385
12386
12387
12388
12389
12390
12391
12392
12393
12394
12395
12396
12397
12398
12399
12400
12401
12402
12403
12404
12405
12406
12407
12408
12409
12410
12411
12412
12413
12414
12415
12416
12417
12418
12419
12420
12421
12422
12423
12424
12425
12426
12427
12428
12429
12430
12431
12432
12433
12434
12435
12436
12437
12438
12439
12440
12441
12442
12443
12444
12445
12446
12447
12448
12449
12450
12451
12452
12453
12454
12455
12456
12457
12458
12459
12460
12461
12462
12463
12464
12465
12466
12467
12468
12469
12470
12471
12472
12473
12474
12475
12476
12477
12478
12479
12480
12481
12482
12483
12484
12485
12486
12487
12488
12489
12490
12491
12492
12493
12494
12495
12496
12497
12498
12499
12500
12501
12502
12503
12504
12505
12506
12507
12508
12509
12510
12511
12512
12513
12514
12515
12516
12517
12518
12519
12520
12521
12522
12523
12524
12525
12526
12527
12528
12529
12530
12531
12532
12533
12534
12535
12536
12537
12538
12539
12540
12541
12542
12543
12544
12545
12546
12547
12548
12549
12550
12551
12552
12553
12554
12555
12556
12557
12558
12559
12560
12561
12562
12563
12564
12565
12566
12567
12568
12569
12570
12571
12572
12573
12574
12575
12576
12577
12578
12579
12580
12581
12582
12583
12584
12585
12586
12587
12588
12589
12590
12591
12592
12593
12594
12595
12596
12597
12598
12599
12600
12601
12602
12603
12604
12605
12606
12607
12608
12609
12610
12611
12612
12613
12614
12615
12616
12617
12618
12619
12620
12621
12622
12623
12624
12625
12626
12627
12628
12629
12630
12631
12632
12633
12634
12635
12636
12637
12638
12639
12640
12641
12642
12643
12644
12645
12646
12647
12648
12649
12650
12651
12652
12653
12654
12655
12656
12657
12658
12659
12660
12661
12662
12663
12664
12665
12666
12667
12668
12669
12670
12671
12672
12673
12674
12675
12676
12677
12678
12679
12680
12681
12682
12683
12684
12685
12686
12687
12688
12689
12690
12691
12692
12693
12694
12695
12696
12697
12698
12699
12700
12701
12702
12703
12704
12705
12706
12707
12708
12709
12710
12711
12712
12713
12714
12715
12716
12717
12718
12719
12720
12721
12722
12723
12724
12725
12726
12727
12728
12729
12730
12731
12732
12733
12734
12735
12736
12737
12738
12739
12740
12741
12742
12743
12744
12745
12746
12747
12748
12749
12750
12751
12752
12753
12754
12755
12756
12757
12758
12759
12760
12761
12762
12763
12764
12765
12766
12767
12768
12769
12770
12771
12772
12773
12774
12775
12776
12777
12778
12779
12780
12781
12782
12783
12784
12785
12786
12787
12788
12789
12790
12791
12792
12793
12794
12795
12796
12797
12798
12799
12800
12801
12802
12803
12804
12805
12806
12807
12808
12809
12810
12811
12812
12813
12814
12815
12816
12817
12818
12819
12820
12821
12822
12823
12824
12825
12826
12827
12828
12829
12830
12831
12832
12833
12834
12835
12836
12837
12838
12839
12840
12841
12842
12843
12844
12845
12846
12847
12848
12849
12850
12851
12852
12853
12854
12855
12856
12857
12858
12859
12860
12861
12862
12863
12864
12865
12866
12867
12868
12869
12870
12871
12872
12873
12874
12875
12876
12877
12878
12879
12880
12881
12882
12883
12884
12885
12886
12887
12888
12889
12890
12891
12892
12893
12894
12895
12896
12897
12898
12899
12900
12901
12902
12903
12904
12905
12906
12907
12908
12909
12910
12911
12912
12913
12914
12915
12916
12917
12918
12919
12920
12921
12922
12923
12924
12925
12926
12927
12928
12929
12930
12931
12932
12933
12934
12935
12936
12937
12938
12939
12940
12941
12942
12943
12944
12945
12946
12947
12948
12949
12950
12951
12952
12953
12954
12955
12956
12957
12958
12959
12960
12961
12962
12963
12964
12965
12966
12967
12968
12969
12970
12971
12972
12973
12974
12975
12976
12977
12978
12979
12980
12981
12982
12983
12984
12985
12986
12987
12988
12989
12990
12991
12992
12993
12994
12995
12996
12997
12998
12999
13000
13001
13002
13003
13004
13005
13006
13007
13008
13009
13010
13011
13012
13013
13014
13015
13016
13017
13018
13019
13020
13021
13022
13023
13024
13025
13026
13027
13028
13029
13030
13031
13032
13033
13034
13035
13036
13037
13038
13039
13040
13041
13042
13043
13044
13045
13046
13047
13048
13049
13050
13051
13052
13053
13054
13055
13056
13057
13058
13059
13060
13061
13062
13063
13064
13065
13066
13067
13068
13069
13070
13071
13072
13073
13074
13075
13076
13077
13078
13079
13080
13081
13082
13083
13084
13085
13086
13087
13088
13089
13090
13091
13092
13093
13094
13095
13096
13097
13098
13099
13100
13101
13102
13103
13104
13105
13106
13107
13108
13109
13110
13111
13112
13113
13114
13115
13116
13117
13118
13119
13120
13121
13122
13123
13124
13125
13126
13127
13128
13129
13130
13131
13132
13133
13134
13135
13136
13137
13138
13139
13140
13141
13142
13143
13144
13145
13146
13147
13148
13149
13150
13151
13152
13153
13154
13155
13156
13157
13158
13159
13160
13161
13162
13163
13164
13165
13166
13167
13168
13169
13170
13171
13172
13173
13174
13175
13176
13177
13178
13179
13180
13181
13182
13183
13184
13185
13186
13187
13188
13189
13190
13191
13192
13193
13194
13195
13196
13197
13198
13199
13200
13201
13202
13203
13204
13205
13206
13207
13208
13209
13210
13211
13212
13213
13214
13215
13216
13217
13218
13219
13220
13221
13222
13223
13224
13225
13226
13227
13228
13229
13230
13231
13232
13233
13234
13235
13236
13237
13238
13239
13240
13241
13242
13243
13244
13245
13246
13247
13248
13249
13250
13251
13252
13253
13254
13255
13256
13257
13258
13259
13260
13261
13262
13263
13264
13265
13266
13267
13268
13269
13270
13271
13272
13273
13274
13275
13276
13277
13278
13279
13280
13281
13282
13283
13284
13285
13286
13287
13288
13289
13290
13291
13292
13293
13294
13295
13296
13297
13298
13299
13300
13301
13302
13303
13304
13305
13306
13307
13308
13309
13310
13311
13312
13313
13314
13315
13316
13317
13318
13319
13320
13321
13322
13323
13324
13325
13326
13327
13328
13329
13330
13331
13332
13333
13334
13335
13336
13337
13338
13339
13340
13341
13342
13343
13344
13345
13346
13347
13348
13349
13350
13351
13352
13353
13354
13355
13356
13357
13358
13359
13360
13361
13362
13363
13364
13365
13366
13367
13368
13369
13370
13371
13372
13373
13374
13375
13376
13377
13378
13379
13380
13381
13382
13383
13384
13385
13386
13387
13388
13389
13390
13391
13392
13393
13394
13395
13396
13397
13398
13399
13400
13401
13402
13403
13404
13405
13406
13407
13408
13409
13410
13411
13412
13413
13414
13415
13416
13417
13418
13419
13420
13421
13422
13423
13424
13425
13426
13427
13428
13429
13430
13431
13432
13433
13434
13435
13436
13437
13438
13439
13440
13441
13442
13443
13444
13445
13446
13447
13448
13449
13450
13451
13452
13453
13454
13455
13456
13457
13458
13459
13460
13461
13462
13463
13464
13465
13466
13467
13468
13469
13470
13471
13472
13473
13474
13475
13476
13477
13478
13479
13480
13481
13482
13483
13484
13485
13486
13487
13488
13489
13490
13491
13492
13493
13494
13495
13496
13497
13498
13499
13500
13501
13502
13503
13504
13505
13506
13507
13508
13509
13510
13511
13512
13513
13514
13515
13516
13517
13518
13519
13520
13521
13522
13523
13524
13525
13526
13527
13528
13529
13530
13531
13532
13533
13534
13535
13536
13537
13538
13539
13540
13541
13542
13543
13544
13545
13546
13547
13548
13549
13550
13551
13552
13553
13554
13555
13556
13557
13558
13559
13560
13561
13562
13563
13564
13565
13566
13567
13568
13569
13570
13571
13572
13573
13574
13575
13576
13577
13578
13579
13580
13581
13582
13583
13584
13585
13586
13587
13588
13589
13590
13591
13592
13593
13594
13595
13596
13597
13598
13599
13600
13601
13602
13603
13604
13605
13606
13607
13608
13609
13610
13611
13612
13613
13614
13615
13616
13617
13618
13619
13620
13621
13622
13623
13624
13625
13626
13627
13628
13629
13630
13631
13632
13633
13634
13635
13636
13637
13638
13639
13640
13641
13642
13643
13644
13645
13646
13647
13648
13649
13650
13651
13652
13653
13654
13655
13656
13657
13658
13659
13660
13661
13662
13663
13664
13665
13666
13667
13668
13669
13670
13671
13672
13673
13674
13675
13676
13677
13678
13679
13680
13681
13682
13683
13684
13685
13686
13687
13688
13689
13690
13691
13692
13693
13694
13695
13696
13697
13698
13699
13700
13701
13702
13703
13704
13705
13706
13707
13708
13709
13710
13711
13712
13713
13714
13715
13716
13717
13718
13719
13720
13721
13722
13723
13724
13725
13726
13727
13728
13729
13730
13731
13732
13733
13734
13735
13736
13737
13738
13739
13740
13741
13742
13743
13744
13745
13746
13747
13748
13749
13750
13751
13752
13753
13754
13755
13756
13757
13758
13759
13760
13761
13762
13763
13764
13765
13766
13767
13768
13769
13770
13771
13772
13773
13774
13775
13776
13777
13778
13779
13780
13781
13782
13783
13784
13785
13786
13787
13788
13789
13790
13791
13792
13793
13794
13795
13796
13797
13798
13799
13800
13801
13802
13803
13804
13805
13806
13807
13808
13809
13810
13811
13812
13813
13814
13815
13816
13817
13818
13819
13820
13821
13822
13823
13824
13825
13826
13827
13828
13829
13830
13831
13832
13833
13834
13835
13836
13837
13838
13839
13840
13841
13842
13843
13844
13845
13846
13847
13848
13849
13850
13851
13852
13853
13854
13855
13856
13857
13858
13859
13860
13861
13862
13863
13864
13865
13866
13867
13868
13869
13870
13871
13872
13873
13874
13875
13876
13877
13878
13879
13880
13881
13882
13883
13884
13885
13886
13887
13888
13889
13890
13891
13892
13893
13894
13895
13896
13897
13898
13899
13900
13901
13902
13903
13904
13905
13906
13907
13908
13909
13910
13911
13912
13913
13914
13915
13916
13917
13918
13919
13920
13921
13922
13923
13924
13925
13926
13927
13928
13929
13930
13931
13932
13933
13934
13935
13936
13937
13938
13939
13940
13941
13942
13943
13944
13945
13946
13947
13948
13949
13950
13951
13952
13953
13954
13955
13956
13957
13958
13959
13960
13961
13962
13963
13964
13965
13966
13967
13968
13969
13970
13971
13972
13973
13974
13975
13976
13977
13978
13979
13980
13981
13982
13983
13984
13985
13986
13987
13988
13989
13990
13991
13992
13993
13994
13995
13996
13997
13998
13999
14000
14001
14002
14003
14004
14005
14006
14007
14008
14009
14010
14011
14012
14013
14014
14015
14016
14017
14018
14019
14020
14021
14022
14023
14024
14025
14026
14027
14028
14029
14030
14031
14032
14033
14034
14035
14036
14037
14038
14039
14040
14041
14042
14043
14044
14045
14046
14047
14048
14049
14050
14051
14052
14053
14054
14055
14056
14057
14058
14059
14060
14061
14062
14063
14064
14065
14066
14067
14068
14069
14070
14071
14072
14073
14074
14075
14076
14077
14078
14079
14080
14081
14082
14083
14084
14085
14086
14087
14088
14089
14090
14091
14092
14093
14094
14095
14096
14097
14098
14099
14100
14101
14102
14103
14104
14105
14106
14107
14108
14109
14110
14111
14112
14113
14114
14115
14116
14117
14118
14119
14120
14121
14122
14123
14124
14125
14126
14127
14128
14129
14130
14131
14132
14133
14134
14135
14136
14137
14138
14139
14140
14141
14142
14143
14144
14145
14146
14147
14148
14149
14150
14151
14152
14153
14154
14155
14156
14157
14158
14159
14160
14161
14162
14163
14164
14165
14166
14167
14168
14169
14170
14171
14172
14173
14174
14175
14176
14177
14178
14179
14180
14181
14182
14183
14184
14185
14186
14187
14188
14189
14190
14191
14192
14193
14194
14195
14196
14197
14198
14199
14200
14201
14202
14203
14204
14205
14206
14207
14208
14209
14210
14211
14212
14213
14214
14215
14216
14217
14218
14219
14220
14221
14222
14223
14224
14225
14226
14227
14228
14229
14230
14231
14232
14233
14234
14235
14236
14237
14238
14239
14240
14241
14242
14243
14244
14245
14246
14247
14248
14249
14250
14251
14252
14253
14254
14255
14256
14257
14258
14259
14260
14261
14262
14263
14264
14265
14266
14267
14268
14269
14270
14271
14272
14273
14274
14275
14276
14277
14278
14279
14280
14281
14282
14283
14284
14285
14286
14287
14288
14289
14290
14291
14292
14293
14294
14295
14296
14297
14298
14299
14300
14301
14302
14303
14304
14305
14306
14307
14308
14309
14310
14311
14312
14313
14314
14315
14316
14317
14318
14319
14320
14321
14322
14323
14324
14325
14326
14327
14328
14329
14330
14331
14332
14333
14334
14335
14336
14337
14338
14339
14340
14341
14342
14343
14344
14345
14346
14347
14348
14349
14350
14351
14352
14353
14354
14355
14356
14357
14358
14359
14360
14361
14362
14363
14364
14365
14366
14367
14368
14369
14370
14371
14372
14373
14374
14375
14376
14377
14378
14379
14380
14381
14382
14383
14384
14385
14386
14387
14388
14389
14390
14391
14392
14393
14394
14395
14396
14397
14398
14399
14400
14401
14402
14403
14404
14405
14406
14407
14408
14409
14410
14411
14412
14413
14414
14415
14416
14417
14418
14419
14420
14421
14422
14423
14424
14425
14426
14427
14428
14429
14430
14431
14432
14433
14434
14435
14436
14437
14438
14439
14440
14441
14442
14443
14444
14445
14446
14447
14448
14449
14450
14451
14452
14453
14454
14455
14456
14457
14458
14459
14460
14461
14462
14463
14464
14465
14466
14467
14468
14469
14470
14471
14472
14473
14474
14475
14476
14477
14478
14479
14480
14481
14482
14483
14484
14485
14486
14487
14488
14489
14490
14491
14492
14493
14494
14495
14496
14497
14498
14499
14500
14501
14502
14503
14504
14505
14506
14507
14508
14509
14510
14511
14512
14513
14514
14515
14516
14517
14518
14519
14520
14521
14522
14523
14524
14525
14526
14527
14528
14529
14530
14531
14532
14533
14534
14535
14536
14537
14538
14539
14540
14541
14542
14543
14544
14545
14546
14547
14548
14549
14550
14551
14552
14553
14554
14555
14556
14557
14558
14559
14560
14561
14562
14563
14564
14565
14566
14567
14568
14569
14570
14571
14572
14573
14574
14575
14576
14577
14578
14579
14580
14581
14582
14583
14584
14585
14586
14587
14588
14589
14590
14591
14592
14593
14594
14595
14596
14597
14598
14599
14600
14601
14602
14603
14604
14605
14606
14607
14608
14609
14610
14611
14612
14613
14614
14615
14616
14617
14618
14619
14620
14621
14622
14623
14624
14625
14626
14627
14628
14629
14630
14631
14632
14633
14634
14635
14636
14637
14638
14639
14640
14641
14642
14643
14644
14645
14646
14647
14648
14649
14650
14651
14652
14653
14654
14655
14656
14657
14658
14659
14660
14661
14662
14663
14664
14665
14666
14667
14668
14669
14670
14671
14672
14673
14674
14675
14676
14677
14678
14679
14680
14681
14682
14683
14684
14685
14686
14687
14688
14689
14690
14691
14692
14693
14694
14695
14696
14697
14698
14699
14700
14701
14702
14703
14704
14705
14706
14707
14708
14709
14710
14711
14712
14713
14714
14715
14716
14717
14718
14719
14720
14721
14722
14723
14724
14725
14726
14727
14728
14729
14730
14731
14732
14733
14734
14735
14736
14737
14738
14739
14740
14741
14742
14743
14744
14745
14746
14747
14748
14749
14750
14751
14752
14753
14754
14755
14756
14757
14758
14759
14760
14761
14762
14763
14764
14765
14766
14767
14768
14769
14770
14771
14772
14773
14774
14775
14776
14777
14778
14779
14780
14781
14782
14783
14784
14785
14786
14787
14788
14789
14790
14791
14792
14793
14794
14795
14796
14797
14798
14799
14800
14801
14802
14803
14804
14805
14806
14807
14808
14809
14810
14811
14812
14813
14814
14815
14816
14817
14818
14819
14820
14821
14822
14823
14824
14825
14826
14827
14828
14829
14830
14831
14832
14833
14834
14835
14836
14837
14838
14839
14840
14841
14842
14843
14844
14845
14846
14847
14848
14849
14850
14851
14852
14853
14854
14855
14856
14857
14858
14859
14860
14861
14862
14863
14864
14865
14866
14867
14868
14869
14870
14871
14872
14873
14874
14875
14876
14877
14878
14879
14880
14881
14882
14883
14884
14885
14886
14887
14888
14889
14890
14891
14892
14893
14894
14895
14896
14897
14898
14899
14900
14901
14902
14903
14904
14905
14906
14907
14908
14909
14910
14911
14912
14913
14914
14915
14916
14917
14918
14919
14920
14921
14922
14923
14924
14925
14926
14927
14928
14929
14930
14931
14932
14933
14934
14935
14936
14937
14938
14939
14940
14941
14942
14943
14944
14945
14946
14947
14948
14949
14950
14951
14952
14953
14954
14955
14956
14957
14958
14959
14960
14961
14962
14963
14964
14965
14966
14967
14968
14969
14970
14971
14972
14973
14974
14975
14976
14977
14978
14979
14980
14981
14982
14983
14984
14985
14986
14987
14988
14989
14990
14991
14992
14993
14994
14995
14996
14997
14998
14999
15000
15001
15002
15003
15004
15005
15006
15007
15008
15009
15010
15011
15012
15013
15014
15015
15016
15017
15018
15019
15020
15021
15022
15023
15024
15025
15026
15027
15028
15029
15030
15031
15032
15033
15034
15035
15036
15037
15038
15039
15040
15041
15042
15043
15044
15045
15046
15047
15048
15049
15050
15051
15052
15053
15054
15055
15056
15057
15058
15059
15060
15061
15062
15063
15064
15065
15066
15067
15068
15069
15070
15071
15072
15073
15074
15075
15076
15077
15078
15079
15080
15081
15082
15083
15084
15085
15086
15087
15088
15089
15090
15091
15092
15093
15094
15095
15096
15097
15098
15099
15100
15101
15102
15103
15104
15105
15106
15107
15108
15109
15110
15111
15112
15113
15114
15115
15116
15117
15118
15119
15120
15121
15122
15123
15124
15125
15126
15127
15128
15129
15130
15131
15132
15133
15134
15135
15136
15137
15138
15139
15140
15141
15142
15143
15144
15145
15146
15147
15148
15149
15150
15151
15152
15153
15154
15155
15156
15157
15158
15159
15160
15161
15162
15163
15164
15165
15166
15167
15168
15169
15170
15171
15172
15173
15174
15175
15176
15177
15178
15179
15180
15181
15182
15183
15184
15185
15186
15187
15188
15189
15190
15191
15192
15193
15194
15195
15196
15197
15198
15199
15200
15201
15202
15203
15204
15205
15206
15207
15208
15209
15210
15211
15212
15213
15214
15215
15216
15217
15218
15219
15220
15221
15222
15223
15224
15225
15226
15227
15228
15229
15230
15231
15232
15233
15234
15235
15236
15237
15238
15239
15240
15241
15242
15243
15244
15245
15246
15247
15248
15249
15250
15251
15252
15253
15254
15255
15256
15257
15258
15259
15260
15261
15262
15263
15264
15265
15266
15267
15268
15269
15270
15271
15272
15273
15274
15275
15276
15277
15278
15279
15280
15281
15282
15283
15284
15285
15286
15287
15288
15289
15290
15291
15292
15293
15294
15295
15296
15297
15298
15299
15300
15301
15302
15303
15304
15305
15306
15307
15308
15309
15310
15311
15312
15313
15314
15315
15316
15317
15318
15319
15320
15321
15322
15323
15324
15325
15326
15327
15328
15329
15330
15331
15332
15333
15334
15335
15336
15337
15338
15339
15340
15341
15342
15343
15344
15345
15346
15347
15348
15349
15350
15351
15352
15353
15354
15355
15356
15357
15358
15359
15360
15361
15362
15363
15364
15365
15366
15367
15368
15369
15370
15371
15372
15373
15374
15375
15376
15377
15378
15379
15380
15381
15382
15383
15384
15385
15386
15387
15388
15389
15390
15391
15392
15393
15394
15395
15396
15397
15398
15399
15400
15401
15402
15403
15404
15405
15406
15407
15408
15409
15410
15411
15412
15413
15414
15415
15416
15417
15418
15419
15420
15421
15422
15423
15424
15425
15426
15427
15428
15429
15430
15431
15432
15433
15434
15435
15436
15437
15438
15439
15440
15441
15442
15443
15444
15445
15446
15447
15448
15449
15450
15451
15452
15453
15454
15455
15456
15457
15458
15459
15460
15461
15462
15463
15464
15465
15466
15467
15468
15469
15470
15471
15472
15473
15474
15475
15476
15477
15478
15479
15480
15481
15482
15483
15484
15485
15486
15487
15488
15489
15490
15491
15492
15493
15494
15495
15496
15497
15498
15499
15500
15501
15502
15503
15504
15505
15506
15507
15508
15509
15510
15511
15512
15513
15514
15515
15516
15517
15518
15519
15520
15521
15522
15523
15524
15525
15526
15527
15528
15529
15530
15531
15532
15533
15534
15535
15536
15537
15538
15539
15540
15541
15542
15543
15544
15545
15546
15547
15548
15549
15550
15551
15552
15553
15554
15555
15556
15557
15558
15559
15560
15561
15562
15563
15564
15565
15566
15567
15568
15569
15570
15571
15572
15573
15574
15575
15576
15577
15578
15579
15580
15581
15582
15583
15584
15585
15586
15587
15588
15589
15590
15591
15592
15593
15594
15595
15596
15597
15598
15599
15600
15601
15602
15603
15604
15605
15606
15607
15608
15609
15610
15611
15612
15613
15614
15615
15616
15617
15618
15619
15620
15621
15622
15623
15624
15625
15626
15627
15628
15629
15630
15631
15632
15633
15634
15635
15636
15637
15638
15639
15640
15641
15642
15643
15644
15645
15646
15647
15648
15649
15650
15651
15652
15653
15654
15655
15656
15657
15658
15659
15660
15661
15662
15663
15664
15665
15666
15667
15668
15669
15670
15671
15672
15673
15674
15675
15676
15677
15678
15679
15680
15681
15682
15683
15684
15685
15686
15687
15688
15689
15690
15691
15692
15693
15694
15695
15696
15697
15698
15699
15700
15701
15702
15703
15704
15705
15706
15707
15708
15709
15710
15711
15712
15713
15714
15715
15716
15717
15718
15719
15720
15721
15722
15723
15724
15725
15726
15727
15728
15729
15730
15731
15732
15733
15734
15735
15736
15737
15738
15739
15740
15741
15742
15743
15744
15745
15746
15747
15748
15749
15750
15751
15752
15753
15754
15755
15756
15757
15758
15759
15760
15761
15762
15763
15764
15765
15766
15767
15768
15769
15770
15771
15772
15773
15774
15775
15776
15777
15778
15779
15780
15781
15782
15783
15784
15785
15786
15787
15788
15789
15790
15791
15792
15793
15794
15795
15796
15797
15798
15799
15800
15801
15802
15803
15804
15805
15806
15807
15808
15809
15810
15811
15812
15813
15814
15815
15816
15817
15818
15819
15820
15821
15822
15823
15824
15825
15826
15827
15828
15829
15830
15831
15832
15833
15834
15835
15836
15837
15838
15839
15840
15841
15842
15843
15844
15845
15846
15847
15848
15849
15850
15851
15852
15853
15854
15855
15856
15857
15858
15859
15860
15861
15862
15863
15864
15865
15866
15867
15868
15869
15870
15871
15872
15873
15874
15875
15876
15877
15878
15879
15880
15881
15882
15883
15884
15885
15886
15887
15888
15889
15890
15891
15892
15893
15894
15895
15896
15897
15898
15899
15900
15901
15902
15903
15904
15905
15906
15907
15908
15909
15910
15911
15912
15913
15914
15915
15916
15917
15918
15919
15920
15921
15922
15923
15924
15925
15926
15927
15928
15929
15930
15931
15932
15933
15934
15935
15936
15937
15938
15939
15940
15941
15942
15943
15944
15945
15946
15947
15948
15949
15950
15951
15952
15953
15954
15955
15956
15957
15958
15959
15960
15961
15962
15963
15964
15965
15966
15967
15968
15969
15970
15971
15972
15973
15974
15975
15976
15977
15978
15979
15980
15981
15982
15983
15984
15985
15986
15987
15988
15989
15990
15991
15992
15993
15994
15995
15996
15997
15998
15999
16000
16001
16002
16003
16004
16005
16006
16007
16008
16009
16010
16011
16012
16013
16014
16015
16016
16017
16018
16019
16020
16021
16022
16023
16024
16025
16026
16027
16028
16029
16030
16031
16032
16033
16034
16035
16036
16037
16038
16039
16040
16041
16042
16043
16044
16045
16046
16047
16048
16049
16050
16051
16052
16053
16054
16055
16056
16057
16058
16059
16060
16061
16062
16063
16064
16065
16066
16067
16068
16069
16070
16071
16072
16073
16074
16075
16076
16077
16078
16079
16080
16081
16082
16083
16084
16085
16086
16087
16088
16089
16090
16091
16092
16093
16094
16095
16096
16097
16098
16099
16100
16101
16102
16103
16104
16105
16106
16107
16108
16109
16110
16111
16112
16113
16114
16115
16116
16117
16118
16119
16120
16121
16122
16123
16124
16125
16126
16127
16128
16129
16130
16131
16132
16133
16134
16135
16136
16137
16138
16139
16140
16141
16142
16143
16144
16145
16146
16147
16148
16149
16150
16151
16152
16153
16154
16155
16156
16157
16158
16159
16160
16161
16162
16163
16164
16165
16166
16167
16168
16169
16170
16171
16172
16173
16174
16175
16176
16177
16178
16179
16180
16181
16182
16183
16184
16185
16186
16187
16188
16189
16190
16191
16192
16193
16194
16195
16196
16197
16198
16199
16200
16201
16202
16203
16204
16205
16206
16207
16208
16209
16210
16211
16212
16213
16214
16215
16216
16217
16218
16219
16220
16221
16222
16223
16224
16225
16226
16227
16228
16229
16230
16231
16232
16233
16234
16235
16236
16237
16238
16239
16240
16241
16242
16243
16244
16245
16246
16247
16248
16249
16250
16251
16252
16253
16254
16255
16256
16257
16258
16259
16260
16261
16262
16263
16264
16265
16266
16267
16268
16269
16270
16271
16272
16273
16274
16275
16276
16277
16278
16279
16280
16281
16282
16283
16284
16285
16286
16287
16288
16289
16290
16291
16292
16293
16294
16295
16296
16297
16298
16299
16300
16301
16302
16303
16304
16305
16306
16307
16308
16309
16310
16311
16312
16313
16314
16315
16316
16317
16318
16319
16320
16321
16322
16323
16324
16325
16326
16327
16328
16329
16330
16331
16332
16333
16334
16335
16336
16337
16338
16339
16340
16341
16342
16343
16344
16345
16346
16347
16348
16349
16350
16351
16352
16353
16354
16355
16356
16357
16358
16359
16360
16361
16362
16363
16364
16365
16366
16367
16368
16369
16370
16371
16372
16373
16374
16375
16376
16377
16378
16379
16380
16381
16382
16383
16384
16385
16386
16387
16388
16389
16390
16391
16392
16393
16394
16395
16396
16397
16398
16399
16400
16401
16402
16403
16404
16405
16406
16407
16408
16409
16410
16411
16412
16413
16414
16415
16416
16417
16418
16419
16420
16421
16422
16423
16424
16425
16426
16427
16428
16429
16430
16431
16432
16433
16434
16435
16436
16437
16438
16439
16440
16441
16442
16443
16444
16445
16446
16447
16448
16449
16450
16451
16452
16453
16454
16455
16456
16457
16458
16459
16460
16461
16462
16463
16464
16465
16466
16467
16468
16469
16470
16471
16472
16473
16474
16475
16476
16477
16478
16479
16480
16481
16482
16483
16484
16485
16486
16487
16488
16489
16490
16491
16492
16493
16494
16495
16496
16497
16498
16499
16500
16501
16502
16503
16504
16505
16506
16507
16508
16509
16510
16511
16512
16513
16514
16515
16516
16517
16518
16519
16520
16521
16522
16523
16524
16525
16526
16527
16528
16529
16530
16531
16532
16533
16534
16535
16536
16537
16538
16539
16540
16541
16542
16543
16544
16545
16546
16547
16548
16549
16550
16551
16552
16553
16554
16555
16556
16557
16558
16559
16560
16561
16562
16563
16564
16565
16566
16567
16568
16569
16570
16571
16572
16573
16574
16575
16576
16577
16578
16579
16580
16581
16582
16583
16584
16585
16586
16587
16588
16589
16590
16591
16592
16593
16594
16595
16596
16597
16598
16599
16600
16601
16602
16603
16604
16605
16606
16607
16608
16609
16610
16611
16612
16613
16614
16615
16616
16617
16618
16619
16620
16621
16622
16623
16624
16625
16626
16627
16628
16629
16630
16631
16632
16633
16634
16635
16636
16637
16638
16639
16640
16641
16642
16643
16644
16645
16646
16647
16648
16649
16650
16651
16652
16653
16654
16655
16656
16657
16658
16659
16660
16661
16662
16663
16664
16665
16666
16667
16668
16669
16670
16671
16672
16673
16674
16675
16676
16677
16678
16679
16680
16681
16682
16683
16684
16685
16686
16687
16688
16689
16690
16691
16692
16693
16694
16695
16696
16697
16698
16699
16700
16701
16702
16703
16704
16705
16706
16707
16708
16709
16710
16711
16712
16713
16714
16715
16716
16717
16718
16719
16720
16721
16722
16723
16724
16725
16726
16727
16728
16729
16730
16731
16732
16733
16734
16735
16736
16737
16738
16739
16740
16741
16742
16743
16744
16745
16746
16747
16748
16749
16750
16751
16752
16753
16754
16755
16756
16757
16758
16759
16760
16761
16762
16763
16764
16765
16766
16767
16768
16769
16770
16771
16772
16773
16774
16775
16776
16777
16778
16779
16780
16781
16782
16783
16784
16785
16786
16787
16788
16789
16790
16791
16792
16793
16794
16795
16796
16797
16798
16799
16800
16801
16802
16803
16804
16805
16806
16807
16808
16809
16810
16811
16812
16813
16814
16815
16816
16817
16818
16819
16820
16821
16822
16823
16824
16825
16826
16827
16828
16829
16830
16831
16832
16833
16834
16835
16836
16837
16838
16839
16840
16841
16842
16843
16844
16845
16846
16847
16848
16849
16850
16851
16852
16853
16854
16855
16856
16857
16858
16859
16860
16861
16862
16863
16864
16865
16866
16867
16868
16869
16870
16871
16872
16873
16874
16875
16876
16877
16878
16879
16880
16881
16882
16883
16884
16885
16886
16887
16888
16889
16890
16891
16892
16893
16894
16895
16896
16897
16898
16899
16900
16901
16902
16903
16904
16905
16906
16907
16908
16909
16910
16911
16912
16913
16914
16915
16916
16917
16918
16919
16920
16921
16922
16923
16924
16925
16926
16927
16928
16929
16930
16931
16932
16933
16934
16935
16936
16937
16938
16939
16940
16941
16942
16943
16944
16945
16946
16947
16948
16949
16950
16951
16952
16953
16954
16955
16956
16957
16958
16959
16960
16961
16962
16963
16964
16965
16966
16967
16968
16969
16970
16971
16972
16973
16974
16975
16976
16977
16978
16979
16980
16981
16982
16983
16984
16985
16986
16987
16988
16989
16990
16991
16992
16993
16994
16995
16996
16997
16998
16999
17000
17001
17002
17003
17004
17005
17006
17007
17008
17009
17010
17011
17012
17013
17014
17015
17016
17017
17018
17019
17020
17021
17022
17023
17024
17025
17026
17027
17028
17029
17030
17031
17032
17033
17034
17035
17036
17037
17038
17039
17040
17041
17042
17043
17044
17045
17046
17047
17048
17049
17050
17051
17052
17053
17054
17055
17056
17057
17058
17059
17060
17061
17062
17063
17064
17065
17066
17067
17068
17069
17070
17071
17072
17073
17074
17075
17076
17077
17078
17079
17080
17081
17082
17083
17084
17085
17086
17087
17088
17089
17090
17091
17092
17093
17094
17095
17096
17097
17098
17099
17100
17101
17102
17103
17104
17105
17106
17107
17108
17109
17110
17111
17112
17113
17114
17115
17116
17117
17118
17119
17120
17121
17122
17123
17124
17125
17126
17127
17128
17129
17130
17131
17132
17133
17134
17135
17136
17137
17138
17139
17140
17141
17142
17143
17144
17145
17146
17147
17148
17149
17150
17151
17152
17153
17154
17155
17156
17157
17158
17159
17160
17161
17162
17163
17164
17165
17166
17167
17168
17169
17170
17171
17172
17173
17174
17175
17176
17177
17178
17179
17180
17181
17182
17183
17184
17185
17186
17187
17188
17189
17190
17191
17192
17193
17194
17195
17196
17197
17198
17199
17200
17201
17202
17203
17204
17205
17206
17207
17208
17209
17210
17211
17212
17213
17214
17215
17216
17217
17218
17219
17220
17221
17222
17223
17224
17225
17226
17227
17228
17229
17230
17231
17232
17233
17234
17235
17236
17237
17238
17239
17240
17241
17242
17243
17244
17245
17246
17247
17248
17249
17250
17251
17252
17253
17254
17255
17256
17257
17258
17259
17260
17261
17262
17263
17264
17265
17266
17267
17268
17269
17270
17271
17272
17273
17274
17275
17276
17277
17278
17279
17280
17281
17282
17283
17284
17285
17286
17287
17288
17289
17290
17291
17292
17293
17294
17295
17296
17297
17298
17299
17300
17301
17302
17303
17304
17305
17306
17307
17308
17309
17310
17311
17312
17313
17314
17315
17316
17317
17318
17319
17320
17321
17322
17323
17324
17325
17326
17327
17328
17329
17330
17331
17332
17333
17334
17335
17336
17337
17338
17339
17340
17341
17342
17343
17344
17345
17346
17347
17348
17349
17350
17351
17352
17353
17354
17355
17356
17357
17358
17359
17360
17361
17362
17363
17364
17365
17366
17367
17368
17369
17370
17371
17372
17373
17374
17375
17376
17377
17378
17379
17380
17381
17382
17383
17384
17385
17386
17387
17388
17389
17390
17391
17392
17393
17394
17395
17396
17397
17398
17399
17400
17401
17402
17403
17404
17405
17406
17407
17408
17409
17410
17411
17412
17413
17414
17415
17416
17417
17418
17419
17420
17421
17422
17423
17424
17425
17426
17427
17428
17429
17430
17431
17432
17433
17434
17435
17436
17437
17438
17439
17440
17441
17442
17443
17444
17445
17446
17447
17448
17449
17450
17451
17452
17453
17454
17455
17456
17457
17458
17459
17460
17461
17462
17463
17464
17465
17466
17467
17468
17469
17470
17471
17472
17473
17474
17475
17476
17477
17478
17479
17480
17481
17482
17483
17484
17485
17486
17487
17488
17489
17490
17491
17492
17493
17494
17495
17496
17497
17498
17499
17500
17501
17502
17503
17504
17505
17506
17507
17508
17509
17510
17511
17512
17513
17514
17515
17516
17517
17518
17519
17520
17521
17522
17523
17524
17525
17526
17527
17528
17529
17530
17531
17532
17533
17534
17535
17536
17537
17538
17539
17540
17541
17542
17543
17544
17545
17546
17547
17548
17549
17550
17551
17552
17553
17554
17555
17556
17557
17558
17559
17560
17561
17562
17563
17564
17565
17566
17567
17568
17569
17570
17571
17572
17573
17574
17575
17576
17577
17578
17579
17580
17581
17582
17583
17584
17585
17586
17587
17588
17589
17590
17591
17592
17593
17594
17595
17596
17597
17598
17599
17600
17601
17602
17603
17604
17605
17606
17607
17608
17609
17610
17611
17612
17613
17614
17615
17616
17617
17618
17619
17620
17621
17622
17623
17624
17625
17626
17627
17628
17629
17630
17631
17632
17633
17634
17635
17636
17637
17638
17639
17640
17641
17642
17643
17644
17645
17646
17647
17648
17649
17650
17651
17652
17653
17654
17655
17656
17657
17658
17659
17660
17661
17662
17663
17664
17665
17666
17667
17668
17669
17670
17671
17672
17673
17674
17675
17676
17677
17678
17679
17680
17681
17682
17683
17684
17685
17686
17687
17688
17689
17690
17691
17692
17693
17694
17695
17696
17697
17698
17699
17700
17701
17702
17703
17704
17705
17706
17707
17708
17709
17710
17711
17712
17713
17714
17715
17716
17717
17718
17719
17720
17721
17722
17723
17724
17725
17726
17727
17728
17729
17730
17731
17732
17733
17734
17735
17736
17737
17738
17739
17740
17741
17742
17743
17744
17745
17746
17747
17748
17749
17750
17751
17752
17753
17754
17755
17756
17757
17758
17759
17760
17761
17762
17763
17764
17765
17766
17767
17768
17769
17770
17771
17772
17773
17774
17775
17776
17777
17778
17779
17780
17781
17782
17783
17784
17785
17786
17787
17788
17789
17790
17791
17792
17793
17794
17795
17796
17797
17798
17799
17800
17801
17802
17803
17804
17805
17806
17807
17808
17809
17810
17811
17812
17813
17814
17815
17816
17817
17818
17819
17820
17821
17822
17823
17824
17825
17826
17827
17828
17829
17830
17831
17832
17833
17834
17835
17836
17837
17838
17839
17840
17841
17842
17843
17844
17845
17846
17847
17848
17849
17850
17851
17852
17853
17854
17855
17856
17857
17858
17859
17860
17861
17862
17863
17864
17865
17866
17867
17868
17869
17870
17871
17872
17873
17874
17875
17876
17877
17878
17879
17880
17881
17882
17883
17884
17885
17886
17887
17888
17889
17890
17891
17892
17893
17894
17895
17896
17897
17898
17899
17900
17901
17902
17903
17904
17905
17906
17907
17908
17909
17910
17911
17912
17913
17914
17915
17916
17917
17918
17919
17920
17921
17922
17923
17924
17925
17926
17927
17928
17929
17930
17931
17932
17933
17934
17935
17936
17937
17938
17939
17940
17941
17942
17943
17944
17945
17946
17947
17948
17949
17950
17951
17952
17953
17954
17955
17956
17957
17958
17959
17960
17961
17962
17963
17964
17965
17966
17967
17968
17969
17970
17971
17972
17973
17974
17975
17976
17977
17978
17979
17980
17981
17982
17983
17984
17985
17986
17987
17988
17989
17990
17991
17992
17993
17994
17995
17996
17997
17998
17999
18000
18001
18002
18003
18004
18005
18006
18007
18008
18009
18010
18011
18012
18013
18014
18015
18016
18017
18018
18019
18020
18021
18022
18023
18024
18025
18026
18027
18028
18029
18030
18031
18032
18033
18034
18035
18036
18037
18038
18039
18040
18041
18042
18043
18044
18045
18046
18047
18048
18049
18050
18051
18052
18053
18054
18055
18056
18057
18058
18059
18060
18061
18062
18063
18064
18065
18066
18067
18068
18069
18070
18071
18072
18073
18074
18075
18076
18077
18078
18079
18080
18081
18082
18083
18084
18085
18086
18087
18088
18089
18090
18091
18092
18093
18094
18095
18096
18097
18098
18099
18100
18101
18102
18103
18104
18105
18106
18107
18108
18109
18110
18111
18112
18113
18114
18115
18116
18117
18118
18119
18120
18121
18122
18123
18124
18125
18126
18127
18128
18129
18130
18131
18132
18133
18134
18135
18136
18137
18138
18139
18140
18141
18142
18143
18144
18145
18146
18147
18148
18149
18150
18151
18152
18153
18154
18155
18156
18157
18158
18159
18160
18161
18162
18163
18164
18165
18166
18167
18168
18169
18170
18171
18172
18173
18174
18175
18176
18177
18178
18179
18180
18181
18182
18183
18184
18185
18186
18187
18188
18189
18190
18191
18192
18193
18194
18195
18196
18197
18198
18199
18200
18201
18202
18203
18204
18205
18206
18207
18208
18209
18210
18211
18212
18213
18214
18215
18216
18217
18218
18219
18220
18221
18222
18223
18224
18225
18226
18227
18228
18229
18230
18231
18232
18233
18234
18235
18236
18237
18238
18239
18240
18241
18242
18243
18244
18245
18246
18247
18248
18249
18250
18251
18252
18253
18254
18255
18256
18257
18258
18259
18260
18261
18262
18263
18264
18265
18266
18267
18268
18269
18270
18271
18272
18273
18274
18275
18276
18277
18278
18279
18280
18281
18282
18283
18284
18285
18286
18287
18288
18289
18290
18291
18292
18293
18294
18295
18296
18297
18298
18299
18300
18301
18302
18303
18304
18305
18306
18307
18308
18309
18310
18311
18312
18313
18314
18315
18316
18317
18318
18319
18320
18321
18322
18323
18324
18325
18326
18327
18328
18329
18330
18331
18332
18333
18334
18335
18336
18337
18338
18339
18340
18341
18342
18343
18344
18345
18346
18347
18348
18349
18350
18351
18352
18353
18354
18355
18356
18357
18358
18359
18360
18361
18362
18363
18364
18365
18366
18367
18368
18369
18370
18371
18372
18373
18374
18375
18376
18377
18378
18379
18380
18381
18382
18383
18384
18385
18386
18387
18388
18389
18390
18391
18392
18393
18394
18395
18396
18397
18398
18399
18400
18401
18402
18403
18404
18405
18406
18407
18408
18409
18410
18411
18412
18413
18414
18415
18416
18417
18418
18419
18420
18421
18422
18423
18424
18425
18426
18427
18428
18429
18430
18431
18432
18433
18434
18435
18436
18437
18438
18439
18440
18441
18442
18443
18444
18445
18446
18447
18448
18449
18450
18451
18452
18453
18454
18455
18456
18457
18458
18459
18460
18461
18462
18463
18464
18465
18466
18467
18468
18469
18470
18471
18472
18473
18474
18475
18476
18477
18478
18479
18480
18481
18482
18483
18484
18485
18486
18487
18488
18489
18490
18491
18492
18493
18494
18495
18496
18497
18498
18499
18500
18501
18502
18503
18504
18505
18506
18507
18508
18509
18510
18511
18512
18513
18514
18515
18516
18517
18518
18519
18520
18521
18522
18523
18524
18525
18526
18527
18528
18529
18530
18531
18532
18533
18534
18535
18536
18537
18538
18539
18540
18541
18542
18543
18544
18545
18546
18547
18548
18549
18550
18551
18552
18553
18554
18555
18556
18557
18558
18559
18560
18561
18562
18563
18564
18565
18566
18567
18568
18569
18570
18571
18572
18573
18574
18575
18576
18577
18578
18579
18580
18581
18582
18583
18584
18585
18586
18587
18588
18589
18590
18591
18592
18593
18594
18595
18596
18597
18598
18599
18600
18601
18602
18603
18604
18605
18606
18607
18608
18609
18610
18611
18612
18613
18614
18615
18616
18617
18618
18619
18620
18621
18622
18623
18624
18625
18626
18627
18628
18629
18630
18631
18632
18633
18634
18635
18636
18637
18638
18639
18640
18641
18642
18643
18644
18645
18646
18647
18648
18649
18650
18651
18652
18653
18654
18655
18656
18657
18658
18659
18660
18661
18662
18663
18664
18665
18666
18667
18668
18669
18670
18671
18672
18673
18674
18675
18676
18677
18678
18679
18680
18681
18682
18683
18684
18685
18686
18687
18688
18689
18690
18691
18692
18693
18694
18695
18696
18697
18698
18699
18700
18701
18702
18703
18704
18705
18706
18707
18708
18709
18710
18711
18712
18713
18714
18715
18716
18717
18718
18719
18720
18721
18722
18723
18724
18725
18726
18727
18728
18729
18730
18731
18732
18733
18734
18735
18736
18737
18738
18739
18740
18741
18742
18743
18744
18745
18746
18747
18748
18749
18750
18751
18752
18753
18754
18755
18756
18757
18758
18759
18760
18761
18762
18763
18764
18765
18766
18767
18768
18769
18770
18771
18772
18773
18774
18775
18776
18777
18778
18779
18780
18781
18782
18783
18784
18785
18786
18787
18788
18789
18790
18791
18792
18793
18794
18795
18796
18797
18798
18799
18800
18801
18802
18803
18804
18805
18806
18807
18808
18809
18810
18811
18812
18813
18814
18815
18816
18817
18818
18819
18820
18821
18822
18823
18824
18825
18826
18827
18828
18829
18830
18831
18832
18833
18834
18835
18836
18837
18838
18839
18840
18841
18842
18843
18844
18845
18846
18847
18848
18849
18850
18851
18852
18853
18854
18855
18856
18857
18858
18859
18860
18861
18862
18863
18864
18865
18866
18867
18868
18869
18870
18871
18872
18873
18874
18875
18876
18877
18878
18879
18880
18881
18882
18883
18884
18885
18886
18887
18888
18889
18890
18891
18892
18893
18894
18895
18896
18897
18898
18899
18900
18901
18902
18903
18904
18905
18906
18907
18908
18909
18910
18911
18912
18913
18914
18915
18916
18917
18918
18919
18920
18921
18922
18923
18924
18925
18926
18927
18928
18929
18930
18931
18932
18933
18934
18935
18936
18937
18938
18939
18940
18941
18942
18943
18944
18945
18946
18947
18948
18949
18950
18951
18952
18953
18954
18955
18956
18957
18958
18959
18960
18961
18962
18963
18964
18965
18966
18967
18968
18969
18970
18971
18972
18973
18974
18975
18976
18977
18978
18979
18980
18981
18982
18983
18984
18985
18986
18987
18988
18989
18990
18991
18992
18993
18994
18995
18996
18997
18998
18999
19000
19001
19002
19003
19004
19005
19006
19007
19008
19009
19010
19011
19012
19013
19014
19015
19016
19017
19018
19019
19020
19021
19022
19023
19024
19025
19026
19027
19028
19029
19030
19031
19032
19033
19034
19035
19036
19037
19038
19039
19040
19041
19042
19043
19044
19045
19046
19047
19048
19049
19050
19051
19052
19053
19054
19055
19056
19057
19058
19059
19060
19061
19062
19063
19064
19065
19066
19067
19068
19069
19070
19071
19072
19073
19074
19075
19076
19077
19078
19079
19080
19081
19082
19083
19084
19085
19086
19087
19088
19089
19090
19091
19092
19093
19094
19095
19096
19097
19098
19099
19100
19101
19102
19103
19104
19105
19106
19107
19108
19109
19110
19111
19112
19113
19114
19115
19116
19117
19118
19119
19120
19121
19122
19123
19124
19125
19126
19127
19128
19129
19130
19131
19132
19133
19134
19135
19136
19137
19138
19139
19140
19141
19142
19143
19144
19145
19146
19147
19148
19149
19150
19151
19152
19153
19154
19155
19156
19157
19158
19159
19160
19161
19162
19163
19164
19165
19166
19167
19168
19169
19170
19171
19172
19173
19174
19175
19176
19177
19178
19179
19180
19181
19182
19183
19184
19185
19186
19187
19188
19189
19190
19191
19192
19193
19194
19195
19196
19197
19198
19199
19200
19201
19202
19203
19204
19205
19206
19207
19208
19209
19210
19211
19212
19213
19214
19215
19216
19217
19218
19219
19220
19221
19222
19223
19224
19225
19226
19227
19228
19229
19230
19231
19232
19233
19234
19235
19236
19237
19238
19239
19240
19241
19242
19243
19244
19245
19246
19247
19248
19249
19250
19251
19252
19253
19254
19255
19256
19257
19258
19259
19260
19261
19262
19263
19264
19265
19266
19267
19268
19269
19270
19271
19272
19273
19274
19275
19276
19277
19278
19279
19280
19281
19282
19283
19284
19285
19286
19287
19288
19289
19290
19291
19292
19293
19294
19295
19296
19297
19298
19299
19300
19301
19302
19303
19304
19305
19306
19307
19308
19309
19310
19311
19312
19313
19314
19315
19316
19317
19318
19319
19320
19321
19322
19323
19324
19325
19326
19327
19328
19329
19330
19331
19332
19333
19334
19335
19336
19337
19338
19339
19340
19341
19342
19343
19344
19345
19346
19347
19348
19349
19350
19351
19352
19353
19354
19355
19356
19357
19358
19359
19360
19361
19362
19363
19364
19365
19366
19367
19368
19369
19370
19371
19372
19373
19374
19375
19376
19377
19378
19379
19380
19381
19382
19383
19384
19385
19386
19387
19388
19389
19390
19391
19392
19393
19394
19395
19396
19397
19398
19399
19400
19401
19402
19403
19404
19405
19406
19407
19408
19409
19410
19411
19412
19413
19414
19415
19416
19417
19418
19419
19420
19421
19422
19423
19424
19425
19426
19427
19428
19429
19430
19431
19432
19433
19434
19435
19436
19437
19438
19439
19440
19441
19442
19443
19444
19445
19446
19447
19448
19449
19450
19451
19452
19453
19454
19455
19456
19457
19458
19459
19460
19461
19462
19463
19464
19465
19466
19467
19468
19469
19470
19471
19472
19473
19474
19475
19476
19477
19478
19479
19480
19481
19482
19483
19484
19485
19486
19487
19488
19489
19490
19491
19492
19493
19494
19495
19496
19497
19498
19499
19500
19501
19502
19503
19504
19505
19506
19507
19508
19509
19510
19511
19512
19513
19514
19515
19516
19517
19518
19519
19520
19521
19522
19523
19524
19525
19526
19527
19528
19529
19530
19531
19532
19533
19534
19535
19536
19537
19538
19539
19540
19541
19542
19543
19544
19545
19546
19547
19548
19549
19550
19551
19552
19553
19554
19555
19556
19557
19558
19559
19560
19561
19562
19563
19564
19565
19566
19567
19568
19569
19570
19571
19572
19573
19574
19575
19576
19577
19578
19579
19580
19581
19582
19583
19584
19585
19586
19587
19588
19589
19590
19591
19592
19593
19594
19595
19596
19597
19598
19599
19600
19601
19602
19603
19604
19605
19606
19607
19608
19609
19610
19611
19612
19613
19614
19615
19616
19617
19618
19619
19620
19621
19622
19623
19624
19625
19626
19627
19628
19629
19630
19631
19632
19633
19634
19635
19636
19637
19638
19639
19640
19641
19642
19643
19644
19645
19646
19647
19648
19649
19650
19651
19652
19653
19654
19655
19656
19657
19658
19659
19660
19661
19662
19663
19664
19665
19666
19667
19668
19669
19670
19671
19672
19673
19674
19675
19676
19677
19678
19679
19680
19681
19682
19683
19684
19685
19686
19687
19688
19689
19690
19691
19692
19693
19694
19695
19696
19697
19698
19699
19700
19701
19702
19703
19704
19705
19706
19707
19708
19709
19710
19711
19712
19713
19714
19715
19716
19717
19718
19719
19720
19721
19722
19723
19724
19725
19726
19727
19728
19729
19730
19731
19732
19733
19734
19735
19736
19737
19738
19739
19740
19741
19742
19743
19744
19745
19746
19747
19748
19749
19750
19751
19752
19753
19754
19755
19756
19757
19758
19759
19760
19761
19762
19763
19764
19765
19766
19767
19768
19769
19770
19771
19772
19773
19774
19775
19776
19777
19778
19779
19780
19781
19782
19783
19784
19785
19786
19787
19788
19789
19790
19791
19792
19793
19794
19795
19796
19797
19798
19799
19800
19801
19802
19803
19804
19805
19806
19807
19808
19809
19810
19811
19812
19813
19814
19815
19816
19817
19818
19819
19820
19821
19822
19823
19824
19825
19826
19827
19828
19829
19830
19831
19832
19833
19834
19835
19836
19837
19838
19839
19840
19841
19842
19843
19844
19845
19846
19847
19848
19849
19850
19851
19852
19853
19854
19855
19856
19857
19858
19859
19860
19861
19862
19863
19864
19865
19866
19867
19868
19869
19870
19871
19872
19873
19874
19875
19876
19877
19878
19879
19880
19881
19882
19883
19884
19885
19886
19887
19888
19889
19890
19891
19892
19893
19894
19895
19896
19897
19898
19899
19900
19901
19902
19903
19904
19905
19906
19907
19908
19909
19910
19911
19912
19913
19914
19915
19916
19917
19918
19919
19920
19921
19922
19923
19924
19925
19926
19927
19928
19929
19930
19931
19932
19933
19934
19935
19936
19937
19938
19939
19940
19941
19942
19943
19944
19945
19946
19947
19948
19949
19950
19951
19952
19953
19954
19955
19956
19957
19958
19959
19960
19961
19962
19963
19964
19965
19966
19967
19968
19969
19970
19971
19972
19973
19974
19975
19976
19977
19978
19979
19980
19981
19982
19983
19984
19985
19986
19987
19988
19989
19990
19991
19992
19993
19994
19995
19996
19997
19998
19999
20000
20001
20002
20003
20004
20005
20006
20007
20008
20009
20010
20011
20012
20013
20014
20015
20016
20017
20018
20019
20020
20021
20022
20023
20024
20025
20026
20027
20028
20029
20030
20031
20032
20033
20034
20035
20036
20037
20038
20039
20040
20041
20042
20043
20044
20045
20046
20047
20048
20049
20050
20051
20052
20053
20054
20055
20056
20057
20058
20059
20060
20061
20062
20063
20064
20065
20066
20067
20068
20069
20070
20071
20072
20073
20074
20075
20076
20077
20078
20079
20080
20081
20082
20083
20084
20085
20086
20087
20088
20089
20090
20091
20092
20093
20094
20095
20096
20097
20098
20099
20100
20101
20102
20103
20104
20105
20106
20107
20108
20109
20110
20111
20112
20113
20114
20115
20116
20117
20118
20119
20120
20121
20122
20123
20124
20125
20126
20127
20128
20129
20130
20131
20132
20133
20134
20135
20136
20137
20138
20139
20140
20141
20142
20143
20144
20145
20146
20147
20148
20149
20150
20151
20152
20153
20154
20155
20156
20157
20158
20159
20160
20161
20162
20163
20164
20165
20166
20167
20168
20169
20170
20171
20172
20173
20174
20175
20176
20177
20178
20179
20180
20181
20182
20183
20184
20185
20186
20187
20188
20189
20190
20191
20192
20193
20194
20195
20196
20197
20198
20199
20200
20201
20202
20203
20204
20205
20206
20207
20208
20209
20210
20211
20212
20213
20214
20215
20216
20217
20218
20219
20220
20221
20222
20223
20224
20225
20226
20227
20228
20229
20230
20231
20232
20233
20234
20235
20236
20237
20238
20239
20240
20241
20242
20243
20244
20245
20246
20247
20248
20249
20250
20251
20252
20253
20254
20255
20256
20257
20258
20259
20260
20261
20262
20263
20264
20265
20266
20267
20268
20269
20270
20271
20272
20273
20274
20275
20276
20277
20278
20279
20280
20281
20282
20283
20284
20285
20286
20287
20288
20289
20290
20291
20292
20293
20294
20295
20296
20297
20298
20299
20300
20301
20302
20303
20304
20305
20306
20307
20308
20309
20310
20311
20312
20313
20314
20315
20316
20317
20318
20319
20320
20321
20322
20323
20324
20325
20326
20327
20328
20329
20330
20331
20332
20333
20334
20335
20336
20337
20338
20339
20340
20341
20342
20343
20344
20345
20346
20347
20348
20349
20350
20351
20352
20353
20354
20355
20356
20357
20358
20359
20360
20361
20362
20363
20364
20365
20366
20367
20368
20369
20370
20371
20372
20373
20374
20375
20376
20377
20378
20379
20380
20381
20382
20383
20384
20385
20386
20387
20388
20389
20390
20391
20392
20393
20394
20395
20396
20397
20398
20399
20400
20401
20402
20403
20404
20405
20406
20407
20408
20409
20410
20411
20412
20413
20414
20415
20416
20417
20418
20419
20420
20421
20422
20423
20424
20425
20426
20427
20428
20429
20430
20431
20432
20433
20434
20435
20436
20437
20438
20439
20440
20441
20442
20443
20444
20445
20446
20447
20448
20449
20450
20451
20452
20453
20454
20455
20456
20457
20458
20459
20460
20461
20462
20463
20464
20465
20466
20467
20468
20469
20470
20471
20472
20473
20474
20475
20476
20477
20478
20479
20480
20481
20482
20483
20484
20485
20486
20487
20488
20489
20490
20491
20492
20493
20494
20495
20496
20497
20498
20499
20500
20501
20502
20503
20504
20505
20506
20507
20508
20509
20510
20511
20512
20513
20514
20515
20516
20517
20518
20519
20520
20521
20522
20523
20524
20525
20526
20527
20528
20529
20530
20531
20532
20533
20534
20535
20536
20537
20538
20539
20540
20541
20542
20543
20544
20545
20546
20547
20548
20549
20550
20551
20552
20553
20554
20555
20556
20557
20558
20559
20560
20561
20562
20563
20564
20565
20566
20567
20568
20569
20570
20571
20572
20573
20574
20575
20576
20577
20578
20579
20580
20581
20582
20583
20584
20585
20586
20587
20588
20589
20590
20591
20592
20593
20594
20595
20596
20597
20598
20599
20600
20601
20602
20603
20604
20605
20606
20607
20608
20609
20610
20611
20612
20613
20614
20615
20616
20617
20618
20619
20620
20621
20622
20623
20624
20625
20626
20627
20628
20629
20630
20631
20632
20633
20634
20635
20636
20637
20638
20639
20640
20641
20642
20643
20644
20645
20646
20647
20648
20649
20650
20651
20652
20653
20654
20655
20656
20657
20658
20659
20660
20661
20662
20663
20664
20665
20666
20667
20668
20669
20670
20671
20672
20673
20674
20675
20676
20677
20678
20679
20680
20681
20682
20683
20684
20685
20686
20687
20688
20689
20690
20691
20692
20693
20694
20695
20696
20697
20698
20699
20700
20701
20702
20703
20704
20705
20706
20707
20708
20709
20710
20711
20712
20713
20714
20715
20716
20717
20718
20719
20720
20721
20722
20723
20724
20725
20726
20727
20728
20729
20730
20731
20732
20733
20734
20735
20736
20737
20738
20739
20740
20741
20742
20743
20744
20745
20746
20747
20748
20749
20750
20751
20752
20753
20754
20755
20756
20757
20758
20759
20760
20761
20762
20763
20764
20765
20766
20767
20768
20769
20770
20771
20772
20773
20774
20775
20776
20777
20778
20779
20780
20781
20782
20783
20784
20785
20786
20787
20788
20789
20790
20791
20792
20793
20794
20795
20796
20797
20798
20799
20800
20801
20802
20803
20804
20805
20806
20807
20808
20809
20810
20811
20812
20813
20814
20815
20816
20817
20818
20819
20820
20821
20822
20823
20824
20825
20826
20827
20828
20829
20830
20831
20832
20833
20834
20835
20836
20837
20838
20839
20840
20841
20842
20843
20844
20845
20846
20847
20848
20849
20850
20851
20852
20853
20854
20855
20856
20857
20858
20859
20860
20861
20862
20863
20864
20865
20866
20867
20868
20869
20870
20871
20872
20873
20874
20875
20876
20877
20878
20879
20880
20881
20882
20883
20884
20885
20886
20887
20888
20889
20890
20891
20892
20893
20894
20895
20896
20897
20898
20899
20900
20901
20902
20903
20904
20905
20906
20907
20908
20909
20910
20911
20912
20913
20914
20915
20916
20917
20918
20919
20920
20921
20922
20923
20924
20925
20926
20927
20928
20929
20930
20931
20932
20933
20934
20935
20936
20937
20938
20939
20940
20941
20942
20943
20944
20945
20946
20947
20948
20949
20950
20951
20952
20953
20954
20955
20956
20957
20958
20959
20960
20961
20962
20963
20964
20965
20966
20967
20968
20969
20970
20971
20972
20973
20974
20975
20976
20977
20978
20979
20980
20981
20982
20983
20984
20985
20986
20987
20988
20989
20990
20991
20992
20993
20994
20995
20996
20997
20998
20999
21000
21001
21002
21003
21004
21005
21006
21007
21008
21009
21010
21011
21012
21013
21014
21015
21016
21017
21018
21019
21020
21021
21022
21023
21024
21025
21026
21027
21028
21029
21030
21031
21032
21033
21034
21035
21036
21037
21038
21039
21040
21041
21042
21043
21044
21045
21046
21047
21048
21049
21050
21051
21052
21053
21054
21055
21056
21057
21058
21059
21060
21061
21062
21063
21064
21065
21066
21067
21068
21069
21070
21071
21072
21073
21074
21075
21076
21077
21078
21079
21080
21081
21082
21083
21084
21085
21086
21087
21088
21089
21090
21091
21092
21093
21094
21095
21096
21097
21098
21099
21100
21101
21102
21103
21104
21105
21106
21107
21108
21109
21110
21111
21112
21113
21114
21115
21116
21117
21118
21119
21120
21121
21122
21123
21124
21125
21126
21127
21128
21129
21130
21131
21132
21133
21134
21135
21136
21137
21138
21139
21140
21141
21142
21143
21144
21145
21146
21147
21148
21149
21150
21151
21152
21153
21154
21155
21156
21157
21158
21159
21160
21161
21162
21163
21164
21165
21166
21167
21168
21169
21170
21171
21172
21173
21174
21175
21176
21177
21178
21179
21180
21181
21182
21183
21184
21185
21186
21187
21188
21189
21190
21191
21192
21193
21194
21195
21196
21197
21198
21199
21200
21201
21202
21203
21204
21205
21206
21207
21208
21209
21210
21211
21212
21213
21214
21215
21216
21217
21218
21219
21220
21221
21222
21223
21224
21225
21226
21227
21228
21229
21230
21231
21232
21233
21234
21235
21236
21237
21238
21239
21240
21241
21242
21243
21244
21245
21246
21247
21248
21249
21250
21251
21252
21253
21254
21255
21256
21257
21258
21259
21260
21261
21262
21263
21264
21265
21266
21267
21268
21269
21270
21271
21272
21273
21274
21275
21276
21277
21278
21279
21280
21281
21282
21283
21284
21285
21286
21287
21288
21289
21290
21291
21292
21293
21294
21295
21296
21297
21298
21299
21300
21301
21302
21303
21304
21305
21306
21307
21308
21309
21310
21311
21312
21313
21314
21315
21316
21317
21318
21319
21320
21321
21322
21323
21324
21325
21326
21327
21328
21329
21330
21331
21332
21333
21334
21335
21336
21337
21338
21339
21340
21341
21342
21343
21344
21345
21346
21347
21348
21349
21350
21351
21352
21353
21354
21355
21356
21357
21358
21359
21360
21361
21362
21363
21364
21365
21366
21367
21368
21369
21370
21371
21372
21373
21374
21375
21376
21377
21378
21379
21380
21381
21382
21383
21384
21385
21386
21387
21388
21389
21390
21391
21392
21393
21394
21395
21396
21397
21398
21399
21400
21401
21402
21403
21404
21405
21406
21407
21408
21409
21410
21411
21412
21413
21414
21415
21416
21417
21418
21419
21420
21421
21422
21423
21424
21425
21426
21427
21428
21429
21430
21431
21432
21433
21434
21435
21436
21437
21438
21439
21440
21441
21442
21443
21444
21445
21446
21447
21448
21449
21450
21451
21452
21453
21454
21455
21456
21457
21458
21459
21460
21461
21462
21463
21464
21465
21466
21467
21468
21469
21470
21471
21472
21473
21474
21475
21476
21477
21478
21479
21480
21481
21482
21483
21484
21485
21486
21487
21488
21489
21490
21491
21492
21493
21494
21495
21496
21497
21498
21499
21500
21501
21502
21503
21504
21505
21506
21507
21508
21509
21510
21511
21512
21513
21514
21515
21516
21517
21518
21519
21520
21521
21522
21523
21524
21525
21526
21527
21528
21529
21530
21531
21532
21533
21534
21535
21536
21537
21538
21539
21540
21541
21542
21543
21544
21545
21546
21547
21548
21549
21550
21551
21552
21553
21554
21555
21556
21557
21558
21559
21560
21561
21562
21563
21564
21565
21566
21567
21568
21569
21570
21571
21572
21573
21574
21575
21576
21577
21578
21579
21580
21581
21582
21583
21584
21585
21586
21587
21588
21589
21590
21591
21592
21593
21594
21595
21596
21597
21598
21599
21600
21601
21602
21603
21604
21605
21606
21607
21608
21609
21610
21611
21612
21613
21614
21615
21616
21617
21618
21619
21620
21621
21622
21623
21624
21625
21626
21627
21628
21629
21630
21631
21632
21633
21634
21635
21636
21637
21638
21639
21640
21641
21642
21643
21644
21645
21646
21647
21648
21649
21650
21651
21652
21653
21654
21655
21656
21657
21658
21659
21660
21661
21662
21663
21664
21665
21666
21667
21668
21669
21670
21671
21672
21673
21674
21675
21676
21677
21678
21679
21680
21681
21682
21683
21684
21685
21686
21687
21688
21689
21690
21691
21692
21693
21694
21695
21696
21697
21698
21699
21700
21701
21702
21703
21704
21705
21706
21707
21708
21709
21710
21711
21712
21713
21714
21715
21716
21717
21718
21719
21720
21721
21722
21723
21724
21725
21726
21727
21728
21729
21730
21731
21732
21733
21734
21735
21736
21737
21738
21739
21740
21741
21742
21743
21744
21745
21746
21747
21748
21749
21750
21751
21752
21753
21754
21755
21756
21757
21758
21759
21760
21761
21762
21763
21764
21765
21766
21767
21768
21769
21770
21771
21772
21773
21774
21775
21776
21777
21778
21779
21780
21781
21782
21783
21784
21785
21786
21787
21788
21789
21790
21791
21792
21793
21794
21795
21796
21797
21798
21799
21800
21801
21802
21803
21804
21805
21806
21807
21808
21809
21810
21811
21812
21813
21814
21815
21816
21817
21818
21819
21820
21821
21822
21823
21824
21825
21826
21827
21828
21829
21830
21831
21832
21833
21834
21835
21836
21837
21838
21839
21840
21841
21842
21843
21844
21845
21846
21847
21848
21849
21850
21851
21852
21853
21854
21855
21856
21857
21858
21859
21860
21861
21862
21863
21864
21865
21866
21867
21868
21869
21870
21871
21872
21873
21874
21875
21876
21877
21878
21879
21880
21881
21882
21883
21884
21885
21886
21887
21888
21889
21890
21891
21892
21893
21894
21895
21896
21897
21898
21899
21900
21901
21902
21903
21904
21905
21906
21907
21908
21909
21910
21911
21912
21913
21914
21915
21916
21917
21918
21919
21920
21921
21922
21923
21924
21925
21926
21927
21928
21929
21930
21931
21932
21933
21934
21935
21936
21937
21938
21939
21940
21941
21942
21943
21944
21945
21946
21947
21948
21949
21950
21951
21952
21953
21954
21955
21956
21957
21958
21959
21960
21961
21962
21963
21964
21965
21966
21967
21968
21969
21970
21971
21972
21973
21974
21975
21976
21977
21978
21979
21980
21981
21982
21983
21984
21985
21986
21987
21988
21989
21990
21991
21992
21993
21994
21995
21996
21997
21998
21999
22000
22001
22002
22003
22004
22005
22006
22007
22008
22009
22010
22011
22012
22013
22014
22015
22016
22017
22018
22019
22020
22021
22022
22023
22024
22025
22026
22027
22028
22029
22030
22031
22032
22033
22034
22035
22036
22037
22038
22039
22040
22041
22042
22043
22044
22045
22046
22047
22048
22049
22050
22051
22052
22053
22054
22055
22056
22057
22058
22059
22060
22061
22062
22063
22064
22065
22066
22067
22068
22069
22070
22071
22072
22073
22074
22075
22076
22077
22078
22079
22080
22081
22082
22083
22084
22085
22086
22087
22088
22089
22090
22091
22092
22093
22094
22095
22096
22097
22098
22099
22100
22101
22102
22103
22104
22105
22106
22107
22108
22109
22110
22111
22112
22113
22114
22115
22116
22117
22118
22119
22120
22121
22122
22123
22124
22125
22126
22127
22128
22129
22130
22131
22132
22133
22134
22135
22136
22137
22138
22139
22140
22141
22142
22143
22144
22145
22146
22147
22148
22149
22150
22151
22152
22153
22154
22155
22156
22157
22158
22159
22160
22161
22162
22163
22164
22165
22166
22167
22168
22169
22170
22171
22172
22173
22174
22175
22176
22177
22178
22179
22180
22181
22182
22183
22184
22185
22186
22187
22188
22189
22190
22191
22192
22193
22194
22195
22196
22197
22198
22199
22200
22201
22202
22203
22204
22205
22206
22207
22208
22209
22210
22211
22212
22213
22214
22215
22216
22217
22218
22219
22220
22221
22222
22223
22224
22225
22226
22227
22228
22229
22230
22231
22232
22233
22234
22235
22236
22237
22238
22239
22240
22241
22242
22243
22244
22245
22246
22247
22248
22249
22250
22251
22252
22253
22254
22255
22256
22257
22258
22259
22260
22261
22262
22263
22264
22265
22266
22267
22268
22269
22270
22271
22272
22273
22274
22275
22276
22277
22278
22279
22280
22281
22282
22283
22284
22285
22286
22287
22288
22289
22290
22291
22292
22293
22294
22295
22296
22297
22298
22299
22300
22301
22302
22303
22304
22305
22306
22307
22308
22309
22310
22311
22312
22313
22314
22315
22316
22317
22318
22319
22320
22321
22322
22323
22324
22325
22326
22327
22328
22329
22330
22331
22332
22333
22334
22335
22336
22337
22338
22339
22340
22341
22342
22343
22344
22345
22346
22347
22348
22349
22350
22351
22352
22353
22354
22355
22356
22357
22358
22359
22360
22361
22362
22363
22364
22365
22366
22367
22368
22369
22370
22371
22372
22373
22374
22375
22376
22377
22378
22379
22380
22381
22382
22383
22384
22385
22386
22387
22388
22389
22390
22391
22392
22393
22394
22395
22396
22397
22398
22399
22400
22401
22402
22403
22404
22405
22406
22407
22408
22409
22410
22411
22412
22413
22414
22415
22416
22417
22418
22419
22420
22421
22422
22423
22424
22425
22426
22427
22428
22429
22430
22431
22432
22433
22434
22435
22436
22437
22438
22439
22440
22441
22442
22443
22444
22445
22446
22447
22448
22449
22450
22451
22452
22453
22454
22455
22456
22457
22458
22459
22460
22461
22462
22463
22464
22465
22466
22467
22468
22469
22470
22471
22472
22473
22474
22475
22476
22477
22478
22479
22480
22481
22482
22483
22484
22485
22486
22487
22488
22489
22490
22491
22492
22493
22494
22495
22496
22497
22498
22499
22500
22501
22502
22503
22504
22505
22506
22507
22508
22509
22510
22511
22512
22513
22514
22515
22516
22517
22518
22519
22520
22521
22522
22523
22524
22525
22526
22527
22528
22529
22530
22531
22532
22533
22534
22535
22536
22537
22538
22539
22540
22541
22542
22543
22544
22545
22546
22547
22548
22549
22550
22551
22552
22553
22554
22555
22556
22557
22558
22559
22560
22561
22562
22563
22564
22565
22566
22567
22568
22569
22570
22571
22572
22573
22574
22575
22576
22577
22578
22579
22580
22581
22582
22583
22584
22585
22586
22587
22588
22589
22590
22591
22592
22593
22594
22595
22596
22597
22598
22599
22600
22601
22602
22603
22604
22605
22606
22607
22608
22609
22610
22611
22612
22613
22614
22615
22616
22617
22618
22619
22620
22621
22622
22623
22624
22625
22626
22627
22628
22629
22630
22631
22632
22633
22634
22635
22636
22637
22638
22639
22640
22641
22642
22643
22644
22645
22646
22647
22648
22649
22650
22651
22652
22653
22654
22655
22656
22657
22658
22659
22660
22661
22662
22663
22664
22665
22666
22667
22668
22669
22670
22671
22672
22673
22674
22675
22676
22677
22678
22679
22680
22681
22682
22683
22684
22685
22686
22687
22688
22689
22690
22691
22692
22693
22694
22695
22696
22697
22698
22699
22700
22701
22702
22703
22704
22705
22706
22707
22708
22709
22710
22711
22712
22713
22714
22715
22716
22717
22718
22719
22720
22721
22722
22723
22724
22725
22726
22727
22728
22729
22730
22731
22732
22733
22734
22735
22736
22737
22738
22739
22740
22741
22742
22743
22744
22745
22746
22747
22748
22749
22750
22751
22752
22753
22754
22755
22756
22757
22758
22759
22760
22761
22762
22763
22764
22765
22766
22767
22768
22769
22770
22771
22772
22773
22774
22775
22776
22777
22778
22779
22780
22781
22782
22783
22784
22785
22786
22787
22788
22789
22790
22791
22792
22793
22794
22795
22796
22797
22798
22799
22800
22801
22802
22803
22804
22805
22806
22807
22808
22809
22810
22811
22812
22813
22814
22815
22816
22817
22818
22819
22820
22821
22822
22823
22824
22825
22826
22827
22828
22829
22830
22831
22832
22833
22834
22835
22836
22837
22838
22839
22840
22841
22842
22843
22844
22845
22846
22847
22848
22849
22850
22851
22852
22853
22854
22855
22856
22857
22858
22859
22860
22861
22862
22863
22864
22865
22866
22867
22868
22869
22870
22871
22872
22873
22874
22875
22876
22877
22878
22879
22880
22881
22882
22883
22884
22885
22886
22887
22888
22889
22890
22891
22892
22893
22894
22895
22896
22897
22898
22899
22900
22901
22902
22903
22904
22905
22906
22907
22908
22909
22910
22911
22912
22913
22914
22915
22916
22917
22918
22919
22920
22921
22922
22923
22924
22925
22926
22927
22928
22929
22930
22931
22932
22933
22934
22935
22936
22937
22938
22939
22940
22941
22942
22943
22944
22945
22946
22947
22948
22949
22950
22951
22952
22953
22954
22955
22956
22957
22958
22959
22960
22961
22962
22963
22964
22965
22966
22967
22968
22969
22970
22971
22972
22973
22974
22975
22976
22977
22978
22979
22980
22981
22982
22983
22984
22985
22986
22987
22988
22989
22990
22991
22992
22993
22994
22995
22996
22997
22998
22999
23000
23001
23002
23003
23004
23005
23006
23007
23008
23009
23010
23011
23012
23013
23014
23015
23016
23017
23018
23019
23020
23021
23022
23023
23024
23025
23026
23027
23028
23029
23030
23031
23032
23033
23034
23035
23036
23037
23038
23039
23040
23041
23042
23043
23044
23045
23046
23047
23048
23049
23050
23051
23052
23053
23054
23055
23056
23057
23058
23059
23060
23061
23062
23063
23064
23065
23066
23067
23068
23069
23070
23071
23072
23073
23074
23075
23076
23077
23078
23079
23080
23081
23082
23083
23084
23085
23086
23087
23088
23089
23090
23091
23092
23093
23094
23095
23096
23097
23098
23099
23100
23101
23102
23103
23104
23105
23106
23107
23108
23109
23110
23111
23112
23113
23114
23115
23116
23117
23118
23119
23120
23121
23122
23123
23124
23125
23126
23127
23128
23129
23130
23131
23132
23133
23134
23135
23136
23137
23138
23139
23140
23141
23142
23143
23144
23145
23146
23147
23148
23149
23150
23151
23152
23153
23154
23155
23156
23157
23158
23159
23160
23161
23162
23163
23164
23165
23166
23167
23168
23169
23170
23171
23172
23173
23174
23175
23176
23177
23178
23179
23180
23181
23182
23183
23184
23185
23186
23187
23188
23189
23190
23191
23192
23193
23194
23195
23196
23197
23198
23199
23200
23201
23202
23203
23204
23205
23206
23207
23208
23209
23210
23211
23212
23213
23214
23215
23216
23217
23218
23219
23220
23221
23222
23223
23224
23225
23226
23227
23228
23229
23230
23231
23232
23233
23234
23235
23236
23237
23238
23239
23240
23241
23242
23243
23244
23245
23246
23247
23248
23249
23250
23251
23252
23253
23254
23255
23256
23257
23258
23259
23260
23261
23262
23263
23264
23265
23266
23267
23268
23269
23270
23271
23272
23273
23274
23275
23276
23277
23278
23279
23280
23281
23282
23283
23284
23285
23286
23287
23288
23289
23290
23291
23292
23293
23294
23295
23296
23297
23298
23299
23300
23301
23302
23303
23304
23305
23306
23307
23308
23309
23310
23311
23312
23313
23314
23315
23316
23317
23318
23319
23320
23321
23322
23323
23324
23325
23326
23327
23328
23329
23330
23331
23332
23333
23334
23335
23336
23337
23338
23339
23340
23341
23342
23343
23344
23345
23346
23347
23348
23349
23350
23351
23352
23353
23354
23355
23356
23357
23358
23359
23360
23361
23362
23363
23364
23365
23366
23367
23368
23369
23370
23371
23372
23373
23374
23375
23376
23377
23378
23379
23380
23381
23382
23383
23384
23385
23386
23387
23388
23389
23390
23391
23392
23393
23394
23395
23396
23397
23398
23399
23400
23401
23402
23403
23404
23405
23406
23407
23408
23409
23410
23411
23412
23413
23414
23415
23416
23417
23418
23419
23420
23421
23422
23423
23424
23425
23426
23427
23428
23429
23430
23431
23432
23433
23434
23435
23436
23437
23438
23439
23440
23441
23442
23443
23444
23445
23446
23447
23448
23449
23450
23451
23452
23453
23454
23455
23456
23457
23458
23459
23460
23461
23462
23463
23464
23465
23466
23467
23468
23469
23470
23471
23472
23473
23474
23475
23476
23477
23478
23479
23480
23481
23482
23483
23484
23485
23486
23487
23488
23489
23490
23491
23492
23493
23494
23495
23496
23497
23498
23499
23500
23501
23502
23503
23504
23505
23506
23507
23508
23509
23510
23511
23512
23513
23514
23515
23516
23517
23518
23519
23520
23521
23522
23523
23524
23525
23526
23527
23528
23529
23530
23531
23532
23533
23534
23535
23536
23537
23538
23539
23540
23541
23542
23543
23544
23545
23546
23547
23548
23549
23550
23551
23552
23553
23554
23555
23556
23557
23558
23559
23560
23561
23562
23563
23564
23565
23566
23567
23568
23569
23570
23571
23572
23573
23574
23575
23576
23577
23578
23579
23580
23581
23582
23583
23584
23585
23586
23587
23588
23589
23590
23591
23592
23593
23594
23595
23596
23597
23598
23599
23600
23601
23602
23603
23604
23605
23606
23607
23608
23609
23610
23611
23612
23613
23614
23615
23616
23617
23618
23619
23620
23621
23622
23623
23624
23625
23626
23627
23628
23629
23630
23631
23632
23633
23634
23635
23636
23637
23638
23639
23640
23641
23642
23643
23644
23645
23646
23647
23648
23649
23650
23651
23652
23653
23654
23655
23656
23657
23658
23659
23660
23661
23662
23663
23664
23665
23666
23667
23668
23669
23670
23671
23672
23673
23674
23675
23676
23677
23678
23679
23680
23681
23682
23683
23684
23685
23686
23687
23688
23689
23690
23691
23692
23693
23694
23695
23696
23697
23698
23699
23700
23701
23702
23703
23704
23705
23706
23707
23708
23709
23710
23711
23712
23713
23714
23715
23716
23717
23718
23719
23720
23721
23722
23723
23724
23725
23726
23727
23728
23729
23730
23731
23732
23733
23734
23735
23736
23737
23738
23739
23740
23741
23742
23743
23744
23745
23746
23747
23748
23749
23750
23751
23752
23753
23754
23755
23756
23757
23758
23759
23760
23761
23762
23763
23764
23765
23766
23767
23768
23769
23770
23771
23772
23773
23774
23775
23776
23777
23778
23779
23780
23781
23782
23783
23784
23785
23786
23787
23788
23789
23790
23791
23792
23793
23794
23795
23796
23797
23798
23799
23800
23801
23802
23803
23804
23805
23806
23807
23808
23809
23810
23811
23812
23813
23814
23815
23816
23817
23818
23819
23820
23821
23822
23823
23824
23825
23826
23827
23828
23829
23830
23831
23832
23833
23834
23835
23836
23837
23838
23839
23840
23841
23842
23843
23844
23845
23846
23847
23848
23849
23850
23851
23852
23853
23854
23855
23856
23857
23858
23859
23860
23861
23862
23863
23864
23865
23866
23867
23868
23869
23870
23871
23872
23873
23874
23875
23876
23877
23878
23879
23880
23881
23882
23883
23884
23885
23886
23887
23888
23889
23890
23891
23892
23893
23894
23895
23896
23897
23898
23899
23900
23901
23902
23903
23904
23905
23906
23907
23908
23909
23910
23911
23912
23913
23914
23915
23916
23917
23918
23919
23920
23921
23922
23923
23924
23925
23926
23927
23928
23929
23930
23931
23932
23933
23934
23935
23936
23937
23938
23939
23940
23941
23942
23943
23944
23945
23946
23947
23948
23949
23950
23951
23952
23953
23954
23955
23956
23957
23958
23959
23960
23961
23962
23963
23964
23965
23966
23967
23968
23969
23970
23971
23972
23973
23974
23975
23976
23977
23978
23979
23980
23981
23982
23983
23984
23985
23986
23987
23988
23989
23990
23991
23992
23993
23994
23995
23996
23997
23998
23999
24000
24001
24002
24003
24004
24005
24006
24007
24008
24009
24010
24011
24012
24013
24014
24015
24016
24017
24018
24019
24020
24021
24022
24023
24024
24025
24026
24027
24028
24029
24030
24031
24032
24033
24034
24035
24036
24037
24038
24039
24040
24041
24042
24043
24044
24045
24046
24047
24048
24049
24050
24051
24052
24053
24054
24055
24056
24057
24058
24059
24060
24061
24062
24063
24064
24065
24066
24067
24068
24069
24070
24071
24072
24073
24074
24075
24076
24077
24078
24079
24080
24081
24082
24083
24084
24085
24086
24087
24088
24089
24090
24091
24092
24093
24094
24095
24096
24097
24098
24099
24100
24101
24102
24103
24104
24105
24106
24107
24108
24109
24110
24111
24112
24113
24114
24115
24116
24117
24118
24119
24120
24121
24122
24123
24124
24125
24126
24127
24128
24129
24130
24131
24132
24133
24134
24135
24136
24137
24138
24139
24140
24141
24142
24143
24144
24145
24146
24147
24148
24149
24150
24151
24152
24153
24154
24155
24156
24157
24158
24159
24160
24161
24162
24163
24164
24165
24166
24167
24168
24169
24170
24171
24172
24173
24174
24175
24176
24177
24178
24179
24180
24181
24182
24183
24184
24185
24186
24187
24188
24189
24190
24191
24192
24193
24194
24195
24196
24197
24198
24199
24200
24201
24202
24203
24204
24205
24206
24207
24208
24209
24210
24211
24212
24213
24214
24215
24216
24217
24218
24219
24220
24221
24222
24223
24224
24225
24226
24227
24228
24229
24230
24231
24232
24233
24234
24235
24236
24237
24238
24239
24240
24241
24242
24243
24244
24245
24246
24247
24248
24249
24250
24251
24252
24253
24254
24255
24256
24257
24258
24259
24260
24261
24262
24263
24264
24265
24266
24267
24268
24269
24270
24271
24272
24273
24274
24275
24276
24277
24278
24279
24280
24281
24282
24283
24284
24285
24286
24287
24288
24289
24290
24291
24292
24293
24294
24295
24296
24297
24298
24299
24300
24301
24302
24303
24304
24305
24306
24307
24308
24309
24310
24311
24312
24313
24314
24315
24316
24317
24318
24319
24320
24321
24322
24323
24324
24325
24326
24327
24328
24329
24330
24331
24332
24333
24334
24335
24336
24337
24338
24339
24340
24341
24342
24343
24344
24345
24346
24347
24348
24349
24350
24351
24352
24353
24354
24355
24356
24357
24358
24359
24360
24361
24362
24363
24364
24365
24366
24367
24368
24369
24370
24371
24372
24373
24374
24375
24376
24377
24378
24379
24380
24381
24382
24383
24384
24385
24386
24387
24388
24389
24390
24391
24392
24393
24394
24395
24396
24397
24398
24399
24400
24401
24402
24403
24404
24405
24406
24407
24408
24409
24410
24411
24412
24413
24414
24415
24416
24417
24418
24419
24420
24421
24422
24423
24424
24425
24426
24427
24428
24429
24430
24431
24432
24433
24434
24435
24436
24437
24438
24439
24440
24441
24442
24443
24444
24445
24446
24447
24448
24449
24450
24451
24452
24453
24454
24455
24456
24457
24458
24459
24460
24461
24462
24463
24464
24465
24466
24467
24468
24469
24470
24471
24472
24473
24474
24475
24476
24477
24478
24479
24480
24481
24482
24483
24484
24485
24486
24487
24488
24489
24490
24491
24492
24493
24494
24495
24496
24497
24498
24499
24500
24501
24502
24503
24504
24505
24506
24507
24508
24509
24510
24511
24512
24513
24514
24515
24516
24517
24518
24519
24520
24521
24522
24523
24524
24525
24526
24527
24528
24529
24530
24531
24532
24533
24534
24535
24536
24537
24538
24539
24540
24541
24542
24543
24544
24545
24546
24547
24548
24549
24550
24551
24552
24553
24554
24555
24556
24557
24558
24559
24560
24561
24562
24563
24564
24565
24566
24567
24568
24569
24570
24571
24572
24573
24574
24575
24576
24577
24578
24579
24580
24581
24582
24583
24584
24585
24586
24587
24588
24589
24590
24591
24592
24593
24594
24595
24596
24597
24598
24599
24600
24601
24602
24603
24604
24605
24606
24607
24608
24609
24610
24611
24612
24613
24614
24615
24616
24617
24618
24619
24620
24621
24622
24623
24624
24625
24626
24627
24628
24629
24630
24631
24632
24633
24634
24635
24636
24637
24638
24639
24640
24641
24642
24643
24644
24645
24646
24647
24648
24649
24650
24651
24652
24653
24654
24655
24656
24657
24658
24659
24660
24661
24662
24663
24664
24665
24666
24667
24668
24669
24670
24671
24672
24673
24674
24675
24676
24677
24678
24679
24680
24681
24682
24683
24684
24685
24686
24687
24688
24689
24690
24691
24692
24693
24694
24695
24696
24697
24698
24699
24700
24701
24702
24703
24704
24705
24706
24707
24708
24709
24710
24711
24712
24713
24714
24715
24716
24717
24718
24719
24720
24721
24722
24723
24724
24725
24726
24727
24728
24729
24730
24731
24732
24733
24734
24735
24736
24737
24738
24739
24740
24741
24742
24743
24744
24745
24746
24747
24748
24749
24750
24751
24752
24753
24754
24755
24756
24757
24758
24759
24760
24761
24762
24763
24764
24765
24766
24767
24768
24769
24770
24771
24772
24773
24774
24775
24776
24777
24778
24779
24780
24781
24782
24783
24784
24785
24786
24787
24788
24789
24790
24791
24792
24793
24794
24795
24796
24797
24798
24799
24800
24801
24802
24803
24804
24805
24806
24807
24808
24809
24810
24811
24812
24813
24814
24815
24816
24817
24818
24819
24820
24821
24822
24823
24824
24825
24826
24827
24828
24829
24830
24831
24832
24833
24834
24835
24836
24837
24838
24839
24840
24841
24842
24843
24844
24845
24846
24847
24848
24849
24850
24851
24852
24853
24854
24855
24856
24857
24858
24859
24860
24861
24862
24863
24864
24865
24866
24867
24868
24869
24870
24871
24872
24873
24874
24875
24876
24877
24878
24879
24880
24881
24882
24883
24884
24885
24886
24887
24888
24889
24890
24891
24892
24893
24894
24895
24896
24897
24898
24899
24900
24901
24902
24903
24904
24905
24906
24907
24908
24909
24910
24911
24912
24913
24914
24915
24916
24917
24918
24919
24920
24921
24922
24923
24924
24925
24926
24927
24928
24929
24930
24931
24932
24933
24934
24935
24936
24937
24938
24939
24940
24941
24942
24943
24944
24945
24946
24947
24948
24949
24950
24951
24952
24953
24954
24955
24956
24957
24958
24959
24960
24961
24962
24963
24964
24965
24966
24967
24968
24969
24970
24971
24972
24973
24974
24975
24976
24977
24978
24979
24980
24981
24982
24983
24984
24985
24986
24987
24988
24989
24990
24991
24992
24993
24994
24995
24996
24997
24998
24999
25000
25001
25002
25003
25004
25005
25006
25007
25008
25009
25010
25011
25012
25013
25014
25015
25016
25017
25018
25019
25020
25021
25022
25023
25024
25025
25026
25027
25028
25029
25030
25031
25032
25033
25034
25035
25036
25037
25038
25039
25040
25041
25042
25043
25044
25045
25046
25047
25048
25049
25050
25051
25052
25053
25054
25055
25056
25057
25058
25059
25060
25061
25062
25063
25064
25065
25066
25067
25068
25069
25070
25071
25072
25073
25074
25075
25076
25077
25078
25079
25080
25081
25082
25083
25084
25085
25086
25087
25088
25089
25090
25091
25092
25093
25094
25095
25096
25097
25098
25099
25100
25101
25102
25103
25104
25105
25106
25107
25108
25109
25110
25111
25112
25113
25114
25115
25116
25117
25118
25119
25120
25121
25122
25123
25124
25125
25126
25127
25128
25129
25130
25131
25132
25133
25134
25135
25136
25137
25138
25139
25140
25141
25142
25143
25144
25145
25146
25147
25148
25149
25150
25151
25152
25153
25154
25155
25156
25157
25158
25159
25160
25161
25162
25163
25164
25165
25166
25167
25168
25169
25170
25171
25172
25173
25174
25175
25176
25177
25178
25179
25180
25181
25182
25183
25184
25185
25186
25187
25188
25189
25190
25191
25192
25193
25194
25195
25196
25197
25198
25199
25200
25201
25202
25203
25204
25205
25206
25207
25208
25209
25210
25211
25212
25213
25214
25215
25216
25217
25218
25219
25220
25221
25222
25223
25224
25225
25226
25227
25228
25229
25230
25231
25232
25233
25234
25235
25236
25237
25238
25239
25240
25241
25242
25243
25244
25245
25246
25247
25248
25249
25250
25251
25252
25253
25254
25255
25256
25257
25258
25259
25260
25261
25262
25263
25264
25265
25266
25267
25268
25269
25270
25271
25272
25273
25274
25275
25276
25277
25278
25279
25280
25281
25282
25283
25284
25285
25286
25287
25288
25289
25290
25291
25292
25293
25294
25295
25296
25297
25298
25299
25300
25301
25302
25303
25304
25305
25306
25307
25308
25309
25310
25311
25312
25313
25314
25315
25316
25317
25318
25319
25320
25321
25322
25323
25324
25325
25326
25327
25328
25329
25330
25331
25332
25333
25334
25335
25336
25337
25338
25339
25340
25341
25342
25343
25344
25345
25346
25347
25348
25349
25350
25351
25352
25353
25354
25355
25356
25357
25358
25359
25360
25361
25362
25363
25364
25365
25366
25367
25368
25369
25370
25371
25372
25373
25374
25375
25376
25377
25378
25379
25380
25381
25382
25383
25384
25385
25386
25387
25388
25389
25390
25391
25392
25393
25394
25395
25396
25397
25398
25399
25400
25401
25402
25403
25404
25405
25406
25407
25408
25409
25410
25411
25412
25413
25414
25415
25416
25417
25418
25419
25420
25421
25422
25423
25424
25425
25426
25427
25428
25429
25430
25431
25432
25433
25434
25435
25436
25437
25438
25439
25440
25441
25442
25443
25444
25445
25446
25447
25448
25449
25450
25451
25452
25453
25454
25455
25456
25457
25458
25459
25460
25461
25462
25463
25464
25465
25466
25467
25468
25469
25470
25471
25472
25473
25474
25475
25476
25477
25478
25479
25480
25481
25482
25483
25484
25485
25486
25487
25488
25489
25490
25491
25492
25493
25494
25495
25496
25497
25498
25499
25500
25501
25502
25503
25504
25505
25506
25507
25508
25509
25510
25511
25512
25513
25514
25515
25516
25517
25518
25519
25520
25521
25522
25523
25524
25525
25526
25527
25528
25529
25530
25531
25532
25533
25534
25535
25536
25537
25538
25539
25540
25541
25542
25543
25544
25545
25546
25547
25548
25549
25550
25551
25552
25553
25554
25555
25556
25557
25558
25559
25560
25561
25562
25563
25564
25565
25566
25567
25568
25569
25570
25571
25572
25573
25574
25575
25576
25577
25578
25579
25580
25581
25582
25583
25584
25585
25586
25587
25588
25589
25590
25591
25592
25593
25594
25595
25596
25597
25598
25599
25600
25601
25602
25603
25604
25605
25606
25607
25608
25609
25610
25611
25612
25613
25614
25615
25616
25617
25618
25619
25620
25621
25622
25623
25624
25625
25626
25627
25628
25629
25630
25631
25632
25633
25634
25635
25636
25637
25638
25639
25640
25641
25642
25643
25644
25645
25646
25647
25648
25649
25650
25651
25652
25653
25654
25655
25656
25657
25658
25659
25660
25661
25662
25663
25664
25665
25666
25667
25668
25669
25670
25671
25672
25673
25674
25675
25676
25677
25678
25679
25680
25681
25682
25683
25684
25685
25686
25687
25688
25689
25690
25691
25692
25693
25694
25695
25696
25697
25698
25699
25700
25701
25702
25703
25704
25705
25706
25707
25708
25709
25710
25711
25712
25713
25714
25715
25716
25717
25718
25719
25720
25721
25722
25723
25724
25725
25726
25727
25728
25729
25730
25731
25732
25733
25734
25735
25736
25737
25738
25739
25740
25741
25742
25743
25744
25745
25746
25747
25748
25749
25750
25751
25752
25753
25754
25755
25756
25757
25758
25759
25760
25761
25762
25763
25764
25765
25766
25767
25768
25769
25770
25771
25772
25773
25774
25775
25776
25777
25778
25779
25780
25781
25782
25783
25784
25785
25786
25787
25788
25789
25790
25791
25792
25793
25794
25795
25796
25797
25798
25799
25800
25801
25802
25803
25804
25805
25806
25807
25808
25809
25810
25811
25812
25813
25814
25815
25816
25817
25818
25819
25820
25821
25822
25823
25824
25825
25826
25827
25828
25829
25830
25831
25832
25833
25834
25835
25836
25837
25838
25839
25840
25841
25842
25843
25844
25845
25846
25847
25848
25849
25850
25851
25852
25853
25854
25855
25856
25857
25858
25859
25860
25861
25862
25863
25864
25865
25866
25867
25868
25869
25870
25871
25872
25873
25874
25875
25876
25877
25878
25879
25880
25881
25882
25883
25884
25885
25886
25887
25888
25889
25890
25891
25892
25893
25894
25895
25896
25897
25898
25899
25900
25901
25902
25903
25904
25905
25906
25907
25908
25909
25910
25911
25912
25913
25914
25915
25916
25917
25918
25919
25920
25921
25922
25923
25924
25925
25926
25927
25928
25929
25930
25931
25932
25933
25934
25935
25936
25937
25938
25939
25940
25941
25942
25943
25944
25945
25946
25947
25948
25949
25950
25951
25952
25953
25954
25955
25956
25957
25958
25959
25960
25961
25962
25963
25964
25965
25966
25967
25968
25969
25970
25971
25972
25973
25974
25975
25976
25977
25978
25979
25980
25981
25982
25983
25984
25985
25986
25987
25988
25989
25990
25991
25992
25993
25994
25995
25996
25997
25998
25999
26000
26001
26002
26003
26004
26005
26006
26007
26008
26009
26010
26011
26012
26013
26014
26015
26016
26017
26018
26019
26020
26021
26022
26023
26024
26025
26026
26027
26028
26029
26030
26031
26032
26033
26034
26035
26036
26037
26038
26039
26040
26041
26042
26043
26044
26045
26046
26047
26048
26049
26050
26051
26052
26053
26054
26055
26056
26057
26058
26059
26060
26061
26062
26063
26064
26065
26066
26067
26068
26069
26070
26071
26072
26073
26074
26075
26076
26077
26078
26079
26080
26081
26082
26083
26084
26085
26086
26087
26088
26089
26090
26091
26092
26093
26094
26095
26096
26097
26098
26099
26100
26101
26102
26103
26104
26105
26106
26107
26108
26109
26110
26111
26112
26113
26114
26115
26116
26117
26118
26119
26120
26121
26122
26123
26124
26125
26126
26127
26128
26129
26130
26131
26132
26133
26134
26135
26136
26137
26138
26139
26140
26141
26142
26143
26144
26145
26146
26147
26148
26149
26150
26151
26152
26153
26154
26155
26156
26157
26158
26159
26160
26161
26162
26163
26164
26165
26166
26167
26168
26169
26170
26171
26172
26173
26174
26175
26176
26177
26178
26179
26180
26181
26182
26183
26184
26185
26186
26187
26188
26189
26190
26191
26192
26193
26194
26195
26196
26197
26198
26199
26200
26201
26202
26203
26204
26205
26206
26207
26208
26209
26210
26211
26212
26213
26214
26215
26216
26217
26218
26219
26220
26221
26222
26223
26224
26225
26226
26227
26228
26229
26230
26231
26232
26233
26234
26235
26236
26237
26238
26239
26240
26241
26242
26243
26244
26245
26246
26247
26248
26249
26250
26251
26252
26253
26254
26255
26256
26257
26258
26259
26260
26261
26262
26263
26264
26265
26266
26267
26268
26269
26270
26271
26272
26273
26274
26275
26276
26277
26278
26279
26280
26281
26282
26283
26284
26285
26286
26287
26288
26289
26290
26291
26292
26293
26294
26295
26296
26297
26298
26299
26300
26301
26302
26303
26304
26305
26306
26307
26308
26309
26310
26311
26312
26313
26314
26315
26316
26317
26318
26319
26320
26321
26322
26323
26324
26325
26326
26327
26328
26329
26330
26331
26332
26333
26334
26335
26336
26337
26338
26339
26340
26341
26342
26343
26344
26345
26346
26347
26348
26349
26350
26351
26352
26353
26354
26355
26356
26357
26358
26359
26360
26361
26362
26363
26364
26365
26366
26367
26368
26369
26370
26371
26372
26373
26374
26375
26376
26377
26378
26379
26380
26381
26382
26383
26384
26385
26386
26387
26388
26389
26390
26391
26392
26393
26394
26395
26396
26397
26398
26399
26400
26401
26402
26403
26404
26405
26406
26407
26408
26409
26410
26411
26412
26413
26414
26415
26416
26417
26418
26419
26420
26421
26422
26423
26424
26425
26426
26427
26428
26429
26430
26431
26432
26433
26434
26435
26436
26437
26438
26439
26440
26441
26442
26443
26444
26445
26446
26447
26448
26449
26450
26451
26452
26453
26454
26455
26456
26457
26458
26459
26460
26461
26462
26463
26464
26465
26466
26467
26468
26469
26470
26471
26472
26473
26474
26475
26476
26477
26478
26479
26480
26481
26482
26483
26484
26485
26486
26487
26488
26489
26490
26491
26492
26493
26494
26495
26496
26497
26498
26499
26500
26501
26502
26503
26504
26505
26506
26507
26508
26509
26510
26511
26512
26513
26514
26515
26516
26517
26518
26519
26520
26521
26522
26523
26524
26525
26526
26527
26528
26529
26530
26531
26532
26533
26534
26535
26536
26537
26538
26539
26540
26541
26542
26543
26544
26545
26546
26547
26548
26549
26550
26551
26552
26553
26554
26555
26556
26557
26558
26559
26560
26561
26562
26563
26564
26565
26566
26567
26568
26569
26570
26571
26572
26573
26574
26575
26576
26577
26578
26579
26580
26581
26582
26583
26584
26585
26586
26587
26588
26589
26590
26591
26592
26593
26594
26595
26596
26597
26598
26599
26600
26601
26602
26603
26604
26605
26606
26607
26608
26609
26610
26611
26612
26613
26614
26615
26616
26617
26618
26619
26620
26621
26622
26623
26624
26625
26626
26627
26628
26629
26630
26631
26632
26633
26634
26635
26636
26637
26638
26639
26640
26641
26642
26643
26644
26645
26646
26647
26648
26649
26650
26651
26652
26653
26654
26655
26656
26657
26658
26659
26660
26661
26662
26663
26664
26665
26666
26667
26668
26669
26670
26671
26672
26673
26674
26675
26676
26677
26678
26679
26680
26681
26682
26683
26684
26685
26686
26687
26688
26689
26690
26691
26692
26693
26694
26695
26696
26697
26698
26699
26700
26701
26702
26703
26704
26705
26706
26707
26708
26709
26710
26711
26712
26713
26714
26715
26716
26717
26718
26719
26720
26721
26722
26723
26724
26725
26726
26727
26728
26729
26730
26731
26732
26733
26734
26735
26736
26737
26738
26739
26740
26741
26742
26743
26744
26745
26746
26747
26748
26749
26750
26751
26752
26753
26754
26755
26756
26757
26758
26759
26760
26761
26762
26763
26764
26765
26766
26767
26768
26769
26770
26771
26772
26773
26774
26775
26776
26777
26778
26779
26780
26781
26782
26783
26784
26785
26786
26787
26788
26789
26790
26791
26792
26793
26794
26795
26796
26797
26798
26799
26800
26801
26802
26803
26804
26805
26806
26807
26808
26809
26810
26811
26812
26813
26814
26815
26816
26817
26818
26819
26820
26821
26822
26823
26824
26825
26826
26827
26828
26829
26830
26831
26832
26833
26834
26835
26836
26837
26838
26839
26840
26841
26842
26843
26844
26845
26846
26847
26848
26849
26850
26851
26852
26853
26854
26855
26856
26857
26858
26859
26860
26861
26862
26863
26864
26865
26866
26867
26868
26869
26870
26871
26872
26873
26874
26875
26876
26877
26878
26879
26880
26881
26882
26883
26884
26885
26886
26887
26888
26889
26890
26891
26892
26893
26894
26895
26896
26897
26898
26899
26900
26901
26902
26903
26904
26905
26906
26907
26908
26909
26910
26911
26912
26913
26914
26915
26916
26917
26918
26919
26920
26921
26922
26923
26924
26925
26926
26927
26928
26929
26930
26931
26932
26933
26934
26935
26936
26937
26938
26939
26940
26941
26942
26943
26944
26945
26946
26947
26948
26949
26950
26951
26952
26953
26954
26955
26956
26957
26958
26959
26960
26961
26962
26963
26964
26965
26966
26967
26968
26969
26970
26971
26972
26973
26974
26975
26976
26977
26978
26979
26980
26981
26982
26983
26984
26985
26986
26987
26988
26989
26990
26991
26992
26993
26994
26995
26996
26997
26998
26999
27000
27001
27002
27003
27004
27005
27006
27007
27008
27009
27010
27011
27012
27013
27014
27015
27016
27017
27018
27019
27020
27021
27022
27023
27024
27025
27026
27027
27028
27029
27030
27031
27032
27033
27034
27035
27036
27037
27038
27039
27040
27041
27042
27043
27044
27045
27046
27047
27048
27049
27050
27051
27052
27053
27054
27055
27056
27057
27058
27059
27060
27061
27062
27063
27064
27065
27066
27067
27068
27069
27070
27071
27072
27073
27074
27075
27076
27077
27078
27079
27080
27081
27082
27083
27084
27085
27086
27087
27088
27089
27090
27091
27092
27093
27094
27095
27096
27097
27098
27099
27100
27101
27102
27103
27104
27105
27106
27107
27108
27109
27110
27111
27112
27113
27114
27115
27116
27117
27118
27119
27120
27121
27122
27123
27124
27125
27126
27127
27128
27129
27130
27131
27132
27133
27134
27135
27136
27137
27138
27139
27140
27141
27142
27143
27144
27145
27146
27147
27148
27149
27150
27151
27152
27153
27154
27155
27156
27157
27158
27159
27160
27161
27162
27163
27164
27165
27166
27167
27168
27169
27170
27171
27172
27173
27174
27175
27176
27177
27178
27179
27180
27181
27182
27183
27184
27185
27186
27187
27188
27189
27190
27191
27192
27193
27194
27195
27196
27197
27198
27199
27200
27201
27202
27203
27204
27205
27206
27207
27208
27209
27210
27211
27212
27213
27214
27215
27216
27217
27218
27219
27220
27221
27222
27223
27224
27225
27226
27227
27228
27229
27230
27231
27232
27233
27234
27235
27236
27237
27238
27239
27240
27241
27242
27243
27244
27245
27246
27247
27248
27249
27250
27251
27252
27253
27254
27255
27256
27257
27258
27259
27260
27261
27262
27263
27264
27265
27266
27267
27268
27269
27270
27271
27272
27273
27274
27275
27276
27277
27278
27279
27280
27281
27282
27283
27284
27285
27286
27287
27288
27289
27290
27291
27292
27293
27294
27295
27296
27297
27298
27299
27300
27301
27302
27303
27304
27305
27306
27307
27308
27309
27310
27311
27312
27313
27314
27315
27316
27317
27318
27319
27320
27321
27322
27323
27324
27325
27326
27327
27328
27329
27330
27331
27332
27333
27334
27335
27336
27337
27338
27339
27340
27341
27342
27343
27344
27345
27346
27347
27348
27349
27350
27351
27352
27353
27354
27355
27356
27357
27358
27359
27360
27361
27362
27363
27364
27365
27366
27367
27368
27369
27370
27371
27372
27373
27374
27375
27376
27377
27378
27379
27380
27381
27382
27383
27384
27385
27386
27387
27388
27389
27390
27391
27392
27393
27394
27395
27396
27397
27398
27399
27400
27401
27402
27403
27404
27405
27406
27407
27408
27409
27410
27411
27412
27413
27414
27415
27416
27417
27418
27419
27420
27421
27422
27423
27424
27425
27426
27427
27428
27429
27430
27431
27432
27433
27434
27435
27436
27437
27438
27439
27440
27441
27442
27443
27444
27445
27446
27447
27448
27449
27450
27451
27452
27453
27454
27455
27456
27457
27458
27459
27460
27461
27462
27463
27464
27465
27466
27467
27468
27469
27470
27471
27472
27473
27474
27475
27476
27477
27478
27479
27480
27481
27482
27483
27484
27485
27486
27487
27488
27489
27490
27491
27492
27493
27494
27495
27496
27497
27498
27499
27500
27501
27502
27503
27504
27505
27506
27507
27508
27509
27510
27511
27512
27513
27514
27515
27516
27517
27518
27519
27520
27521
27522
27523
27524
27525
27526
27527
27528
27529
27530
27531
27532
27533
27534
27535
27536
27537
27538
27539
27540
27541
27542
27543
27544
27545
27546
27547
27548
27549
27550
27551
27552
27553
27554
27555
27556
27557
27558
27559
27560
27561
27562
27563
27564
27565
27566
27567
27568
27569
27570
27571
27572
27573
27574
27575
27576
27577
27578
27579
27580
27581
27582
27583
27584
27585
27586
27587
27588
27589
27590
27591
27592
27593
27594
27595
27596
27597
27598
27599
27600
27601
27602
27603
27604
27605
27606
27607
27608
27609
27610
27611
27612
27613
27614
27615
27616
27617
27618
27619
27620
27621
27622
27623
27624
27625
27626
27627
27628
27629
27630
27631
27632
27633
27634
27635
27636
27637
27638
27639
27640
27641
27642
27643
27644
27645
27646
27647
27648
27649
27650
27651
27652
27653
27654
27655
27656
27657
27658
27659
27660
27661
27662
27663
27664
27665
27666
27667
27668
27669
27670
27671
27672
27673
27674
27675
27676
27677
27678
27679
27680
27681
27682
27683
27684
27685
27686
27687
27688
27689
27690
27691
27692
27693
27694
27695
27696
27697
27698
27699
27700
27701
27702
27703
27704
27705
27706
27707
27708
27709
27710
27711
27712
27713
27714
27715
27716
27717
27718
27719
27720
27721
27722
27723
27724
27725
27726
27727
27728
27729
27730
27731
27732
27733
27734
27735
27736
27737
27738
27739
27740
27741
27742
27743
27744
27745
27746
27747
27748
27749
27750
27751
27752
27753
27754
27755
27756
27757
27758
27759
27760
27761
27762
27763
27764
27765
27766
27767
27768
27769
27770
27771
27772
27773
27774
27775
27776
27777
27778
27779
27780
27781
27782
27783
27784
27785
27786
27787
27788
27789
27790
27791
27792
27793
27794
27795
27796
27797
27798
27799
27800
27801
27802
27803
27804
27805
27806
27807
27808
27809
27810
27811
27812
27813
27814
27815
27816
27817
27818
27819
27820
27821
27822
27823
27824
27825
27826
27827
27828
27829
27830
27831
27832
27833
27834
27835
27836
27837
27838
27839
27840
27841
27842
27843
27844
27845
27846
27847
27848
27849
27850
27851
27852
27853
27854
27855
27856
27857
27858
27859
27860
27861
27862
27863
27864
27865
27866
27867
27868
27869
27870
27871
27872
27873
27874
27875
27876
27877
27878
27879
27880
27881
27882
27883
27884
27885
27886
27887
27888
27889
27890
27891
27892
27893
27894
27895
27896
27897
27898
27899
27900
27901
27902
27903
27904
27905
27906
27907
27908
27909
27910
27911
27912
27913
27914
27915
27916
27917
27918
27919
27920
27921
27922
27923
27924
27925
27926
27927
27928
27929
27930
27931
27932
27933
27934
27935
27936
27937
27938
27939
27940
27941
27942
27943
27944
27945
27946
27947
27948
27949
27950
27951
27952
27953
27954
27955
27956
27957
27958
27959
27960
27961
27962
27963
27964
27965
27966
27967
27968
27969
27970
27971
27972
27973
27974
27975
27976
27977
27978
27979
27980
27981
27982
27983
27984
27985
27986
27987
27988
27989
27990
27991
27992
27993
27994
27995
27996
27997
27998
27999
28000
28001
28002
28003
28004
28005
28006
28007
28008
28009
28010
28011
28012
28013
28014
28015
28016
28017
28018
28019
28020
28021
28022
28023
28024
28025
28026
28027
28028
28029
28030
28031
28032
28033
28034
28035
28036
28037
28038
28039
28040
28041
28042
28043
28044
28045
28046
28047
28048
28049
28050
28051
28052
28053
28054
28055
28056
28057
28058
28059
28060
28061
28062
28063
28064
28065
28066
28067
28068
28069
28070
28071
28072
28073
28074
28075
28076
28077
28078
28079
28080
28081
28082
28083
28084
28085
28086
28087
28088
28089
28090
28091
28092
28093
28094
28095
28096
28097
28098
28099
28100
28101
28102
28103
28104
28105
28106
28107
28108
28109
28110
28111
28112
28113
28114
28115
28116
28117
28118
28119
28120
28121
28122
28123
28124
28125
28126
28127
28128
28129
28130
28131
28132
28133
28134
28135
28136
28137
28138
28139
28140
28141
28142
28143
28144
28145
28146
28147
28148
28149
28150
28151
28152
28153
28154
28155
28156
28157
28158
28159
28160
28161
28162
28163
28164
28165
28166
28167
28168
28169
28170
28171
28172
28173
28174
28175
28176
28177
28178
28179
28180
28181
28182
28183
28184
28185
28186
28187
28188
28189
28190
28191
28192
28193
28194
28195
28196
28197
28198
28199
28200
28201
28202
28203
28204
28205
28206
28207
28208
28209
28210
28211
28212
28213
28214
28215
28216
28217
28218
28219
28220
28221
28222
28223
28224
28225
28226
28227
28228
28229
28230
28231
28232
28233
28234
28235
28236
28237
28238
28239
28240
28241
28242
28243
28244
28245
28246
28247
28248
28249
28250
28251
28252
28253
28254
28255
28256
28257
28258
28259
28260
28261
28262
28263
28264
28265
28266
28267
28268
28269
28270
28271
28272
28273
28274
28275
28276
28277
28278
28279
28280
28281
28282
28283
28284
28285
28286
28287
28288
28289
28290
28291
28292
28293
28294
28295
28296
28297
28298
28299
28300
28301
28302
28303
28304
28305
28306
28307
28308
28309
28310
28311
28312
28313
28314
28315
28316
28317
28318
28319
28320
28321
28322
28323
28324
28325
28326
28327
28328
28329
28330
28331
28332
28333
28334
28335
28336
28337
28338
28339
28340
28341
28342
28343
28344
28345
28346
28347
28348
28349
28350
28351
28352
28353
28354
28355
28356
28357
28358
28359
28360
28361
28362
28363
28364
28365
28366
28367
28368
28369
28370
28371
28372
28373
28374
28375
28376
28377
28378
28379
28380
28381
28382
28383
28384
28385
28386
28387
28388
28389
28390
28391
28392
28393
28394
28395
28396
28397
28398
28399
28400
28401
28402
28403
28404
28405
28406
28407
28408
28409
28410
28411
28412
28413
28414
28415
28416
28417
28418
28419
28420
28421
28422
28423
28424
28425
28426
28427
28428
28429
28430
28431
28432
28433
28434
28435
28436
28437
28438
28439
28440
28441
28442
28443
28444
28445
28446
28447
28448
28449
28450
28451
28452
28453
28454
28455
28456
28457
28458
28459
28460
28461
28462
28463
28464
28465
28466
28467
28468
28469
28470
28471
28472
28473
28474
28475
28476
28477
28478
28479
28480
28481
28482
28483
28484
28485
28486
28487
28488
28489
28490
28491
28492
28493
28494
28495
28496
28497
28498
28499
28500
28501
28502
28503
28504
28505
28506
28507
28508
28509
28510
28511
28512
28513
28514
28515
28516
28517
28518
28519
28520
28521
28522
28523
28524
28525
28526
28527
28528
28529
28530
28531
28532
28533
28534
28535
28536
28537
28538
28539
28540
28541
28542
28543
28544
28545
28546
28547
28548
28549
28550
28551
28552
28553
28554
28555
28556
28557
28558
28559
28560
28561
28562
28563
28564
28565
28566
28567
28568
28569
28570
28571
28572
28573
28574
28575
28576
28577
28578
28579
28580
28581
28582
28583
28584
28585
28586
28587
28588
28589
28590
28591
28592
28593
28594
28595
28596
28597
28598
28599
28600
28601
28602
28603
28604
28605
28606
28607
28608
28609
28610
28611
28612
28613
28614
28615
28616
28617
28618
28619
28620
28621
28622
28623
28624
28625
28626
28627
28628
28629
28630
28631
28632
28633
28634
28635
28636
28637
28638
28639
28640
28641
28642
28643
28644
28645
28646
28647
28648
28649
28650
28651
28652
28653
28654
28655
28656
28657
28658
28659
28660
28661
28662
28663
28664
28665
28666
28667
28668
28669
28670
28671
28672
28673
28674
28675
28676
28677
28678
28679
28680
28681
28682
28683
28684
28685
28686
28687
28688
28689
28690
28691
28692
28693
28694
28695
28696
28697
28698
28699
28700
28701
28702
28703
28704
28705
28706
28707
28708
28709
28710
28711
28712
28713
28714
28715
28716
28717
28718
28719
28720
28721
28722
28723
28724
28725
28726
28727
28728
28729
28730
28731
28732
28733
28734
28735
28736
28737
28738
28739
28740
28741
28742
28743
28744
28745
28746
28747
28748
28749
28750
28751
28752
28753
28754
28755
28756
28757
28758
28759
28760
28761
28762
28763
28764
28765
28766
28767
28768
28769
28770
28771
28772
28773
28774
28775
28776
28777
28778
28779
28780
28781
28782
28783
28784
28785
28786
28787
28788
28789
28790
28791
28792
28793
28794
28795
28796
28797
28798
28799
28800
28801
28802
28803
28804
28805
28806
28807
28808
28809
28810
28811
28812
28813
28814
28815
28816
28817
28818
28819
28820
28821
28822
28823
28824
28825
28826
28827
28828
28829
28830
28831
28832
28833
28834
28835
28836
28837
28838
28839
28840
28841
28842
28843
28844
28845
28846
28847
28848
28849
28850
28851
28852
28853
28854
28855
28856
28857
28858
28859
28860
28861
28862
28863
28864
28865
28866
28867
28868
28869
28870
28871
28872
28873
28874
28875
28876
28877
28878
28879
28880
28881
28882
28883
28884
28885
28886
28887
28888
28889
28890
28891
28892
28893
28894
28895
28896
28897
28898
28899
28900
28901
28902
28903
28904
28905
28906
28907
28908
28909
28910
28911
28912
28913
28914
28915
28916
28917
28918
28919
28920
28921
28922
28923
28924
28925
28926
28927
28928
28929
28930
28931
28932
28933
28934
28935
28936
28937
28938
28939
28940
28941
28942
28943
28944
28945
28946
28947
28948
28949
28950
28951
28952
28953
28954
28955
28956
28957
28958
28959
28960
28961
28962
28963
28964
28965
28966
28967
28968
28969
28970
28971
28972
28973
28974
28975
28976
28977
28978
28979
28980
28981
28982
28983
28984
28985
28986
28987
28988
28989
28990
28991
28992
28993
28994
28995
28996
28997
28998
28999
29000
29001
29002
29003
29004
29005
29006
29007
29008
29009
29010
29011
29012
29013
29014
29015
29016
29017
29018
29019
29020
29021
29022
29023
29024
29025
29026
29027
29028
29029
29030
29031
29032
29033
29034
29035
29036
29037
29038
29039
29040
29041
29042
29043
29044
29045
29046
29047
29048
29049
29050
29051
29052
29053
29054
29055
29056
29057
29058
29059
29060
29061
29062
29063
29064
29065
29066
29067
29068
29069
29070
29071
29072
29073
29074
29075
29076
29077
29078
29079
29080
29081
29082
29083
29084
29085
29086
29087
29088
29089
29090
29091
29092
29093
29094
29095
29096
29097
29098
29099
29100
29101
29102
29103
29104
29105
29106
29107
29108
29109
29110
29111
29112
29113
29114
29115
29116
29117
29118
29119
29120
29121
29122
29123
29124
29125
29126
29127
29128
29129
29130
29131
29132
29133
29134
29135
29136
29137
29138
29139
29140
29141
29142
29143
29144
29145
29146
29147
29148
29149
29150
29151
29152
29153
29154
29155
29156
29157
29158
29159
29160
29161
29162
29163
29164
29165
29166
29167
29168
29169
29170
29171
29172
29173
29174
29175
29176
29177
29178
29179
29180
29181
29182
29183
29184
29185
29186
29187
29188
29189
29190
29191
29192
29193
29194
29195
29196
29197
29198
29199
29200
29201
29202
29203
29204
29205
29206
29207
29208
29209
29210
29211
29212
29213
29214
29215
29216
29217
29218
29219
29220
29221
29222
29223
29224
29225
29226
29227
29228
29229
29230
29231
29232
29233
29234
29235
29236
29237
29238
29239
29240
29241
29242
29243
29244
29245
29246
29247
29248
29249
29250
29251
29252
29253
29254
29255
29256
29257
29258
29259
29260
29261
29262
29263
29264
29265
29266
29267
29268
29269
29270
29271
29272
29273
29274
29275
29276
29277
29278
29279
29280
29281
29282
29283
29284
29285
29286
29287
29288
29289
29290
29291
29292
29293
29294
29295
29296
29297
29298
29299
29300
29301
29302
29303
29304
29305
29306
29307
29308
29309
29310
29311
29312
29313
29314
29315
29316
29317
29318
29319
29320
29321
29322
29323
29324
29325
29326
29327
29328
29329
29330
29331
29332
29333
29334
29335
29336
29337
29338
29339
29340
29341
29342
29343
29344
29345
29346
29347
29348
29349
29350
29351
29352
29353
29354
29355
29356
29357
29358
29359
29360
29361
29362
29363
29364
29365
29366
29367
29368
29369
29370
29371
29372
29373
29374
29375
29376
29377
29378
29379
29380
29381
29382
29383
29384
29385
29386
29387
29388
29389
29390
29391
29392
29393
29394
29395
29396
29397
29398
29399
29400
29401
29402
29403
29404
29405
29406
29407
29408
29409
29410
29411
29412
29413
29414
29415
29416
29417
29418
29419
29420
29421
29422
29423
29424
29425
29426
29427
29428
29429
29430
29431
29432
29433
29434
29435
29436
29437
29438
29439
29440
29441
29442
29443
29444
29445
29446
29447
29448
29449
29450
29451
29452
29453
29454
29455
29456
29457
29458
29459
29460
29461
29462
29463
29464
29465
29466
29467
29468
29469
29470
29471
29472
29473
29474
29475
29476
29477
29478
29479
29480
29481
29482
29483
29484
29485
29486
29487
29488
29489
29490
29491
29492
29493
29494
29495
29496
29497
29498
29499
29500
29501
29502
29503
29504
29505
29506
29507
29508
29509
29510
29511
29512
29513
29514
29515
29516
29517
29518
29519
29520
29521
29522
29523
29524
29525
29526
29527
29528
29529
29530
29531
29532
29533
29534
29535
29536
29537
29538
29539
29540
29541
29542
29543
29544
29545
29546
29547
29548
29549
29550
29551
29552
29553
29554
29555
29556
29557
29558
29559
29560
29561
29562
29563
29564
29565
29566
29567
29568
29569
29570
29571
29572
29573
29574
29575
29576
29577
29578
29579
29580
29581
29582
29583
29584
29585
29586
29587
29588
29589
29590
29591
29592
29593
29594
29595
29596
29597
29598
29599
29600
29601
29602
29603
29604
29605
29606
29607
29608
29609
29610
29611
29612
29613
29614
29615
29616
29617
29618
29619
29620
29621
29622
29623
29624
29625
29626
29627
29628
29629
29630
29631
29632
29633
29634
29635
29636
29637
29638
29639
29640
29641
29642
29643
29644
29645
29646
29647
29648
29649
29650
29651
29652
29653
29654
29655
29656
29657
29658
29659
29660
29661
29662
29663
29664
29665
29666
29667
29668
29669
29670
29671
29672
29673
29674
29675
29676
29677
29678
29679
29680
29681
29682
29683
29684
29685
29686
29687
29688
29689
29690
29691
29692
29693
29694
29695
29696
29697
29698
29699
29700
29701
29702
29703
29704
29705
29706
29707
29708
29709
29710
29711
29712
29713
29714
29715
29716
29717
29718
29719
29720
29721
29722
29723
29724
29725
29726
29727
29728
29729
29730
29731
29732
29733
29734
29735
29736
29737
29738
29739
29740
29741
29742
29743
29744
29745
29746
29747
29748
29749
29750
29751
29752
29753
29754
29755
29756
29757
29758
29759
29760
29761
29762
29763
29764
29765
29766
29767
29768
29769
29770
29771
29772
29773
29774
29775
29776
29777
29778
29779
29780
29781
29782
29783
29784
29785
29786
29787
29788
29789
29790
29791
29792
29793
29794
29795
29796
29797
29798
29799
29800
29801
29802
29803
29804
29805
29806
29807
29808
29809
29810
29811
29812
29813
29814
29815
29816
29817
29818
29819
29820
29821
29822
29823
29824
29825
29826
29827
29828
29829
29830
29831
29832
29833
29834
29835
29836
29837
29838
29839
29840
29841
29842
29843
29844
29845
29846
29847
29848
29849
29850
29851
29852
29853
29854
29855
29856
29857
29858
29859
29860
29861
29862
29863
29864
29865
29866
29867
29868
29869
29870
29871
29872
29873
29874
29875
29876
29877
29878
29879
29880
29881
29882
29883
29884
29885
29886
29887
29888
29889
29890
29891
29892
29893
29894
29895
29896
29897
29898
29899
29900
29901
29902
29903
29904
29905
29906
29907
29908
29909
29910
29911
29912
29913
29914
29915
29916
29917
29918
29919
29920
29921
29922
29923
29924
29925
29926
29927
29928
29929
29930
29931
29932
29933
29934
29935
29936
29937
29938
29939
29940
29941
29942
29943
29944
29945
29946
29947
29948
29949
29950
29951
29952
29953
29954
29955
29956
29957
29958
29959
29960
29961
29962
29963
29964
29965
29966
29967
29968
29969
29970
29971
29972
29973
29974
29975
29976
29977
29978
29979
29980
29981
29982
29983
29984
29985
29986
29987
29988
29989
29990
29991
29992
29993
29994
29995
29996
29997
29998
29999
30000
30001
30002
30003
30004
30005
30006
30007
30008
30009
30010
30011
30012
30013
30014
30015
30016
30017
30018
30019
30020
30021
30022
30023
30024
30025
30026
30027
30028
30029
30030
30031
30032
30033
30034
30035
30036
30037
30038
30039
30040
30041
30042
30043
30044
30045
30046
30047
30048
30049
30050
30051
30052
30053
30054
30055
30056
30057
30058
30059
30060
30061
30062
30063
30064
30065
30066
30067
30068
30069
30070
30071
30072
30073
30074
30075
30076
30077
30078
30079
30080
30081
30082
30083
30084
30085
30086
30087
30088
30089
30090
30091
30092
30093
30094
30095
30096
30097
30098
30099
30100
30101
30102
30103
30104
30105
30106
30107
30108
30109
30110
30111
30112
30113
30114
30115
30116
30117
30118
30119
30120
30121
30122
30123
30124
30125
30126
30127
30128
30129
30130
30131
30132
30133
30134
30135
30136
30137
30138
30139
30140
30141
30142
30143
30144
30145
30146
30147
30148
30149
30150
30151
30152
30153
30154
30155
30156
30157
30158
30159
30160
30161
30162
30163
30164
30165
30166
30167
30168
30169
30170
30171
30172
30173
30174
30175
30176
30177
30178
30179
30180
30181
30182
30183
30184
30185
30186
30187
30188
30189
30190
30191
30192
30193
30194
30195
30196
30197
30198
30199
30200
30201
30202
30203
30204
30205
30206
30207
30208
30209
30210
30211
30212
30213
30214
30215
30216
30217
30218
30219
30220
30221
30222
30223
30224
30225
30226
30227
30228
30229
30230
30231
30232
30233
30234
30235
30236
30237
30238
30239
30240
30241
30242
30243
30244
30245
30246
30247
30248
30249
30250
30251
30252
30253
30254
30255
30256
30257
30258
30259
30260
30261
30262
30263
30264
30265
30266
30267
30268
30269
30270
30271
30272
30273
30274
30275
30276
30277
30278
30279
30280
30281
30282
30283
30284
30285
30286
30287
30288
30289
30290
30291
30292
30293
30294
30295
30296
30297
30298
30299
30300
30301
30302
30303
30304
30305
30306
30307
30308
30309
30310
30311
30312
30313
30314
30315
30316
30317
30318
30319
30320
30321
30322
30323
30324
30325
30326
30327
30328
30329
30330
30331
30332
30333
30334
30335
30336
30337
30338
30339
30340
30341
30342
30343
30344
30345
30346
30347
30348
30349
30350
30351
30352
30353
30354
30355
30356
30357
30358
30359
30360
30361
30362
30363
30364
30365
30366
30367
30368
30369
30370
30371
30372
30373
30374
30375
30376
30377
30378
30379
30380
30381
30382
30383
30384
30385
30386
30387
30388
30389
30390
30391
30392
30393
30394
30395
30396
30397
30398
30399
30400
30401
30402
30403
30404
30405
30406
30407
30408
30409
30410
30411
30412
30413
30414
30415
30416
30417
30418
30419
30420
30421
30422
30423
30424
30425
30426
30427
30428
30429
30430
30431
30432
30433
30434
30435
30436
30437
30438
30439
30440
30441
30442
30443
30444
30445
30446
30447
30448
30449
30450
30451
30452
30453
30454
30455
30456
30457
30458
30459
30460
30461
30462
30463
30464
30465
30466
30467
30468
30469
30470
30471
30472
30473
30474
30475
30476
30477
30478
30479
30480
30481
30482
30483
30484
30485
30486
30487
30488
30489
30490
30491
30492
30493
30494
30495
30496
30497
30498
30499
30500
30501
30502
30503
30504
30505
30506
30507
30508
30509
30510
30511
30512
30513
30514
30515
30516
30517
30518
30519
30520
30521
30522
30523
30524
30525
30526
30527
30528
30529
30530
30531
30532
30533
30534
30535
30536
30537
30538
30539
30540
30541
30542
30543
30544
30545
30546
30547
30548
30549
30550
30551
30552
30553
30554
30555
30556
30557
30558
30559
30560
30561
30562
30563
30564
30565
30566
30567
30568
30569
30570
30571
30572
30573
30574
30575
30576
30577
30578
30579
30580
30581
30582
30583
30584
30585
30586
30587
30588
30589
30590
30591
30592
30593
30594
30595
30596
30597
30598
30599
30600
30601
30602
30603
30604
30605
30606
30607
30608
30609
30610
30611
30612
30613
30614
30615
30616
30617
30618
30619
30620
30621
30622
30623
30624
30625
30626
30627
30628
30629
30630
30631
30632
30633
30634
30635
30636
30637
30638
30639
30640
30641
30642
30643
30644
30645
30646
30647
30648
30649
30650
30651
30652
30653
30654
30655
30656
30657
30658
30659
30660
30661
30662
30663
30664
30665
30666
30667
30668
30669
30670
30671
30672
30673
30674
30675
30676
30677
30678
30679
30680
30681
30682
30683
30684
30685
30686
30687
30688
30689
30690
30691
30692
30693
30694
30695
30696
30697
30698
30699
30700
30701
30702
30703
30704
30705
30706
30707
30708
30709
30710
30711
30712
30713
30714
30715
30716
30717
30718
30719
30720
30721
30722
30723
30724
30725
30726
30727
30728
30729
30730
30731
30732
30733
30734
30735
30736
30737
30738
30739
30740
30741
30742
30743
30744
30745
30746
30747
30748
30749
30750
30751
30752
30753
30754
30755
30756
30757
30758
30759
30760
30761
30762
30763
30764
30765
30766
30767
30768
30769
30770
30771
30772
30773
30774
30775
30776
30777
30778
30779
30780
30781
30782
30783
30784
30785
30786
30787
30788
30789
30790
30791
30792
30793
30794
30795
30796
30797
30798
30799
30800
30801
30802
30803
30804
30805
30806
30807
30808
30809
30810
30811
30812
30813
30814
30815
30816
30817
30818
30819
30820
30821
30822
30823
30824
30825
30826
30827
30828
30829
30830
30831
30832
30833
30834
30835
30836
30837
30838
30839
30840
30841
30842
30843
30844
30845
30846
30847
30848
30849
30850
30851
30852
30853
30854
30855
30856
30857
30858
30859
30860
30861
30862
30863
30864
30865
30866
30867
30868
30869
30870
30871
30872
30873
30874
30875
30876
30877
30878
30879
30880
30881
30882
30883
30884
30885
30886
30887
30888
30889
30890
30891
30892
30893
30894
30895
30896
30897
30898
30899
30900
30901
30902
30903
30904
30905
30906
30907
30908
30909
30910
30911
30912
30913
30914
30915
30916
30917
30918
30919
30920
30921
30922
30923
30924
30925
30926
30927
30928
30929
30930
30931
30932
30933
30934
30935
30936
30937
30938
30939
30940
30941
30942
30943
30944
30945
30946
30947
30948
30949
30950
30951
30952
30953
30954
30955
30956
30957
30958
30959
30960
30961
30962
30963
30964
30965
30966
30967
30968
30969
30970
30971
30972
30973
30974
30975
30976
30977
30978
30979
30980
30981
30982
30983
30984
30985
30986
30987
30988
30989
30990
30991
30992
30993
30994
30995
30996
30997
30998
30999
31000
31001
31002
31003
31004
31005
31006
31007
31008
31009
31010
31011
31012
31013
31014
31015
31016
31017
31018
31019
31020
31021
31022
31023
31024
31025
31026
31027
31028
31029
31030
31031
31032
31033
31034
31035
31036
31037
31038
31039
31040
31041
31042
31043
31044
31045
31046
31047
31048
31049
31050
31051
31052
31053
31054
31055
31056
31057
31058
31059
31060
31061
31062
31063
31064
31065
31066
31067
31068
31069
31070
31071
31072
31073
31074
31075
31076
31077
31078
31079
31080
31081
31082
31083
31084
31085
31086
31087
31088
31089
31090
31091
31092
31093
31094
31095
31096
31097
31098
31099
31100
31101
31102
31103
31104
31105
31106
31107
31108
31109
31110
31111
31112
31113
31114
31115
31116
31117
31118
31119
31120
31121
31122
31123
31124
31125
31126
31127
31128
31129
31130
31131
31132
31133
31134
31135
31136
31137
31138
31139
31140
31141
31142
31143
31144
31145
31146
31147
31148
31149
31150
31151
31152
31153
31154
31155
31156
31157
31158
31159
31160
31161
31162
31163
31164
31165
31166
31167
31168
31169
31170
31171
31172
31173
31174
31175
31176
31177
31178
31179
31180
31181
31182
31183
31184
31185
31186
31187
31188
31189
31190
31191
31192
31193
31194
31195
31196
31197
31198
31199
31200
31201
31202
31203
31204
31205
31206
31207
31208
31209
31210
31211
31212
31213
31214
31215
31216
31217
31218
31219
31220
31221
31222
31223
31224
31225
31226
31227
31228
31229
31230
31231
31232
31233
31234
31235
31236
31237
31238
31239
31240
31241
31242
31243
31244
31245
31246
31247
31248
31249
31250
31251
31252
31253
31254
31255
31256
31257
31258
31259
31260
31261
31262
31263
31264
31265
31266
31267
31268
31269
31270
31271
31272
31273
31274
31275
31276
31277
31278
31279
31280
31281
31282
31283
31284
31285
31286
31287
31288
31289
31290
31291
31292
31293
31294
31295
31296
31297
31298
31299
31300
31301
31302
31303
31304
31305
31306
31307
31308
31309
31310
31311
31312
31313
31314
31315
31316
31317
31318
31319
31320
31321
31322
31323
31324
31325
31326
31327
31328
31329
31330
31331
31332
31333
31334
31335
31336
31337
31338
31339
31340
31341
31342
31343
31344
31345
31346
31347
31348
31349
31350
31351
31352
31353
31354
31355
31356
31357
31358
31359
31360
31361
31362
31363
31364
31365
31366
31367
31368
31369
31370
31371
31372
31373
31374
31375
31376
31377
31378
31379
31380
31381
31382
31383
31384
31385
31386
31387
31388
31389
31390
31391
31392
31393
31394
31395
31396
31397
31398
31399
31400
31401
31402
31403
31404
31405
31406
31407
31408
31409
31410
31411
31412
31413
31414
31415
31416
31417
31418
31419
31420
31421
31422
31423
31424
31425
31426
31427
31428
31429
31430
31431
31432
31433
31434
31435
31436
31437
31438
31439
31440
31441
31442
31443
31444
31445
31446
31447
31448
31449
31450
31451
31452
31453
31454
31455
31456
31457
31458
31459
31460
31461
31462
31463
31464
31465
31466
31467
31468
31469
31470
31471
31472
31473
31474
31475
31476
31477
31478
31479
31480
31481
31482
31483
31484
31485
31486
31487
31488
31489
31490
31491
31492
31493
31494
31495
31496
31497
31498
31499
31500
31501
31502
31503
31504
31505
31506
31507
31508
31509
31510
31511
31512
31513
31514
31515
31516
31517
31518
31519
31520
31521
31522
31523
31524
31525
31526
31527
31528
31529
31530
31531
31532
31533
31534
31535
31536
31537
31538
31539
31540
31541
31542
31543
31544
31545
31546
31547
31548
31549
31550
31551
31552
31553
31554
31555
31556
31557
31558
31559
31560
31561
31562
31563
31564
31565
31566
31567
31568
31569
31570
31571
31572
31573
31574
31575
31576
31577
31578
31579
31580
31581
31582
31583
31584
31585
31586
31587
31588
31589
31590
31591
31592
31593
31594
31595
31596
31597
31598
31599
31600
31601
31602
31603
31604
31605
31606
31607
31608
31609
31610
31611
31612
31613
31614
31615
31616
31617
31618
31619
31620
31621
31622
31623
31624
31625
31626
31627
31628
31629
31630
31631
31632
31633
31634
31635
31636
31637
31638
31639
31640
31641
31642
31643
31644
31645
31646
31647
31648
31649
31650
31651
31652
31653
31654
31655
31656
31657
31658
31659
31660
31661
31662
31663
31664
31665
31666
31667
31668
31669
31670
31671
31672
31673
31674
31675
31676
31677
31678
31679
31680
31681
31682
31683
31684
31685
31686
31687
31688
31689
31690
31691
31692
31693
31694
31695
31696
31697
31698
31699
31700
31701
31702
31703
31704
31705
31706
31707
31708
31709
31710
31711
31712
31713
31714
31715
31716
31717
31718
31719
31720
31721
31722
31723
31724
31725
31726
31727
31728
31729
31730
31731
31732
31733
31734
31735
31736
31737
31738
31739
31740
31741
31742
31743
31744
31745
31746
31747
31748
31749
31750
31751
31752
31753
31754
31755
31756
31757
31758
31759
31760
31761
31762
31763
31764
31765
31766
31767
31768
31769
31770
31771
31772
31773
31774
31775
31776
31777
31778
31779
31780
31781
31782
31783
31784
31785
31786
31787
31788
31789
31790
31791
31792
31793
31794
31795
31796
31797
31798
31799
31800
31801
31802
31803
31804
31805
31806
31807
31808
31809
31810
31811
31812
31813
31814
31815
31816
31817
31818
31819
31820
31821
31822
31823
31824
31825
31826
31827
31828
31829
31830
31831
31832
31833
31834
31835
31836
31837
31838
31839
31840
31841
31842
31843
31844
31845
31846
31847
31848
31849
31850
31851
31852
31853
31854
31855
31856
31857
31858
31859
31860
31861
31862
31863
31864
31865
31866
31867
31868
31869
31870
31871
31872
31873
31874
31875
31876
31877
31878
31879
31880
31881
31882
31883
31884
31885
31886
31887
31888
31889
31890
31891
31892
31893
31894
31895
31896
31897
31898
31899
31900
31901
31902
31903
31904
31905
31906
31907
31908
31909
31910
31911
31912
31913
31914
31915
31916
31917
31918
31919
31920
31921
31922
31923
31924
31925
31926
31927
31928
31929
31930
31931
31932
31933
31934
31935
31936
31937
31938
31939
31940
31941
31942
31943
31944
31945
31946
31947
31948
31949
31950
31951
31952
31953
31954
31955
31956
31957
31958
31959
31960
31961
31962
31963
31964
31965
31966
31967
31968
31969
31970
31971
31972
31973
31974
31975
31976
31977
31978
31979
31980
31981
31982
31983
31984
31985
31986
31987
31988
31989
31990
31991
31992
31993
31994
31995
31996
31997
31998
31999
32000
32001
32002
32003
32004
32005
32006
32007
32008
32009
32010
32011
32012
32013
32014
32015
32016
32017
32018
32019
32020
32021
32022
32023
32024
32025
32026
32027
32028
32029
32030
32031
32032
32033
32034
32035
32036
32037
32038
32039
32040
32041
32042
32043
32044
32045
32046
32047
32048
32049
32050
32051
32052
32053
32054
32055
32056
32057
32058
32059
32060
32061
32062
32063
32064
32065
32066
32067
32068
32069
32070
32071
32072
32073
32074
32075
32076
32077
32078
32079
32080
32081
32082
32083
32084
32085
32086
32087
32088
32089
32090
32091
32092
32093
32094
32095
32096
32097
32098
32099
32100
32101
32102
32103
32104
32105
32106
32107
32108
32109
32110
32111
32112
32113
32114
32115
32116
32117
32118
32119
32120
32121
32122
32123
32124
32125
32126
32127
32128
32129
32130
32131
32132
32133
32134
32135
32136
32137
32138
32139
32140
32141
32142
32143
32144
32145
32146
32147
32148
32149
32150
32151
32152
32153
32154
32155
32156
32157
32158
32159
32160
32161
32162
32163
32164
32165
32166
32167
32168
32169
32170
32171
32172
32173
32174
32175
32176
32177
32178
32179
32180
32181
32182
32183
32184
32185
32186
32187
32188
32189
32190
32191
32192
32193
32194
32195
32196
32197
32198
32199
32200
32201
32202
32203
32204
32205
32206
32207
32208
32209
32210
32211
32212
32213
32214
32215
32216
32217
32218
32219
32220
32221
32222
32223
32224
32225
32226
32227
32228
32229
32230
32231
32232
32233
32234
32235
32236
32237
32238
32239
32240
32241
32242
32243
32244
32245
32246
32247
32248
32249
32250
32251
32252
32253
32254
32255
32256
32257
32258
32259
32260
32261
32262
32263
32264
32265
32266
32267
32268
32269
32270
32271
32272
32273
32274
32275
32276
32277
32278
32279
32280
32281
32282
32283
32284
32285
32286
32287
32288
32289
32290
32291
32292
32293
32294
32295
32296
32297
32298
32299
32300
32301
32302
32303
32304
32305
32306
32307
32308
32309
32310
32311
32312
32313
32314
32315
32316
32317
32318
32319
32320
32321
32322
32323
32324
32325
32326
32327
32328
32329
32330
32331
32332
32333
32334
32335
32336
32337
32338
32339
32340
32341
32342
32343
32344
32345
32346
32347
32348
32349
32350
32351
32352
32353
32354
32355
32356
32357
32358
32359
32360
32361
32362
32363
32364
32365
32366
32367
32368
32369
32370
32371
32372
32373
32374
32375
32376
32377
32378
32379
32380
32381
32382
32383
32384
32385
32386
32387
32388
32389
32390
32391
32392
32393
32394
32395
32396
32397
32398
32399
32400
32401
32402
32403
32404
32405
32406
32407
32408
32409
32410
32411
32412
32413
32414
32415
32416
32417
32418
32419
32420
32421
32422
32423
32424
32425
32426
32427
32428
32429
32430
32431
32432
32433
32434
32435
32436
32437
32438
32439
32440
32441
32442
32443
32444
32445
32446
32447
32448
32449
32450
32451
32452
32453
32454
32455
32456
32457
32458
32459
32460
32461
32462
32463
32464
32465
32466
32467
32468
32469
32470
32471
32472
32473
32474
32475
32476
32477
32478
32479
32480
32481
32482
32483
32484
32485
32486
32487
32488
32489
32490
32491
32492
32493
32494
32495
32496
32497
32498
32499
32500
32501
32502
32503
32504
32505
32506
32507
32508
32509
32510
32511
32512
32513
32514
32515
32516
32517
32518
32519
32520
32521
32522
32523
32524
32525
32526
32527
32528
32529
32530
32531
32532
32533
32534
32535
32536
32537
32538
32539
32540
32541
32542
32543
32544
32545
32546
32547
32548
32549
32550
32551
32552
32553
32554
32555
32556
32557
32558
32559
32560
32561
32562
32563
32564
32565
32566
32567
32568
32569
32570
32571
32572
32573
32574
32575
32576
32577
32578
32579
32580
32581
32582
32583
32584
32585
32586
32587
32588
32589
32590
32591
32592
32593
32594
32595
32596
32597
32598
32599
32600
32601
32602
32603
32604
32605
32606
32607
32608
32609
32610
32611
32612
32613
32614
32615
32616
32617
32618
32619
32620
32621
32622
32623
32624
32625
32626
32627
32628
32629
32630
32631
32632
32633
32634
32635
32636
32637
32638
32639
32640
32641
32642
32643
32644
32645
32646
32647
32648
32649
32650
32651
32652
32653
32654
32655
32656
32657
32658
32659
32660
32661
32662
32663
32664
32665
32666
32667
32668
32669
32670
32671
32672
32673
32674
32675
32676
32677
32678
32679
32680
32681
32682
32683
32684
32685
32686
32687
32688
32689
32690
32691
32692
32693
32694
32695
32696
32697
32698
32699
32700
32701
32702
32703
32704
32705
32706
32707
32708
32709
32710
32711
32712
32713
32714
32715
32716
32717
32718
32719
32720
32721
32722
32723
32724
32725
32726
32727
32728
32729
32730
32731
32732
32733
32734
32735
32736
32737
32738
32739
32740
32741
32742
32743
32744
32745
32746
32747
32748
32749
32750
32751
32752
32753
32754
32755
32756
32757
32758
32759
32760
32761
32762
32763
32764
32765
32766
32767
32768
32769
32770
32771
32772
32773
32774
32775
32776
32777
32778
32779
32780
32781
32782
32783
32784
32785
32786
32787
32788
32789
32790
32791
32792
32793
32794
32795
32796
32797
32798
32799
32800
32801
32802
32803
32804
32805
32806
32807
32808
32809
32810
32811
32812
32813
32814
32815
32816
32817
32818
32819
32820
32821
32822
32823
32824
32825
32826
32827
32828
32829
32830
32831
32832
32833
32834
32835
32836
32837
32838
32839
32840
32841
32842
32843
32844
32845
32846
32847
32848
32849
32850
32851
32852
32853
32854
32855
32856
32857
32858
32859
32860
32861
32862
32863
32864
32865
32866
32867
32868
32869
32870
32871
32872
32873
32874
32875
32876
32877
32878
32879
32880
32881
32882
32883
32884
32885
32886
32887
32888
32889
32890
32891
32892
32893
32894
32895
32896
32897
32898
32899
32900
32901
32902
32903
32904
32905
32906
32907
32908
32909
32910
32911
32912
32913
32914
32915
32916
32917
32918
32919
32920
32921
32922
32923
32924
32925
32926
32927
32928
32929
32930
32931
32932
32933
32934
32935
32936
32937
32938
32939
32940
32941
32942
32943
32944
32945
32946
32947
32948
32949
32950
32951
32952
32953
32954
32955
32956
32957
32958
32959
32960
32961
32962
32963
32964
32965
32966
32967
32968
32969
32970
32971
32972
32973
32974
32975
32976
32977
32978
32979
32980
32981
32982
32983
32984
32985
32986
32987
32988
32989
32990
32991
32992
32993
32994
32995
32996
32997
32998
32999
33000
33001
33002
33003
33004
33005
33006
33007
33008
33009
33010
33011
33012
33013
33014
33015
33016
33017
33018
33019
33020
33021
33022
33023
33024
33025
33026
33027
33028
33029
33030
33031
33032
33033
33034
33035
33036
33037
33038
33039
33040
33041
33042
33043
33044
33045
33046
33047
33048
33049
33050
33051
33052
33053
33054
33055
33056
33057
33058
33059
33060
33061
33062
33063
33064
33065
33066
33067
33068
33069
33070
33071
33072
33073
33074
33075
33076
33077
33078
33079
33080
33081
33082
33083
33084
33085
33086
33087
33088
33089
33090
33091
33092
33093
33094
33095
33096
33097
33098
33099
33100
33101
33102
33103
33104
33105
33106
33107
33108
33109
33110
33111
33112
33113
33114
33115
33116
33117
33118
33119
33120
33121
33122
33123
33124
33125
33126
33127
33128
33129
33130
33131
33132
33133
33134
33135
33136
33137
33138
33139
33140
33141
33142
33143
33144
33145
33146
33147
33148
33149
33150
33151
33152
33153
33154
33155
33156
33157
33158
33159
33160
33161
33162
33163
33164
33165
33166
33167
33168
33169
33170
33171
33172
33173
33174
33175
33176
33177
33178
33179
33180
33181
33182
33183
33184
33185
33186
33187
33188
33189
33190
33191
33192
33193
33194
33195
33196
33197
33198
33199
33200
33201
33202
33203
33204
33205
33206
33207
33208
33209
33210
33211
33212
33213
33214
33215
33216
33217
33218
33219
33220
33221
33222
33223
33224
33225
33226
33227
33228
33229
33230
33231
33232
33233
33234
33235
33236
33237
33238
33239
33240
33241
33242
33243
33244
33245
33246
33247
33248
33249
33250
33251
33252
33253
33254
33255
33256
33257
33258
33259
33260
33261
33262
33263
33264
33265
33266
33267
33268
33269
33270
33271
33272
33273
33274
33275
33276
33277
33278
33279
33280
33281
33282
33283
33284
33285
33286
33287
33288
33289
33290
33291
33292
33293
33294
33295
33296
33297
33298
33299
33300
33301
33302
33303
33304
33305
33306
33307
33308
33309
33310
33311
33312
33313
33314
33315
33316
33317
33318
33319
33320
33321
33322
33323
33324
33325
33326
33327
33328
33329
33330
33331
33332
33333
33334
33335
33336
33337
33338
33339
33340
33341
33342
33343
33344
33345
33346
33347
33348
33349
33350
33351
33352
33353
33354
33355
33356
33357
33358
33359
33360
33361
33362
33363
33364
33365
33366
33367
33368
33369
33370
33371
33372
33373
33374
33375
33376
33377
33378
33379
33380
33381
33382
33383
33384
33385
33386
33387
33388
33389
33390
33391
33392
33393
33394
33395
33396
33397
33398
33399
33400
33401
33402
33403
33404
33405
33406
33407
33408
33409
33410
33411
33412
33413
33414
33415
33416
33417
33418
33419
33420
33421
33422
33423
33424
33425
33426
33427
33428
33429
33430
33431
33432
33433
33434
33435
33436
33437
33438
33439
33440
33441
33442
33443
33444
33445
33446
33447
33448
33449
33450
33451
33452
33453
33454
33455
33456
33457
33458
33459
33460
33461
33462
33463
33464
33465
33466
33467
33468
33469
33470
33471
33472
33473
33474
33475
33476
33477
33478
33479
33480
33481
33482
33483
33484
33485
33486
33487
33488
33489
33490
33491
33492
33493
33494
33495
33496
33497
33498
33499
33500
33501
33502
33503
33504
33505
33506
33507
33508
33509
33510
33511
33512
33513
33514
33515
33516
33517
33518
33519
33520
33521
33522
33523
33524
33525
33526
33527
33528
33529
33530
33531
33532
33533
33534
33535
33536
33537
33538
33539
33540
33541
33542
33543
33544
33545
33546
33547
33548
33549
33550
33551
33552
33553
33554
33555
33556
33557
33558
33559
33560
33561
33562
33563
33564
33565
33566
33567
33568
33569
33570
33571
33572
33573
33574
33575
33576
33577
33578
33579
33580
33581
33582
33583
33584
33585
33586
33587
33588
33589
33590
33591
33592
33593
33594
33595
33596
33597
33598
33599
33600
33601
33602
33603
33604
33605
33606
33607
33608
33609
33610
33611
33612
33613
33614
33615
33616
33617
33618
33619
33620
33621
33622
33623
33624
33625
33626
33627
33628
33629
33630
33631
33632
33633
33634
33635
33636
33637
33638
33639
33640
33641
33642
33643
33644
33645
33646
33647
33648
33649
33650
33651
33652
33653
33654
33655
33656
33657
33658
33659
33660
33661
33662
33663
33664
33665
33666
33667
33668
33669
33670
33671
33672
33673
33674
33675
33676
33677
33678
33679
33680
33681
33682
33683
33684
33685
33686
33687
33688
33689
33690
33691
33692
33693
33694
33695
33696
33697
33698
33699
33700
33701
33702
33703
33704
33705
33706
33707
33708
33709
33710
33711
33712
33713
33714
33715
33716
33717
33718
33719
33720
33721
33722
33723
33724
33725
33726
33727
33728
33729
33730
33731
33732
33733
33734
33735
33736
33737
33738
33739
33740
33741
33742
33743
33744
33745
33746
33747
33748
33749
33750
33751
33752
33753
33754
33755
33756
33757
33758
33759
33760
33761
33762
33763
33764
33765
33766
33767
33768
33769
33770
33771
33772
33773
33774
33775
33776
33777
33778
33779
33780
33781
33782
33783
33784
33785
33786
33787
33788
33789
33790
33791
33792
33793
33794
33795
33796
33797
33798
33799
33800
33801
33802
33803
33804
33805
33806
33807
33808
33809
33810
33811
33812
33813
33814
33815
33816
33817
33818
33819
33820
33821
33822
33823
33824
33825
33826
33827
33828
33829
33830
33831
33832
33833
33834
33835
33836
33837
33838
33839
33840
33841
33842
33843
33844
33845
33846
33847
33848
33849
33850
33851
33852
33853
33854
33855
33856
33857
33858
33859
33860
33861
33862
33863
33864
33865
33866
33867
33868
33869
33870
33871
33872
33873
33874
33875
33876
33877
33878
33879
33880
33881
33882
33883
33884
33885
33886
33887
33888
33889
33890
33891
33892
33893
33894
33895
33896
33897
33898
33899
33900
33901
33902
33903
33904
33905
33906
33907
33908
33909
33910
33911
33912
33913
33914
33915
33916
33917
33918
33919
33920
33921
33922
33923
33924
33925
33926
33927
33928
33929
33930
33931
33932
33933
33934
33935
33936
33937
33938
33939
33940
33941
33942
33943
33944
33945
33946
33947
33948
33949
33950
33951
33952
33953
33954
33955
33956
33957
33958
33959
33960
33961
33962
33963
33964
33965
33966
33967
33968
33969
33970
33971
33972
33973
33974
33975
33976
33977
33978
33979
33980
33981
33982
33983
33984
33985
33986
33987
33988
33989
33990
33991
33992
33993
33994
33995
33996
33997
33998
33999
34000
34001
34002
34003
34004
34005
34006
34007
34008
34009
34010
34011
34012
34013
34014
34015
34016
34017
34018
34019
34020
34021
34022
34023
34024
34025
34026
34027
34028
34029
34030
34031
34032
34033
34034
34035
34036
34037
34038
34039
34040
34041
34042
34043
34044
34045
34046
34047
34048
34049
34050
34051
34052
34053
34054
34055
34056
34057
34058
34059
34060
34061
34062
34063
34064
34065
34066
34067
34068
34069
34070
34071
34072
34073
34074
34075
34076
34077
34078
34079
34080
34081
34082
34083
34084
34085
34086
34087
34088
34089
34090
34091
34092
34093
34094
34095
34096
34097
34098
34099
34100
34101
34102
34103
34104
34105
34106
34107
34108
34109
34110
34111
34112
34113
34114
34115
34116
34117
34118
34119
34120
34121
34122
34123
34124
34125
34126
34127
34128
34129
34130
34131
34132
34133
34134
34135
34136
34137
34138
34139
34140
34141
34142
34143
34144
34145
34146
34147
34148
34149
34150
34151
34152
34153
34154
34155
34156
34157
34158
34159
34160
34161
34162
34163
34164
34165
34166
34167
34168
34169
34170
34171
34172
34173
34174
34175
34176
34177
34178
34179
34180
34181
34182
34183
34184
34185
34186
34187
34188
34189
34190
34191
34192
34193
34194
34195
34196
34197
34198
34199
34200
34201
34202
34203
34204
34205
34206
34207
34208
34209
34210
34211
34212
34213
34214
34215
34216
34217
34218
34219
34220
34221
34222
34223
34224
34225
34226
34227
34228
34229
34230
34231
34232
34233
34234
34235
34236
34237
34238
34239
34240
34241
34242
34243
34244
34245
34246
34247
34248
34249
34250
34251
34252
34253
34254
34255
34256
34257
34258
34259
34260
34261
34262
34263
34264
34265
34266
34267
34268
34269
34270
34271
34272
34273
34274
34275
34276
34277
34278
34279
34280
34281
34282
34283
34284
34285
34286
34287
34288
34289
34290
34291
34292
34293
34294
34295
34296
34297
34298
34299
34300
34301
34302
34303
34304
34305
34306
34307
34308
34309
34310
34311
34312
34313
34314
34315
34316
34317
34318
34319
34320
34321
34322
34323
34324
34325
34326
34327
34328
34329
34330
34331
34332
34333
34334
34335
34336
34337
34338
34339
34340
34341
34342
34343
34344
34345
34346
34347
34348
34349
34350
34351
34352
34353
34354
34355
34356
34357
34358
34359
34360
34361
34362
34363
34364
34365
34366
34367
34368
34369
34370
34371
34372
34373
34374
34375
34376
34377
34378
34379
34380
34381
34382
34383
34384
34385
34386
34387
34388
34389
34390
34391
34392
34393
34394
34395
34396
34397
34398
34399
34400
34401
34402
34403
34404
34405
34406
34407
34408
34409
34410
34411
34412
34413
34414
34415
34416
34417
34418
34419
34420
34421
34422
34423
34424
34425
34426
34427
34428
34429
34430
34431
34432
34433
34434
34435
34436
34437
34438
34439
34440
34441
34442
34443
34444
34445
34446
34447
34448
34449
34450
34451
34452
34453
34454
34455
34456
34457
34458
34459
34460
34461
34462
34463
34464
34465
34466
34467
34468
34469
34470
34471
34472
34473
34474
34475
34476
34477
34478
34479
34480
34481
34482
34483
34484
34485
34486
34487
34488
34489
34490
34491
34492
34493
34494
34495
34496
34497
34498
34499
34500
34501
34502
34503
34504
34505
34506
34507
34508
34509
34510
34511
34512
34513
34514
34515
34516
34517
34518
34519
34520
34521
34522
34523
34524
34525
34526
34527
34528
34529
34530
34531
34532
34533
34534
34535
34536
34537
34538
34539
34540
34541
34542
34543
34544
34545
34546
34547
34548
34549
34550
34551
34552
34553
34554
34555
34556
34557
34558
34559
34560
34561
34562
34563
34564
34565
34566
34567
34568
34569
34570
34571
34572
34573
34574
34575
34576
34577
34578
34579
34580
34581
34582
34583
34584
34585
34586
34587
34588
34589
34590
34591
34592
34593
34594
34595
34596
34597
34598
34599
34600
34601
34602
34603
34604
34605
34606
34607
34608
34609
34610
34611
34612
34613
34614
34615
34616
34617
34618
34619
34620
34621
34622
34623
34624
34625
34626
34627
34628
34629
34630
34631
34632
34633
34634
34635
34636
34637
34638
34639
34640
34641
34642
34643
34644
34645
34646
34647
34648
34649
34650
34651
34652
34653
34654
34655
34656
34657
34658
34659
34660
34661
34662
34663
34664
34665
34666
34667
34668
34669
34670
34671
34672
34673
34674
34675
34676
34677
34678
34679
34680
34681
34682
34683
34684
34685
34686
34687
34688
34689
34690
34691
34692
34693
34694
34695
34696
34697
34698
34699
34700
34701
34702
34703
34704
34705
34706
34707
34708
34709
34710
34711
34712
34713
34714
34715
34716
34717
34718
34719
34720
34721
34722
34723
34724
34725
34726
34727
34728
34729
34730
34731
34732
34733
34734
34735
34736
34737
34738
34739
34740
34741
34742
34743
34744
34745
34746
34747
34748
34749
34750
34751
34752
34753
34754
34755
34756
34757
34758
34759
34760
34761
34762
34763
34764
34765
34766
34767
34768
34769
34770
34771
34772
34773
34774
34775
34776
34777
34778
34779
34780
34781
34782
34783
34784
34785
34786
34787
34788
34789
34790
34791
34792
34793
34794
34795
34796
34797
34798
34799
34800
34801
34802
34803
34804
34805
34806
34807
34808
34809
34810
34811
34812
34813
34814
34815
34816
34817
34818
34819
34820
34821
34822
34823
34824
34825
34826
34827
34828
34829
34830
34831
34832
34833
34834
34835
34836
34837
34838
34839
34840
34841
34842
34843
34844
34845
34846
34847
34848
34849
34850
34851
34852
34853
34854
34855
34856
34857
34858
34859
34860
34861
34862
34863
34864
34865
34866
34867
34868
34869
34870
34871
34872
34873
34874
34875
34876
34877
34878
34879
34880
34881
34882
34883
34884
34885
34886
34887
34888
34889
34890
34891
34892
34893
34894
34895
34896
34897
34898
34899
34900
34901
34902
34903
34904
34905
34906
34907
34908
34909
34910
34911
34912
34913
34914
34915
34916
34917
34918
34919
34920
34921
34922
34923
34924
34925
34926
34927
34928
34929
34930
34931
34932
34933
34934
34935
34936
34937
34938
34939
34940
34941
34942
34943
34944
34945
34946
34947
34948
34949
34950
34951
34952
34953
34954
34955
34956
34957
34958
34959
34960
34961
34962
34963
34964
34965
34966
34967
34968
34969
34970
34971
34972
34973
34974
34975
34976
34977
34978
34979
34980
34981
34982
34983
34984
34985
34986
34987
34988
34989
34990
34991
34992
34993
34994
34995
34996
34997
34998
34999
35000
35001
35002
35003
35004
35005
35006
35007
35008
35009
35010
35011
35012
35013
35014
35015
35016
35017
35018
35019
35020
35021
35022
35023
35024
35025
35026
35027
35028
35029
35030
35031
35032
35033
35034
35035
35036
35037
35038
35039
35040
35041
35042
35043
35044
35045
35046
35047
35048
35049
35050
35051
35052
35053
35054
35055
35056
35057
35058
35059
35060
35061
35062
35063
35064
35065
35066
35067
35068
35069
35070
35071
35072
35073
35074
35075
35076
35077
35078
35079
35080
35081
35082
35083
35084
35085
35086
35087
35088
35089
35090
35091
35092
35093
35094
35095
35096
35097
35098
35099
35100
35101
35102
35103
35104
35105
35106
35107
35108
35109
35110
35111
35112
35113
35114
35115
35116
35117
35118
35119
35120
35121
35122
35123
35124
35125
35126
35127
35128
35129
35130
35131
35132
35133
35134
35135
35136
35137
35138
35139
35140
35141
35142
35143
35144
35145
35146
35147
35148
35149
35150
35151
35152
35153
35154
35155
35156
35157
35158
35159
35160
35161
35162
35163
35164
35165
35166
35167
35168
35169
35170
35171
35172
35173
35174
35175
35176
35177
35178
35179
35180
35181
35182
35183
35184
35185
35186
35187
35188
35189
35190
35191
35192
35193
35194
35195
35196
35197
35198
35199
35200
35201
35202
35203
35204
35205
35206
35207
35208
35209
35210
35211
35212
35213
35214
35215
35216
35217
35218
35219
35220
35221
35222
35223
35224
35225
35226
35227
35228
35229
35230
35231
35232
35233
35234
35235
35236
35237
35238
35239
35240
35241
35242
35243
35244
35245
35246
35247
35248
35249
35250
35251
35252
35253
35254
35255
35256
35257
35258
35259
35260
35261
35262
35263
35264
35265
35266
35267
35268
35269
35270
35271
35272
35273
35274
35275
35276
35277
35278
35279
35280
35281
35282
35283
35284
35285
35286
35287
35288
35289
35290
35291
35292
35293
35294
35295
35296
35297
35298
35299
35300
35301
35302
35303
35304
35305
35306
35307
35308
35309
35310
35311
35312
35313
35314
35315
35316
35317
35318
35319
35320
35321
35322
35323
35324
35325
35326
35327
35328
35329
35330
35331
35332
35333
35334
35335
35336
35337
35338
35339
35340
35341
35342
35343
35344
35345
35346
35347
35348
35349
35350
35351
35352
35353
35354
35355
35356
35357
35358
35359
35360
35361
35362
35363
35364
35365
35366
35367
35368
35369
35370
35371
35372
35373
35374
35375
35376
35377
35378
35379
35380
35381
35382
35383
35384
35385
35386
35387
35388
35389
35390
35391
35392
35393
35394
35395
35396
35397
35398
35399
35400
35401
35402
35403
35404
35405
35406
35407
35408
35409
35410
35411
35412
35413
35414
35415
35416
35417
35418
35419
35420
35421
35422
35423
35424
35425
35426
35427
35428
35429
35430
35431
35432
35433
35434
35435
35436
35437
35438
35439
35440
35441
35442
35443
35444
35445
35446
35447
35448
35449
35450
35451
35452
35453
35454
35455
35456
35457
35458
35459
35460
35461
35462
35463
35464
35465
35466
35467
35468
35469
35470
35471
35472
35473
35474
35475
35476
35477
35478
35479
35480
35481
35482
35483
35484
35485
35486
35487
35488
35489
35490
35491
35492
35493
35494
35495
35496
35497
35498
35499
35500
35501
35502
35503
35504
35505
35506
35507
35508
35509
35510
35511
35512
35513
35514
35515
35516
35517
35518
35519
35520
35521
35522
35523
35524
35525
35526
35527
35528
35529
35530
35531
35532
35533
35534
35535
35536
35537
35538
35539
35540
35541
35542
35543
35544
35545
35546
35547
35548
35549
35550
35551
35552
35553
35554
35555
35556
35557
35558
35559
35560
35561
35562
35563
35564
35565
35566
35567
35568
35569
35570
35571
35572
35573
35574
35575
35576
35577
35578
35579
35580
35581
35582
35583
35584
35585
35586
35587
35588
35589
35590
35591
35592
35593
35594
35595
35596
35597
35598
35599
35600
35601
35602
35603
35604
35605
35606
35607
35608
35609
35610
35611
35612
35613
35614
35615
35616
35617
35618
35619
35620
35621
35622
35623
35624
35625
35626
35627
35628
35629
35630
35631
35632
35633
35634
35635
35636
35637
35638
35639
35640
35641
35642
35643
35644
35645
35646
35647
35648
35649
35650
35651
35652
35653
35654
35655
35656
35657
35658
35659
35660
35661
35662
35663
35664
35665
35666
35667
35668
35669
35670
35671
35672
35673
35674
35675
35676
35677
35678
35679
35680
35681
35682
35683
35684
35685
35686
35687
35688
35689
35690
35691
35692
35693
35694
35695
35696
35697
35698
35699
35700
35701
35702
35703
35704
35705
35706
35707
35708
35709
35710
35711
35712
35713
35714
35715
35716
35717
35718
35719
35720
35721
35722
35723
35724
35725
35726
35727
35728
35729
35730
35731
35732
35733
35734
35735
35736
35737
35738
35739
35740
35741
35742
35743
35744
35745
35746
35747
35748
35749
35750
35751
35752
35753
35754
35755
35756
35757
35758
35759
35760
35761
35762
35763
35764
35765
35766
35767
35768
35769
35770
35771
35772
35773
35774
35775
35776
35777
35778
35779
35780
35781
35782
35783
35784
35785
35786
35787
35788
35789
35790
35791
35792
35793
35794
35795
35796
35797
35798
35799
35800
35801
35802
35803
35804
35805
35806
35807
35808
35809
35810
35811
35812
35813
35814
35815
35816
35817
35818
35819
35820
35821
35822
35823
35824
35825
35826
35827
35828
35829
35830
35831
35832
35833
35834
35835
35836
35837
35838
35839
35840
35841
35842
35843
35844
35845
35846
35847
35848
35849
35850
35851
35852
35853
35854
35855
35856
35857
35858
35859
35860
35861
35862
35863
35864
35865
35866
35867
35868
35869
35870
35871
35872
35873
35874
35875
35876
35877
35878
35879
35880
35881
35882
35883
35884
35885
35886
35887
35888
35889
35890
35891
35892
35893
35894
35895
35896
35897
35898
35899
35900
35901
35902
35903
35904
35905
35906
35907
35908
35909
35910
35911
35912
35913
35914
35915
35916
35917
35918
35919
35920
35921
35922
35923
35924
35925
35926
35927
35928
35929
35930
35931
35932
35933
35934
35935
35936
35937
35938
35939
35940
35941
35942
35943
35944
35945
35946
35947
35948
35949
35950
35951
35952
35953
35954
35955
35956
35957
35958
35959
35960
35961
35962
35963
35964
35965
35966
35967
35968
35969
35970
35971
35972
35973
35974
35975
35976
35977
35978
35979
35980
35981
35982
35983
35984
35985
35986
35987
35988
35989
35990
35991
35992
35993
35994
35995
35996
35997
35998
35999
36000
36001
36002
36003
36004
36005
36006
36007
36008
36009
36010
36011
36012
36013
36014
36015
36016
36017
36018
36019
36020
36021
36022
36023
36024
36025
36026
36027
36028
36029
36030
36031
36032
36033
36034
36035
36036
36037
36038
36039
36040
36041
36042
36043
36044
36045
36046
36047
36048
36049
36050
36051
36052
36053
36054
36055
36056
36057
36058
36059
36060
36061
36062
36063
36064
36065
36066
36067
36068
36069
36070
36071
36072
36073
36074
36075
36076
36077
36078
36079
36080
36081
36082
36083
36084
36085
36086
36087
36088
36089
36090
36091
36092
36093
36094
36095
36096
36097
36098
36099
36100
36101
36102
36103
36104
36105
36106
36107
36108
36109
36110
36111
36112
36113
36114
36115
36116
36117
36118
36119
36120
36121
36122
36123
36124
36125
36126
36127
36128
36129
36130
36131
36132
36133
36134
36135
36136
36137
36138
36139
36140
36141
36142
36143
36144
36145
36146
36147
36148
36149
36150
36151
36152
36153
36154
36155
36156
36157
36158
36159
36160
36161
36162
36163
36164
36165
36166
36167
36168
36169
36170
36171
36172
36173
36174
36175
36176
36177
36178
36179
36180
36181
36182
36183
36184
36185
36186
36187
36188
36189
36190
36191
36192
36193
36194
36195
36196
36197
36198
36199
36200
36201
36202
36203
36204
36205
36206
36207
36208
36209
36210
36211
36212
36213
36214
36215
36216
36217
36218
36219
36220
36221
36222
36223
36224
36225
36226
36227
36228
36229
36230
36231
36232
36233
36234
36235
36236
36237
36238
36239
36240
36241
36242
36243
36244
36245
36246
36247
36248
36249
36250
36251
36252
36253
36254
36255
36256
36257
36258
36259
36260
36261
36262
36263
36264
36265
36266
36267
36268
36269
36270
36271
36272
36273
36274
36275
36276
36277
36278
36279
36280
36281
36282
36283
36284
36285
36286
36287
36288
36289
36290
36291
36292
36293
36294
36295
36296
36297
36298
36299
36300
36301
36302
36303
36304
36305
36306
36307
36308
36309
36310
36311
36312
36313
36314
36315
36316
36317
36318
36319
36320
36321
36322
36323
36324
36325
36326
36327
36328
36329
36330
36331
36332
36333
36334
36335
36336
36337
36338
36339
36340
36341
36342
36343
36344
36345
36346
36347
36348
36349
36350
36351
36352
36353
36354
36355
36356
36357
36358
36359
36360
36361
36362
36363
36364
36365
36366
36367
36368
36369
36370
36371
36372
36373
36374
36375
36376
36377
36378
36379
36380
36381
36382
36383
36384
36385
36386
36387
36388
36389
36390
36391
36392
36393
36394
36395
36396
36397
36398
36399
36400
36401
36402
36403
36404
36405
36406
36407
36408
36409
36410
36411
36412
36413
36414
36415
36416
36417
36418
36419
36420
36421
36422
36423
36424
36425
36426
36427
36428
36429
36430
36431
36432
36433
36434
36435
36436
36437
36438
36439
36440
36441
36442
36443
36444
36445
36446
36447
36448
36449
36450
36451
36452
36453
36454
36455
36456
36457
36458
36459
36460
36461
36462
36463
36464
36465
36466
36467
36468
36469
36470
36471
36472
36473
36474
36475
36476
36477
36478
36479
36480
36481
36482
36483
36484
36485
36486
36487
36488
36489
36490
36491
36492
36493
36494
36495
36496
36497
36498
36499
36500
36501
36502
36503
36504
36505
36506
36507
36508
36509
36510
36511
36512
36513
36514
36515
36516
36517
36518
36519
36520
36521
36522
36523
36524
36525
36526
36527
36528
36529
36530
36531
36532
36533
36534
36535
36536
36537
36538
36539
36540
36541
36542
36543
36544
36545
36546
36547
36548
36549
36550
36551
36552
36553
36554
36555
36556
36557
36558
36559
36560
36561
36562
36563
36564
36565
36566
36567
36568
36569
36570
36571
36572
36573
36574
36575
36576
36577
36578
36579
36580
36581
36582
36583
36584
36585
36586
36587
36588
36589
36590
36591
36592
36593
36594
36595
36596
36597
36598
36599
36600
36601
36602
36603
36604
36605
36606
36607
36608
36609
36610
36611
36612
36613
36614
36615
36616
36617
36618
36619
36620
36621
36622
36623
36624
36625
36626
36627
36628
36629
36630
36631
36632
36633
36634
36635
36636
36637
36638
36639
36640
36641
36642
36643
36644
36645
36646
36647
36648
36649
36650
36651
36652
36653
36654
36655
36656
36657
36658
36659
36660
36661
36662
36663
36664
36665
36666
36667
36668
36669
36670
36671
36672
36673
36674
36675
36676
36677
36678
36679
36680
36681
36682
36683
36684
36685
36686
36687
36688
36689
36690
36691
36692
36693
36694
36695
36696
36697
36698
36699
36700
36701
36702
36703
36704
36705
36706
36707
36708
36709
36710
36711
36712
36713
36714
36715
36716
36717
36718
36719
36720
36721
36722
36723
36724
36725
36726
36727
36728
36729
36730
36731
36732
36733
36734
36735
36736
36737
36738
36739
36740
36741
36742
36743
36744
36745
36746
36747
36748
36749
36750
36751
36752
36753
36754
36755
36756
36757
36758
36759
36760
36761
36762
36763
36764
36765
36766
36767
36768
36769
36770
36771
36772
36773
36774
36775
36776
36777
36778
36779
36780
36781
36782
36783
36784
36785
36786
36787
36788
36789
36790
36791
36792
36793
36794
36795
36796
36797
36798
36799
36800
36801
36802
36803
36804
36805
36806
36807
36808
36809
36810
36811
36812
36813
36814
36815
36816
36817
36818
36819
36820
36821
36822
36823
36824
36825
36826
36827
36828
36829
36830
36831
36832
36833
36834
36835
36836
36837
36838
36839
36840
36841
36842
36843
36844
36845
36846
36847
36848
36849
36850
36851
36852
36853
36854
36855
36856
36857
36858
36859
36860
36861
36862
36863
36864
36865
36866
36867
36868
36869
36870
36871
36872
36873
36874
36875
36876
36877
36878
36879
36880
36881
36882
36883
36884
36885
36886
36887
36888
36889
36890
36891
36892
36893
36894
36895
36896
36897
36898
36899
36900
36901
36902
36903
36904
36905
36906
36907
36908
36909
36910
36911
36912
36913
36914
36915
36916
36917
36918
36919
36920
36921
36922
36923
36924
36925
36926
36927
36928
36929
36930
36931
36932
36933
36934
36935
36936
36937
36938
36939
36940
36941
36942
36943
36944
36945
36946
36947
36948
36949
36950
36951
36952
36953
36954
36955
36956
36957
36958
36959
36960
36961
36962
36963
36964
36965
36966
36967
36968
36969
36970
36971
36972
36973
36974
36975
36976
36977
36978
36979
36980
36981
36982
36983
36984
36985
36986
36987
36988
36989
36990
36991
36992
36993
36994
36995
36996
36997
36998
36999
37000
37001
37002
37003
37004
37005
37006
37007
37008
37009
37010
37011
37012
37013
37014
37015
37016
37017
37018
37019
37020
37021
37022
37023
37024
37025
37026
37027
37028
37029
37030
37031
37032
37033
37034
37035
37036
37037
37038
37039
37040
37041
37042
37043
37044
37045
37046
37047
37048
37049
37050
37051
37052
37053
37054
37055
37056
37057
37058
37059
37060
37061
37062
37063
37064
37065
37066
37067
37068
37069
37070
37071
37072
37073
37074
37075
37076
37077
37078
37079
37080
37081
37082
37083
37084
37085
37086
37087
37088
37089
37090
37091
37092
37093
37094
37095
37096
37097
37098
37099
37100
37101
37102
37103
37104
37105
37106
37107
37108
37109
37110
37111
37112
37113
37114
37115
37116
37117
37118
37119
37120
37121
37122
37123
37124
37125
37126
37127
37128
37129
37130
37131
37132
37133
37134
37135
37136
37137
37138
37139
37140
37141
37142
37143
37144
37145
37146
37147
37148
37149
37150
37151
37152
37153
37154
37155
37156
37157
37158
37159
37160
37161
37162
37163
37164
37165
37166
37167
37168
37169
37170
37171
37172
37173
37174
37175
37176
37177
37178
37179
37180
37181
37182
37183
37184
37185
37186
37187
37188
37189
37190
37191
37192
37193
37194
37195
37196
37197
37198
37199
37200
37201
37202
37203
37204
37205
37206
37207
37208
37209
37210
37211
37212
37213
37214
37215
37216
37217
37218
37219
37220
37221
37222
37223
37224
37225
37226
37227
37228
37229
37230
37231
37232
37233
37234
37235
37236
37237
37238
37239
37240
37241
37242
37243
37244
37245
37246
37247
37248
37249
37250
37251
37252
37253
37254
37255
37256
37257
37258
37259
37260
37261
37262
37263
37264
37265
37266
37267
37268
37269
37270
37271
37272
37273
37274
37275
37276
37277
37278
37279
37280
37281
37282
37283
37284
37285
37286
37287
37288
37289
37290
37291
37292
37293
37294
37295
37296
37297
37298
37299
37300
37301
37302
37303
37304
37305
37306
37307
37308
37309
37310
37311
37312
37313
37314
37315
37316
37317
37318
37319
37320
37321
37322
37323
37324
37325
37326
37327
37328
37329
37330
37331
37332
37333
37334
37335
37336
37337
37338
37339
37340
37341
37342
37343
37344
37345
37346
37347
37348
37349
37350
37351
37352
37353
37354
37355
37356
37357
37358
37359
37360
37361
37362
37363
37364
37365
37366
37367
37368
37369
37370
37371
37372
37373
37374
37375
37376
37377
37378
37379
37380
37381
37382
37383
37384
37385
37386
37387
37388
37389
37390
37391
37392
37393
37394
37395
37396
37397
37398
37399
37400
37401
37402
37403
37404
37405
37406
37407
37408
37409
37410
37411
37412
37413
37414
37415
37416
37417
37418
37419
37420
37421
37422
37423
37424
37425
37426
37427
37428
37429
37430
37431
37432
37433
37434
37435
37436
37437
37438
37439
37440
37441
37442
37443
37444
37445
37446
37447
37448
37449
37450
37451
37452
37453
37454
37455
37456
37457
37458
37459
37460
37461
37462
37463
37464
37465
37466
37467
37468
37469
37470
37471
37472
37473
37474
37475
37476
37477
37478
37479
37480
37481
37482
37483
37484
37485
37486
37487
37488
37489
37490
37491
37492
37493
37494
37495
37496
37497
37498
37499
37500
37501
37502
37503
37504
37505
37506
37507
37508
37509
37510
37511
37512
37513
37514
37515
37516
37517
37518
37519
37520
37521
37522
37523
37524
37525
37526
37527
37528
37529
37530
37531
37532
37533
37534
37535
37536
37537
37538
37539
37540
37541
37542
37543
37544
37545
37546
37547
37548
37549
37550
37551
37552
37553
37554
37555
37556
37557
37558
37559
37560
37561
37562
37563
37564
37565
37566
37567
37568
37569
37570
37571
37572
37573
37574
37575
37576
37577
37578
37579
37580
37581
37582
37583
37584
37585
37586
37587
37588
37589
37590
37591
37592
37593
37594
37595
37596
37597
37598
37599
37600
37601
37602
37603
37604
37605
37606
37607
37608
37609
37610
37611
37612
37613
37614
37615
37616
37617
37618
37619
37620
37621
37622
37623
37624
37625
37626
37627
37628
37629
37630
37631
37632
37633
37634
37635
37636
37637
37638
37639
37640
37641
37642
37643
37644
37645
37646
37647
37648
37649
37650
37651
37652
37653
37654
37655
37656
37657
37658
37659
37660
37661
37662
37663
37664
37665
37666
37667
37668
37669
37670
37671
37672
37673
37674
37675
37676
37677
37678
37679
37680
37681
37682
37683
37684
37685
37686
37687
37688
37689
37690
37691
37692
37693
37694
37695
37696
37697
37698
37699
37700
37701
37702
37703
37704
37705
37706
37707
37708
37709
37710
37711
37712
37713
37714
37715
37716
37717
37718
37719
37720
37721
37722
37723
37724
37725
37726
37727
37728
37729
37730
37731
37732
37733
37734
37735
37736
37737
37738
37739
37740
37741
37742
37743
37744
37745
37746
37747
37748
37749
37750
37751
37752
37753
37754
37755
37756
37757
37758
37759
37760
37761
37762
37763
37764
37765
37766
37767
37768
37769
37770
37771
37772
37773
37774
37775
37776
37777
37778
37779
37780
37781
37782
37783
37784
37785
37786
37787
37788
37789
37790
37791
37792
37793
37794
37795
37796
37797
37798
37799
37800
37801
37802
37803
37804
37805
37806
37807
37808
37809
37810
37811
37812
37813
37814
37815
37816
37817
37818
37819
37820
37821
37822
37823
37824
37825
37826
37827
37828
37829
37830
37831
37832
37833
37834
37835
37836
37837
37838
37839
37840
37841
37842
37843
37844
37845
37846
37847
37848
37849
37850
37851
37852
37853
37854
37855
37856
37857
37858
37859
37860
37861
37862
37863
37864
37865
37866
37867
37868
37869
37870
37871
37872
37873
37874
37875
37876
37877
37878
37879
37880
37881
37882
37883
37884
37885
37886
37887
37888
37889
37890
37891
37892
37893
37894
37895
37896
37897
37898
37899
37900
37901
37902
37903
37904
37905
37906
37907
37908
37909
37910
37911
37912
37913
37914
37915
37916
37917
37918
37919
37920
37921
37922
37923
37924
37925
37926
37927
37928
37929
37930
37931
37932
37933
37934
37935
37936
37937
37938
37939
37940
37941
37942
37943
37944
37945
37946
37947
37948
37949
37950
37951
37952
37953
37954
37955
37956
37957
37958
37959
37960
37961
37962
37963
37964
37965
37966
37967
37968
37969
37970
37971
37972
37973
37974
37975
37976
37977
37978
37979
37980
37981
37982
37983
37984
37985
37986
37987
37988
37989
37990
37991
37992
37993
37994
37995
37996
37997
37998
37999
38000
38001
38002
38003
38004
38005
38006
38007
38008
38009
38010
38011
38012
38013
38014
38015
38016
38017
38018
38019
38020
38021
38022
38023
38024
38025
38026
38027
38028
38029
38030
38031
38032
38033
38034
38035
38036
38037
38038
38039
38040
38041
38042
38043
38044
38045
38046
38047
38048
38049
38050
38051
38052
38053
38054
38055
38056
38057
38058
38059
38060
38061
38062
38063
38064
38065
38066
38067
38068
38069
38070
38071
38072
38073
38074
38075
38076
38077
38078
38079
38080
38081
38082
38083
38084
38085
38086
38087
38088
38089
38090
38091
38092
38093
38094
38095
38096
38097
38098
38099
38100
38101
38102
38103
38104
38105
38106
38107
38108
38109
38110
38111
38112
38113
38114
38115
38116
38117
38118
38119
38120
38121
38122
38123
38124
38125
38126
38127
38128
38129
38130
38131
38132
38133
38134
38135
38136
38137
38138
38139
38140
38141
38142
38143
38144
38145
38146
38147
38148
38149
38150
38151
38152
38153
38154
38155
38156
38157
38158
38159
38160
38161
38162
38163
38164
38165
38166
38167
38168
38169
38170
38171
38172
38173
38174
38175
38176
38177
38178
38179
38180
38181
38182
38183
38184
38185
38186
38187
38188
38189
38190
38191
38192
38193
38194
38195
38196
38197
38198
38199
38200
38201
38202
38203
38204
38205
38206
38207
38208
38209
38210
38211
38212
38213
38214
38215
38216
38217
38218
38219
38220
38221
38222
38223
38224
38225
38226
38227
38228
38229
38230
38231
38232
38233
38234
38235
38236
38237
38238
38239
38240
38241
38242
38243
38244
38245
38246
38247
38248
38249
38250
38251
38252
38253
38254
38255
38256
38257
38258
38259
38260
38261
38262
38263
38264
38265
38266
38267
38268
38269
38270
38271
38272
38273
38274
38275
38276
38277
38278
38279
38280
38281
38282
38283
38284
38285
38286
38287
38288
38289
38290
38291
38292
38293
38294
38295
38296
38297
38298
38299
38300
38301
38302
38303
38304
38305
38306
38307
38308
38309
38310
38311
38312
38313
38314
38315
38316
38317
38318
38319
38320
38321
38322
38323
38324
38325
38326
38327
38328
38329
38330
38331
38332
38333
38334
38335
38336
38337
38338
38339
38340
38341
38342
38343
38344
38345
38346
38347
38348
38349
38350
38351
38352
38353
38354
38355
38356
38357
38358
38359
38360
38361
38362
38363
38364
38365
38366
38367
38368
38369
38370
38371
38372
38373
38374
38375
38376
38377
38378
38379
38380
38381
38382
38383
38384
38385
38386
38387
38388
38389
38390
38391
38392
38393
38394
38395
38396
38397
38398
38399
38400
38401
38402
38403
38404
38405
38406
38407
38408
38409
38410
38411
38412
38413
38414
38415
38416
38417
38418
38419
38420
38421
38422
38423
38424
38425
38426
38427
38428
38429
38430
38431
38432
38433
38434
38435
38436
38437
38438
38439
38440
38441
38442
38443
38444
38445
38446
38447
38448
38449
38450
38451
38452
38453
38454
38455
38456
38457
38458
38459
38460
38461
38462
38463
38464
38465
38466
38467
38468
38469
38470
38471
38472
38473
38474
38475
38476
38477
38478
38479
38480
38481
38482
38483
38484
38485
38486
38487
38488
38489
38490
38491
38492
38493
38494
38495
38496
38497
38498
38499
38500
38501
38502
38503
38504
38505
38506
38507
38508
38509
38510
38511
38512
38513
38514
38515
38516
38517
38518
38519
38520
38521
38522
38523
38524
38525
38526
38527
38528
38529
38530
38531
38532
38533
38534
38535
38536
38537
38538
38539
38540
38541
38542
38543
38544
38545
38546
38547
38548
38549
38550
38551
38552
38553
38554
38555
38556
38557
38558
38559
38560
38561
38562
38563
38564
38565
38566
38567
38568
38569
38570
38571
38572
38573
38574
38575
38576
38577
38578
38579
38580
38581
38582
38583
38584
38585
38586
38587
38588
38589
38590
38591
38592
38593
38594
38595
38596
38597
38598
38599
38600
38601
38602
38603
38604
38605
38606
38607
38608
38609
38610
38611
38612
38613
38614
38615
38616
38617
38618
38619
38620
38621
38622
38623
38624
38625
38626
38627
38628
38629
38630
38631
38632
38633
38634
38635
38636
38637
38638
38639
38640
38641
38642
38643
38644
38645
38646
38647
38648
38649
38650
38651
38652
38653
38654
38655
38656
38657
38658
38659
38660
38661
38662
38663
38664
38665
38666
38667
38668
38669
38670
38671
38672
38673
38674
38675
38676
38677
38678
38679
38680
38681
38682
38683
38684
38685
38686
38687
38688
38689
38690
38691
38692
38693
38694
38695
38696
38697
38698
38699
38700
38701
38702
38703
38704
38705
38706
38707
38708
38709
38710
38711
38712
38713
38714
38715
38716
38717
38718
38719
38720
38721
38722
38723
38724
38725
38726
38727
38728
38729
38730
38731
38732
38733
38734
38735
38736
38737
38738
38739
38740
38741
38742
38743
38744
38745
38746
38747
38748
38749
38750
38751
38752
38753
38754
38755
38756
38757
38758
38759
38760
38761
38762
38763
38764
38765
38766
38767
38768
38769
38770
38771
38772
38773
38774
38775
38776
38777
38778
38779
38780
38781
38782
38783
38784
38785
38786
38787
38788
38789
38790
38791
38792
38793
38794
38795
38796
38797
38798
38799
38800
38801
38802
38803
38804
38805
38806
38807
38808
38809
38810
38811
38812
38813
38814
38815
38816
38817
38818
38819
38820
38821
38822
38823
38824
38825
38826
38827
38828
38829
38830
38831
38832
38833
38834
38835
38836
38837
38838
38839
38840
38841
38842
38843
38844
38845
38846
38847
38848
38849
38850
38851
38852
38853
38854
38855
38856
38857
38858
38859
38860
38861
38862
38863
38864
38865
38866
38867
38868
38869
38870
38871
38872
38873
38874
38875
38876
38877
38878
38879
38880
38881
38882
38883
38884
38885
38886
38887
38888
38889
38890
38891
38892
38893
38894
38895
38896
38897
38898
38899
38900
38901
38902
38903
38904
38905
38906
38907
38908
38909
38910
38911
38912
38913
38914
38915
38916
38917
38918
38919
38920
38921
38922
38923
38924
38925
38926
38927
38928
38929
38930
38931
38932
38933
38934
38935
38936
38937
38938
38939
38940
38941
38942
38943
38944
38945
38946
38947
38948
38949
38950
38951
38952
38953
38954
38955
38956
38957
38958
38959
38960
38961
38962
38963
38964
38965
38966
38967
38968
38969
38970
38971
38972
38973
38974
38975
38976
38977
38978
38979
38980
38981
38982
38983
38984
38985
38986
38987
38988
38989
38990
38991
38992
38993
38994
38995
38996
38997
38998
38999
39000
39001
39002
39003
39004
39005
39006
39007
39008
39009
39010
39011
39012
39013
39014
39015
39016
39017
39018
39019
39020
39021
39022
39023
39024
39025
39026
39027
39028
39029
39030
39031
39032
39033
39034
39035
39036
39037
39038
39039
39040
39041
39042
39043
39044
39045
39046
39047
39048
39049
39050
39051
39052
39053
39054
39055
39056
39057
39058
39059
39060
39061
39062
39063
39064
39065
39066
39067
39068
39069
39070
39071
39072
39073
39074
39075
39076
39077
39078
39079
39080
39081
39082
39083
39084
39085
39086
39087
39088
39089
39090
39091
39092
39093
39094
39095
39096
39097
39098
39099
39100
39101
39102
39103
39104
39105
39106
39107
39108
39109
39110
39111
39112
39113
39114
39115
39116
39117
39118
39119
39120
39121
39122
39123
39124
39125
39126
39127
39128
39129
39130
39131
39132
39133
39134
39135
39136
39137
39138
39139
39140
39141
39142
39143
39144
39145
39146
39147
39148
39149
39150
39151
39152
39153
39154
39155
39156
39157
39158
39159
39160
39161
39162
39163
39164
39165
39166
39167
39168
39169
39170
39171
39172
39173
39174
39175
39176
39177
39178
39179
39180
39181
39182
39183
39184
39185
39186
39187
39188
39189
39190
39191
39192
39193
39194
39195
39196
39197
39198
39199
39200
39201
39202
39203
39204
39205
39206
39207
39208
39209
39210
39211
39212
39213
39214
39215
39216
39217
39218
39219
39220
39221
39222
39223
39224
39225
39226
39227
39228
39229
39230
39231
39232
39233
39234
39235
39236
39237
39238
39239
39240
39241
39242
39243
39244
39245
39246
39247
39248
39249
39250
39251
39252
39253
39254
39255
39256
39257
39258
39259
39260
39261
39262
39263
39264
39265
39266
39267
39268
39269
39270
39271
39272
39273
39274
39275
39276
39277
39278
39279
39280
39281
39282
39283
39284
39285
39286
39287
39288
39289
39290
39291
39292
39293
39294
39295
39296
39297
39298
39299
39300
39301
39302
39303
39304
39305
39306
39307
39308
39309
39310
39311
39312
39313
39314
39315
39316
39317
39318
39319
39320
39321
39322
39323
39324
39325
39326
39327
39328
39329
39330
39331
39332
39333
39334
39335
39336
39337
39338
39339
39340
39341
39342
39343
39344
39345
39346
39347
39348
39349
39350
39351
39352
39353
39354
39355
39356
39357
39358
39359
39360
39361
39362
39363
39364
39365
39366
39367
39368
39369
39370
39371
39372
39373
39374
39375
39376
39377
39378
39379
39380
39381
39382
39383
39384
39385
39386
39387
39388
39389
39390
39391
39392
39393
39394
39395
39396
39397
39398
39399
39400
39401
39402
39403
39404
39405
39406
39407
39408
39409
39410
39411
39412
39413
39414
39415
39416
39417
39418
39419
39420
39421
39422
39423
39424
39425
39426
39427
39428
39429
39430
39431
39432
39433
39434
39435
39436
39437
39438
39439
39440
39441
39442
39443
39444
39445
39446
39447
39448
39449
39450
39451
39452
39453
39454
39455
39456
39457
39458
39459
39460
39461
39462
39463
39464
39465
39466
39467
39468
39469
39470
39471
39472
39473
39474
39475
39476
39477
39478
39479
39480
39481
39482
39483
39484
39485
39486
39487
39488
39489
39490
39491
39492
39493
39494
39495
39496
39497
39498
39499
39500
39501
39502
39503
39504
39505
39506
39507
39508
39509
39510
39511
39512
39513
39514
39515
39516
39517
39518
39519
39520
39521
39522
39523
39524
39525
39526
39527
39528
39529
39530
39531
39532
39533
39534
39535
39536
39537
39538
39539
39540
39541
39542
39543
39544
39545
39546
39547
39548
39549
39550
39551
39552
39553
39554
39555
39556
39557
39558
39559
39560
39561
39562
39563
39564
39565
39566
39567
39568
39569
39570
39571
39572
39573
39574
39575
39576
39577
39578
39579
39580
39581
39582
39583
39584
39585
39586
39587
39588
39589
39590
39591
39592
39593
39594
39595
39596
39597
39598
39599
39600
39601
39602
39603
39604
39605
39606
39607
39608
39609
39610
39611
39612
39613
39614
39615
39616
39617
39618
39619
39620
39621
39622
39623
39624
39625
39626
39627
39628
39629
39630
39631
39632
39633
39634
39635
39636
39637
39638
39639
39640
39641
39642
39643
39644
39645
39646
39647
39648
39649
39650
39651
39652
39653
39654
39655
39656
39657
39658
39659
39660
39661
39662
39663
39664
39665
39666
39667
39668
39669
39670
39671
39672
39673
39674
39675
39676
39677
39678
39679
39680
39681
39682
39683
39684
39685
39686
39687
39688
39689
39690
39691
39692
39693
39694
39695
39696
39697
39698
39699
39700
39701
39702
39703
39704
39705
39706
39707
39708
39709
39710
39711
39712
39713
39714
39715
39716
39717
39718
39719
39720
39721
39722
39723
39724
39725
39726
39727
39728
39729
39730
39731
39732
39733
39734
39735
39736
39737
39738
39739
39740
39741
39742
39743
39744
39745
39746
39747
39748
39749
39750
39751
39752
39753
39754
39755
39756
39757
39758
39759
39760
39761
39762
39763
39764
39765
39766
39767
39768
39769
39770
39771
39772
39773
39774
39775
39776
39777
39778
39779
39780
39781
39782
39783
39784
39785
39786
39787
39788
39789
39790
39791
39792
39793
39794
39795
39796
39797
39798
39799
39800
39801
39802
39803
39804
39805
39806
39807
39808
39809
39810
39811
39812
39813
39814
39815
39816
39817
39818
39819
39820
39821
39822
39823
39824
39825
39826
39827
39828
39829
39830
39831
39832
39833
39834
39835
39836
39837
39838
39839
39840
39841
39842
39843
39844
39845
39846
39847
39848
39849
39850
39851
39852
39853
39854
39855
39856
39857
39858
39859
39860
39861
39862
39863
39864
39865
39866
39867
39868
39869
39870
39871
39872
39873
39874
39875
39876
39877
39878
39879
39880
39881
39882
39883
39884
39885
39886
39887
39888
39889
39890
39891
39892
39893
39894
39895
39896
39897
39898
39899
39900
39901
39902
39903
39904
39905
39906
39907
39908
39909
39910
39911
39912
39913
39914
39915
39916
39917
39918
39919
39920
39921
39922
39923
39924
39925
39926
39927
39928
39929
39930
39931
39932
39933
39934
39935
39936
39937
39938
39939
39940
39941
39942
39943
39944
39945
39946
39947
39948
39949
39950
39951
39952
39953
39954
39955
39956
39957
39958
39959
39960
39961
39962
39963
39964
39965
39966
39967
39968
39969
39970
39971
39972
39973
39974
39975
39976
39977
39978
39979
39980
39981
39982
39983
39984
39985
39986
39987
39988
39989
39990
39991
39992
39993
39994
39995
39996
39997
39998
39999
40000
40001
40002
40003
40004
40005
40006
40007
40008
40009
40010
40011
40012
40013
40014
40015
40016
40017
40018
40019
40020
40021
40022
40023
40024
40025
40026
40027
40028
40029
40030
40031
40032
40033
40034
40035
40036
40037
40038
40039
40040
40041
40042
40043
40044
40045
40046
40047
40048
40049
40050
40051
40052
40053
40054
40055
40056
40057
40058
40059
40060
40061
40062
40063
40064
40065
40066
40067
40068
40069
40070
40071
40072
40073
40074
40075
40076
40077
40078
40079
40080
40081
40082
40083
40084
40085
40086
40087
40088
40089
40090
40091
40092
40093
40094
40095
40096
40097
40098
40099
40100
40101
40102
40103
40104
40105
40106
40107
40108
40109
40110
40111
40112
40113
40114
40115
40116
40117
40118
40119
40120
40121
40122
40123
40124
40125
40126
40127
40128
40129
40130
40131
40132
40133
40134
40135
40136
40137
40138
40139
40140
40141
40142
40143
40144
40145
40146
40147
40148
40149
40150
40151
40152
40153
40154
40155
40156
40157
40158
40159
40160
40161
40162
40163
40164
40165
40166
40167
40168
40169
40170
40171
40172
40173
40174
40175
40176
40177
40178
40179
40180
40181
40182
40183
40184
40185
40186
40187
40188
40189
40190
40191
40192
40193
40194
40195
40196
40197
40198
40199
40200
40201
40202
40203
40204
40205
40206
40207
40208
40209
40210
40211
40212
40213
40214
40215
40216
40217
40218
40219
40220
40221
40222
40223
40224
40225
40226
40227
40228
40229
40230
40231
40232
40233
40234
40235
40236
40237
40238
40239
40240
40241
40242
40243
40244
40245
40246
40247
40248
40249
40250
40251
40252
40253
40254
40255
40256
40257
40258
40259
40260
40261
40262
40263
40264
40265
40266
40267
40268
40269
40270
40271
40272
40273
40274
40275
40276
40277
40278
40279
40280
40281
40282
40283
40284
40285
40286
40287
40288
40289
40290
40291
40292
40293
40294
40295
40296
40297
40298
40299
40300
40301
40302
40303
40304
40305
40306
40307
40308
40309
40310
40311
40312
40313
40314
40315
40316
40317
40318
40319
40320
40321
40322
40323
40324
40325
40326
40327
40328
40329
40330
40331
40332
40333
40334
40335
40336
40337
40338
40339
40340
40341
40342
40343
40344
40345
40346
40347
40348
40349
40350
40351
40352
40353
40354
40355
40356
40357
40358
40359
40360
40361
40362
40363
40364
40365
40366
40367
40368
40369
40370
40371
40372
40373
40374
40375
40376
40377
40378
40379
40380
40381
40382
40383
40384
40385
40386
40387
40388
40389
40390
40391
40392
40393
40394
40395
40396
40397
40398
40399
40400
40401
40402
40403
40404
40405
40406
40407
40408
40409
40410
40411
40412
40413
40414
40415
40416
40417
40418
40419
40420
40421
40422
40423
40424
40425
40426
40427
40428
40429
40430
40431
40432
40433
40434
40435
40436
40437
40438
40439
40440
40441
40442
40443
40444
40445
40446
40447
40448
40449
40450
40451
40452
40453
40454
40455
40456
40457
40458
40459
40460
40461
40462
40463
40464
40465
40466
40467
40468
40469
40470
40471
40472
40473
40474
40475
40476
40477
40478
40479
40480
40481
40482
40483
40484
40485
40486
40487
40488
40489
40490
40491
40492
40493
40494
40495
40496
40497
40498
40499
40500
40501
40502
40503
40504
40505
40506
40507
40508
40509
40510
40511
40512
40513
40514
40515
40516
40517
40518
40519
40520
40521
40522
40523
40524
40525
40526
40527
40528
40529
40530
40531
40532
40533
40534
40535
40536
40537
40538
40539
40540
40541
40542
40543
40544
40545
40546
40547
40548
40549
40550
40551
40552
40553
40554
40555
40556
40557
40558
40559
40560
40561
40562
40563
40564
40565
40566
40567
40568
40569
40570
40571
40572
40573
40574
40575
40576
40577
40578
40579
40580
40581
40582
40583
40584
40585
40586
40587
40588
40589
40590
40591
40592
40593
40594
40595
40596
40597
40598
40599
40600
40601
40602
40603
40604
40605
40606
40607
40608
40609
40610
40611
40612
40613
40614
40615
40616
40617
40618
40619
40620
40621
40622
40623
40624
40625
40626
40627
40628
40629
40630
40631
40632
40633
40634
40635
40636
40637
40638
40639
40640
40641
40642
40643
40644
40645
40646
40647
40648
40649
40650
40651
40652
40653
40654
40655
40656
40657
40658
40659
40660
40661
40662
40663
40664
40665
40666
40667
40668
40669
40670
40671
40672
40673
40674
40675
40676
40677
40678
40679
40680
40681
40682
40683
40684
40685
40686
40687
40688
40689
40690
40691
40692
40693
40694
40695
40696
40697
40698
40699
40700
40701
40702
40703
40704
40705
40706
40707
40708
40709
40710
40711
40712
40713
40714
40715
40716
40717
40718
40719
40720
40721
40722
40723
40724
40725
40726
40727
40728
40729
40730
40731
40732
40733
40734
40735
40736
40737
40738
40739
40740
40741
40742
40743
40744
40745
40746
40747
40748
40749
40750
40751
40752
40753
40754
40755
40756
40757
40758
40759
40760
40761
40762
40763
40764
40765
40766
40767
40768
40769
40770
40771
40772
40773
40774
40775
40776
40777
40778
40779
40780
40781
40782
40783
40784
40785
40786
40787
40788
40789
40790
40791
40792
40793
40794
40795
40796
40797
40798
40799
40800
40801
40802
40803
40804
40805
40806
40807
40808
40809
40810
40811
40812
40813
40814
40815
40816
40817
40818
40819
40820
40821
40822
40823
40824
40825
40826
40827
40828
40829
40830
40831
40832
40833
40834
40835
40836
40837
40838
40839
40840
40841
40842
40843
40844
40845
40846
40847
40848
40849
40850
40851
40852
40853
40854
40855
40856
40857
40858
40859
40860
40861
40862
40863
40864
40865
40866
40867
40868
40869
40870
40871
40872
40873
40874
40875
40876
40877
40878
40879
40880
40881
40882
40883
40884
40885
40886
40887
40888
40889
40890
40891
40892
40893
40894
40895
40896
40897
40898
40899
40900
40901
40902
40903
40904
40905
40906
40907
40908
40909
40910
40911
40912
40913
40914
40915
40916
40917
40918
40919
40920
40921
40922
40923
40924
40925
40926
40927
40928
40929
40930
40931
40932
40933
40934
40935
40936
40937
40938
40939
40940
40941
40942
40943
40944
40945
40946
40947
40948
40949
40950
40951
40952
40953
40954
40955
40956
40957
40958
40959
40960
40961
40962
40963
40964
40965
40966
40967
40968
40969
40970
40971
40972
40973
40974
40975
40976
40977
40978
40979
40980
40981
40982
40983
40984
40985
40986
40987
40988
40989
40990
40991
40992
40993
40994
40995
40996
40997
40998
40999
41000
41001
41002
41003
41004
41005
41006
41007
41008
41009
41010
41011
41012
41013
41014
41015
41016
41017
41018
41019
41020
41021
41022
41023
41024
41025
41026
41027
41028
41029
41030
41031
41032
41033
41034
41035
41036
41037
41038
41039
41040
41041
41042
41043
41044
41045
41046
41047
41048
41049
41050
41051
41052
41053
41054
41055
41056
41057
41058
41059
41060
41061
41062
41063
41064
41065
41066
41067
41068
41069
41070
41071
41072
41073
41074
41075
41076
41077
41078
41079
41080
41081
41082
41083
41084
41085
41086
41087
41088
41089
41090
41091
41092
41093
41094
41095
41096
41097
41098
41099
41100
41101
41102
41103
41104
41105
41106
41107
41108
41109
41110
41111
41112
41113
41114
41115
41116
41117
41118
41119
41120
41121
41122
41123
41124
41125
41126
41127
41128
41129
41130
41131
41132
41133
41134
41135
41136
41137
41138
41139
41140
41141
41142
41143
41144
41145
41146
41147
41148
41149
41150
41151
41152
41153
41154
41155
41156
41157
41158
41159
41160
41161
41162
41163
41164
41165
41166
41167
41168
41169
41170
41171
41172
41173
41174
41175
41176
41177
41178
41179
41180
41181
41182
41183
41184
41185
41186
41187
41188
41189
41190
41191
41192
41193
41194
41195
41196
41197
41198
41199
41200
41201
41202
41203
41204
41205
41206
41207
41208
41209
41210
41211
41212
41213
41214
41215
41216
41217
41218
41219
41220
41221
41222
41223
41224
41225
41226
41227
41228
41229
41230
41231
41232
41233
41234
41235
41236
41237
41238
41239
41240
41241
41242
41243
41244
41245
41246
41247
41248
41249
41250
41251
41252
41253
41254
41255
41256
41257
41258
41259
41260
41261
41262
41263
41264
41265
41266
41267
41268
41269
41270
41271
41272
41273
41274
41275
41276
41277
41278
41279
41280
41281
41282
41283
41284
41285
41286
41287
41288
41289
41290
41291
41292
41293
41294
41295
41296
41297
41298
41299
41300
41301
41302
41303
41304
41305
41306
41307
41308
41309
41310
41311
41312
41313
41314
41315
41316
41317
41318
41319
41320
41321
41322
41323
41324
41325
41326
41327
41328
41329
41330
41331
41332
41333
41334
41335
41336
41337
41338
41339
41340
41341
41342
41343
41344
41345
41346
41347
41348
41349
41350
41351
41352
41353
41354
41355
41356
41357
41358
41359
41360
41361
41362
41363
41364
41365
41366
41367
41368
41369
41370
41371
41372
41373
41374
41375
41376
41377
41378
41379
41380
41381
41382
41383
41384
41385
41386
41387
41388
41389
41390
41391
41392
41393
41394
41395
41396
41397
41398
41399
41400
41401
41402
41403
41404
41405
41406
41407
41408
41409
41410
41411
41412
41413
41414
41415
41416
41417
41418
41419
41420
41421
41422
41423
41424
41425
41426
41427
41428
41429
41430
41431
41432
41433
41434
41435
41436
41437
41438
41439
41440
41441
41442
41443
41444
41445
41446
41447
41448
41449
41450
41451
41452
41453
41454
41455
41456
41457
41458
41459
41460
41461
41462
41463
41464
41465
41466
41467
41468
41469
41470
41471
41472
41473
41474
41475
41476
41477
41478
41479
41480
41481
41482
41483
41484
41485
41486
41487
41488
41489
41490
41491
41492
41493
41494
41495
41496
41497
41498
41499
41500
41501
41502
41503
41504
41505
41506
41507
41508
41509
41510
41511
41512
41513
41514
41515
41516
41517
41518
41519
41520
41521
41522
41523
41524
41525
41526
41527
41528
41529
41530
41531
41532
41533
41534
41535
41536
41537
41538
41539
41540
41541
41542
41543
41544
41545
41546
41547
41548
41549
41550
41551
41552
41553
41554
41555
41556
41557
41558
41559
41560
41561
41562
41563
41564
41565
41566
41567
41568
41569
41570
41571
41572
41573
41574
41575
41576
41577
41578
41579
41580
41581
41582
41583
41584
41585
41586
41587
41588
41589
41590
41591
41592
41593
41594
41595
41596
41597
41598
41599
41600
41601
41602
41603
41604
41605
41606
41607
41608
41609
41610
41611
41612
41613
41614
41615
41616
41617
41618
41619
41620
41621
41622
41623
41624
41625
41626
41627
41628
41629
41630
41631
41632
41633
41634
41635
41636
41637
41638
41639
41640
41641
41642
41643
41644
41645
41646
41647
41648
41649
41650
41651
41652
41653
41654
41655
41656
41657
41658
41659
41660
41661
41662
41663
41664
41665
41666
41667
41668
41669
41670
41671
41672
41673
41674
41675
41676
41677
41678
41679
41680
41681
41682
41683
41684
41685
41686
41687
41688
41689
41690
41691
41692
41693
41694
41695
41696
41697
41698
41699
41700
41701
41702
41703
41704
41705
41706
41707
41708
41709
41710
41711
41712
41713
41714
41715
41716
41717
41718
41719
41720
41721
41722
41723
41724
41725
41726
41727
41728
41729
41730
41731
41732
41733
41734
41735
41736
41737
41738
41739
41740
41741
41742
41743
41744
41745
41746
41747
41748
41749
41750
41751
41752
41753
41754
41755
41756
41757
41758
41759
41760
41761
41762
41763
41764
41765
41766
41767
41768
41769
41770
41771
41772
41773
41774
41775
41776
41777
41778
41779
41780
41781
41782
41783
41784
41785
41786
41787
41788
41789
41790
41791
41792
41793
41794
41795
41796
41797
41798
41799
41800
41801
41802
41803
41804
41805
41806
41807
41808
41809
41810
41811
41812
41813
41814
41815
41816
41817
41818
41819
41820
41821
41822
41823
41824
41825
41826
41827
41828
41829
41830
41831
41832
41833
41834
41835
41836
41837
41838
41839
41840
41841
41842
41843
41844
41845
41846
41847
41848
41849
41850
41851
41852
41853
41854
41855
41856
41857
41858
41859
41860
41861
41862
41863
41864
41865
41866
41867
41868
41869
41870
41871
41872
41873
41874
41875
41876
41877
41878
41879
41880
41881
41882
41883
41884
41885
41886
41887
41888
41889
41890
41891
41892
41893
41894
41895
41896
41897
41898
41899
41900
41901
41902
41903
41904
41905
41906
41907
41908
41909
41910
41911
41912
41913
41914
41915
41916
41917
41918
41919
41920
41921
41922
41923
41924
41925
41926
41927
41928
41929
41930
41931
41932
41933
41934
41935
41936
41937
41938
41939
41940
41941
41942
41943
41944
41945
41946
41947
41948
41949
41950
41951
41952
41953
41954
41955
41956
41957
41958
41959
41960
41961
41962
41963
41964
41965
41966
41967
41968
41969
41970
41971
41972
41973
41974
41975
41976
41977
41978
41979
41980
41981
41982
41983
41984
41985
41986
41987
41988
41989
41990
41991
41992
41993
41994
41995
41996
41997
41998
41999
42000
42001
42002
42003
42004
42005
42006
42007
42008
42009
42010
42011
42012
42013
42014
42015
42016
42017
42018
42019
42020
42021
42022
42023
42024
42025
42026
42027
42028
42029
42030
42031
42032
42033
42034
42035
42036
42037
42038
42039
42040
42041
42042
42043
42044
42045
42046
42047
42048
42049
42050
42051
42052
42053
42054
42055
42056
42057
42058
42059
42060
42061
42062
42063
42064
42065
42066
42067
42068
42069
42070
42071
42072
42073
42074
42075
42076
42077
42078
42079
42080
42081
42082
42083
42084
42085
42086
42087
42088
42089
42090
42091
42092
42093
42094
42095
42096
42097
42098
42099
42100
42101
42102
42103
42104
42105
42106
42107
42108
42109
42110
42111
42112
42113
42114
42115
42116
42117
42118
42119
42120
42121
42122
42123
42124
42125
42126
42127
42128
42129
42130
42131
42132
42133
42134
42135
42136
42137
42138
42139
42140
42141
42142
42143
42144
42145
42146
42147
42148
42149
42150
42151
42152
42153
42154
42155
42156
42157
42158
42159
42160
42161
42162
42163
42164
42165
42166
42167
42168
42169
42170
42171
42172
42173
42174
42175
42176
42177
42178
42179
42180
42181
42182
42183
42184
42185
42186
42187
42188
42189
42190
42191
42192
42193
42194
42195
42196
42197
42198
42199
42200
42201
42202
42203
42204
42205
42206
42207
42208
42209
42210
42211
42212
42213
42214
42215
42216
42217
42218
42219
42220
42221
42222
42223
42224
42225
42226
42227
42228
42229
42230
42231
42232
42233
42234
42235
42236
42237
42238
42239
42240
42241
42242
42243
42244
42245
42246
42247
42248
42249
42250
42251
42252
42253
42254
42255
42256
42257
42258
42259
42260
42261
42262
42263
42264
42265
42266
42267
42268
42269
42270
42271
42272
42273
42274
42275
42276
42277
42278
42279
42280
42281
42282
42283
42284
42285
42286
42287
42288
42289
42290
42291
42292
42293
42294
42295
42296
42297
42298
42299
42300
42301
42302
42303
42304
42305
42306
42307
42308
42309
42310
42311
42312
42313
42314
42315
42316
42317
42318
42319
42320
42321
42322
42323
42324
42325
42326
42327
42328
42329
42330
42331
42332
42333
42334
42335
42336
42337
42338
42339
42340
42341
42342
42343
42344
42345
42346
42347
42348
42349
42350
42351
42352
42353
42354
42355
42356
42357
42358
42359
42360
42361
42362
42363
42364
42365
42366
42367
42368
42369
42370
42371
42372
42373
42374
42375
42376
42377
42378
42379
42380
42381
42382
42383
42384
42385
42386
42387
42388
42389
42390
42391
42392
42393
42394
42395
42396
42397
42398
42399
42400
42401
42402
42403
42404
42405
42406
42407
42408
42409
42410
42411
42412
42413
42414
42415
42416
42417
42418
42419
42420
42421
42422
42423
42424
42425
42426
42427
42428
42429
42430
42431
42432
42433
42434
42435
42436
42437
42438
42439
42440
42441
42442
42443
42444
42445
42446
42447
42448
42449
42450
42451
42452
42453
42454
42455
42456
42457
42458
42459
42460
42461
42462
42463
42464
42465
42466
42467
42468
42469
42470
42471
42472
42473
42474
42475
42476
42477
42478
42479
42480
42481
42482
42483
42484
42485
42486
42487
42488
42489
42490
42491
42492
42493
42494
42495
42496
42497
42498
42499
42500
42501
42502
42503
42504
42505
42506
42507
42508
42509
42510
42511
42512
42513
42514
42515
42516
42517
42518
42519
42520
42521
42522
42523
42524
42525
42526
42527
42528
42529
42530
42531
42532
42533
42534
42535
42536
42537
42538
42539
42540
42541
42542
42543
42544
42545
42546
42547
42548
42549
42550
42551
42552
42553
42554
42555
42556
42557
42558
42559
42560
42561
42562
42563
42564
42565
42566
42567
42568
42569
42570
42571
42572
42573
42574
42575
42576
42577
42578
42579
42580
42581
42582
42583
42584
42585
42586
42587
42588
42589
42590
42591
42592
42593
42594
42595
42596
42597
42598
42599
42600
42601
42602
42603
42604
42605
42606
42607
42608
42609
42610
42611
42612
42613
42614
42615
42616
42617
42618
42619
42620
42621
42622
42623
42624
42625
42626
42627
42628
42629
42630
42631
42632
42633
42634
42635
42636
42637
42638
42639
42640
42641
42642
42643
42644
42645
42646
42647
42648
42649
42650
42651
42652
42653
42654
42655
42656
42657
42658
42659
42660
42661
42662
42663
42664
42665
42666
42667
42668
42669
42670
42671
42672
42673
42674
42675
42676
42677
42678
42679
42680
42681
42682
42683
42684
42685
42686
42687
42688
42689
42690
42691
42692
42693
42694
42695
42696
42697
42698
42699
42700
42701
42702
42703
42704
42705
42706
42707
42708
42709
42710
42711
42712
42713
42714
42715
42716
42717
42718
42719
42720
42721
42722
42723
42724
42725
42726
42727
42728
42729
42730
42731
42732
42733
42734
42735
42736
42737
42738
42739
42740
42741
42742
42743
42744
42745
42746
42747
42748
42749
42750
42751
42752
42753
42754
42755
42756
42757
42758
42759
42760
42761
42762
42763
42764
42765
42766
42767
42768
42769
42770
42771
42772
42773
42774
42775
42776
42777
42778
42779
42780
42781
42782
42783
42784
42785
42786
42787
42788
42789
42790
42791
42792
42793
42794
42795
42796
42797
42798
42799
42800
42801
42802
42803
42804
42805
42806
42807
42808
42809
42810
42811
42812
42813
42814
42815
42816
42817
42818
42819
42820
42821
42822
42823
42824
42825
42826
42827
42828
42829
42830
42831
42832
42833
42834
42835
42836
42837
42838
42839
42840
42841
42842
42843
42844
42845
42846
42847
42848
42849
42850
42851
42852
42853
42854
42855
42856
42857
42858
42859
42860
42861
42862
42863
42864
42865
42866
42867
42868
42869
42870
42871
42872
42873
42874
42875
42876
42877
42878
42879
42880
42881
42882
42883
42884
42885
42886
42887
42888
42889
42890
42891
42892
42893
42894
42895
42896
42897
42898
42899
42900
42901
42902
42903
42904
42905
42906
42907
42908
42909
42910
42911
42912
42913
42914
42915
42916
42917
42918
42919
42920
42921
42922
42923
42924
42925
42926
42927
42928
42929
42930
42931
42932
42933
42934
42935
42936
42937
42938
42939
42940
42941
42942
42943
42944
42945
42946
42947
42948
42949
42950
42951
42952
42953
42954
42955
42956
42957
42958
42959
42960
42961
42962
42963
42964
42965
42966
42967
42968
42969
42970
42971
42972
42973
42974
42975
42976
42977
42978
42979
42980
42981
42982
42983
42984
42985
42986
42987
42988
42989
42990
42991
42992
42993
42994
42995
42996
42997
42998
42999
43000
43001
43002
43003
43004
43005
43006
43007
43008
43009
43010
43011
43012
43013
43014
43015
43016
43017
43018
43019
43020
43021
43022
43023
43024
43025
43026
43027
43028
43029
43030
43031
43032
43033
43034
43035
43036
43037
43038
43039
43040
43041
43042
43043
43044
43045
43046
43047
43048
43049
43050
43051
43052
43053
43054
43055
43056
43057
43058
43059
43060
43061
43062
43063
43064
43065
43066
43067
43068
43069
43070
43071
43072
43073
43074
43075
43076
43077
43078
43079
43080
43081
43082
43083
43084
43085
43086
43087
43088
43089
43090
43091
43092
43093
43094
43095
43096
43097
43098
43099
43100
43101
43102
43103
43104
43105
43106
43107
43108
43109
43110
43111
43112
43113
43114
43115
43116
43117
43118
43119
43120
43121
43122
43123
43124
43125
43126
43127
43128
43129
43130
43131
43132
43133
43134
43135
43136
43137
43138
43139
43140
43141
43142
43143
43144
43145
43146
43147
43148
43149
43150
43151
43152
43153
43154
43155
43156
43157
43158
43159
43160
43161
43162
43163
43164
43165
43166
43167
43168
43169
43170
43171
43172
43173
43174
43175
43176
43177
43178
43179
43180
43181
43182
43183
43184
43185
43186
43187
43188
43189
43190
43191
43192
43193
43194
43195
43196
43197
43198
43199
43200
43201
43202
43203
43204
43205
43206
43207
43208
43209
43210
43211
43212
43213
43214
43215
43216
43217
43218
43219
43220
43221
43222
43223
43224
43225
43226
43227
43228
43229
43230
43231
43232
43233
43234
43235
43236
43237
43238
43239
43240
43241
43242
43243
43244
43245
43246
43247
43248
43249
43250
43251
43252
43253
43254
43255
43256
43257
43258
43259
43260
43261
43262
43263
43264
43265
43266
43267
43268
43269
43270
43271
43272
43273
43274
43275
43276
43277
43278
43279
43280
43281
43282
43283
43284
43285
43286
43287
43288
43289
43290
43291
43292
43293
43294
43295
43296
43297
43298
43299
43300
43301
43302
43303
43304
43305
43306
43307
43308
43309
43310
43311
43312
43313
43314
43315
43316
43317
43318
43319
43320
43321
43322
43323
43324
43325
43326
43327
43328
43329
43330
43331
43332
43333
43334
43335
43336
43337
43338
43339
43340
43341
43342
43343
43344
43345
43346
43347
43348
43349
43350
43351
43352
43353
43354
43355
43356
43357
43358
43359
43360
43361
43362
43363
43364
43365
43366
43367
43368
43369
43370
43371
43372
43373
43374
43375
43376
43377
43378
43379
43380
43381
43382
43383
43384
43385
43386
43387
43388
43389
43390
43391
43392
43393
43394
43395
43396
43397
43398
43399
43400
43401
43402
43403
43404
43405
43406
43407
43408
43409
43410
43411
43412
43413
43414
43415
43416
43417
43418
43419
43420
43421
43422
43423
43424
43425
43426
43427
43428
43429
43430
43431
43432
43433
43434
43435
43436
43437
43438
43439
43440
43441
43442
43443
43444
43445
43446
43447
43448
43449
43450
43451
43452
43453
43454
43455
43456
43457
43458
43459
43460
43461
43462
43463
43464
43465
43466
43467
43468
43469
43470
43471
43472
43473
43474
43475
43476
43477
43478
43479
43480
43481
43482
43483
43484
43485
43486
43487
43488
43489
43490
43491
43492
43493
43494
43495
43496
43497
43498
43499
43500
43501
43502
43503
43504
43505
43506
43507
43508
43509
43510
43511
43512
43513
43514
43515
43516
43517
43518
43519
43520
43521
43522
43523
43524
43525
43526
43527
43528
43529
43530
43531
43532
43533
43534
43535
43536
43537
43538
43539
43540
43541
43542
43543
43544
43545
43546
43547
43548
43549
43550
43551
43552
43553
43554
43555
43556
43557
43558
43559
43560
43561
43562
43563
43564
43565
43566
43567
43568
43569
43570
43571
43572
43573
43574
43575
43576
43577
43578
43579
43580
43581
43582
43583
43584
43585
43586
43587
43588
43589
43590
43591
43592
43593
43594
43595
43596
43597
43598
43599
43600
43601
43602
43603
43604
43605
43606
43607
43608
43609
43610
43611
43612
43613
43614
43615
43616
43617
43618
43619
43620
43621
43622
43623
43624
43625
43626
43627
43628
43629
43630
43631
43632
43633
43634
43635
43636
43637
43638
43639
43640
43641
43642
43643
43644
43645
43646
43647
43648
43649
43650
43651
43652
43653
43654
43655
43656
43657
43658
43659
43660
43661
43662
43663
43664
43665
43666
43667
43668
43669
43670
43671
43672
43673
43674
43675
43676
43677
43678
43679
43680
43681
43682
43683
43684
43685
43686
43687
43688
43689
43690
43691
43692
43693
43694
43695
43696
43697
43698
43699
43700
43701
43702
43703
43704
43705
43706
43707
43708
43709
43710
43711
43712
43713
43714
43715
43716
43717
43718
43719
43720
43721
43722
43723
43724
43725
43726
43727
43728
43729
43730
43731
43732
43733
43734
43735
43736
43737
43738
43739
43740
43741
43742
43743
43744
43745
43746
43747
43748
43749
43750
43751
43752
43753
43754
43755
43756
43757
43758
43759
43760
43761
43762
43763
43764
43765
43766
43767
43768
43769
43770
43771
43772
43773
43774
43775
43776
43777
43778
43779
43780
43781
43782
43783
43784
43785
43786
43787
43788
43789
43790
43791
43792
43793
43794
43795
43796
43797
43798
43799
43800
43801
43802
43803
43804
43805
43806
43807
43808
43809
43810
43811
43812
43813
43814
43815
43816
43817
43818
43819
43820
43821
43822
43823
43824
43825
43826
43827
43828
43829
43830
43831
43832
43833
43834
43835
43836
43837
43838
43839
43840
43841
43842
43843
43844
43845
43846
43847
43848
43849
43850
43851
43852
43853
43854
43855
43856
43857
43858
43859
43860
43861
43862
43863
43864
43865
43866
43867
43868
43869
43870
43871
43872
43873
43874
43875
43876
43877
43878
43879
43880
43881
43882
43883
43884
43885
43886
43887
43888
43889
43890
43891
43892
43893
43894
43895
43896
43897
43898
43899
43900
43901
43902
43903
43904
43905
43906
43907
43908
43909
43910
43911
43912
43913
43914
43915
43916
43917
43918
43919
43920
43921
43922
43923
43924
43925
43926
43927
43928
43929
43930
43931
43932
43933
43934
43935
43936
43937
43938
43939
43940
43941
43942
43943
43944
43945
43946
43947
43948
43949
43950
43951
43952
43953
43954
43955
43956
43957
43958
43959
43960
43961
43962
43963
43964
43965
43966
43967
43968
43969
43970
43971
43972
43973
43974
43975
43976
43977
43978
43979
43980
43981
43982
43983
43984
43985
43986
43987
43988
43989
43990
43991
43992
43993
43994
43995
43996
43997
43998
43999
44000
44001
44002
44003
44004
44005
44006
44007
44008
44009
44010
44011
44012
44013
44014
44015
44016
44017
44018
44019
44020
44021
44022
44023
44024
44025
44026
44027
44028
44029
44030
44031
44032
44033
44034
44035
44036
44037
44038
44039
44040
44041
44042
44043
44044
44045
44046
44047
44048
44049
44050
44051
44052
44053
44054
44055
44056
44057
44058
44059
44060
44061
44062
44063
44064
44065
44066
44067
44068
44069
44070
44071
44072
44073
44074
44075
44076
44077
44078
44079
44080
44081
44082
44083
44084
44085
44086
44087
44088
44089
44090
44091
44092
44093
44094
44095
44096
44097
44098
44099
44100
44101
44102
44103
44104
44105
44106
44107
44108
44109
44110
44111
44112
44113
44114
44115
44116
44117
44118
44119
44120
44121
44122
44123
44124
44125
44126
44127
44128
44129
44130
44131
44132
44133
44134
44135
44136
44137
44138
44139
44140
44141
44142
44143
44144
44145
44146
44147
44148
44149
44150
44151
44152
44153
44154
44155
44156
44157
44158
44159
44160
44161
44162
44163
44164
44165
44166
44167
44168
44169
44170
44171
44172
44173
44174
44175
44176
44177
44178
44179
44180
44181
44182
44183
44184
44185
44186
44187
44188
44189
44190
44191
44192
44193
44194
44195
44196
44197
44198
44199
44200
44201
44202
44203
44204
44205
44206
44207
44208
44209
44210
44211
44212
44213
44214
44215
44216
44217
44218
44219
44220
44221
44222
44223
44224
44225
44226
44227
44228
44229
44230
44231
44232
44233
44234
44235
44236
44237
44238
44239
44240
44241
44242
44243
44244
44245
44246
44247
44248
44249
44250
44251
44252
44253
44254
44255
44256
44257
44258
44259
44260
44261
44262
44263
44264
44265
44266
44267
44268
44269
44270
44271
44272
44273
44274
44275
44276
44277
44278
44279
44280
44281
44282
44283
44284
44285
44286
44287
44288
44289
44290
44291
44292
44293
44294
44295
44296
44297
44298
44299
44300
44301
44302
44303
44304
44305
44306
44307
44308
44309
44310
44311
44312
44313
44314
44315
44316
44317
44318
44319
44320
44321
44322
44323
44324
44325
44326
44327
44328
44329
44330
44331
44332
44333
44334
44335
44336
44337
44338
44339
44340
44341
44342
44343
44344
44345
44346
44347
44348
44349
44350
44351
44352
44353
44354
44355
44356
44357
44358
44359
44360
44361
44362
44363
44364
44365
44366
44367
44368
44369
44370
44371
44372
44373
44374
44375
44376
44377
44378
44379
44380
44381
44382
44383
44384
44385
44386
44387
44388
44389
44390
44391
44392
44393
44394
44395
44396
44397
44398
44399
44400
44401
44402
44403
44404
44405
44406
44407
44408
44409
44410
44411
44412
44413
44414
44415
44416
44417
44418
44419
44420
44421
44422
44423
44424
44425
44426
44427
44428
44429
44430
44431
44432
44433
44434
44435
44436
44437
44438
44439
44440
44441
44442
44443
44444
44445
44446
44447
44448
44449
44450
44451
44452
44453
44454
44455
44456
44457
44458
44459
44460
44461
44462
44463
44464
44465
44466
44467
44468
44469
44470
44471
44472
44473
44474
44475
44476
44477
44478
44479
44480
44481
44482
44483
44484
44485
44486
44487
44488
44489
44490
44491
44492
44493
44494
44495
44496
44497
44498
44499
44500
44501
44502
44503
44504
44505
44506
44507
44508
44509
44510
44511
44512
44513
44514
44515
44516
44517
44518
44519
44520
44521
44522
44523
44524
44525
44526
44527
44528
44529
44530
44531
44532
44533
44534
44535
44536
44537
44538
44539
44540
44541
44542
44543
44544
44545
44546
44547
44548
44549
44550
44551
44552
44553
44554
44555
44556
44557
44558
44559
44560
44561
44562
44563
44564
44565
44566
44567
44568
44569
44570
44571
44572
44573
44574
44575
44576
44577
44578
44579
44580
44581
44582
44583
44584
44585
44586
44587
44588
44589
44590
44591
44592
44593
44594
44595
44596
44597
44598
44599
44600
44601
44602
44603
44604
44605
44606
44607
44608
44609
44610
44611
44612
44613
44614
44615
44616
44617
44618
44619
44620
44621
44622
44623
44624
44625
44626
44627
44628
44629
44630
44631
44632
44633
44634
44635
44636
44637
44638
44639
44640
44641
44642
44643
44644
44645
44646
44647
44648
44649
44650
44651
44652
44653
44654
44655
44656
44657
44658
44659
44660
44661
44662
44663
44664
44665
44666
44667
44668
44669
44670
44671
44672
44673
44674
44675
44676
44677
44678
44679
44680
44681
44682
44683
44684
44685
44686
44687
44688
44689
44690
44691
44692
44693
44694
44695
44696
44697
44698
44699
44700
44701
44702
44703
44704
44705
44706
44707
44708
44709
44710
44711
44712
44713
44714
44715
44716
44717
44718
44719
44720
44721
44722
44723
44724
44725
44726
44727
44728
44729
44730
44731
44732
44733
44734
44735
44736
44737
44738
44739
44740
44741
44742
44743
44744
44745
44746
44747
44748
44749
44750
44751
44752
44753
44754
44755
44756
44757
44758
44759
44760
44761
44762
44763
44764
44765
44766
44767
44768
44769
44770
44771
44772
44773
44774
44775
44776
44777
44778
44779
44780
44781
44782
44783
44784
44785
44786
44787
44788
44789
44790
44791
44792
44793
44794
44795
44796
44797
44798
44799
44800
44801
44802
44803
44804
44805
44806
44807
44808
44809
44810
44811
44812
44813
44814
44815
44816
44817
44818
44819
44820
44821
44822
44823
44824
44825
44826
44827
44828
44829
44830
44831
44832
44833
44834
44835
44836
44837
44838
44839
44840
44841
44842
44843
44844
44845
44846
44847
44848
44849
44850
44851
44852
44853
44854
44855
44856
44857
44858
44859
44860
44861
44862
44863
44864
44865
44866
44867
44868
44869
44870
44871
44872
44873
44874
44875
44876
44877
44878
44879
44880
44881
44882
44883
44884
44885
44886
44887
44888
44889
44890
44891
44892
44893
44894
44895
44896
44897
44898
44899
44900
44901
44902
44903
44904
44905
44906
44907
44908
44909
44910
44911
44912
44913
44914
44915
44916
44917
44918
44919
44920
44921
44922
44923
44924
44925
44926
44927
44928
44929
44930
44931
44932
44933
44934
44935
44936
44937
44938
44939
44940
44941
44942
44943
44944
44945
44946
44947
44948
44949
44950
44951
44952
44953
44954
44955
44956
44957
44958
44959
44960
44961
44962
44963
44964
44965
44966
44967
44968
44969
44970
44971
44972
44973
44974
44975
44976
44977
44978
44979
44980
44981
44982
44983
44984
44985
44986
44987
44988
44989
44990
44991
44992
44993
44994
44995
44996
44997
44998
44999
45000
45001
45002
45003
45004
45005
45006
45007
45008
45009
45010
45011
45012
45013
45014
45015
45016
45017
45018
45019
45020
45021
45022
45023
45024
45025
45026
45027
45028
45029
45030
45031
45032
45033
45034
45035
45036
45037
45038
45039
45040
45041
45042
45043
45044
45045
45046
45047
45048
45049
45050
45051
45052
45053
45054
45055
45056
45057
45058
45059
45060
45061
45062
45063
45064
45065
45066
45067
45068
45069
45070
45071
45072
45073
45074
45075
45076
45077
45078
45079
45080
45081
45082
45083
45084
45085
45086
45087
45088
45089
45090
45091
45092
45093
45094
45095
45096
45097
45098
45099
45100
45101
45102
45103
45104
45105
45106
45107
45108
45109
45110
45111
45112
45113
45114
45115
45116
45117
45118
45119
45120
45121
45122
45123
45124
45125
45126
45127
45128
45129
45130
45131
45132
45133
45134
45135
45136
45137
45138
45139
45140
45141
45142
45143
45144
45145
45146
45147
45148
45149
45150
45151
45152
45153
45154
45155
45156
45157
45158
45159
45160
45161
45162
45163
45164
45165
45166
45167
45168
45169
45170
45171
45172
45173
45174
45175
45176
45177
45178
45179
45180
45181
45182
45183
45184
45185
45186
45187
45188
45189
45190
45191
45192
45193
45194
45195
45196
45197
45198
45199
45200
45201
45202
45203
45204
45205
45206
45207
45208
45209
45210
45211
45212
45213
45214
45215
45216
45217
45218
45219
45220
45221
45222
45223
45224
45225
45226
45227
45228
45229
45230
45231
45232
45233
45234
45235
45236
45237
45238
45239
45240
45241
45242
45243
45244
45245
45246
45247
45248
45249
45250
45251
45252
45253
45254
45255
45256
45257
45258
45259
45260
45261
45262
45263
45264
45265
45266
45267
45268
45269
45270
45271
45272
45273
45274
45275
45276
45277
45278
45279
45280
45281
45282
45283
45284
45285
45286
45287
45288
45289
45290
45291
45292
45293
45294
45295
45296
45297
45298
45299
45300
45301
45302
45303
45304
45305
45306
45307
45308
45309
45310
45311
45312
45313
45314
45315
45316
45317
45318
45319
45320
45321
45322
45323
45324
45325
45326
45327
45328
45329
45330
45331
45332
45333
45334
45335
45336
45337
45338
45339
45340
45341
45342
45343
45344
45345
45346
45347
45348
45349
45350
45351
45352
45353
45354
45355
45356
45357
45358
45359
45360
45361
45362
45363
45364
45365
45366
45367
45368
45369
45370
45371
45372
45373
45374
45375
45376
45377
45378
45379
45380
45381
45382
45383
45384
45385
45386
45387
45388
45389
45390
45391
45392
45393
45394
45395
45396
45397
45398
45399
45400
45401
45402
45403
45404
45405
45406
45407
45408
45409
45410
45411
45412
45413
45414
45415
45416
45417
45418
45419
45420
45421
45422
45423
45424
45425
45426
45427
45428
45429
45430
45431
45432
45433
45434
45435
45436
45437
45438
45439
45440
45441
45442
45443
45444
45445
45446
45447
45448
45449
45450
45451
45452
45453
45454
45455
45456
45457
45458
45459
45460
45461
45462
45463
45464
45465
45466
45467
45468
45469
45470
45471
45472
45473
45474
45475
45476
45477
45478
45479
45480
45481
45482
45483
45484
45485
45486
45487
45488
45489
45490
45491
45492
45493
45494
45495
45496
45497
45498
45499
45500
45501
45502
45503
45504
45505
45506
45507
45508
45509
45510
45511
45512
45513
45514
45515
45516
45517
45518
45519
45520
45521
45522
45523
45524
45525
45526
45527
45528
45529
45530
45531
45532
45533
45534
45535
45536
45537
45538
45539
45540
45541
45542
45543
45544
45545
45546
45547
45548
45549
45550
45551
45552
45553
45554
45555
45556
45557
45558
45559
45560
45561
45562
45563
45564
45565
45566
45567
45568
45569
45570
45571
45572
45573
45574
45575
45576
45577
45578
45579
45580
45581
45582
45583
45584
45585
45586
45587
45588
45589
45590
45591
45592
45593
45594
45595
45596
45597
45598
45599
45600
45601
45602
45603
45604
45605
45606
45607
45608
45609
45610
45611
45612
45613
45614
45615
45616
45617
45618
45619
45620
45621
45622
45623
45624
45625
45626
45627
45628
45629
45630
45631
45632
45633
45634
45635
45636
45637
45638
45639
45640
45641
45642
45643
45644
45645
45646
45647
45648
45649
45650
45651
45652
45653
45654
45655
45656
45657
45658
45659
45660
45661
45662
45663
45664
45665
45666
45667
45668
45669
45670
45671
45672
45673
45674
45675
45676
45677
45678
45679
45680
45681
45682
45683
45684
45685
45686
45687
45688
45689
45690
45691
45692
45693
45694
45695
45696
45697
45698
45699
45700
45701
45702
45703
45704
45705
45706
45707
45708
45709
45710
45711
45712
45713
45714
45715
45716
45717
45718
45719
45720
45721
45722
45723
45724
45725
45726
45727
45728
45729
45730
45731
45732
45733
45734
45735
45736
45737
45738
45739
45740
45741
45742
45743
45744
45745
45746
45747
45748
45749
45750
45751
45752
45753
45754
45755
45756
45757
45758
45759
45760
45761
45762
45763
45764
45765
45766
45767
45768
45769
45770
45771
45772
45773
45774
45775
45776
45777
45778
45779
45780
45781
45782
45783
45784
45785
45786
45787
45788
45789
45790
45791
45792
45793
45794
45795
45796
45797
45798
45799
45800
45801
45802
45803
45804
45805
45806
45807
45808
45809
45810
45811
45812
45813
45814
45815
45816
45817
45818
45819
45820
45821
45822
45823
45824
45825
45826
45827
45828
45829
45830
45831
45832
45833
45834
45835
45836
45837
45838
45839
45840
45841
45842
45843
45844
45845
45846
45847
45848
45849
45850
45851
45852
45853
45854
45855
45856
45857
45858
45859
45860
45861
45862
45863
45864
45865
45866
45867
45868
45869
45870
45871
45872
45873
45874
45875
45876
45877
45878
45879
45880
45881
45882
45883
45884
45885
45886
45887
45888
45889
45890
45891
45892
45893
45894
45895
45896
45897
45898
45899
45900
45901
45902
45903
45904
45905
45906
45907
45908
45909
45910
45911
45912
45913
45914
45915
45916
45917
45918
45919
45920
45921
45922
45923
45924
45925
45926
45927
45928
45929
45930
45931
45932
45933
45934
45935
45936
45937
45938
45939
45940
45941
45942
45943
45944
45945
45946
45947
45948
45949
45950
45951
45952
45953
45954
45955
45956
45957
45958
45959
45960
45961
45962
45963
45964
45965
45966
45967
45968
45969
45970
45971
45972
45973
45974
45975
45976
45977
45978
45979
45980
45981
45982
45983
45984
45985
45986
45987
45988
45989
45990
45991
45992
45993
45994
45995
45996
45997
45998
45999
46000
46001
46002
46003
46004
46005
46006
46007
46008
46009
46010
46011
46012
46013
46014
46015
46016
46017
46018
46019
46020
46021
46022
46023
46024
46025
46026
46027
46028
46029
46030
46031
46032
46033
46034
46035
46036
46037
46038
46039
46040
46041
46042
46043
46044
46045
46046
46047
46048
46049
46050
46051
46052
46053
46054
46055
46056
46057
46058
46059
46060
46061
46062
46063
46064
46065
46066
46067
46068
46069
46070
46071
46072
46073
46074
46075
46076
46077
46078
46079
46080
46081
46082
46083
46084
46085
46086
46087
46088
46089
46090
46091
46092
46093
46094
46095
46096
46097
46098
46099
46100
46101
46102
46103
46104
46105
46106
46107
46108
46109
46110
46111
46112
46113
46114
46115
46116
46117
46118
46119
46120
46121
46122
46123
46124
46125
46126
46127
46128
46129
46130
46131
46132
46133
46134
46135
46136
46137
46138
46139
46140
46141
46142
46143
46144
46145
46146
46147
46148
46149
46150
46151
46152
46153
46154
46155
46156
46157
46158
46159
46160
46161
46162
46163
46164
46165
46166
46167
46168
46169
46170
46171
46172
46173
46174
46175
46176
46177
46178
46179
46180
46181
46182
46183
46184
46185
46186
46187
46188
46189
46190
46191
46192
46193
46194
46195
46196
46197
46198
46199
46200
46201
46202
46203
46204
46205
46206
46207
46208
46209
46210
46211
46212
46213
46214
46215
46216
46217
46218
46219
46220
46221
46222
46223
46224
46225
46226
46227
46228
46229
46230
46231
46232
46233
46234
46235
46236
46237
46238
46239
46240
46241
46242
46243
46244
46245
46246
46247
46248
46249
46250
46251
46252
46253
46254
46255
46256
46257
46258
46259
46260
46261
46262
46263
46264
46265
46266
46267
46268
46269
46270
46271
46272
46273
46274
46275
46276
46277
46278
46279
46280
46281
46282
46283
46284
46285
46286
46287
46288
46289
46290
46291
46292
46293
46294
46295
46296
46297
46298
46299
46300
46301
46302
46303
46304
46305
46306
46307
46308
46309
46310
46311
46312
46313
46314
46315
46316
46317
46318
46319
46320
46321
46322
46323
46324
46325
46326
46327
46328
46329
46330
46331
46332
46333
46334
46335
46336
46337
46338
46339
46340
46341
46342
46343
46344
46345
46346
46347
46348
46349
46350
46351
46352
46353
46354
46355
46356
46357
46358
46359
46360
46361
46362
46363
46364
46365
46366
46367
46368
46369
46370
46371
46372
46373
46374
46375
46376
46377
46378
46379
46380
46381
46382
46383
46384
46385
46386
46387
46388
46389
46390
46391
46392
46393
46394
46395
46396
46397
46398
46399
46400
46401
46402
46403
46404
46405
46406
46407
46408
46409
46410
46411
46412
46413
46414
46415
46416
46417
46418
46419
46420
46421
46422
46423
46424
46425
46426
46427
46428
46429
46430
46431
46432
46433
46434
46435
46436
46437
46438
46439
46440
46441
46442
46443
46444
46445
46446
46447
46448
46449
46450
46451
46452
46453
46454
46455
46456
46457
46458
46459
46460
46461
46462
46463
46464
46465
46466
46467
46468
46469
46470
46471
46472
46473
46474
46475
46476
46477
46478
46479
46480
46481
46482
46483
46484
46485
46486
46487
46488
46489
46490
46491
46492
46493
46494
46495
46496
46497
46498
46499
46500
46501
46502
46503
46504
46505
46506
46507
46508
46509
46510
46511
46512
46513
46514
46515
46516
46517
46518
46519
46520
46521
46522
46523
46524
46525
46526
46527
46528
46529
46530
46531
46532
46533
46534
46535
46536
46537
46538
46539
46540
46541
46542
46543
46544
46545
46546
46547
46548
46549
46550
46551
46552
46553
46554
46555
46556
46557
46558
46559
46560
46561
46562
46563
46564
46565
46566
46567
46568
46569
46570
46571
46572
46573
46574
46575
46576
46577
46578
46579
46580
46581
46582
46583
46584
46585
46586
46587
46588
46589
46590
46591
46592
46593
46594
46595
46596
46597
46598
46599
46600
46601
46602
46603
46604
46605
46606
46607
46608
46609
46610
46611
46612
46613
46614
46615
46616
46617
46618
46619
46620
46621
46622
46623
46624
46625
46626
46627
46628
46629
46630
46631
46632
46633
46634
46635
46636
46637
46638
46639
46640
46641
46642
46643
46644
46645
46646
46647
46648
46649
46650
46651
46652
46653
46654
46655
46656
46657
46658
46659
46660
46661
46662
46663
46664
46665
46666
46667
46668
46669
46670
46671
46672
46673
46674
46675
46676
46677
46678
46679
46680
46681
46682
46683
46684
46685
46686
46687
46688
46689
46690
46691
46692
46693
46694
46695
46696
46697
46698
46699
46700
46701
46702
46703
46704
46705
46706
46707
46708
46709
46710
46711
46712
46713
46714
46715
46716
46717
46718
46719
46720
46721
46722
46723
46724
46725
46726
46727
46728
46729
46730
46731
46732
46733
46734
46735
46736
46737
46738
46739
46740
46741
46742
46743
46744
46745
46746
46747
46748
46749
46750
46751
46752
46753
46754
46755
46756
46757
46758
46759
46760
46761
46762
46763
46764
46765
46766
46767
46768
46769
46770
46771
46772
46773
46774
46775
46776
46777
46778
46779
46780
46781
46782
46783
46784
46785
46786
46787
46788
46789
46790
46791
46792
46793
46794
46795
46796
46797
46798
46799
46800
46801
46802
46803
46804
46805
46806
46807
46808
46809
46810
46811
46812
46813
46814
46815
46816
46817
46818
46819
46820
46821
46822
46823
46824
46825
46826
46827
46828
46829
46830
46831
46832
46833
46834
46835
46836
46837
46838
46839
46840
46841
46842
46843
46844
46845
46846
46847
46848
46849
46850
46851
46852
46853
46854
46855
46856
46857
46858
46859
46860
46861
46862
46863
46864
46865
46866
46867
46868
46869
46870
46871
46872
46873
46874
46875
46876
46877
46878
46879
46880
46881
46882
46883
46884
46885
46886
46887
46888
46889
46890
46891
46892
46893
46894
46895
46896
46897
46898
46899
46900
46901
46902
46903
46904
46905
46906
46907
46908
46909
46910
46911
46912
46913
46914
46915
46916
46917
46918
46919
46920
46921
46922
46923
46924
46925
46926
46927
46928
46929
46930
46931
46932
46933
46934
46935
46936
46937
46938
46939
46940
46941
46942
46943
46944
46945
46946
46947
46948
46949
46950
46951
46952
46953
46954
46955
46956
46957
46958
46959
46960
46961
46962
46963
46964
46965
46966
46967
46968
46969
46970
46971
46972
46973
46974
46975
46976
46977
46978
46979
46980
46981
46982
46983
46984
46985
46986
46987
46988
46989
46990
46991
46992
46993
46994
46995
46996
46997
46998
46999
47000
47001
47002
47003
47004
47005
47006
47007
47008
47009
47010
47011
47012
47013
47014
47015
47016
47017
47018
47019
47020
47021
47022
47023
47024
47025
47026
47027
47028
47029
47030
47031
47032
47033
47034
47035
47036
47037
47038
47039
47040
47041
47042
47043
47044
47045
47046
47047
47048
47049
47050
47051
47052
47053
47054
47055
47056
47057
47058
47059
47060
47061
47062
47063
47064
47065
47066
47067
47068
47069
47070
47071
47072
47073
47074
47075
47076
47077
47078
47079
47080
47081
47082
47083
47084
47085
47086
47087
47088
47089
47090
47091
47092
47093
47094
47095
47096
47097
47098
47099
47100
47101
47102
47103
47104
47105
47106
47107
47108
47109
47110
47111
47112
47113
47114
47115
47116
47117
47118
47119
47120
47121
47122
47123
47124
47125
47126
47127
47128
47129
47130
47131
47132
47133
47134
47135
47136
47137
47138
47139
47140
47141
47142
47143
47144
47145
47146
47147
47148
47149
47150
47151
47152
47153
47154
47155
47156
47157
47158
47159
47160
47161
47162
47163
47164
47165
47166
47167
47168
47169
47170
47171
47172
47173
47174
47175
47176
47177
47178
47179
47180
47181
47182
47183
47184
47185
47186
47187
47188
47189
47190
47191
47192
47193
47194
47195
47196
47197
47198
47199
47200
47201
47202
47203
47204
47205
47206
47207
47208
47209
47210
47211
47212
47213
47214
47215
47216
47217
47218
47219
47220
47221
47222
47223
47224
47225
47226
47227
47228
47229
47230
47231
47232
47233
47234
47235
47236
47237
47238
47239
47240
47241
47242
47243
47244
47245
47246
47247
47248
47249
47250
47251
47252
47253
47254
47255
47256
47257
47258
47259
47260
47261
47262
47263
47264
47265
47266
47267
47268
47269
47270
47271
47272
47273
47274
47275
47276
47277
47278
47279
47280
47281
47282
47283
47284
47285
47286
47287
47288
47289
47290
47291
47292
47293
47294
47295
47296
47297
47298
47299
47300
47301
47302
47303
47304
47305
47306
47307
47308
47309
47310
47311
47312
47313
47314
47315
47316
47317
47318
47319
47320
47321
47322
47323
47324
47325
47326
47327
47328
47329
47330
47331
47332
47333
47334
47335
47336
47337
47338
47339
47340
47341
47342
47343
47344
47345
47346
47347
47348
47349
47350
47351
47352
47353
47354
47355
47356
47357
47358
47359
47360
47361
47362
47363
47364
47365
47366
47367
47368
47369
47370
47371
47372
47373
47374
47375
47376
47377
47378
47379
47380
47381
47382
47383
47384
47385
47386
47387
47388
47389
47390
47391
47392
47393
47394
47395
47396
47397
47398
47399
47400
47401
47402
47403
47404
47405
47406
47407
47408
47409
47410
47411
47412
47413
47414
47415
47416
47417
47418
47419
47420
47421
47422
47423
47424
47425
47426
47427
47428
47429
47430
47431
47432
47433
47434
47435
47436
47437
47438
47439
47440
47441
47442
47443
47444
47445
47446
47447
47448
47449
47450
47451
47452
47453
47454
47455
47456
47457
47458
47459
47460
47461
47462
47463
47464
47465
47466
47467
47468
47469
47470
47471
47472
47473
47474
47475
47476
47477
47478
47479
47480
47481
47482
47483
47484
47485
47486
47487
47488
47489
47490
47491
47492
47493
47494
47495
47496
47497
47498
47499
47500
47501
47502
47503
47504
47505
47506
47507
47508
47509
47510
47511
47512
47513
47514
47515
47516
47517
47518
47519
47520
47521
47522
47523
47524
47525
47526
47527
47528
47529
47530
47531
47532
47533
47534
47535
47536
47537
47538
47539
47540
47541
47542
47543
47544
47545
47546
47547
47548
47549
47550
47551
47552
47553
47554
47555
47556
47557
47558
47559
47560
47561
47562
47563
47564
47565
47566
47567
47568
47569
47570
47571
47572
47573
47574
47575
47576
47577
47578
47579
47580
47581
47582
47583
47584
47585
47586
47587
47588
47589
47590
47591
47592
47593
47594
47595
47596
47597
47598
47599
47600
47601
47602
47603
47604
47605
47606
47607
47608
47609
47610
47611
47612
47613
47614
47615
47616
47617
47618
47619
47620
47621
47622
47623
47624
47625
47626
47627
47628
47629
47630
47631
47632
47633
47634
47635
47636
47637
47638
47639
47640
47641
47642
47643
47644
47645
47646
47647
47648
47649
47650
47651
47652
47653
47654
47655
47656
47657
47658
47659
47660
47661
47662
47663
47664
47665
47666
47667
47668
47669
47670
47671
47672
47673
47674
47675
47676
47677
47678
47679
47680
47681
47682
47683
47684
47685
47686
47687
47688
47689
47690
47691
47692
47693
47694
47695
47696
47697
47698
47699
47700
47701
47702
47703
47704
47705
47706
47707
47708
47709
47710
47711
47712
47713
47714
47715
47716
47717
47718
47719
47720
47721
47722
47723
47724
47725
47726
47727
47728
47729
47730
47731
47732
47733
47734
47735
47736
47737
47738
47739
47740
47741
47742
47743
47744
47745
47746
47747
47748
47749
47750
47751
47752
47753
47754
47755
47756
47757
47758
47759
47760
47761
47762
47763
47764
47765
47766
47767
47768
47769
47770
47771
47772
47773
47774
47775
47776
47777
47778
47779
47780
47781
47782
47783
47784
47785
47786
47787
47788
47789
47790
47791
47792
47793
47794
47795
47796
47797
47798
47799
47800
47801
47802
47803
47804
47805
47806
47807
47808
47809
47810
47811
47812
47813
47814
47815
47816
47817
47818
47819
47820
47821
47822
47823
47824
47825
47826
47827
47828
47829
47830
47831
47832
47833
47834
47835
47836
47837
47838
47839
47840
47841
47842
47843
47844
47845
47846
47847
47848
47849
47850
47851
47852
47853
47854
47855
47856
47857
47858
47859
47860
47861
47862
47863
47864
47865
47866
47867
47868
47869
47870
47871
47872
47873
47874
47875
47876
47877
47878
47879
47880
47881
47882
47883
47884
47885
47886
47887
47888
47889
47890
47891
47892
47893
47894
47895
47896
47897
47898
47899
47900
47901
47902
47903
47904
47905
47906
47907
47908
47909
47910
47911
47912
47913
47914
47915
47916
47917
47918
47919
47920
47921
47922
47923
47924
47925
47926
47927
47928
47929
47930
47931
47932
47933
47934
47935
47936
47937
47938
47939
47940
47941
47942
47943
47944
47945
47946
47947
47948
47949
47950
47951
47952
47953
47954
47955
47956
47957
47958
47959
47960
47961
47962
47963
47964
47965
47966
47967
47968
47969
47970
47971
47972
47973
47974
47975
47976
47977
47978
47979
47980
47981
47982
47983
47984
47985
47986
47987
47988
47989
47990
47991
47992
47993
47994
47995
47996
47997
47998
47999
48000
48001
48002
48003
48004
48005
48006
48007
48008
48009
48010
48011
48012
48013
48014
48015
48016
48017
48018
48019
48020
48021
48022
48023
48024
48025
48026
48027
48028
48029
48030
48031
48032
48033
48034
48035
48036
48037
48038
48039
48040
48041
48042
48043
48044
48045
48046
48047
48048
48049
48050
48051
48052
48053
48054
48055
48056
48057
48058
48059
48060
48061
48062
48063
48064
48065
48066
48067
48068
48069
48070
48071
48072
48073
48074
48075
48076
48077
48078
48079
48080
48081
48082
48083
48084
48085
48086
48087
48088
48089
48090
48091
48092
48093
48094
48095
48096
48097
48098
48099
48100
48101
48102
48103
48104
48105
48106
48107
48108
48109
48110
48111
48112
48113
48114
48115
48116
48117
48118
48119
48120
48121
48122
48123
48124
48125
48126
48127
48128
48129
48130
48131
48132
48133
48134
48135
48136
48137
48138
48139
48140
48141
48142
48143
48144
48145
48146
48147
48148
48149
48150
48151
48152
48153
48154
48155
48156
48157
48158
48159
48160
48161
48162
48163
48164
48165
48166
48167
48168
48169
48170
48171
48172
48173
48174
48175
48176
48177
48178
48179
48180
48181
48182
48183
48184
48185
48186
48187
48188
48189
48190
48191
48192
48193
48194
48195
48196
48197
48198
48199
48200
48201
48202
48203
48204
48205
48206
48207
48208
48209
48210
48211
48212
48213
48214
48215
48216
48217
48218
48219
48220
48221
48222
48223
48224
48225
48226
48227
48228
48229
48230
48231
48232
48233
48234
48235
48236
48237
48238
48239
48240
48241
48242
48243
48244
48245
48246
48247
48248
48249
48250
48251
48252
48253
48254
48255
48256
48257
48258
48259
48260
48261
48262
48263
48264
48265
48266
48267
48268
48269
48270
48271
48272
48273
48274
48275
48276
48277
48278
48279
48280
48281
48282
48283
48284
48285
48286
48287
48288
48289
48290
48291
48292
48293
48294
48295
48296
48297
48298
48299
48300
48301
48302
48303
48304
48305
48306
48307
48308
48309
48310
48311
48312
48313
48314
48315
48316
48317
48318
48319
48320
48321
48322
48323
48324
48325
48326
48327
48328
48329
48330
48331
48332
48333
48334
48335
48336
48337
48338
48339
48340
48341
48342
48343
48344
48345
48346
48347
48348
48349
48350
48351
48352
48353
48354
48355
48356
48357
48358
48359
48360
48361
48362
48363
48364
48365
48366
48367
48368
48369
48370
48371
48372
48373
48374
48375
48376
48377
48378
48379
48380
48381
48382
48383
48384
48385
48386
48387
48388
48389
48390
48391
48392
48393
48394
48395
48396
48397
48398
48399
48400
48401
48402
48403
48404
48405
48406
48407
48408
48409
48410
48411
48412
48413
48414
48415
48416
48417
48418
48419
48420
48421
48422
48423
48424
48425
48426
48427
48428
48429
48430
48431
48432
48433
48434
48435
48436
48437
48438
48439
48440
48441
48442
48443
48444
48445
48446
48447
48448
48449
48450
48451
48452
48453
48454
48455
48456
48457
48458
48459
48460
48461
48462
48463
48464
48465
48466
48467
48468
48469
48470
48471
48472
48473
48474
48475
48476
48477
48478
48479
48480
48481
48482
48483
48484
48485
48486
48487
48488
48489
48490
48491
48492
48493
48494
48495
48496
48497
48498
48499
48500
48501
48502
48503
48504
48505
48506
48507
48508
48509
48510
48511
48512
48513
48514
48515
48516
48517
48518
48519
48520
48521
48522
48523
48524
48525
48526
48527
48528
48529
48530
48531
48532
48533
48534
48535
48536
48537
48538
48539
48540
48541
48542
48543
48544
48545
48546
48547
48548
48549
48550
48551
48552
48553
48554
48555
48556
48557
48558
48559
48560
48561
48562
48563
48564
48565
48566
48567
48568
48569
48570
48571
48572
48573
48574
48575
48576
48577
48578
48579
48580
48581
48582
48583
48584
48585
48586
48587
48588
48589
48590
48591
48592
48593
48594
48595
48596
48597
48598
48599
48600
48601
48602
48603
48604
48605
48606
48607
48608
48609
48610
48611
48612
48613
48614
48615
48616
48617
48618
48619
48620
48621
48622
48623
48624
48625
48626
48627
48628
48629
48630
48631
48632
48633
48634
48635
48636
48637
48638
48639
48640
48641
48642
48643
48644
48645
48646
48647
48648
48649
48650
48651
48652
48653
48654
48655
48656
48657
48658
48659
48660
48661
48662
48663
48664
48665
48666
48667
48668
48669
48670
48671
48672
48673
48674
48675
48676
48677
48678
48679
48680
48681
48682
48683
48684
48685
48686
48687
48688
48689
48690
48691
48692
48693
48694
48695
48696
48697
48698
48699
48700
48701
48702
48703
48704
48705
48706
48707
48708
48709
48710
48711
48712
48713
48714
48715
48716
48717
48718
48719
48720
48721
48722
48723
48724
48725
48726
48727
48728
48729
48730
48731
48732
48733
48734
48735
48736
48737
48738
48739
48740
48741
48742
48743
48744
48745
48746
48747
48748
48749
48750
48751
48752
48753
48754
48755
48756
48757
48758
48759
48760
48761
48762
48763
48764
48765
48766
48767
48768
48769
48770
48771
48772
48773
48774
48775
48776
48777
48778
48779
48780
48781
48782
48783
48784
48785
48786
48787
48788
48789
48790
48791
48792
48793
48794
48795
48796
48797
48798
48799
48800
48801
48802
48803
48804
48805
48806
48807
48808
48809
48810
48811
48812
48813
48814
48815
48816
48817
48818
48819
48820
48821
48822
48823
48824
48825
48826
48827
48828
48829
48830
48831
48832
48833
48834
48835
48836
48837
48838
48839
48840
48841
48842
48843
48844
48845
48846
48847
48848
48849
48850
48851
48852
48853
48854
48855
48856
48857
48858
48859
48860
48861
48862
48863
48864
48865
48866
48867
48868
48869
48870
48871
48872
48873
48874
48875
48876
48877
48878
48879
48880
48881
48882
48883
48884
48885
48886
48887
48888
48889
48890
48891
48892
48893
48894
48895
48896
48897
48898
48899
48900
48901
48902
48903
48904
48905
48906
48907
48908
48909
48910
48911
48912
48913
48914
48915
48916
48917
48918
48919
48920
48921
48922
48923
48924
48925
48926
48927
48928
48929
48930
48931
48932
48933
48934
48935
48936
48937
48938
48939
48940
48941
48942
48943
48944
48945
48946
48947
48948
48949
48950
48951
48952
48953
48954
48955
48956
48957
48958
48959
48960
48961
48962
48963
48964
48965
48966
48967
48968
48969
48970
48971
48972
48973
48974
48975
48976
48977
48978
48979
48980
48981
48982
48983
48984
48985
48986
48987
48988
48989
48990
48991
48992
48993
48994
48995
48996
48997
48998
48999
49000
49001
49002
49003
49004
49005
49006
49007
49008
49009
49010
49011
49012
49013
49014
49015
49016
49017
49018
49019
49020
49021
49022
49023
49024
49025
49026
49027
49028
49029
49030
49031
49032
49033
49034
49035
49036
49037
49038
49039
49040
49041
49042
49043
49044
49045
49046
49047
49048
49049
49050
49051
49052
49053
49054
49055
49056
49057
49058
49059
49060
49061
49062
49063
49064
49065
49066
49067
49068
49069
49070
49071
49072
49073
49074
49075
49076
49077
49078
49079
49080
49081
49082
49083
49084
49085
49086
49087
49088
49089
49090
49091
49092
49093
49094
49095
49096
49097
49098
49099
49100
49101
49102
49103
49104
49105
49106
49107
49108
49109
49110
49111
49112
49113
49114
49115
49116
49117
49118
49119
49120
49121
49122
49123
49124
49125
49126
49127
49128
49129
49130
49131
49132
49133
49134
49135
49136
49137
49138
49139
49140
49141
49142
49143
49144
49145
49146
49147
49148
49149
49150
49151
49152
49153
49154
49155
49156
49157
49158
49159
49160
49161
49162
49163
49164
49165
49166
49167
49168
49169
49170
49171
49172
49173
49174
49175
49176
49177
49178
49179
49180
49181
49182
49183
49184
49185
49186
49187
49188
49189
49190
49191
49192
49193
49194
49195
49196
49197
49198
49199
49200
49201
49202
49203
49204
49205
49206
49207
49208
49209
49210
49211
49212
49213
49214
49215
49216
49217
49218
49219
49220
49221
49222
49223
49224
49225
49226
49227
49228
49229
49230
49231
49232
49233
49234
49235
49236
49237
49238
49239
49240
49241
49242
49243
49244
49245
49246
49247
49248
49249
49250
49251
49252
49253
49254
49255
49256
49257
49258
49259
49260
49261
49262
49263
49264
49265
49266
49267
49268
49269
49270
49271
49272
49273
49274
49275
49276
49277
49278
49279
49280
49281
49282
49283
49284
49285
49286
49287
49288
49289
49290
49291
49292
49293
49294
49295
49296
49297
49298
49299
49300
49301
49302
49303
49304
49305
49306
49307
49308
49309
49310
49311
49312
49313
49314
49315
49316
49317
49318
49319
49320
49321
49322
49323
49324
49325
49326
49327
49328
49329
49330
49331
49332
49333
49334
49335
49336
49337
49338
49339
49340
49341
49342
49343
49344
49345
49346
49347
49348
49349
49350
49351
49352
49353
49354
49355
49356
49357
49358
49359
49360
49361
49362
49363
49364
49365
49366
49367
49368
49369
49370
49371
49372
49373
49374
49375
49376
49377
49378
49379
49380
49381
49382
49383
49384
49385
49386
49387
49388
49389
49390
49391
49392
49393
49394
49395
49396
49397
49398
49399
49400
49401
49402
49403
49404
49405
49406
49407
49408
49409
49410
49411
49412
49413
49414
49415
49416
49417
49418
49419
49420
49421
49422
49423
49424
49425
49426
49427
49428
49429
49430
49431
49432
49433
49434
49435
49436
49437
49438
49439
49440
49441
49442
49443
49444
49445
49446
49447
49448
49449
49450
49451
49452
49453
49454
49455
49456
49457
49458
49459
49460
49461
49462
49463
49464
49465
49466
49467
49468
49469
49470
49471
49472
49473
49474
49475
49476
49477
49478
49479
49480
49481
49482
49483
49484
49485
49486
49487
49488
49489
49490
49491
49492
49493
49494
49495
49496
49497
49498
49499
49500
49501
49502
49503
49504
49505
49506
49507
49508
49509
49510
49511
49512
49513
49514
49515
49516
49517
49518
49519
49520
49521
49522
49523
49524
49525
49526
49527
49528
49529
49530
49531
49532
49533
49534
49535
49536
49537
49538
49539
49540
49541
49542
49543
49544
49545
49546
49547
49548
49549
49550
49551
49552
49553
49554
49555
49556
49557
49558
49559
49560
49561
49562
49563
49564
49565
49566
49567
49568
49569
49570
49571
49572
49573
49574
49575
49576
49577
49578
49579
49580
49581
49582
49583
49584
49585
49586
49587
49588
49589
49590
49591
49592
49593
49594
49595
49596
49597
49598
49599
49600
49601
49602
49603
49604
49605
49606
49607
49608
49609
49610
49611
49612
49613
49614
49615
49616
49617
49618
49619
49620
49621
49622
49623
49624
49625
49626
49627
49628
49629
49630
49631
49632
49633
49634
49635
49636
49637
49638
49639
49640
49641
49642
49643
49644
49645
49646
49647
49648
49649
49650
49651
49652
49653
49654
49655
49656
49657
49658
49659
49660
49661
49662
49663
49664
49665
49666
49667
49668
49669
49670
49671
49672
49673
49674
49675
49676
49677
49678
49679
49680
49681
49682
49683
49684
49685
49686
49687
49688
49689
49690
49691
49692
49693
49694
49695
49696
49697
49698
49699
49700
49701
49702
49703
49704
49705
49706
49707
49708
49709
49710
49711
49712
49713
49714
49715
49716
49717
49718
49719
49720
49721
49722
49723
49724
49725
49726
49727
49728
49729
49730
49731
49732
49733
49734
49735
49736
49737
49738
49739
49740
49741
49742
49743
49744
49745
49746
49747
49748
49749
49750
49751
49752
49753
49754
49755
49756
49757
49758
49759
49760
49761
49762
49763
49764
49765
49766
49767
49768
49769
49770
49771
49772
49773
49774
49775
49776
49777
49778
49779
49780
49781
49782
49783
49784
49785
49786
49787
49788
49789
49790
49791
49792
49793
49794
49795
49796
49797
49798
49799
49800
49801
49802
49803
49804
49805
49806
49807
49808
49809
49810
49811
49812
49813
49814
49815
49816
49817
49818
49819
49820
49821
49822
49823
49824
49825
49826
49827
49828
49829
49830
49831
49832
49833
49834
49835
49836
49837
49838
49839
49840
49841
49842
49843
49844
49845
49846
49847
49848
49849
49850
49851
49852
49853
49854
49855
49856
49857
49858
49859
49860
49861
49862
49863
49864
49865
49866
49867
49868
49869
49870
49871
49872
49873
49874
49875
49876
49877
49878
49879
49880
49881
49882
49883
49884
49885
49886
49887
49888
49889
49890
49891
49892
49893
49894
49895
49896
49897
49898
49899
49900
49901
49902
49903
49904
49905
49906
49907
49908
49909
49910
49911
49912
49913
49914
49915
49916
49917
49918
49919
49920
49921
49922
49923
49924
49925
49926
49927
49928
49929
49930
49931
49932
49933
49934
49935
49936
49937
49938
49939
49940
49941
49942
49943
49944
49945
49946
49947
49948
49949
49950
49951
49952
49953
49954
49955
49956
49957
49958
49959
49960
49961
49962
49963
49964
49965
49966
49967
49968
49969
49970
49971
49972
49973
49974
49975
49976
49977
49978
49979
49980
49981
49982
49983
49984
49985
49986
49987
49988
49989
49990
49991
49992
49993
49994
49995
49996
49997
49998
49999
50000
50001
50002
50003
50004
50005
50006
50007
50008
50009
50010
50011
50012
50013
50014
50015
50016
50017
50018
50019
50020
50021
50022
50023
50024
50025
50026
50027
50028
50029
50030
50031
50032
50033
50034
50035
50036
50037
50038
50039
50040
50041
50042
50043
50044
50045
50046
50047
50048
50049
50050
50051
50052
50053
50054
50055
50056
50057
50058
50059
50060
50061
50062
50063
50064
50065
50066
50067
50068
50069
50070
50071
50072
50073
50074
50075
50076
50077
50078
50079
50080
50081
50082
50083
50084
50085
50086
50087
50088
50089
50090
50091
50092
50093
50094
50095
50096
50097
50098
50099
50100
50101
50102
50103
50104
50105
50106
50107
50108
50109
50110
50111
50112
50113
50114
50115
50116
50117
50118
50119
50120
50121
50122
50123
50124
50125
50126
50127
50128
50129
50130
50131
50132
50133
50134
50135
50136
50137
50138
50139
50140
50141
50142
50143
50144
50145
50146
50147
50148
50149
50150
50151
50152
50153
50154
50155
50156
50157
50158
50159
50160
50161
50162
50163
50164
50165
50166
50167
50168
50169
50170
50171
50172
50173
50174
50175
50176
50177
50178
50179
50180
50181
50182
50183
50184
50185
50186
50187
50188
50189
50190
50191
50192
50193
50194
50195
50196
50197
50198
50199
50200
50201
50202
50203
50204
50205
50206
50207
50208
50209
50210
50211
50212
50213
50214
50215
50216
50217
50218
50219
50220
50221
50222
50223
50224
50225
50226
50227
50228
50229
50230
50231
50232
50233
50234
50235
50236
50237
50238
50239
50240
50241
50242
50243
50244
50245
50246
50247
50248
50249
50250
50251
50252
50253
50254
50255
50256
50257
50258
50259
50260
50261
50262
50263
50264
50265
50266
50267
50268
50269
50270
50271
50272
50273
50274
50275
50276
50277
50278
50279
50280
50281
50282
50283
50284
50285
50286
50287
50288
50289
50290
50291
50292
50293
50294
50295
50296
50297
50298
50299
50300
50301
50302
50303
50304
50305
50306
50307
50308
50309
50310
50311
50312
50313
50314
50315
50316
50317
50318
50319
50320
50321
50322
50323
50324
50325
50326
50327
50328
50329
50330
50331
50332
50333
50334
50335
50336
50337
50338
50339
50340
50341
50342
50343
50344
50345
50346
50347
50348
50349
50350
50351
50352
50353
50354
50355
50356
50357
50358
50359
50360
50361
50362
50363
50364
50365
50366
50367
50368
50369
50370
50371
50372
50373
50374
50375
50376
50377
50378
50379
50380
50381
50382
50383
50384
50385
50386
50387
50388
50389
50390
50391
50392
50393
50394
50395
50396
50397
50398
50399
50400
50401
50402
50403
50404
50405
50406
50407
50408
50409
50410
50411
50412
50413
50414
50415
50416
50417
50418
50419
50420
50421
50422
50423
50424
50425
50426
50427
50428
50429
50430
50431
50432
50433
50434
50435
50436
50437
50438
50439
50440
50441
50442
50443
50444
50445
50446
50447
50448
50449
50450
50451
50452
50453
50454
50455
50456
50457
50458
50459
50460
50461
50462
50463
50464
50465
50466
50467
50468
50469
50470
50471
50472
50473
50474
50475
50476
50477
50478
50479
50480
50481
50482
50483
50484
50485
50486
50487
50488
50489
50490
50491
50492
50493
50494
50495
50496
50497
50498
50499
50500
50501
50502
50503
50504
50505
50506
50507
50508
50509
50510
50511
50512
50513
50514
50515
50516
50517
50518
50519
50520
50521
50522
50523
50524
50525
50526
50527
50528
50529
50530
50531
50532
50533
50534
50535
50536
50537
50538
50539
50540
50541
50542
50543
50544
50545
50546
50547
50548
50549
50550
50551
50552
50553
50554
50555
50556
50557
50558
50559
50560
50561
50562
50563
50564
50565
50566
50567
50568
50569
50570
50571
50572
50573
50574
50575
50576
50577
50578
50579
50580
50581
50582
50583
50584
50585
50586
50587
50588
50589
50590
50591
50592
50593
50594
50595
50596
50597
50598
50599
50600
50601
50602
50603
50604
50605
50606
50607
50608
50609
50610
50611
50612
50613
50614
50615
50616
50617
50618
50619
50620
50621
50622
50623
50624
50625
50626
50627
50628
50629
50630
50631
50632
50633
50634
50635
50636
50637
50638
50639
50640
50641
50642
50643
50644
50645
50646
50647
50648
50649
50650
50651
50652
50653
50654
50655
50656
50657
50658
50659
50660
50661
50662
50663
50664
50665
50666
50667
50668
50669
50670
50671
50672
50673
50674
50675
50676
50677
50678
50679
50680
50681
50682
50683
50684
50685
50686
50687
50688
50689
50690
50691
50692
50693
50694
50695
50696
50697
50698
50699
50700
50701
50702
50703
50704
50705
50706
50707
50708
50709
50710
50711
50712
50713
50714
50715
50716
50717
50718
50719
50720
50721
50722
50723
50724
50725
50726
50727
50728
50729
50730
50731
50732
50733
50734
50735
50736
50737
50738
50739
50740
50741
50742
50743
50744
50745
50746
50747
50748
50749
50750
50751
50752
50753
50754
50755
50756
50757
50758
50759
50760
50761
50762
50763
50764
50765
50766
50767
50768
50769
50770
50771
50772
50773
50774
50775
50776
50777
50778
50779
50780
50781
50782
50783
50784
50785
50786
50787
50788
50789
50790
50791
50792
50793
50794
50795
50796
50797
50798
50799
50800
50801
50802
50803
50804
50805
50806
50807
50808
50809
50810
50811
50812
50813
50814
50815
50816
50817
50818
50819
50820
50821
50822
50823
50824
50825
50826
50827
50828
50829
50830
50831
50832
50833
50834
50835
50836
50837
50838
50839
50840
50841
50842
50843
50844
50845
50846
50847
50848
50849
50850
50851
50852
50853
50854
50855
50856
50857
50858
50859
50860
50861
50862
50863
50864
50865
50866
50867
50868
50869
50870
50871
50872
50873
50874
50875
50876
50877
50878
50879
50880
50881
50882
50883
50884
50885
50886
50887
50888
50889
50890
50891
50892
50893
50894
50895
50896
50897
50898
50899
50900
50901
50902
50903
50904
50905
50906
50907
50908
50909
50910
50911
50912
50913
50914
50915
50916
50917
50918
50919
50920
50921
50922
50923
50924
50925
50926
50927
50928
50929
50930
50931
50932
50933
50934
50935
50936
50937
50938
50939
50940
50941
50942
50943
50944
50945
50946
50947
50948
50949
50950
50951
50952
50953
50954
50955
50956
50957
50958
50959
50960
50961
50962
50963
50964
50965
50966
50967
50968
50969
50970
50971
50972
50973
50974
50975
50976
50977
50978
50979
50980
50981
50982
50983
50984
50985
50986
50987
50988
50989
50990
50991
50992
50993
50994
50995
50996
50997
50998
50999
51000
51001
51002
51003
51004
51005
51006
51007
51008
51009
51010
51011
51012
51013
51014
51015
51016
51017
51018
51019
51020
51021
51022
51023
51024
51025
51026
51027
51028
51029
51030
51031
51032
51033
51034
51035
51036
51037
51038
51039
51040
51041
51042
51043
51044
51045
51046
51047
51048
51049
51050
51051
51052
51053
51054
51055
51056
51057
51058
51059
51060
51061
51062
51063
51064
51065
51066
51067
51068
51069
51070
51071
51072
51073
51074
51075
51076
51077
51078
51079
51080
51081
51082
51083
51084
51085
51086
51087
51088
51089
51090
51091
51092
51093
51094
51095
51096
51097
51098
51099
51100
51101
51102
51103
51104
51105
51106
51107
51108
51109
51110
51111
51112
51113
51114
51115
51116
51117
51118
51119
51120
51121
51122
51123
51124
51125
51126
51127
51128
51129
51130
51131
51132
51133
51134
51135
51136
51137
51138
51139
51140
51141
51142
51143
51144
51145
51146
51147
51148
51149
51150
51151
51152
51153
51154
51155
51156
51157
51158
51159
51160
51161
51162
51163
51164
51165
51166
51167
51168
51169
51170
51171
51172
51173
51174
51175
51176
51177
51178
51179
51180
51181
51182
51183
51184
51185
51186
51187
51188
51189
51190
51191
51192
51193
51194
51195
51196
51197
51198
51199
51200
51201
51202
51203
51204
51205
51206
51207
51208
51209
51210
51211
51212
51213
51214
51215
51216
51217
51218
51219
51220
51221
51222
51223
51224
51225
51226
51227
51228
51229
51230
51231
51232
51233
51234
51235
51236
51237
51238
51239
51240
51241
51242
51243
51244
51245
51246
51247
51248
51249
51250
51251
51252
51253
51254
51255
51256
51257
51258
51259
51260
51261
51262
51263
51264
51265
51266
51267
51268
51269
51270
51271
51272
51273
51274
51275
51276
51277
51278
51279
51280
51281
51282
51283
51284
51285
51286
51287
51288
51289
51290
51291
51292
51293
51294
51295
51296
51297
51298
51299
51300
51301
51302
51303
51304
51305
51306
51307
51308
51309
51310
51311
51312
51313
51314
51315
51316
51317
51318
51319
51320
51321
51322
51323
51324
51325
51326
51327
51328
51329
51330
51331
51332
51333
51334
51335
51336
51337
51338
51339
51340
51341
51342
51343
51344
51345
51346
51347
51348
51349
51350
51351
51352
51353
51354
51355
51356
51357
51358
51359
51360
51361
51362
51363
51364
51365
51366
51367
51368
51369
51370
51371
51372
51373
51374
51375
51376
51377
51378
51379
51380
51381
51382
51383
51384
51385
51386
51387
51388
51389
51390
51391
51392
51393
51394
51395
51396
51397
51398
51399
51400
51401
51402
51403
51404
51405
51406
51407
51408
51409
51410
51411
51412
51413
51414
51415
51416
51417
51418
51419
51420
51421
51422
51423
51424
51425
51426
51427
51428
51429
51430
51431
51432
51433
51434
51435
51436
51437
51438
51439
51440
51441
51442
51443
51444
51445
51446
51447
51448
51449
51450
51451
51452
51453
51454
51455
51456
51457
51458
51459
51460
51461
51462
51463
51464
51465
51466
51467
51468
51469
51470
51471
51472
51473
51474
51475
51476
51477
51478
51479
51480
51481
51482
51483
51484
51485
51486
51487
51488
51489
51490
51491
51492
51493
51494
51495
51496
51497
51498
51499
51500
51501
51502
51503
51504
51505
51506
51507
51508
51509
51510
51511
51512
51513
51514
51515
51516
51517
51518
51519
51520
51521
51522
51523
51524
51525
51526
51527
51528
51529
51530
51531
51532
51533
51534
51535
51536
51537
51538
51539
51540
51541
51542
51543
51544
51545
51546
51547
51548
51549
51550
51551
51552
51553
51554
51555
51556
51557
51558
51559
51560
51561
51562
51563
51564
51565
51566
51567
51568
51569
51570
51571
51572
51573
51574
51575
51576
51577
51578
51579
51580
51581
51582
51583
51584
51585
51586
51587
51588
51589
51590
51591
51592
51593
51594
51595
51596
51597
51598
51599
51600
51601
51602
51603
51604
51605
51606
51607
51608
51609
51610
51611
51612
51613
51614
51615
51616
51617
51618
51619
51620
51621
51622
51623
51624
51625
51626
51627
51628
51629
51630
51631
51632
51633
51634
51635
51636
51637
51638
51639
51640
51641
51642
51643
51644
51645
51646
51647
51648
51649
51650
51651
51652
51653
51654
51655
51656
51657
51658
51659
51660
51661
51662
51663
51664
51665
51666
51667
51668
51669
51670
51671
51672
51673
51674
51675
51676
51677
51678
51679
51680
51681
51682
51683
51684
51685
51686
51687
51688
51689
51690
51691
51692
51693
51694
51695
51696
51697
51698
51699
51700
51701
51702
51703
51704
51705
51706
51707
51708
51709
51710
51711
51712
51713
51714
51715
51716
51717
51718
51719
51720
51721
51722
51723
51724
51725
51726
51727
51728
51729
51730
51731
51732
51733
51734
51735
51736
51737
51738
51739
51740
51741
51742
51743
51744
51745
51746
51747
51748
51749
51750
51751
51752
51753
51754
51755
51756
51757
51758
51759
51760
51761
51762
51763
51764
51765
51766
51767
51768
51769
51770
51771
51772
51773
51774
51775
51776
51777
51778
51779
51780
51781
51782
51783
51784
51785
51786
51787
51788
51789
51790
51791
51792
51793
51794
51795
51796
51797
51798
51799
51800
51801
51802
51803
51804
51805
51806
51807
51808
51809
51810
51811
51812
51813
51814
51815
51816
51817
51818
51819
51820
51821
51822
51823
51824
51825
51826
51827
51828
51829
51830
51831
51832
51833
51834
51835
51836
51837
51838
51839
51840
51841
51842
51843
51844
51845
51846
51847
51848
51849
51850
51851
51852
51853
51854
51855
51856
51857
51858
51859
51860
51861
51862
51863
51864
51865
51866
51867
51868
51869
51870
51871
51872
51873
51874
51875
51876
51877
51878
51879
51880
51881
51882
51883
51884
51885
51886
51887
51888
51889
51890
51891
51892
51893
51894
51895
51896
51897
51898
51899
51900
51901
51902
51903
51904
51905
51906
51907
51908
51909
51910
51911
51912
51913
51914
51915
51916
51917
51918
51919
51920
51921
51922
51923
51924
51925
51926
51927
51928
51929
51930
51931
51932
51933
51934
51935
51936
51937
51938
51939
51940
51941
51942
51943
51944
51945
51946
51947
51948
51949
51950
51951
51952
51953
51954
51955
51956
51957
51958
51959
51960
51961
51962
51963
51964
51965
51966
51967
51968
51969
51970
51971
51972
51973
51974
51975
51976
51977
51978
51979
51980
51981
51982
51983
51984
51985
51986
51987
51988
51989
51990
51991
51992
51993
51994
51995
51996
51997
51998
51999
52000
52001
52002
52003
52004
52005
52006
52007
52008
52009
52010
52011
52012
52013
52014
52015
52016
52017
52018
52019
52020
52021
52022
52023
52024
52025
52026
52027
52028
52029
52030
52031
52032
52033
52034
52035
52036
52037
52038
52039
52040
52041
52042
52043
52044
52045
52046
52047
52048
52049
52050
52051
52052
52053
52054
52055
52056
52057
52058
52059
52060
52061
52062
52063
52064
52065
52066
52067
52068
52069
52070
52071
52072
52073
52074
52075
52076
52077
52078
52079
52080
52081
52082
52083
52084
52085
52086
52087
52088
52089
52090
52091
52092
52093
52094
52095
52096
52097
52098
52099
52100
52101
52102
52103
52104
52105
52106
52107
52108
52109
52110
52111
52112
52113
52114
52115
52116
52117
52118
52119
52120
52121
52122
52123
52124
52125
52126
52127
52128
52129
52130
52131
52132
52133
52134
52135
52136
52137
52138
52139
52140
52141
52142
52143
52144
52145
52146
52147
52148
52149
52150
52151
52152
52153
52154
52155
52156
52157
52158
52159
52160
52161
52162
52163
52164
52165
52166
52167
52168
52169
52170
52171
52172
52173
52174
52175
52176
52177
52178
52179
52180
52181
52182
52183
52184
52185
52186
52187
52188
52189
52190
52191
52192
52193
52194
52195
52196
52197
52198
52199
52200
52201
52202
52203
52204
52205
52206
52207
52208
52209
52210
52211
52212
52213
52214
52215
52216
52217
52218
52219
52220
52221
52222
52223
52224
52225
52226
52227
52228
52229
52230
52231
52232
52233
52234
52235
52236
52237
52238
52239
52240
52241
52242
52243
52244
52245
52246
52247
52248
52249
52250
52251
52252
52253
52254
52255
52256
52257
52258
52259
52260
52261
52262
52263
52264
52265
52266
52267
52268
52269
52270
52271
52272
52273
52274
52275
52276
52277
52278
52279
52280
52281
52282
52283
52284
52285
52286
52287
52288
52289
52290
52291
52292
52293
52294
52295
52296
52297
52298
52299
52300
52301
52302
52303
52304
52305
52306
52307
52308
52309
52310
52311
52312
52313
52314
52315
52316
52317
52318
52319
52320
52321
52322
52323
52324
52325
52326
52327
52328
52329
52330
52331
52332
52333
52334
52335
52336
52337
52338
52339
52340
52341
52342
52343
52344
52345
52346
52347
52348
52349
52350
52351
52352
52353
52354
52355
52356
52357
52358
52359
52360
52361
52362
52363
52364
52365
52366
52367
52368
52369
52370
52371
52372
52373
52374
52375
52376
52377
52378
52379
52380
52381
52382
52383
52384
52385
52386
52387
52388
52389
52390
52391
52392
52393
52394
52395
52396
52397
52398
52399
52400
52401
52402
52403
52404
52405
52406
52407
52408
52409
52410
52411
52412
52413
52414
52415
52416
52417
52418
52419
52420
52421
52422
52423
52424
52425
52426
52427
52428
52429
52430
52431
52432
52433
52434
52435
52436
52437
52438
52439
52440
52441
52442
52443
52444
52445
52446
52447
52448
52449
52450
52451
52452
52453
52454
52455
52456
52457
52458
52459
52460
52461
52462
52463
52464
52465
52466
52467
52468
52469
52470
52471
52472
52473
52474
52475
52476
52477
52478
52479
52480
52481
52482
52483
52484
52485
52486
52487
52488
52489
52490
52491
52492
52493
52494
52495
52496
52497
52498
52499
52500
52501
52502
52503
52504
52505
52506
52507
52508
52509
52510
52511
52512
52513
52514
52515
52516
52517
52518
52519
52520
52521
52522
52523
52524
52525
52526
52527
52528
52529
52530
52531
52532
52533
52534
52535
52536
52537
52538
52539
52540
52541
52542
52543
52544
52545
52546
52547
52548
52549
52550
52551
52552
52553
52554
52555
52556
52557
52558
52559
52560
52561
52562
52563
52564
52565
52566
52567
52568
52569
52570
52571
52572
52573
52574
52575
52576
52577
52578
52579
52580
52581
52582
52583
52584
52585
52586
52587
52588
52589
52590
52591
52592
52593
52594
52595
52596
52597
52598
52599
52600
52601
52602
52603
52604
52605
52606
52607
52608
52609
52610
52611
52612
52613
52614
52615
52616
52617
52618
52619
52620
52621
52622
52623
52624
52625
52626
52627
52628
52629
52630
52631
52632
52633
52634
52635
52636
52637
52638
52639
52640
52641
52642
52643
52644
52645
52646
52647
52648
52649
52650
52651
52652
52653
52654
52655
52656
52657
52658
52659
52660
52661
52662
52663
52664
52665
52666
52667
52668
52669
52670
52671
52672
52673
52674
52675
52676
52677
52678
52679
52680
52681
52682
52683
52684
52685
52686
52687
52688
52689
52690
52691
52692
52693
52694
52695
52696
52697
52698
52699
52700
52701
52702
52703
52704
52705
52706
52707
52708
52709
52710
52711
52712
52713
52714
52715
52716
52717
52718
52719
52720
52721
52722
52723
52724
52725
52726
52727
52728
52729
52730
52731
52732
52733
52734
52735
52736
52737
52738
52739
52740
52741
52742
52743
52744
52745
52746
52747
52748
52749
52750
52751
52752
52753
52754
52755
52756
52757
52758
52759
52760
52761
52762
52763
52764
52765
52766
52767
52768
52769
52770
52771
52772
52773
52774
52775
52776
52777
52778
52779
52780
52781
52782
52783
52784
52785
52786
52787
52788
52789
52790
52791
52792
52793
52794
52795
52796
52797
52798
52799
52800
52801
52802
52803
52804
52805
52806
52807
52808
52809
52810
52811
52812
52813
52814
52815
52816
52817
52818
52819
52820
52821
52822
52823
52824
52825
52826
52827
52828
52829
52830
52831
52832
52833
52834
52835
52836
52837
52838
52839
52840
52841
52842
52843
52844
52845
52846
52847
52848
52849
52850
52851
52852
52853
52854
52855
52856
52857
52858
52859
52860
52861
52862
52863
52864
52865
52866
52867
52868
52869
52870
52871
52872
52873
52874
52875
52876
52877
52878
52879
52880
52881
52882
52883
52884
52885
52886
52887
52888
52889
52890
52891
52892
52893
52894
52895
52896
52897
52898
52899
52900
52901
52902
52903
52904
52905
52906
52907
52908
52909
52910
52911
52912
52913
52914
52915
52916
52917
52918
52919
52920
52921
52922
52923
52924
52925
52926
52927
52928
52929
52930
52931
52932
52933
52934
52935
52936
52937
52938
52939
52940
52941
52942
52943
52944
52945
52946
52947
52948
52949
52950
52951
52952
52953
52954
52955
52956
52957
52958
52959
52960
52961
52962
52963
52964
52965
52966
52967
52968
52969
52970
52971
52972
52973
52974
52975
52976
52977
52978
52979
52980
52981
52982
52983
52984
52985
52986
52987
52988
52989
52990
52991
52992
52993
52994
52995
52996
52997
52998
52999
53000
53001
53002
53003
53004
53005
53006
53007
53008
53009
53010
53011
53012
53013
53014
53015
53016
53017
53018
53019
53020
53021
53022
53023
53024
53025
53026
53027
53028
53029
53030
53031
53032
53033
53034
53035
53036
53037
53038
53039
53040
53041
53042
53043
53044
53045
53046
53047
53048
53049
53050
53051
53052
53053
53054
53055
53056
53057
53058
53059
53060
53061
53062
53063
53064
53065
53066
53067
53068
53069
53070
53071
53072
53073
53074
53075
53076
53077
53078
53079
53080
53081
53082
53083
53084
53085
53086
53087
53088
53089
53090
53091
53092
53093
53094
53095
53096
53097
53098
53099
53100
53101
53102
53103
53104
53105
53106
53107
53108
53109
53110
53111
53112
53113
53114
53115
53116
53117
53118
53119
53120
53121
53122
53123
53124
53125
53126
53127
53128
53129
53130
53131
53132
53133
53134
53135
53136
53137
53138
53139
53140
53141
53142
53143
53144
53145
53146
53147
53148
53149
53150
53151
53152
53153
53154
53155
53156
53157
53158
53159
53160
53161
53162
53163
53164
53165
53166
53167
53168
53169
53170
53171
53172
53173
53174
53175
53176
53177
53178
53179
53180
53181
53182
53183
53184
53185
53186
53187
53188
53189
53190
53191
53192
53193
53194
53195
53196
53197
53198
53199
53200
53201
53202
53203
53204
53205
53206
53207
53208
53209
53210
53211
53212
53213
53214
53215
53216
53217
53218
53219
53220
53221
53222
53223
53224
53225
53226
53227
53228
53229
53230
53231
53232
53233
53234
53235
53236
53237
53238
53239
53240
53241
53242
53243
53244
53245
53246
53247
53248
53249
53250
53251
53252
53253
53254
53255
53256
53257
53258
53259
53260
53261
53262
53263
53264
53265
53266
53267
53268
53269
53270
53271
53272
53273
53274
53275
53276
53277
53278
53279
53280
53281
53282
53283
53284
53285
53286
53287
53288
53289
53290
53291
53292
53293
53294
53295
53296
53297
53298
53299
53300
53301
53302
53303
53304
53305
53306
53307
53308
53309
53310
53311
53312
53313
53314
53315
53316
53317
53318
53319
53320
53321
53322
53323
53324
53325
53326
53327
53328
53329
53330
53331
53332
53333
53334
53335
53336
53337
53338
53339
53340
53341
53342
53343
53344
53345
53346
53347
53348
53349
53350
53351
53352
53353
53354
53355
53356
53357
53358
53359
53360
53361
53362
53363
53364
53365
53366
53367
53368
53369
53370
53371
53372
53373
53374
53375
53376
53377
53378
53379
53380
53381
53382
53383
53384
53385
53386
53387
53388
53389
53390
53391
53392
53393
53394
53395
53396
53397
53398
53399
53400
53401
53402
53403
53404
53405
53406
53407
53408
53409
53410
53411
53412
53413
53414
53415
53416
53417
53418
53419
53420
53421
53422
53423
53424
53425
53426
53427
53428
53429
53430
53431
53432
53433
53434
53435
53436
53437
53438
53439
53440
53441
53442
53443
53444
53445
53446
53447
53448
53449
53450
53451
53452
53453
53454
53455
53456
53457
53458
53459
53460
53461
53462
53463
53464
53465
53466
53467
53468
53469
53470
53471
53472
53473
53474
53475
53476
53477
53478
53479
53480
53481
53482
53483
53484
53485
53486
53487
53488
53489
53490
53491
53492
53493
53494
53495
53496
53497
53498
53499
53500
53501
53502
53503
53504
53505
53506
53507
53508
53509
53510
53511
53512
53513
53514
53515
53516
53517
53518
53519
53520
53521
53522
53523
53524
53525
53526
53527
53528
53529
53530
53531
53532
53533
53534
53535
53536
53537
53538
53539
53540
53541
53542
53543
53544
53545
53546
53547
53548
53549
53550
53551
53552
53553
53554
53555
53556
53557
53558
53559
53560
53561
53562
53563
53564
53565
53566
53567
53568
53569
53570
53571
53572
53573
53574
53575
53576
53577
53578
53579
53580
53581
53582
53583
53584
53585
53586
53587
53588
53589
53590
53591
53592
53593
53594
53595
53596
53597
53598
53599
53600
53601
53602
53603
53604
53605
53606
53607
53608
53609
53610
53611
53612
53613
53614
53615
53616
53617
53618
53619
53620
53621
53622
53623
53624
53625
53626
53627
53628
53629
53630
53631
53632
53633
53634
53635
53636
53637
53638
53639
53640
53641
53642
53643
53644
53645
53646
53647
53648
53649
53650
53651
53652
53653
53654
53655
53656
53657
53658
53659
53660
53661
53662
53663
53664
53665
53666
53667
53668
53669
53670
53671
53672
53673
53674
53675
53676
53677
53678
53679
53680
53681
53682
53683
53684
53685
53686
53687
53688
53689
53690
53691
53692
53693
53694
53695
53696
53697
53698
53699
53700
53701
53702
53703
53704
53705
53706
53707
53708
53709
53710
53711
53712
53713
53714
53715
53716
53717
53718
53719
53720
53721
53722
53723
53724
53725
53726
53727
53728
53729
53730
53731
53732
53733
53734
53735
53736
53737
53738
53739
53740
53741
53742
53743
53744
53745
53746
53747
53748
53749
53750
53751
53752
53753
53754
53755
53756
53757
53758
53759
53760
53761
53762
53763
53764
53765
53766
53767
53768
53769
53770
53771
53772
53773
53774
53775
53776
53777
53778
53779
53780
53781
53782
53783
53784
53785
53786
53787
53788
53789
53790
53791
53792
53793
53794
53795
53796
53797
53798
53799
53800
53801
53802
53803
53804
53805
53806
53807
53808
53809
53810
53811
53812
53813
53814
53815
53816
53817
53818
53819
53820
53821
53822
53823
53824
53825
53826
53827
53828
53829
53830
53831
53832
53833
53834
53835
53836
53837
53838
53839
53840
53841
53842
53843
53844
53845
53846
53847
53848
53849
53850
53851
53852
53853
53854
53855
53856
53857
53858
53859
53860
53861
53862
53863
53864
53865
53866
53867
53868
53869
53870
53871
53872
53873
53874
53875
53876
53877
53878
53879
53880
53881
53882
53883
53884
53885
53886
53887
53888
53889
53890
53891
53892
53893
53894
53895
53896
53897
53898
53899
53900
53901
53902
53903
53904
53905
53906
53907
53908
53909
53910
53911
53912
53913
53914
53915
53916
53917
53918
53919
53920
53921
53922
53923
53924
53925
53926
53927
53928
53929
53930
53931
53932
53933
53934
53935
53936
53937
53938
53939
53940
53941
53942
53943
53944
53945
53946
53947
53948
53949
53950
53951
53952
53953
53954
53955
53956
53957
53958
53959
53960
53961
53962
53963
53964
53965
53966
53967
53968
53969
53970
53971
53972
53973
53974
53975
53976
53977
53978
53979
53980
53981
53982
53983
53984
53985
53986
53987
53988
53989
53990
53991
53992
53993
53994
53995
53996
53997
53998
53999
54000
54001
54002
54003
54004
54005
54006
54007
54008
54009
54010
54011
54012
54013
54014
54015
54016
54017
54018
54019
54020
54021
54022
54023
54024
54025
54026
54027
54028
54029
54030
54031
54032
54033
54034
54035
54036
54037
54038
54039
54040
54041
54042
54043
54044
54045
54046
54047
54048
54049
54050
54051
54052
54053
54054
54055
54056
54057
54058
54059
54060
54061
54062
54063
54064
54065
54066
54067
54068
54069
54070
54071
54072
54073
54074
54075
54076
54077
54078
54079
54080
54081
54082
54083
54084
54085
54086
54087
54088
54089
54090
54091
54092
54093
54094
54095
54096
54097
54098
54099
54100
54101
54102
54103
54104
54105
54106
54107
54108
54109
54110
54111
54112
54113
54114
54115
54116
54117
54118
54119
54120
54121
54122
54123
54124
54125
54126
54127
54128
54129
54130
54131
54132
54133
54134
54135
54136
54137
54138
54139
54140
54141
54142
54143
54144
54145
54146
54147
54148
54149
54150
54151
54152
54153
54154
54155
54156
54157
54158
54159
54160
54161
54162
54163
54164
54165
54166
54167
54168
54169
54170
54171
54172
54173
54174
54175
54176
54177
54178
54179
54180
54181
54182
54183
54184
54185
54186
54187
54188
54189
54190
54191
54192
54193
54194
54195
54196
54197
54198
54199
54200
54201
54202
54203
54204
54205
54206
54207
54208
54209
54210
54211
54212
54213
54214
54215
54216
54217
54218
54219
54220
54221
54222
54223
54224
54225
54226
54227
54228
54229
54230
54231
54232
54233
54234
54235
54236
54237
54238
54239
54240
54241
54242
54243
54244
54245
54246
54247
54248
54249
54250
54251
54252
54253
54254
54255
54256
54257
54258
54259
54260
54261
54262
54263
54264
54265
54266
54267
54268
54269
54270
54271
54272
54273
54274
54275
54276
54277
54278
54279
54280
54281
54282
54283
54284
54285
54286
54287
54288
54289
54290
54291
54292
54293
54294
54295
54296
54297
54298
54299
54300
54301
54302
54303
54304
54305
54306
54307
54308
54309
54310
54311
54312
54313
54314
54315
54316
54317
54318
54319
54320
54321
54322
54323
54324
54325
54326
54327
54328
54329
54330
54331
54332
54333
54334
54335
54336
54337
54338
54339
54340
54341
54342
54343
54344
54345
54346
54347
54348
54349
54350
54351
54352
54353
54354
54355
54356
54357
54358
54359
54360
54361
54362
54363
54364
54365
54366
54367
54368
54369
54370
54371
54372
54373
54374
54375
54376
54377
54378
54379
54380
54381
54382
54383
54384
54385
54386
54387
54388
54389
54390
54391
54392
54393
54394
54395
54396
54397
54398
54399
54400
54401
54402
54403
54404
54405
54406
54407
54408
54409
54410
54411
54412
54413
54414
54415
54416
54417
54418
54419
54420
54421
54422
54423
54424
54425
54426
54427
54428
54429
54430
54431
54432
54433
54434
54435
54436
54437
54438
54439
54440
54441
54442
54443
54444
54445
54446
54447
54448
54449
54450
54451
54452
54453
54454
54455
54456
54457
54458
54459
54460
54461
54462
54463
54464
54465
54466
54467
54468
54469
54470
54471
54472
54473
54474
54475
54476
54477
54478
54479
54480
54481
54482
54483
54484
54485
54486
54487
54488
54489
54490
54491
54492
54493
54494
54495
54496
54497
54498
54499
54500
54501
54502
54503
54504
54505
54506
54507
54508
54509
54510
54511
54512
54513
54514
54515
54516
54517
54518
54519
54520
54521
54522
54523
54524
54525
54526
54527
54528
54529
54530
54531
54532
54533
54534
54535
54536
54537
54538
54539
54540
54541
54542
54543
54544
54545
54546
54547
54548
54549
54550
54551
54552
54553
54554
54555
54556
54557
54558
54559
54560
54561
54562
54563
54564
54565
54566
54567
54568
54569
54570
54571
54572
54573
54574
54575
54576
54577
54578
54579
54580
54581
54582
54583
54584
54585
54586
54587
54588
54589
54590
54591
54592
54593
54594
54595
54596
54597
54598
54599
54600
54601
54602
54603
54604
54605
54606
54607
54608
54609
54610
54611
54612
54613
54614
54615
54616
54617
54618
54619
54620
54621
54622
54623
54624
54625
54626
54627
54628
54629
54630
54631
54632
54633
54634
54635
54636
54637
54638
54639
54640
54641
54642
54643
54644
54645
54646
54647
54648
54649
54650
54651
54652
54653
54654
54655
54656
54657
54658
54659
54660
54661
54662
54663
54664
54665
54666
54667
54668
54669
54670
54671
54672
54673
54674
54675
54676
54677
54678
54679
54680
54681
54682
54683
54684
54685
54686
54687
54688
54689
54690
54691
54692
54693
54694
54695
54696
54697
54698
54699
54700
54701
54702
54703
54704
54705
54706
54707
54708
54709
54710
54711
54712
54713
54714
54715
54716
54717
54718
54719
54720
54721
54722
54723
54724
54725
54726
54727
54728
54729
54730
54731
54732
54733
54734
54735
54736
54737
54738
54739
54740
54741
54742
54743
54744
54745
54746
54747
54748
54749
54750
54751
54752
54753
54754
54755
54756
54757
54758
54759
54760
54761
54762
54763
54764
54765
54766
54767
54768
54769
54770
54771
54772
54773
54774
54775
54776
54777
54778
54779
54780
54781
54782
54783
54784
54785
54786
54787
54788
54789
54790
54791
54792
54793
54794
54795
54796
54797
54798
54799
54800
54801
54802
54803
54804
54805
54806
54807
54808
54809
54810
54811
54812
54813
54814
54815
54816
54817
54818
54819
54820
54821
54822
54823
54824
54825
54826
54827
54828
54829
54830
54831
54832
54833
54834
54835
54836
54837
54838
54839
54840
54841
54842
54843
54844
54845
54846
54847
54848
54849
54850
54851
54852
54853
54854
54855
54856
54857
54858
54859
54860
54861
54862
54863
54864
54865
54866
54867
54868
54869
54870
54871
54872
54873
54874
54875
54876
54877
54878
54879
54880
54881
54882
54883
54884
54885
54886
54887
54888
54889
54890
54891
54892
54893
54894
54895
54896
54897
54898
54899
54900
54901
54902
54903
54904
54905
54906
54907
54908
54909
54910
54911
54912
54913
54914
54915
54916
54917
54918
54919
54920
54921
54922
54923
54924
54925
54926
54927
54928
54929
54930
54931
54932
54933
54934
54935
54936
54937
54938
54939
54940
54941
54942
54943
54944
54945
54946
54947
54948
54949
54950
54951
54952
54953
54954
54955
54956
54957
54958
54959
54960
54961
54962
54963
54964
54965
54966
54967
54968
54969
54970
54971
54972
54973
54974
54975
54976
54977
54978
54979
54980
54981
54982
54983
54984
54985
54986
54987
54988
54989
54990
54991
54992
54993
54994
54995
54996
54997
54998
54999
55000
55001
55002
55003
55004
55005
55006
55007
55008
55009
55010
55011
55012
55013
55014
55015
55016
55017
55018
55019
55020
55021
55022
55023
55024
55025
55026
55027
55028
55029
55030
55031
55032
55033
55034
55035
55036
55037
55038
55039
55040
55041
55042
55043
55044
55045
55046
55047
55048
55049
55050
55051
55052
55053
55054
55055
55056
55057
55058
55059
55060
55061
55062
55063
55064
55065
55066
55067
55068
55069
55070
55071
55072
55073
55074
55075
55076
55077
55078
55079
55080
55081
55082
55083
55084
55085
55086
55087
55088
55089
55090
55091
55092
55093
55094
55095
55096
55097
55098
55099
55100
55101
55102
55103
55104
55105
55106
55107
55108
55109
55110
55111
55112
55113
55114
55115
55116
55117
55118
55119
55120
55121
55122
55123
55124
55125
55126
55127
55128
55129
55130
55131
55132
55133
55134
55135
55136
55137
55138
55139
55140
55141
55142
55143
55144
55145
55146
55147
55148
55149
55150
55151
55152
55153
55154
55155
55156
55157
55158
55159
55160
55161
55162
55163
55164
55165
55166
55167
55168
55169
55170
55171
55172
55173
55174
55175
55176
55177
55178
55179
55180
55181
55182
55183
55184
55185
55186
55187
55188
55189
55190
55191
55192
55193
55194
55195
55196
55197
55198
55199
55200
55201
55202
55203
55204
55205
55206
55207
55208
55209
55210
55211
55212
55213
55214
55215
55216
55217
55218
55219
55220
55221
55222
55223
55224
55225
55226
55227
55228
55229
55230
55231
55232
55233
55234
55235
55236
55237
55238
55239
55240
55241
55242
55243
55244
55245
55246
55247
55248
55249
55250
55251
55252
55253
55254
55255
55256
55257
55258
55259
55260
55261
55262
55263
55264
55265
55266
55267
55268
55269
55270
55271
55272
55273
55274
55275
55276
55277
55278
55279
55280
55281
55282
55283
55284
55285
55286
55287
55288
55289
55290
55291
55292
55293
55294
55295
55296
55297
55298
55299
55300
55301
55302
55303
55304
55305
55306
55307
55308
55309
55310
55311
55312
55313
55314
55315
55316
55317
55318
55319
55320
55321
55322
55323
55324
55325
55326
55327
55328
55329
55330
55331
55332
55333
55334
55335
55336
55337
55338
55339
55340
55341
55342
55343
55344
55345
55346
55347
55348
55349
55350
55351
55352
55353
55354
55355
55356
55357
55358
55359
55360
55361
55362
55363
55364
55365
55366
55367
55368
55369
55370
55371
55372
55373
55374
55375
55376
55377
55378
55379
55380
55381
55382
55383
55384
55385
55386
55387
55388
55389
55390
55391
55392
55393
55394
55395
55396
55397
55398
55399
55400
55401
55402
55403
55404
55405
55406
55407
55408
55409
55410
55411
55412
55413
55414
55415
55416
55417
55418
55419
55420
55421
55422
55423
55424
55425
55426
55427
55428
55429
55430
55431
55432
55433
55434
55435
55436
55437
55438
55439
55440
55441
55442
55443
55444
55445
55446
55447
55448
55449
55450
55451
55452
55453
55454
55455
55456
55457
55458
55459
55460
55461
55462
55463
55464
55465
55466
55467
55468
55469
55470
55471
55472
55473
55474
55475
55476
55477
55478
55479
55480
55481
55482
55483
55484
55485
55486
55487
55488
55489
55490
55491
55492
55493
55494
55495
55496
55497
55498
55499
55500
55501
55502
55503
55504
55505
55506
55507
55508
55509
55510
55511
55512
55513
55514
55515
55516
55517
55518
55519
55520
55521
55522
55523
55524
55525
55526
55527
55528
55529
55530
55531
55532
55533
55534
55535
55536
55537
55538
55539
55540
55541
55542
55543
55544
55545
55546
55547
55548
55549
55550
55551
55552
55553
55554
55555
55556
55557
55558
55559
55560
55561
55562
55563
55564
55565
55566
55567
55568
55569
55570
55571
55572
55573
55574
55575
55576
55577
55578
55579
55580
55581
55582
55583
55584
55585
55586
55587
55588
55589
55590
55591
55592
55593
55594
55595
55596
55597
55598
55599
55600
55601
55602
55603
55604
55605
55606
55607
55608
55609
55610
55611
55612
55613
55614
55615
55616
55617
55618
55619
55620
55621
55622
55623
55624
55625
55626
55627
55628
55629
55630
55631
55632
55633
55634
55635
55636
55637
55638
55639
55640
55641
55642
55643
55644
55645
55646
55647
55648
55649
55650
55651
55652
55653
55654
55655
55656
55657
55658
55659
55660
55661
55662
55663
55664
55665
55666
55667
55668
55669
55670
55671
55672
55673
55674
55675
55676
55677
55678
55679
55680
55681
55682
55683
55684
55685
55686
55687
55688
55689
55690
55691
55692
55693
55694
55695
55696
55697
55698
55699
55700
55701
55702
55703
55704
55705
55706
55707
55708
55709
55710
55711
55712
55713
55714
55715
55716
55717
55718
55719
55720
55721
55722
55723
55724
55725
55726
55727
55728
55729
55730
55731
55732
55733
55734
55735
55736
55737
55738
55739
55740
55741
55742
55743
55744
55745
55746
55747
55748
55749
55750
55751
55752
55753
55754
55755
55756
55757
55758
55759
55760
55761
55762
55763
55764
55765
55766
55767
55768
55769
55770
55771
55772
55773
55774
55775
55776
55777
55778
55779
55780
55781
55782
55783
55784
55785
55786
55787
55788
55789
55790
55791
55792
55793
55794
55795
55796
55797
55798
55799
55800
55801
55802
55803
55804
55805
55806
55807
55808
55809
55810
55811
55812
55813
55814
55815
55816
55817
55818
55819
55820
55821
55822
55823
55824
55825
55826
55827
55828
55829
55830
55831
55832
55833
55834
55835
55836
55837
55838
55839
55840
55841
55842
55843
55844
55845
55846
55847
55848
55849
55850
55851
55852
55853
55854
55855
55856
55857
55858
55859
55860
55861
55862
55863
55864
55865
55866
55867
55868
55869
55870
55871
55872
55873
55874
55875
55876
55877
55878
55879
55880
55881
55882
55883
55884
55885
55886
55887
55888
55889
55890
55891
55892
55893
55894
55895
55896
55897
55898
55899
55900
55901
55902
55903
55904
55905
55906
55907
55908
55909
55910
55911
55912
55913
55914
55915
55916
55917
55918
55919
55920
55921
55922
55923
55924
55925
55926
55927
55928
55929
55930
55931
55932
55933
55934
55935
55936
55937
55938
55939
55940
55941
55942
55943
55944
55945
55946
55947
55948
55949
55950
55951
55952
55953
55954
55955
55956
55957
55958
55959
55960
55961
55962
55963
55964
55965
55966
55967
55968
55969
55970
55971
55972
55973
55974
55975
55976
55977
55978
55979
55980
55981
55982
55983
55984
55985
55986
55987
55988
55989
55990
55991
55992
55993
55994
55995
55996
55997
55998
55999
56000
56001
56002
56003
56004
56005
56006
56007
56008
56009
56010
56011
56012
56013
56014
56015
56016
56017
56018
56019
56020
56021
56022
56023
56024
56025
56026
56027
56028
56029
56030
56031
56032
56033
56034
56035
56036
56037
56038
56039
56040
56041
56042
56043
56044
56045
56046
56047
56048
56049
56050
56051
56052
56053
56054
56055
56056
56057
56058
56059
56060
56061
56062
56063
56064
56065
56066
56067
56068
56069
56070
56071
56072
56073
56074
56075
56076
56077
56078
56079
56080
56081
56082
56083
56084
56085
56086
56087
56088
56089
56090
56091
56092
56093
56094
56095
56096
56097
56098
56099
56100
56101
56102
56103
56104
56105
56106
56107
56108
56109
56110
56111
56112
56113
56114
56115
56116
56117
56118
56119
56120
56121
56122
56123
56124
56125
56126
56127
56128
56129
56130
56131
56132
56133
56134
56135
56136
56137
56138
56139
56140
56141
56142
56143
56144
56145
56146
56147
56148
56149
56150
56151
56152
56153
56154
56155
56156
56157
56158
56159
56160
56161
56162
56163
56164
56165
56166
56167
56168
56169
56170
56171
56172
56173
56174
56175
56176
56177
56178
56179
56180
56181
56182
56183
56184
56185
56186
56187
56188
56189
56190
56191
56192
56193
56194
56195
56196
56197
56198
56199
56200
56201
56202
56203
56204
56205
56206
56207
56208
56209
56210
56211
56212
56213
56214
56215
56216
56217
56218
56219
56220
56221
56222
56223
56224
56225
56226
56227
56228
56229
56230
56231
56232
56233
56234
56235
56236
56237
56238
56239
56240
56241
56242
56243
56244
56245
56246
56247
56248
56249
56250
56251
56252
56253
56254
56255
56256
56257
56258
56259
56260
56261
56262
56263
56264
56265
56266
56267
56268
56269
56270
56271
56272
56273
56274
56275
56276
56277
56278
56279
56280
56281
56282
56283
56284
56285
56286
56287
56288
56289
56290
56291
56292
56293
56294
56295
56296
56297
56298
56299
56300
56301
56302
56303
56304
56305
56306
56307
56308
56309
56310
56311
56312
56313
56314
56315
56316
56317
56318
56319
56320
56321
56322
56323
56324
56325
56326
56327
56328
56329
56330
56331
56332
56333
56334
56335
56336
56337
56338
56339
56340
56341
56342
56343
56344
56345
56346
56347
56348
56349
56350
56351
56352
56353
56354
56355
56356
56357
56358
56359
56360
56361
56362
56363
56364
56365
56366
56367
56368
56369
56370
56371
56372
56373
56374
56375
56376
56377
56378
56379
56380
56381
56382
56383
56384
56385
56386
56387
56388
56389
56390
56391
56392
56393
56394
56395
56396
56397
56398
56399
56400
56401
56402
56403
56404
56405
56406
56407
56408
56409
56410
56411
56412
56413
56414
56415
56416
56417
56418
56419
56420
56421
56422
56423
56424
56425
56426
56427
56428
56429
56430
56431
56432
56433
56434
56435
56436
56437
56438
56439
56440
56441
56442
56443
56444
56445
56446
56447
56448
56449
56450
56451
56452
56453
56454
56455
56456
56457
56458
56459
56460
56461
56462
56463
56464
56465
56466
56467
56468
56469
56470
56471
56472
56473
56474
56475
56476
56477
56478
56479
56480
56481
56482
56483
56484
56485
56486
56487
56488
56489
56490
56491
56492
56493
56494
56495
56496
56497
56498
56499
56500
56501
56502
56503
56504
56505
56506
56507
56508
56509
56510
56511
56512
56513
56514
56515
56516
56517
56518
56519
56520
56521
56522
56523
56524
56525
56526
56527
56528
56529
56530
56531
56532
56533
56534
56535
56536
56537
56538
56539
56540
56541
56542
56543
56544
56545
56546
56547
56548
56549
56550
56551
56552
56553
56554
56555
56556
56557
56558
56559
56560
56561
56562
56563
56564
56565
56566
56567
56568
56569
56570
56571
56572
56573
56574
56575
56576
56577
56578
56579
56580
56581
56582
56583
56584
56585
56586
56587
56588
56589
56590
56591
56592
56593
56594
56595
56596
56597
56598
56599
56600
56601
56602
56603
56604
56605
56606
56607
56608
56609
56610
56611
56612
56613
56614
56615
56616
56617
56618
56619
56620
56621
56622
56623
56624
56625
56626
56627
56628
56629
56630
56631
56632
56633
56634
56635
56636
56637
56638
56639
56640
56641
56642
56643
56644
56645
56646
56647
56648
56649
56650
56651
56652
56653
56654
56655
56656
56657
56658
56659
56660
56661
56662
56663
56664
56665
56666
56667
56668
56669
56670
56671
56672
56673
56674
56675
56676
56677
56678
56679
56680
56681
56682
56683
56684
56685
56686
56687
56688
56689
56690
56691
56692
56693
56694
56695
56696
56697
56698
56699
56700
56701
56702
56703
56704
56705
56706
56707
56708
56709
56710
56711
56712
56713
56714
56715
56716
56717
56718
56719
56720
56721
56722
56723
56724
56725
56726
56727
56728
56729
56730
56731
56732
56733
56734
56735
56736
56737
56738
56739
56740
56741
56742
56743
56744
56745
56746
56747
56748
56749
56750
56751
56752
56753
56754
56755
56756
56757
56758
56759
56760
56761
56762
56763
56764
56765
56766
56767
56768
56769
56770
56771
56772
56773
56774
56775
56776
56777
56778
56779
56780
56781
56782
56783
56784
56785
56786
56787
56788
56789
56790
56791
56792
56793
56794
56795
56796
56797
56798
56799
56800
56801
56802
56803
56804
56805
56806
56807
56808
56809
56810
56811
56812
56813
56814
56815
56816
56817
56818
56819
56820
56821
56822
56823
56824
56825
56826
56827
56828
56829
56830
56831
56832
56833
56834
56835
56836
56837
56838
56839
56840
56841
56842
56843
56844
56845
56846
56847
56848
56849
56850
56851
56852
56853
56854
56855
56856
56857
56858
56859
56860
56861
56862
56863
56864
56865
56866
56867
56868
56869
56870
56871
56872
56873
56874
56875
56876
56877
56878
56879
56880
56881
56882
56883
56884
56885
56886
56887
56888
56889
56890
56891
56892
56893
56894
56895
56896
56897
56898
56899
56900
56901
56902
56903
56904
56905
56906
56907
56908
56909
56910
56911
56912
56913
56914
56915
56916
56917
56918
56919
56920
56921
56922
56923
56924
56925
56926
56927
56928
56929
56930
56931
56932
56933
56934
56935
56936
56937
56938
56939
56940
56941
56942
56943
56944
56945
56946
56947
56948
56949
56950
56951
56952
56953
56954
56955
56956
56957
56958
56959
56960
56961
56962
56963
56964
56965
56966
56967
56968
56969
56970
56971
56972
56973
56974
56975
56976
56977
56978
56979
56980
56981
56982
56983
56984
56985
56986
56987
56988
56989
56990
56991
56992
56993
56994
56995
56996
56997
56998
56999
57000
57001
57002
57003
57004
57005
57006
57007
57008
57009
57010
57011
57012
57013
57014
57015
57016
57017
57018
57019
57020
57021
57022
57023
57024
57025
57026
57027
57028
57029
57030
57031
57032
57033
57034
57035
57036
57037
57038
57039
57040
57041
57042
57043
57044
57045
57046
57047
57048
57049
57050
57051
57052
57053
57054
57055
57056
57057
57058
57059
57060
57061
57062
57063
57064
57065
57066
57067
57068
57069
57070
57071
57072
57073
57074
57075
57076
57077
57078
57079
57080
57081
57082
57083
57084
57085
57086
57087
57088
57089
57090
57091
57092
57093
57094
57095
57096
57097
57098
57099
57100
57101
57102
57103
57104
57105
57106
57107
57108
57109
57110
57111
57112
57113
57114
57115
57116
57117
57118
57119
57120
57121
57122
57123
57124
57125
57126
57127
57128
57129
57130
57131
57132
57133
57134
57135
57136
57137
57138
57139
57140
57141
57142
57143
57144
57145
57146
57147
57148
57149
57150
57151
57152
57153
57154
57155
57156
57157
57158
57159
57160
57161
57162
57163
57164
57165
57166
57167
57168
57169
57170
57171
57172
57173
57174
57175
57176
57177
57178
57179
57180
57181
57182
57183
57184
57185
57186
57187
57188
57189
57190
57191
57192
57193
57194
57195
57196
57197
57198
57199
57200
57201
57202
57203
57204
57205
57206
57207
57208
57209
57210
57211
57212
57213
57214
57215
57216
57217
57218
57219
57220
57221
57222
57223
57224
57225
57226
57227
57228
57229
57230
57231
57232
57233
57234
57235
57236
57237
57238
57239
57240
57241
57242
57243
57244
57245
57246
57247
57248
57249
57250
57251
57252
57253
57254
57255
57256
57257
57258
57259
57260
57261
57262
57263
57264
57265
57266
57267
57268
57269
57270
57271
57272
57273
57274
57275
57276
57277
57278
57279
57280
57281
57282
57283
57284
57285
57286
57287
57288
57289
57290
57291
57292
57293
57294
57295
57296
57297
57298
57299
57300
57301
57302
57303
57304
57305
57306
57307
57308
57309
57310
57311
57312
57313
57314
57315
57316
57317
57318
57319
57320
57321
57322
57323
57324
57325
57326
57327
57328
57329
57330
57331
57332
57333
57334
57335
57336
57337
57338
57339
57340
57341
57342
57343
57344
57345
57346
57347
57348
57349
57350
57351
57352
57353
57354
57355
57356
57357
57358
57359
57360
57361
57362
57363
57364
57365
57366
57367
57368
57369
57370
57371
57372
57373
57374
57375
57376
57377
57378
57379
57380
57381
57382
57383
57384
57385
57386
57387
57388
57389
57390
57391
57392
57393
57394
57395
57396
57397
57398
57399
57400
57401
57402
57403
57404
57405
57406
57407
57408
57409
57410
57411
57412
57413
57414
57415
57416
57417
57418
57419
57420
57421
57422
57423
57424
57425
57426
57427
57428
57429
57430
57431
57432
57433
57434
57435
57436
57437
57438
57439
57440
57441
57442
57443
57444
57445
57446
57447
57448
57449
57450
57451
57452
57453
57454
57455
57456
57457
57458
57459
57460
57461
57462
57463
57464
57465
57466
57467
57468
57469
57470
57471
57472
57473
57474
57475
57476
57477
57478
57479
57480
57481
57482
57483
57484
57485
57486
57487
57488
57489
57490
57491
57492
57493
57494
57495
57496
57497
57498
57499
57500
57501
57502
57503
57504
57505
57506
57507
57508
57509
57510
57511
57512
57513
57514
57515
57516
57517
57518
57519
57520
57521
57522
57523
57524
57525
57526
57527
57528
57529
57530
57531
57532
57533
57534
57535
57536
57537
57538
57539
57540
57541
57542
57543
57544
57545
57546
57547
57548
57549
57550
57551
57552
57553
57554
57555
57556
57557
57558
57559
57560
57561
57562
57563
57564
57565
57566
57567
57568
57569
57570
57571
57572
57573
57574
57575
57576
57577
57578
57579
57580
57581
57582
57583
57584
57585
57586
57587
57588
57589
57590
57591
57592
57593
57594
57595
57596
57597
57598
57599
57600
57601
57602
57603
57604
57605
57606
57607
57608
57609
57610
57611
57612
57613
57614
57615
57616
57617
57618
57619
57620
57621
57622
57623
57624
57625
57626
57627
57628
57629
57630
57631
57632
57633
57634
57635
57636
57637
57638
57639
57640
57641
57642
57643
57644
57645
57646
57647
57648
57649
57650
57651
57652
57653
57654
57655
57656
57657
57658
57659
57660
57661
57662
57663
57664
57665
57666
57667
57668
57669
57670
57671
57672
57673
57674
57675
57676
57677
57678
57679
57680
57681
57682
57683
57684
57685
57686
57687
57688
57689
57690
57691
57692
57693
57694
57695
57696
57697
57698
57699
57700
57701
57702
57703
57704
57705
57706
57707
57708
57709
57710
57711
57712
57713
57714
57715
57716
57717
57718
57719
57720
57721
57722
57723
57724
57725
57726
57727
57728
57729
57730
57731
57732
57733
57734
57735
57736
57737
57738
57739
57740
57741
57742
57743
57744
57745
57746
57747
57748
57749
57750
57751
57752
57753
57754
57755
57756
57757
57758
57759
57760
57761
57762
57763
57764
57765
57766
57767
57768
57769
57770
57771
57772
57773
57774
57775
57776
57777
57778
57779
57780
57781
57782
57783
57784
57785
57786
57787
57788
57789
57790
57791
57792
57793
57794
57795
57796
57797
57798
57799
57800
57801
57802
57803
57804
57805
57806
57807
57808
57809
57810
57811
57812
57813
57814
57815
57816
57817
57818
57819
57820
57821
57822
57823
57824
57825
57826
57827
57828
57829
57830
57831
57832
57833
57834
57835
57836
57837
57838
57839
57840
57841
57842
57843
57844
57845
57846
57847
57848
57849
57850
57851
57852
57853
57854
57855
57856
57857
57858
57859
57860
57861
57862
57863
57864
57865
57866
57867
57868
57869
57870
57871
57872
57873
57874
57875
57876
57877
57878
57879
57880
57881
57882
57883
57884
57885
57886
57887
57888
57889
57890
57891
57892
57893
57894
57895
57896
57897
57898
57899
57900
57901
57902
57903
57904
57905
57906
57907
57908
57909
57910
57911
57912
57913
57914
57915
57916
57917
57918
57919
57920
57921
57922
57923
57924
57925
57926
57927
57928
57929
57930
57931
57932
57933
57934
57935
57936
57937
57938
57939
57940
57941
57942
57943
57944
57945
57946
57947
57948
57949
57950
57951
57952
57953
57954
57955
57956
57957
57958
57959
57960
57961
57962
57963
57964
57965
57966
57967
57968
57969
57970
57971
57972
57973
57974
57975
57976
57977
57978
57979
57980
57981
57982
57983
57984
57985
57986
57987
57988
57989
57990
57991
57992
57993
57994
57995
57996
57997
57998
57999
58000
58001
58002
58003
58004
58005
58006
58007
58008
58009
58010
58011
58012
58013
58014
58015
58016
58017
58018
58019
58020
58021
58022
58023
58024
58025
58026
58027
58028
58029
58030
58031
58032
58033
58034
58035
58036
58037
58038
58039
58040
58041
58042
58043
58044
58045
58046
58047
58048
58049
58050
58051
58052
58053
58054
58055
58056
58057
58058
58059
58060
58061
58062
58063
58064
58065
58066
58067
58068
58069
58070
58071
58072
58073
58074
58075
58076
58077
58078
58079
58080
58081
58082
58083
58084
58085
58086
58087
58088
58089
58090
58091
58092
58093
58094
58095
58096
58097
58098
58099
58100
58101
58102
58103
58104
58105
58106
58107
58108
58109
58110
58111
58112
58113
58114
58115
58116
58117
58118
58119
58120
58121
58122
58123
58124
58125
58126
58127
58128
58129
58130
58131
58132
58133
58134
58135
58136
58137
58138
58139
58140
58141
58142
58143
58144
58145
58146
58147
58148
58149
58150
58151
58152
58153
58154
58155
58156
58157
58158
58159
58160
58161
58162
58163
58164
58165
58166
58167
58168
58169
58170
58171
58172
58173
58174
58175
58176
58177
58178
58179
58180
58181
58182
58183
58184
58185
58186
58187
58188
58189
58190
58191
58192
58193
58194
58195
58196
58197
58198
58199
58200
58201
58202
58203
58204
58205
58206
58207
58208
58209
58210
58211
58212
58213
58214
58215
58216
58217
58218
58219
58220
58221
58222
58223
58224
58225
58226
58227
58228
58229
58230
58231
58232
58233
58234
58235
58236
58237
58238
58239
58240
58241
58242
58243
58244
58245
58246
58247
58248
58249
58250
58251
58252
58253
58254
58255
58256
58257
58258
58259
58260
58261
58262
58263
58264
58265
58266
58267
58268
58269
58270
58271
58272
58273
58274
58275
58276
58277
58278
58279
58280
58281
58282
58283
58284
58285
58286
58287
58288
58289
58290
58291
58292
58293
58294
58295
58296
58297
58298
58299
58300
58301
58302
58303
58304
58305
58306
58307
58308
58309
58310
58311
58312
58313
58314
58315
58316
58317
58318
58319
58320
58321
58322
58323
58324
58325
58326
58327
58328
58329
58330
58331
58332
58333
58334
58335
58336
58337
58338
58339
58340
58341
58342
58343
58344
58345
58346
58347
58348
58349
58350
58351
58352
58353
58354
58355
58356
58357
58358
58359
58360
58361
58362
58363
58364
58365
58366
58367
58368
58369
58370
58371
58372
58373
58374
58375
58376
58377
58378
58379
58380
58381
58382
58383
58384
58385
58386
58387
58388
58389
58390
58391
58392
58393
58394
58395
58396
58397
58398
58399
58400
58401
58402
58403
58404
58405
58406
58407
58408
58409
58410
58411
58412
58413
58414
58415
58416
58417
58418
58419
58420
58421
58422
58423
58424
58425
58426
58427
58428
58429
58430
58431
58432
58433
58434
58435
58436
58437
58438
58439
58440
58441
58442
58443
58444
58445
58446
58447
58448
58449
58450
58451
58452
58453
58454
58455
58456
58457
58458
58459
58460
58461
58462
58463
58464
58465
58466
58467
58468
58469
58470
58471
58472
58473
58474
58475
58476
58477
58478
58479
58480
58481
58482
58483
58484
58485
58486
58487
58488
58489
58490
58491
58492
58493
58494
58495
58496
58497
58498
58499
58500
58501
58502
58503
58504
58505
58506
58507
58508
58509
58510
58511
58512
58513
58514
58515
58516
58517
58518
58519
58520
58521
58522
58523
58524
58525
58526
58527
58528
58529
58530
58531
58532
58533
58534
58535
58536
58537
58538
58539
58540
58541
58542
58543
58544
58545
58546
58547
58548
58549
58550
58551
58552
58553
58554
58555
58556
58557
58558
58559
58560
58561
58562
58563
58564
58565
58566
58567
58568
58569
58570
58571
58572
58573
58574
58575
58576
58577
58578
58579
58580
58581
58582
58583
58584
58585
58586
58587
58588
58589
58590
58591
58592
58593
58594
58595
58596
58597
58598
58599
58600
58601
58602
58603
58604
58605
58606
58607
58608
58609
58610
58611
58612
58613
58614
58615
58616
58617
58618
58619
58620
58621
58622
58623
58624
58625
58626
58627
58628
58629
58630
58631
58632
58633
58634
58635
58636
58637
58638
58639
58640
58641
58642
58643
58644
58645
58646
58647
58648
58649
58650
58651
58652
58653
58654
58655
58656
58657
58658
58659
58660
58661
58662
58663
58664
58665
58666
58667
58668
58669
58670
58671
58672
58673
58674
58675
58676
58677
58678
58679
58680
58681
58682
58683
58684
58685
58686
58687
58688
58689
58690
58691
58692
58693
58694
58695
58696
58697
58698
58699
58700
58701
58702
58703
58704
58705
58706
58707
58708
58709
58710
58711
58712
58713
58714
58715
58716
58717
58718
58719
58720
58721
58722
58723
58724
58725
58726
58727
58728
58729
58730
58731
58732
58733
58734
58735
58736
58737
58738
58739
58740
58741
58742
58743
58744
58745
58746
58747
58748
58749
58750
58751
58752
58753
58754
58755
58756
58757
58758
58759
58760
58761
58762
58763
58764
58765
58766
58767
58768
58769
58770
58771
58772
58773
58774
58775
58776
58777
58778
58779
58780
58781
58782
58783
58784
58785
58786
58787
58788
58789
58790
58791
58792
58793
58794
58795
58796
58797
58798
58799
58800
58801
58802
58803
58804
58805
58806
58807
58808
58809
58810
58811
58812
58813
58814
58815
58816
58817
58818
58819
58820
58821
58822
58823
58824
58825
58826
58827
58828
58829
58830
58831
58832
58833
58834
58835
58836
58837
58838
58839
58840
58841
58842
58843
58844
58845
58846
58847
58848
58849
58850
58851
58852
58853
58854
58855
58856
58857
58858
58859
58860
58861
58862
58863
58864
58865
58866
58867
58868
58869
58870
58871
58872
58873
58874
58875
58876
58877
58878
58879
58880
58881
58882
58883
58884
58885
58886
58887
58888
58889
58890
58891
58892
58893
58894
58895
58896
58897
58898
58899
58900
58901
58902
58903
58904
58905
58906
58907
58908
58909
58910
58911
58912
58913
58914
58915
58916
58917
58918
58919
58920
58921
58922
58923
58924
58925
58926
58927
58928
58929
58930
58931
58932
58933
58934
58935
58936
58937
58938
58939
58940
58941
58942
58943
58944
58945
58946
58947
58948
58949
58950
58951
58952
58953
58954
58955
58956
58957
58958
58959
58960
58961
58962
58963
58964
58965
58966
58967
58968
58969
58970
58971
58972
58973
58974
58975
58976
58977
58978
58979
58980
58981
58982
58983
58984
58985
58986
58987
58988
58989
58990
58991
58992
58993
58994
58995
58996
58997
58998
58999
59000
59001
59002
59003
59004
59005
59006
59007
59008
59009
59010
59011
59012
59013
59014
59015
59016
59017
59018
59019
59020
59021
59022
59023
59024
59025
59026
59027
59028
59029
59030
59031
59032
59033
59034
59035
59036
59037
59038
59039
59040
59041
59042
59043
59044
59045
59046
59047
59048
59049
59050
59051
59052
59053
59054
59055
59056
59057
59058
59059
59060
59061
59062
59063
59064
59065
59066
59067
59068
59069
59070
59071
59072
59073
59074
59075
59076
59077
59078
59079
59080
59081
59082
59083
59084
59085
59086
59087
59088
59089
59090
59091
59092
59093
59094
59095
59096
59097
59098
59099
59100
59101
59102
59103
59104
59105
59106
59107
59108
59109
59110
59111
59112
59113
59114
59115
59116
59117
59118
59119
59120
59121
59122
59123
59124
59125
59126
59127
59128
59129
59130
59131
59132
59133
59134
59135
59136
59137
59138
59139
59140
59141
59142
59143
59144
59145
59146
59147
59148
59149
59150
59151
59152
59153
59154
59155
59156
59157
59158
59159
59160
59161
59162
59163
59164
59165
59166
59167
59168
59169
59170
59171
59172
59173
59174
59175
59176
59177
59178
59179
59180
59181
59182
59183
59184
59185
59186
59187
59188
59189
59190
59191
59192
59193
59194
59195
59196
59197
59198
59199
59200
59201
59202
59203
59204
59205
59206
59207
59208
59209
59210
59211
59212
59213
59214
59215
59216
59217
59218
59219
59220
59221
59222
59223
59224
59225
59226
59227
59228
59229
59230
59231
59232
59233
59234
59235
59236
59237
59238
59239
59240
59241
59242
59243
59244
59245
59246
59247
59248
59249
59250
59251
59252
59253
59254
59255
59256
59257
59258
59259
59260
59261
59262
59263
59264
59265
59266
59267
59268
59269
59270
59271
59272
59273
59274
59275
59276
59277
59278
59279
59280
59281
59282
59283
59284
59285
59286
59287
59288
59289
59290
59291
59292
59293
59294
59295
59296
59297
59298
59299
59300
59301
59302
59303
59304
59305
59306
59307
59308
59309
59310
59311
59312
59313
59314
59315
59316
59317
59318
59319
59320
59321
59322
59323
59324
59325
59326
59327
59328
59329
59330
59331
59332
59333
59334
59335
59336
59337
59338
59339
59340
59341
59342
59343
59344
59345
59346
59347
59348
59349
59350
59351
59352
59353
59354
59355
59356
59357
59358
59359
59360
59361
59362
59363
59364
59365
59366
59367
59368
59369
59370
59371
59372
59373
59374
59375
59376
59377
59378
59379
59380
59381
59382
59383
59384
59385
59386
59387
59388
59389
59390
59391
59392
59393
59394
59395
59396
59397
59398
59399
59400
59401
59402
59403
59404
59405
59406
59407
59408
59409
59410
59411
59412
59413
59414
59415
59416
59417
59418
59419
59420
59421
59422
59423
59424
59425
59426
59427
59428
59429
59430
59431
59432
59433
59434
59435
59436
59437
59438
59439
59440
59441
59442
59443
59444
59445
59446
59447
59448
59449
59450
59451
59452
59453
59454
59455
59456
59457
59458
59459
59460
59461
59462
59463
59464
59465
59466
59467
59468
59469
59470
59471
59472
59473
59474
59475
59476
59477
59478
59479
59480
59481
59482
59483
59484
59485
59486
59487
59488
59489
59490
59491
59492
59493
59494
59495
59496
59497
59498
59499
59500
59501
59502
59503
59504
59505
59506
59507
59508
59509
59510
59511
59512
59513
59514
59515
59516
59517
59518
59519
59520
59521
59522
59523
59524
59525
59526
59527
59528
59529
59530
59531
59532
59533
59534
59535
59536
59537
59538
59539
59540
59541
59542
59543
59544
59545
59546
59547
59548
59549
59550
59551
59552
59553
59554
59555
59556
59557
59558
59559
59560
59561
59562
59563
59564
59565
59566
59567
59568
59569
59570
59571
59572
59573
59574
59575
59576
59577
59578
59579
59580
59581
59582
59583
59584
59585
59586
59587
59588
59589
59590
59591
59592
59593
59594
59595
59596
59597
59598
59599
59600
59601
59602
59603
59604
59605
59606
59607
59608
59609
59610
59611
59612
59613
59614
59615
59616
59617
59618
59619
59620
59621
59622
59623
59624
59625
59626
59627
59628
59629
59630
59631
59632
59633
59634
59635
59636
59637
59638
59639
59640
59641
59642
59643
59644
59645
59646
59647
59648
59649
59650
59651
59652
59653
59654
59655
59656
59657
59658
59659
59660
59661
59662
59663
59664
59665
59666
59667
59668
59669
59670
59671
59672
59673
59674
59675
59676
59677
59678
59679
59680
59681
59682
59683
59684
59685
59686
59687
59688
59689
59690
59691
59692
59693
59694
59695
59696
59697
59698
59699
59700
59701
59702
59703
59704
59705
59706
59707
59708
59709
59710
59711
59712
59713
59714
59715
59716
59717
59718
59719
59720
59721
59722
59723
59724
59725
59726
59727
59728
59729
59730
59731
59732
59733
59734
59735
59736
59737
59738
59739
59740
59741
59742
59743
59744
59745
59746
59747
59748
59749
59750
59751
59752
59753
59754
59755
59756
59757
59758
59759
59760
59761
59762
59763
59764
59765
59766
59767
59768
59769
59770
59771
59772
59773
59774
59775
59776
59777
59778
59779
59780
59781
59782
59783
59784
59785
59786
59787
59788
59789
59790
59791
59792
59793
59794
59795
59796
59797
59798
59799
59800
59801
59802
59803
59804
59805
59806
59807
59808
59809
59810
59811
59812
59813
59814
59815
59816
59817
59818
59819
59820
59821
59822
59823
59824
59825
59826
59827
59828
59829
59830
59831
59832
59833
59834
59835
59836
59837
59838
59839
59840
59841
59842
59843
59844
59845
59846
59847
59848
59849
59850
59851
59852
59853
59854
59855
59856
59857
59858
59859
59860
59861
59862
59863
59864
59865
59866
59867
59868
59869
59870
59871
59872
59873
59874
59875
59876
59877
59878
59879
59880
59881
59882
59883
59884
59885
59886
59887
59888
59889
59890
59891
59892
59893
59894
59895
59896
59897
59898
59899
59900
59901
59902
59903
59904
59905
59906
59907
59908
59909
59910
59911
59912
59913
59914
59915
59916
59917
59918
59919
59920
59921
59922
59923
59924
59925
59926
59927
59928
59929
59930
59931
59932
59933
59934
59935
59936
59937
59938
59939
59940
59941
59942
59943
59944
59945
59946
59947
59948
59949
59950
59951
59952
59953
59954
59955
59956
59957
59958
59959
59960
59961
59962
59963
59964
59965
59966
59967
59968
59969
59970
59971
59972
59973
59974
59975
59976
59977
59978
59979
59980
59981
59982
59983
59984
59985
59986
59987
59988
59989
59990
59991
59992
59993
59994
59995
59996
59997
59998
59999
60000
60001
60002
60003
60004
60005
60006
60007
60008
60009
60010
60011
60012
60013
60014
60015
60016
60017
60018
60019
60020
60021
60022
60023
60024
60025
60026
60027
60028
60029
60030
60031
60032
60033
60034
60035
60036
60037
60038
60039
60040
60041
60042
60043
60044
60045
60046
60047
60048
60049
60050
60051
60052
60053
60054
60055
60056
60057
60058
60059
60060
60061
60062
60063
60064
60065
60066
60067
60068
60069
60070
60071
60072
60073
60074
60075
60076
60077
60078
60079
60080
60081
60082
60083
60084
60085
60086
60087
60088
60089
60090
60091
60092
60093
60094
60095
60096
60097
60098
60099
60100
60101
60102
60103
60104
60105
60106
60107
60108
60109
60110
60111
60112
60113
60114
60115
60116
60117
60118
60119
60120
60121
60122
60123
60124
60125
60126
60127
60128
60129
60130
60131
60132
60133
60134
60135
60136
60137
60138
60139
60140
60141
60142
60143
60144
60145
60146
60147
60148
60149
60150
60151
60152
60153
60154
60155
60156
60157
60158
60159
60160
60161
60162
60163
60164
60165
60166
60167
60168
60169
60170
60171
60172
60173
60174
60175
60176
60177
60178
60179
60180
60181
60182
60183
60184
60185
60186
60187
60188
60189
60190
60191
60192
60193
60194
60195
60196
60197
60198
60199
60200
60201
60202
60203
60204
60205
60206
60207
60208
60209
60210
60211
60212
60213
60214
60215
60216
60217
60218
60219
60220
60221
60222
60223
60224
60225
60226
60227
60228
60229
60230
60231
60232
60233
60234
60235
60236
60237
60238
60239
60240
60241
60242
60243
60244
60245
60246
60247
60248
60249
60250
60251
60252
60253
60254
60255
60256
60257
60258
60259
60260
60261
60262
60263
60264
60265
60266
60267
60268
60269
60270
60271
60272
60273
60274
60275
60276
60277
60278
60279
60280
60281
60282
60283
60284
60285
60286
60287
60288
60289
60290
60291
60292
60293
60294
60295
60296
60297
60298
60299
60300
60301
60302
60303
60304
60305
60306
60307
60308
60309
60310
60311
60312
60313
60314
60315
60316
60317
60318
60319
60320
60321
60322
60323
60324
60325
60326
60327
60328
60329
60330
60331
60332
60333
60334
60335
60336
60337
60338
60339
60340
60341
60342
60343
60344
60345
60346
60347
60348
60349
60350
60351
60352
60353
60354
60355
60356
60357
60358
60359
60360
60361
60362
60363
60364
60365
60366
60367
60368
60369
60370
60371
60372
60373
60374
60375
60376
60377
60378
60379
60380
60381
60382
60383
60384
60385
60386
60387
60388
60389
60390
60391
60392
60393
60394
60395
60396
60397
60398
60399
60400
60401
60402
60403
60404
60405
60406
60407
60408
60409
60410
60411
60412
60413
60414
60415
60416
60417
60418
60419
60420
60421
60422
60423
60424
60425
60426
60427
60428
60429
60430
60431
60432
60433
60434
60435
60436
60437
60438
60439
60440
60441
60442
60443
60444
60445
60446
60447
60448
60449
60450
60451
60452
60453
60454
60455
60456
60457
60458
60459
60460
60461
60462
60463
60464
60465
60466
60467
60468
60469
60470
60471
60472
60473
60474
60475
60476
60477
60478
60479
60480
60481
60482
60483
60484
60485
60486
60487
60488
60489
60490
60491
60492
60493
60494
60495
60496
60497
60498
60499
60500
60501
60502
60503
60504
60505
60506
60507
60508
60509
60510
60511
60512
60513
60514
60515
60516
60517
60518
60519
60520
60521
60522
60523
60524
60525
60526
60527
60528
60529
60530
60531
60532
60533
60534
60535
60536
60537
60538
60539
60540
60541
60542
60543
60544
60545
60546
60547
60548
60549
60550
60551
60552
60553
60554
60555
60556
60557
60558
60559
60560
60561
60562
60563
60564
60565
60566
60567
60568
60569
60570
60571
60572
60573
60574
60575
60576
60577
60578
60579
60580
60581
60582
60583
60584
60585
60586
60587
60588
60589
60590
60591
60592
60593
60594
60595
60596
60597
60598
60599
60600
60601
60602
60603
60604
60605
60606
60607
60608
60609
60610
60611
60612
60613
60614
60615
60616
60617
60618
60619
60620
60621
60622
60623
60624
60625
60626
60627
60628
60629
60630
60631
60632
60633
60634
60635
60636
60637
60638
60639
60640
60641
60642
60643
60644
60645
60646
60647
60648
60649
60650
60651
60652
60653
60654
60655
60656
60657
60658
60659
60660
60661
60662
60663
60664
60665
60666
60667
60668
60669
60670
60671
60672
60673
60674
60675
60676
60677
60678
60679
60680
60681
60682
60683
60684
60685
60686
60687
60688
60689
60690
60691
60692
60693
60694
60695
60696
60697
60698
60699
60700
60701
60702
60703
60704
60705
60706
60707
60708
60709
60710
60711
60712
60713
60714
60715
60716
60717
60718
60719
60720
60721
60722
60723
60724
60725
60726
60727
60728
60729
60730
60731
60732
60733
60734
60735
60736
60737
60738
60739
60740
60741
60742
60743
60744
60745
60746
60747
60748
60749
60750
60751
60752
60753
60754
60755
60756
60757
60758
60759
60760
60761
60762
60763
60764
60765
60766
60767
60768
60769
60770
60771
60772
60773
60774
60775
60776
60777
60778
60779
60780
60781
60782
60783
60784
60785
60786
60787
60788
60789
60790
60791
60792
60793
60794
60795
60796
60797
60798
60799
60800
60801
60802
60803
60804
60805
60806
60807
60808
60809
60810
60811
60812
60813
60814
60815
60816
60817
60818
60819
60820
60821
60822
60823
60824
60825
60826
60827
60828
60829
60830
60831
60832
60833
60834
60835
60836
60837
60838
60839
60840
60841
60842
60843
60844
60845
60846
60847
60848
60849
60850
60851
60852
60853
60854
60855
60856
60857
60858
60859
60860
60861
60862
60863
60864
60865
60866
60867
60868
60869
60870
60871
60872
60873
60874
60875
60876
60877
60878
60879
60880
60881
60882
60883
60884
60885
60886
60887
60888
60889
60890
60891
60892
60893
60894
60895
60896
60897
60898
60899
60900
60901
60902
60903
60904
60905
60906
60907
60908
60909
60910
60911
60912
60913
60914
60915
60916
60917
60918
60919
60920
60921
60922
60923
60924
60925
60926
60927
60928
60929
60930
60931
60932
60933
60934
60935
60936
60937
60938
60939
60940
60941
60942
60943
60944
60945
60946
60947
60948
60949
60950
60951
60952
60953
60954
60955
60956
60957
60958
60959
60960
60961
60962
60963
60964
60965
60966
60967
60968
60969
60970
60971
60972
60973
60974
60975
60976
60977
60978
60979
60980
60981
60982
60983
60984
60985
60986
60987
60988
60989
60990
60991
60992
60993
60994
60995
60996
60997
60998
60999
61000
61001
61002
61003
61004
61005
61006
61007
61008
61009
61010
61011
61012
61013
61014
61015
61016
61017
61018
61019
61020
61021
61022
61023
61024
61025
61026
61027
61028
61029
61030
61031
61032
61033
61034
61035
61036
61037
61038
61039
61040
61041
61042
61043
61044
61045
61046
61047
61048
61049
61050
61051
61052
61053
61054
61055
61056
61057
61058
61059
61060
61061
61062
61063
61064
61065
61066
61067
61068
61069
61070
61071
61072
61073
61074
61075
61076
61077
61078
61079
61080
61081
61082
61083
61084
61085
61086
61087
61088
61089
61090
61091
61092
61093
61094
61095
61096
61097
61098
61099
61100
61101
61102
61103
61104
61105
61106
61107
61108
61109
61110
61111
61112
61113
61114
61115
61116
61117
61118
61119
61120
61121
61122
61123
61124
61125
61126
61127
61128
61129
61130
61131
61132
61133
61134
61135
61136
61137
61138
61139
61140
61141
61142
61143
61144
61145
61146
61147
61148
61149
61150
61151
61152
61153
61154
61155
61156
61157
61158
61159
61160
61161
61162
61163
61164
61165
61166
61167
61168
61169
61170
61171
61172
61173
61174
61175
61176
61177
61178
61179
61180
61181
61182
61183
61184
61185
61186
61187
61188
61189
61190
61191
61192
61193
61194
61195
61196
61197
61198
61199
61200
61201
61202
61203
61204
61205
61206
61207
61208
61209
61210
61211
61212
61213
61214
61215
61216
61217
61218
61219
61220
61221
61222
61223
61224
61225
61226
61227
61228
61229
61230
61231
61232
61233
61234
61235
61236
61237
61238
61239
61240
61241
61242
61243
61244
61245
61246
61247
61248
61249
61250
61251
61252
61253
61254
61255
61256
61257
61258
61259
61260
61261
61262
61263
61264
61265
61266
61267
61268
61269
61270
61271
61272
61273
61274
61275
61276
61277
61278
61279
61280
61281
61282
61283
61284
61285
61286
61287
61288
61289
61290
61291
61292
61293
61294
61295
61296
61297
61298
61299
61300
61301
61302
61303
61304
61305
61306
61307
61308
61309
61310
61311
61312
61313
61314
61315
61316
61317
61318
61319
61320
61321
61322
61323
61324
61325
61326
61327
61328
61329
61330
61331
61332
61333
61334
61335
61336
61337
61338
61339
61340
61341
61342
61343
61344
61345
61346
61347
61348
61349
61350
61351
61352
61353
61354
61355
61356
61357
61358
61359
61360
61361
61362
61363
61364
61365
61366
61367
61368
61369
61370
61371
61372
61373
61374
61375
61376
61377
61378
61379
61380
61381
61382
61383
61384
61385
61386
61387
61388
61389
61390
61391
61392
61393
61394
61395
61396
61397
61398
61399
61400
61401
61402
61403
61404
61405
61406
61407
61408
61409
61410
61411
61412
61413
61414
61415
61416
61417
61418
61419
61420
61421
61422
61423
61424
61425
61426
61427
61428
61429
61430
61431
61432
61433
61434
61435
61436
61437
61438
61439
61440
61441
61442
61443
61444
61445
61446
61447
61448
61449
61450
61451
61452
61453
61454
61455
61456
61457
61458
61459
61460
61461
61462
61463
61464
61465
61466
61467
61468
61469
61470
61471
61472
61473
61474
61475
61476
61477
61478
61479
61480
61481
61482
61483
61484
61485
61486
61487
61488
61489
61490
61491
61492
61493
61494
61495
61496
61497
61498
61499
61500
61501
61502
61503
61504
61505
61506
61507
61508
61509
61510
61511
61512
61513
61514
61515
61516
61517
61518
61519
61520
61521
61522
61523
61524
61525
61526
61527
61528
61529
61530
61531
61532
61533
61534
61535
61536
61537
61538
61539
61540
61541
61542
61543
61544
61545
61546
61547
61548
61549
61550
61551
61552
61553
61554
61555
61556
61557
61558
61559
61560
61561
61562
61563
61564
61565
61566
61567
61568
61569
61570
61571
61572
61573
61574
61575
61576
61577
61578
61579
61580
61581
61582
61583
61584
61585
61586
61587
61588
61589
61590
61591
61592
61593
61594
61595
61596
61597
61598
61599
61600
61601
61602
61603
61604
61605
61606
61607
61608
61609
61610
61611
61612
61613
61614
61615
61616
61617
61618
61619
61620
61621
61622
61623
61624
61625
61626
61627
61628
61629
61630
61631
61632
61633
61634
61635
61636
61637
61638
61639
61640
61641
61642
61643
61644
61645
61646
61647
61648
61649
61650
61651
61652
61653
61654
61655
61656
61657
61658
61659
61660
61661
61662
61663
61664
61665
61666
61667
61668
61669
61670
61671
61672
61673
61674
61675
61676
61677
61678
61679
61680
61681
61682
61683
61684
61685
61686
61687
61688
61689
61690
61691
61692
61693
61694
61695
61696
61697
61698
61699
61700
61701
61702
61703
61704
61705
61706
61707
61708
61709
61710
61711
61712
61713
61714
61715
61716
61717
61718
61719
61720
61721
61722
61723
61724
61725
61726
61727
61728
61729
61730
61731
61732
61733
61734
61735
61736
61737
61738
61739
61740
61741
61742
61743
61744
61745
61746
61747
61748
61749
61750
61751
61752
61753
61754
61755
61756
61757
61758
61759
61760
61761
61762
61763
61764
61765
61766
61767
61768
61769
61770
61771
61772
61773
61774
61775
61776
61777
61778
61779
61780
61781
61782
61783
61784
61785
61786
61787
61788
61789
61790
61791
61792
61793
61794
61795
61796
61797
61798
61799
61800
61801
61802
61803
61804
61805
61806
61807
61808
61809
61810
61811
61812
61813
61814
61815
61816
61817
61818
61819
61820
61821
61822
61823
61824
61825
61826
61827
61828
61829
61830
61831
61832
61833
61834
61835
61836
61837
61838
61839
61840
61841
61842
61843
61844
61845
61846
61847
61848
61849
61850
61851
61852
61853
61854
61855
61856
61857
61858
61859
61860
61861
61862
61863
61864
61865
61866
61867
61868
61869
61870
61871
61872
61873
61874
61875
61876
61877
61878
61879
61880
61881
61882
61883
61884
61885
61886
61887
61888
61889
61890
61891
61892
61893
61894
61895
61896
61897
61898
61899
61900
61901
61902
61903
61904
61905
61906
61907
61908
61909
61910
61911
61912
61913
61914
61915
61916
61917
61918
61919
61920
61921
61922
61923
61924
61925
61926
61927
61928
61929
61930
61931
61932
61933
61934
61935
61936
61937
61938
61939
61940
61941
61942
61943
61944
61945
61946
61947
61948
61949
61950
61951
61952
61953
61954
61955
61956
61957
61958
61959
61960
61961
61962
61963
61964
61965
61966
61967
61968
61969
61970
61971
61972
61973
61974
61975
61976
61977
61978
61979
61980
61981
61982
61983
61984
61985
61986
61987
61988
61989
61990
61991
61992
61993
61994
61995
61996
61997
61998
61999
62000
62001
62002
62003
62004
62005
62006
62007
62008
62009
62010
62011
62012
62013
62014
62015
62016
62017
62018
62019
62020
62021
62022
62023
62024
62025
62026
62027
62028
62029
62030
62031
62032
62033
62034
62035
62036
62037
62038
62039
62040
62041
62042
62043
62044
62045
62046
62047
62048
62049
62050
62051
62052
62053
62054
62055
62056
62057
62058
62059
62060
62061
62062
62063
62064
62065
62066
62067
62068
62069
62070
62071
62072
62073
62074
62075
62076
62077
62078
62079
62080
62081
62082
62083
62084
62085
62086
62087
62088
62089
62090
62091
62092
62093
62094
62095
62096
62097
62098
62099
62100
62101
62102
62103
62104
62105
62106
62107
62108
62109
62110
62111
62112
62113
62114
62115
62116
62117
62118
62119
62120
62121
62122
62123
62124
62125
62126
62127
62128
62129
62130
62131
62132
62133
62134
62135
62136
62137
62138
62139
62140
62141
62142
62143
62144
62145
62146
62147
62148
62149
62150
62151
62152
62153
62154
62155
62156
62157
62158
62159
62160
62161
62162
62163
62164
62165
62166
62167
62168
62169
62170
62171
62172
62173
62174
62175
62176
62177
62178
62179
62180
62181
62182
62183
62184
62185
62186
62187
62188
62189
62190
62191
62192
62193
62194
62195
62196
62197
62198
62199
62200
62201
62202
62203
62204
62205
62206
62207
62208
62209
62210
62211
62212
62213
62214
62215
62216
62217
62218
62219
62220
62221
62222
62223
62224
62225
62226
62227
62228
62229
62230
62231
62232
62233
62234
62235
62236
62237
62238
62239
62240
62241
62242
62243
62244
62245
62246
62247
62248
62249
62250
62251
62252
62253
62254
62255
62256
62257
62258
62259
62260
62261
62262
62263
62264
62265
62266
62267
62268
62269
62270
62271
62272
62273
62274
62275
62276
62277
62278
62279
62280
62281
62282
62283
62284
62285
62286
62287
62288
62289
62290
62291
62292
62293
62294
62295
62296
62297
62298
62299
62300
62301
62302
62303
62304
62305
62306
62307
62308
62309
62310
62311
62312
62313
62314
62315
62316
62317
62318
62319
62320
62321
62322
62323
62324
62325
62326
62327
62328
62329
62330
62331
62332
62333
62334
62335
62336
62337
62338
62339
62340
62341
62342
62343
62344
62345
62346
62347
62348
62349
62350
62351
62352
62353
62354
62355
62356
62357
62358
62359
62360
62361
62362
62363
62364
62365
62366
62367
62368
62369
62370
62371
62372
62373
62374
62375
62376
62377
62378
62379
62380
62381
62382
62383
62384
62385
62386
62387
62388
62389
62390
62391
62392
62393
62394
62395
62396
62397
62398
62399
62400
62401
62402
62403
62404
62405
62406
62407
62408
62409
62410
62411
62412
62413
62414
62415
62416
62417
62418
62419
62420
62421
62422
62423
62424
62425
62426
62427
62428
62429
62430
62431
62432
62433
62434
62435
62436
62437
62438
62439
62440
62441
62442
62443
62444
62445
62446
62447
62448
62449
62450
62451
62452
62453
62454
62455
62456
62457
62458
62459
62460
62461
62462
62463
62464
62465
62466
62467
62468
62469
62470
62471
62472
62473
62474
62475
62476
62477
62478
62479
62480
62481
62482
62483
62484
62485
62486
62487
62488
62489
62490
62491
62492
62493
62494
62495
62496
62497
62498
62499
62500
62501
62502
62503
62504
62505
62506
62507
62508
62509
62510
62511
62512
62513
62514
62515
62516
62517
62518
62519
62520
62521
62522
62523
62524
62525
62526
62527
62528
62529
62530
62531
62532
62533
62534
62535
62536
62537
62538
62539
62540
62541
62542
62543
62544
62545
62546
62547
62548
62549
62550
62551
62552
62553
62554
62555
62556
62557
62558
62559
62560
62561
62562
62563
62564
62565
62566
62567
62568
62569
62570
62571
62572
62573
62574
62575
62576
62577
62578
62579
62580
62581
62582
62583
62584
62585
62586
62587
62588
62589
62590
62591
62592
62593
62594
62595
62596
62597
62598
62599
62600
62601
62602
62603
62604
62605
62606
62607
62608
62609
62610
62611
62612
62613
62614
62615
62616
62617
62618
62619
62620
62621
62622
62623
62624
62625
62626
62627
62628
62629
62630
62631
62632
62633
62634
62635
62636
62637
62638
62639
62640
62641
62642
62643
62644
62645
62646
62647
62648
62649
62650
62651
62652
62653
62654
62655
62656
62657
62658
62659
62660
62661
62662
62663
62664
62665
62666
62667
62668
62669
62670
62671
62672
62673
62674
62675
62676
62677
62678
62679
62680
62681
62682
62683
62684
62685
62686
62687
62688
62689
62690
62691
62692
62693
62694
62695
62696
62697
62698
62699
62700
62701
62702
62703
62704
62705
62706
62707
62708
62709
62710
62711
62712
62713
62714
62715
62716
62717
62718
62719
62720
62721
62722
62723
62724
62725
62726
62727
62728
62729
62730
62731
62732
62733
62734
62735
62736
62737
62738
62739
62740
62741
62742
62743
62744
62745
62746
62747
62748
62749
62750
62751
62752
62753
62754
62755
62756
62757
62758
62759
62760
62761
62762
62763
62764
62765
62766
62767
62768
62769
62770
62771
62772
62773
62774
62775
62776
62777
62778
62779
62780
62781
62782
62783
62784
62785
62786
62787
62788
62789
62790
62791
62792
62793
62794
62795
62796
62797
62798
62799
62800
62801
62802
62803
62804
62805
62806
62807
62808
62809
62810
62811
62812
62813
62814
62815
62816
62817
62818
62819
62820
62821
62822
62823
62824
62825
62826
62827
62828
62829
62830
62831
62832
62833
62834
62835
62836
62837
62838
62839
62840
62841
62842
62843
62844
62845
62846
62847
62848
62849
62850
62851
62852
62853
62854
62855
62856
62857
62858
62859
62860
62861
62862
62863
62864
62865
62866
62867
62868
62869
62870
62871
62872
62873
62874
62875
62876
62877
62878
62879
62880
62881
62882
62883
62884
62885
62886
62887
62888
62889
62890
62891
62892
62893
62894
62895
62896
62897
62898
62899
62900
62901
62902
62903
62904
62905
62906
62907
62908
62909
62910
62911
62912
62913
62914
62915
62916
62917
62918
62919
62920
62921
62922
62923
62924
62925
62926
62927
62928
62929
62930
62931
62932
62933
62934
62935
62936
62937
62938
62939
62940
62941
62942
62943
62944
62945
62946
62947
62948
62949
62950
62951
62952
62953
62954
62955
62956
62957
62958
62959
62960
62961
62962
62963
62964
62965
62966
62967
62968
62969
62970
62971
62972
62973
62974
62975
62976
62977
62978
62979
62980
62981
62982
62983
62984
62985
62986
62987
62988
62989
62990
62991
62992
62993
62994
62995
62996
62997
62998
62999
63000
63001
63002
63003
63004
63005
63006
63007
63008
63009
63010
63011
63012
63013
63014
63015
63016
63017
63018
63019
63020
63021
63022
63023
63024
63025
63026
63027
63028
63029
63030
63031
63032
63033
63034
63035
63036
63037
63038
63039
63040
63041
63042
63043
63044
63045
63046
63047
63048
63049
63050
63051
63052
63053
63054
63055
63056
63057
63058
63059
63060
63061
63062
63063
63064
63065
63066
63067
63068
63069
63070
63071
63072
63073
63074
63075
63076
63077
63078
63079
63080
63081
63082
63083
63084
63085
63086
63087
63088
63089
63090
63091
63092
63093
63094
63095
63096
63097
63098
63099
63100
63101
63102
63103
63104
63105
63106
63107
63108
63109
63110
63111
63112
63113
63114
63115
63116
63117
63118
63119
63120
63121
63122
63123
63124
63125
63126
63127
63128
63129
63130
63131
63132
63133
63134
63135
63136
63137
63138
63139
63140
63141
63142
63143
63144
63145
63146
63147
63148
63149
63150
63151
63152
63153
63154
63155
63156
63157
63158
63159
63160
63161
63162
63163
63164
63165
63166
63167
63168
63169
63170
63171
63172
63173
63174
63175
63176
63177
63178
63179
63180
63181
63182
63183
63184
63185
63186
63187
63188
63189
63190
63191
63192
63193
63194
63195
63196
63197
63198
63199
63200
63201
63202
63203
63204
63205
63206
63207
63208
63209
63210
63211
63212
63213
63214
63215
63216
63217
63218
63219
63220
63221
63222
63223
63224
63225
63226
63227
63228
63229
63230
63231
63232
63233
63234
63235
63236
63237
63238
63239
63240
63241
63242
63243
63244
63245
63246
63247
63248
63249
63250
63251
63252
63253
63254
63255
63256
63257
63258
63259
63260
63261
63262
63263
63264
63265
63266
63267
63268
63269
63270
63271
63272
63273
63274
63275
63276
63277
63278
63279
63280
63281
63282
63283
63284
63285
63286
63287
63288
63289
63290
63291
63292
63293
63294
63295
63296
63297
63298
63299
63300
63301
63302
63303
63304
63305
63306
63307
63308
63309
63310
63311
63312
63313
63314
63315
63316
63317
63318
63319
63320
63321
63322
63323
63324
63325
63326
63327
63328
63329
63330
63331
63332
63333
63334
63335
63336
63337
63338
63339
63340
63341
63342
63343
63344
63345
63346
63347
63348
63349
63350
63351
63352
63353
63354
63355
63356
63357
63358
63359
63360
63361
63362
63363
63364
63365
63366
63367
63368
63369
63370
63371
63372
63373
63374
63375
63376
63377
63378
63379
63380
63381
63382
63383
63384
63385
63386
63387
63388
63389
63390
63391
63392
63393
63394
63395
63396
63397
63398
63399
63400
63401
63402
63403
63404
63405
63406
63407
63408
63409
63410
63411
63412
63413
63414
63415
63416
63417
63418
63419
63420
63421
63422
63423
63424
63425
63426
63427
63428
63429
63430
63431
63432
63433
63434
63435
63436
63437
63438
63439
63440
63441
63442
63443
63444
63445
63446
63447
63448
63449
63450
63451
63452
63453
63454
63455
63456
63457
63458
63459
63460
63461
63462
63463
63464
63465
63466
63467
63468
63469
63470
63471
63472
63473
63474
63475
63476
63477
63478
63479
63480
63481
63482
63483
63484
63485
63486
63487
63488
63489
63490
63491
63492
63493
63494
63495
63496
63497
63498
63499
63500
63501
63502
63503
63504
63505
63506
63507
63508
63509
63510
63511
63512
63513
63514
63515
63516
63517
63518
63519
63520
63521
63522
63523
63524
63525
63526
63527
63528
63529
63530
63531
63532
63533
63534
63535
63536
63537
63538
63539
63540
63541
63542
63543
63544
63545
63546
63547
63548
63549
63550
63551
63552
63553
63554
63555
63556
63557
63558
63559
63560
63561
63562
63563
63564
63565
63566
63567
63568
63569
63570
63571
63572
63573
63574
63575
63576
63577
63578
63579
63580
63581
63582
63583
63584
63585
63586
63587
63588
63589
63590
63591
63592
63593
63594
63595
63596
63597
63598
63599
63600
63601
63602
63603
63604
63605
63606
63607
63608
63609
63610
63611
63612
63613
63614
63615
63616
63617
63618
63619
63620
63621
63622
63623
63624
63625
63626
63627
63628
63629
63630
63631
63632
63633
63634
63635
63636
63637
63638
63639
63640
63641
63642
63643
63644
63645
63646
63647
63648
63649
63650
63651
63652
63653
63654
63655
63656
63657
63658
63659
63660
63661
63662
63663
63664
63665
63666
63667
63668
63669
63670
63671
63672
63673
63674
63675
63676
63677
63678
63679
63680
63681
63682
63683
63684
63685
63686
63687
63688
63689
63690
63691
63692
63693
63694
63695
63696
63697
63698
63699
63700
63701
63702
63703
63704
63705
63706
63707
63708
63709
63710
63711
63712
63713
63714
63715
63716
63717
63718
63719
63720
63721
63722
63723
63724
63725
63726
63727
63728
63729
63730
63731
63732
63733
63734
63735
63736
63737
63738
63739
63740
63741
63742
63743
63744
63745
63746
63747
63748
63749
63750
63751
63752
63753
63754
63755
63756
63757
63758
63759
63760
63761
63762
63763
63764
63765
63766
63767
63768
63769
63770
63771
63772
63773
63774
63775
63776
63777
63778
63779
63780
63781
63782
63783
63784
63785
63786
63787
63788
63789
63790
63791
63792
63793
63794
63795
63796
63797
63798
63799
63800
63801
63802
63803
63804
63805
63806
63807
63808
63809
63810
63811
63812
63813
63814
63815
63816
63817
63818
63819
63820
63821
63822
63823
63824
63825
63826
63827
63828
63829
63830
63831
63832
63833
63834
63835
63836
63837
63838
63839
63840
63841
63842
63843
63844
63845
63846
63847
63848
63849
63850
63851
63852
63853
63854
63855
63856
63857
63858
63859
63860
63861
63862
63863
63864
63865
63866
63867
63868
63869
63870
63871
63872
63873
63874
63875
63876
63877
63878
63879
63880
63881
63882
63883
63884
63885
63886
63887
63888
63889
63890
63891
63892
63893
63894
63895
63896
63897
63898
63899
63900
63901
63902
63903
63904
63905
63906
63907
63908
63909
63910
63911
63912
63913
63914
63915
63916
63917
63918
63919
63920
63921
63922
63923
63924
63925
63926
63927
63928
63929
63930
63931
63932
63933
63934
63935
63936
63937
63938
63939
63940
63941
63942
63943
63944
63945
63946
63947
63948
63949
63950
63951
63952
63953
63954
63955
63956
63957
63958
63959
63960
63961
63962
63963
63964
63965
63966
63967
63968
63969
63970
63971
63972
63973
63974
63975
63976
63977
63978
63979
63980
63981
63982
63983
63984
63985
63986
63987
63988
63989
63990
63991
63992
63993
63994
63995
63996
63997
63998
63999
64000
64001
64002
64003
64004
64005
64006
64007
64008
64009
64010
64011
64012
64013
64014
64015
64016
64017
64018
64019
64020
64021
64022
64023
64024
64025
64026
64027
64028
64029
64030
64031
64032
64033
64034
64035
64036
64037
64038
64039
64040
64041
64042
64043
64044
64045
64046
64047
64048
64049
64050
64051
64052
64053
64054
64055
64056
64057
64058
64059
64060
64061
64062
64063
64064
64065
64066
64067
64068
64069
64070
64071
64072
64073
64074
64075
64076
64077
64078
64079
64080
64081
64082
64083
64084
64085
64086
64087
64088
64089
64090
64091
64092
64093
64094
64095
64096
64097
64098
64099
64100
64101
64102
64103
64104
64105
64106
64107
64108
64109
64110
64111
64112
64113
64114
64115
64116
64117
64118
64119
64120
64121
64122
64123
64124
64125
64126
64127
64128
64129
64130
64131
64132
64133
64134
64135
64136
64137
64138
64139
64140
64141
64142
64143
64144
64145
64146
64147
64148
64149
64150
64151
64152
64153
64154
64155
64156
64157
64158
64159
64160
64161
64162
64163
64164
64165
64166
64167
64168
64169
64170
64171
64172
64173
64174
64175
64176
64177
64178
64179
64180
64181
64182
64183
64184
64185
64186
64187
64188
64189
64190
64191
64192
64193
64194
64195
64196
64197
64198
64199
64200
64201
64202
64203
64204
64205
64206
64207
64208
64209
64210
64211
64212
64213
64214
64215
64216
64217
64218
64219
64220
64221
64222
64223
64224
64225
64226
64227
64228
64229
64230
64231
64232
64233
64234
64235
64236
64237
64238
64239
64240
64241
64242
64243
64244
64245
64246
64247
64248
64249
64250
64251
64252
64253
64254
64255
64256
64257
64258
64259
64260
64261
64262
64263
64264
64265
64266
64267
64268
64269
64270
64271
64272
64273
64274
64275
64276
64277
64278
64279
64280
64281
64282
64283
64284
64285
64286
64287
64288
64289
64290
64291
64292
64293
64294
64295
64296
64297
64298
64299
64300
64301
64302
64303
64304
64305
64306
64307
64308
64309
64310
64311
64312
64313
64314
64315
64316
64317
64318
64319
64320
64321
64322
64323
64324
64325
64326
64327
64328
64329
64330
64331
64332
64333
64334
64335
64336
64337
64338
64339
64340
64341
64342
64343
64344
64345
64346
64347
64348
64349
64350
64351
64352
64353
64354
64355
64356
64357
64358
64359
64360
64361
64362
64363
64364
64365
64366
64367
64368
64369
64370
64371
64372
64373
64374
64375
64376
64377
64378
64379
64380
64381
64382
64383
64384
64385
64386
64387
64388
64389
64390
64391
64392
64393
64394
64395
64396
64397
64398
64399
64400
64401
64402
64403
64404
64405
64406
64407
64408
64409
64410
64411
64412
64413
64414
64415
64416
64417
64418
64419
64420
64421
64422
64423
64424
64425
64426
64427
64428
64429
64430
64431
64432
64433
64434
64435
64436
64437
64438
64439
64440
64441
64442
64443
64444
64445
64446
64447
64448
64449
64450
64451
64452
64453
64454
64455
64456
64457
64458
64459
64460
64461
64462
64463
64464
64465
64466
64467
64468
64469
64470
64471
64472
64473
64474
64475
64476
64477
64478
64479
64480
64481
64482
64483
64484
64485
64486
64487
64488
64489
64490
64491
64492
64493
64494
64495
64496
64497
64498
64499
64500
64501
64502
64503
64504
64505
64506
64507
64508
64509
64510
64511
64512
64513
64514
64515
64516
64517
64518
64519
64520
64521
64522
64523
64524
64525
64526
64527
64528
64529
64530
64531
64532
64533
64534
64535
64536
64537
64538
64539
64540
64541
64542
64543
64544
64545
64546
64547
64548
64549
64550
64551
64552
64553
64554
64555
64556
64557
64558
64559
64560
64561
64562
64563
64564
64565
64566
64567
64568
64569
64570
64571
64572
64573
64574
64575
64576
64577
64578
64579
64580
64581
64582
64583
64584
64585
64586
64587
64588
64589
64590
64591
64592
64593
64594
64595
64596
64597
64598
64599
64600
64601
64602
64603
64604
64605
64606
64607
64608
64609
64610
64611
64612
64613
64614
64615
64616
64617
64618
64619
64620
64621
64622
64623
64624
64625
64626
64627
64628
64629
64630
64631
64632
64633
64634
64635
64636
64637
64638
64639
64640
64641
64642
64643
64644
64645
64646
64647
64648
64649
64650
64651
64652
64653
64654
64655
64656
64657
64658
64659
64660
64661
64662
64663
64664
64665
64666
64667
64668
64669
64670
64671
64672
64673
64674
64675
64676
64677
64678
64679
64680
64681
64682
64683
64684
64685
64686
64687
64688
64689
64690
64691
64692
64693
64694
64695
64696
64697
64698
64699
64700
64701
64702
64703
64704
64705
64706
64707
64708
64709
64710
64711
64712
64713
64714
64715
64716
64717
64718
64719
64720
64721
64722
64723
64724
64725
64726
64727
64728
64729
64730
64731
64732
64733
64734
64735
64736
64737
64738
64739
64740
64741
64742
64743
64744
64745
64746
64747
64748
64749
64750
64751
64752
64753
64754
64755
64756
64757
64758
64759
64760
64761
64762
64763
64764
64765
64766
64767
64768
64769
64770
64771
64772
64773
64774
64775
64776
64777
64778
64779
64780
64781
64782
64783
64784
64785
64786
64787
64788
64789
64790
64791
64792
64793
64794
64795
64796
64797
64798
64799
64800
64801
64802
64803
64804
64805
64806
64807
64808
64809
64810
64811
64812
64813
64814
64815
64816
64817
64818
64819
64820
64821
64822
64823
64824
64825
64826
64827
64828
64829
64830
64831
64832
64833
64834
64835
64836
64837
64838
64839
64840
64841
64842
64843
64844
64845
64846
64847
64848
64849
64850
64851
64852
64853
64854
64855
64856
64857
64858
64859
64860
64861
64862
64863
64864
64865
64866
64867
64868
64869
64870
64871
64872
64873
64874
64875
64876
64877
64878
64879
64880
64881
64882
64883
64884
64885
64886
64887
64888
64889
64890
64891
64892
64893
64894
64895
64896
64897
64898
64899
64900
64901
64902
64903
64904
64905
64906
64907
64908
64909
64910
64911
64912
64913
64914
64915
64916
64917
64918
64919
64920
64921
64922
64923
64924
64925
64926
64927
64928
64929
64930
64931
64932
64933
64934
64935
64936
64937
64938
64939
64940
64941
64942
64943
64944
64945
64946
64947
64948
64949
64950
64951
64952
64953
64954
64955
64956
64957
64958
64959
64960
64961
64962
64963
64964
64965
64966
64967
64968
64969
64970
64971
64972
64973
64974
64975
64976
64977
64978
64979
64980
64981
64982
64983
64984
64985
64986
64987
64988
64989
64990
64991
64992
64993
64994
64995
64996
64997
64998
64999
65000
65001
65002
65003
65004
65005
65006
65007
65008
65009
65010
65011
65012
65013
65014
65015
65016
65017
65018
65019
65020
65021
65022
65023
65024
65025
65026
65027
65028
65029
65030
65031
65032
65033
65034
65035
65036
65037
65038
65039
65040
65041
65042
65043
65044
65045
65046
65047
65048
65049
65050
65051
65052
65053
65054
65055
65056
65057
65058
65059
65060
65061
65062
65063
65064
65065
65066
65067
65068
65069
65070
65071
65072
65073
65074
65075
65076
65077
65078
65079
65080
65081
65082
65083
65084
65085
65086
65087
65088
65089
65090
65091
65092
65093
65094
65095
65096
65097
65098
65099
65100
65101
65102
65103
65104
65105
65106
65107
65108
65109
65110
65111
65112
65113
65114
65115
65116
65117
65118
65119
65120
65121
65122
65123
65124
65125
65126
65127
65128
65129
65130
65131
65132
65133
65134
65135
65136
65137
65138
65139
65140
65141
65142
65143
65144
65145
65146
65147
65148
65149
65150
65151
65152
65153
65154
65155
65156
65157
65158
65159
65160
65161
65162
65163
65164
65165
65166
65167
65168
65169
65170
65171
65172
65173
65174
65175
65176
65177
65178
65179
65180
65181
65182
65183
65184
65185
65186
65187
65188
65189
65190
65191
65192
65193
65194
65195
65196
65197
65198
65199
65200
65201
65202
65203
65204
65205
65206
65207
65208
65209
65210
65211
65212
65213
65214
65215
65216
65217
65218
65219
65220
65221
65222
65223
65224
65225
65226
65227
65228
65229
65230
65231
65232
65233
65234
65235
65236
65237
65238
65239
65240
65241
65242
65243
65244
65245
65246
65247
65248
65249
65250
65251
65252
65253
65254
65255
65256
65257
65258
65259
65260
65261
65262
65263
65264
65265
65266
65267
65268
65269
65270
65271
65272
65273
65274
65275
65276
65277
65278
65279
65280
65281
65282
65283
65284
65285
65286
65287
65288
65289
65290
65291
65292
65293
65294
65295
65296
65297
65298
65299
65300
65301
65302
65303
65304
65305
65306
65307
65308
65309
65310
65311
65312
65313
65314
65315
65316
65317
65318
65319
65320
65321
65322
65323
65324
65325
65326
65327
65328
65329
65330
65331
65332
65333
65334
65335
65336
65337
65338
65339
65340
65341
65342
65343
65344
65345
65346
65347
65348
65349
65350
65351
65352
65353
65354
65355
65356
65357
65358
65359
65360
65361
65362
65363
65364
65365
65366
65367
65368
65369
65370
65371
65372
65373
65374
65375
65376
65377
65378
65379
65380
65381
65382
65383
65384
65385
65386
65387
65388
65389
65390
65391
65392
65393
65394
65395
65396
65397
65398
65399
65400
65401
65402
65403
65404
65405
65406
65407
65408
65409
65410
65411
65412
65413
65414
65415
65416
65417
65418
65419
65420
65421
65422
65423
65424
65425
65426
65427
65428
65429
65430
65431
65432
65433
65434
65435
65436
65437
65438
65439
65440
65441
65442
65443
65444
65445
65446
65447
65448
65449
65450
65451
65452
65453
65454
65455
65456
65457
65458
65459
65460
65461
65462
65463
65464
65465
65466
65467
65468
65469
65470
65471
65472
65473
65474
65475
65476
65477
65478
65479
65480
65481
65482
65483
65484
65485
65486
65487
65488
65489
65490
65491
65492
65493
65494
65495
65496
65497
65498
65499
65500
65501
65502
65503
65504
65505
65506
65507
65508
65509
65510
65511
65512
65513
65514
65515
65516
65517
65518
65519
65520
65521
65522
65523
65524
65525
65526
65527
65528
65529
65530
65531
65532
65533
65534
65535
65536
65537
65538
65539
65540
65541
65542
65543
65544
65545
65546
65547
65548
65549
65550
65551
65552
65553
65554
65555
65556
65557
65558
65559
65560
65561
65562
65563
65564
65565
65566
65567
65568
65569
65570
65571
65572
65573
65574
65575
65576
65577
65578
65579
65580
65581
65582
65583
65584
65585
65586
65587
65588
65589
65590
65591
65592
65593
65594
65595
65596
65597
65598
65599
65600
65601
65602
65603
65604
65605
65606
65607
65608
65609
65610
65611
65612
65613
65614
65615
65616
65617
65618
65619
65620
65621
65622
65623
65624
65625
65626
65627
65628
65629
65630
65631
65632
65633
65634
65635
65636
65637
65638
65639
65640
65641
65642
65643
65644
65645
65646
65647
65648
65649
65650
65651
65652
65653
65654
65655
65656
65657
65658
65659
65660
65661
65662
65663
65664
65665
65666
65667
65668
65669
65670
65671
65672
65673
65674
65675
65676
65677
65678
65679
65680
65681
65682
65683
65684
65685
65686
65687
65688
65689
65690
65691
65692
65693
65694
65695
65696
65697
65698
65699
65700
65701
65702
65703
65704
65705
65706
65707
65708
65709
65710
65711
65712
65713
65714
65715
65716
65717
65718
65719
65720
65721
65722
65723
65724
65725
65726
65727
65728
65729
65730
65731
65732
65733
65734
65735
65736
65737
65738
65739
65740
65741
65742
65743
65744
65745
65746
65747
65748
65749
65750
65751
65752
65753
65754
65755
65756
65757
65758
65759
65760
65761
65762
65763
65764
65765
65766
65767
65768
65769
65770
65771
65772
65773
65774
65775
65776
65777
65778
65779
65780
65781
65782
65783
65784
65785
65786
65787
65788
65789
65790
65791
65792
65793
65794
65795
65796
65797
65798
65799
65800
65801
65802
65803
65804
65805
65806
65807
65808
65809
65810
65811
65812
65813
65814
65815
65816
65817
65818
65819
65820
65821
65822
65823
65824
65825
65826
65827
65828
65829
65830
65831
65832
65833
65834
65835
65836
65837
65838
65839
65840
65841
65842
65843
65844
65845
65846
65847
65848
65849
65850
65851
65852
65853
65854
65855
65856
65857
65858
65859
65860
65861
65862
65863
65864
65865
65866
65867
65868
65869
65870
65871
65872
65873
65874
65875
65876
65877
65878
65879
65880
65881
65882
65883
65884
65885
65886
65887
65888
65889
65890
65891
65892
65893
65894
65895
65896
65897
65898
65899
65900
65901
65902
65903
65904
65905
65906
65907
65908
65909
65910
65911
65912
65913
65914
65915
65916
65917
65918
65919
65920
65921
65922
65923
65924
65925
65926
65927
65928
65929
65930
65931
65932
65933
65934
65935
65936
65937
65938
65939
65940
65941
65942
65943
65944
65945
65946
65947
65948
65949
65950
65951
65952
65953
65954
65955
65956
65957
65958
65959
65960
65961
65962
65963
65964
65965
65966
65967
65968
65969
65970
65971
65972
65973
65974
65975
65976
65977
65978
65979
65980
65981
65982
65983
65984
65985
65986
65987
65988
65989
65990
65991
65992
65993
65994
65995
65996
65997
65998
65999
66000
66001
66002
66003
66004
66005
66006
66007
66008
66009
66010
66011
66012
66013
66014
66015
66016
66017
66018
66019
66020
66021
66022
66023
66024
66025
66026
66027
66028
66029
66030
66031
66032
66033
66034
66035
66036
66037
66038
66039
66040
66041
66042
66043
66044
66045
66046
66047
66048
66049
66050
66051
66052
66053
66054
66055
66056
66057
66058
66059
66060
66061
66062
66063
66064
66065
66066
66067
66068
66069
66070
66071
66072
66073
66074
66075
66076
66077
66078
66079
66080
66081
66082
66083
66084
66085
66086
66087
66088
66089
66090
66091
66092
66093
66094
66095
66096
66097
66098
66099
66100
66101
66102
66103
66104
66105
66106
66107
66108
66109
66110
66111
66112
66113
66114
66115
66116
66117
66118
66119
66120
66121
66122
66123
66124
66125
66126
66127
66128
66129
66130
66131
66132
66133
66134
66135
66136
66137
66138
66139
66140
66141
66142
66143
66144
66145
66146
66147
66148
66149
66150
66151
66152
66153
66154
66155
66156
66157
66158
66159
66160
66161
66162
66163
66164
66165
66166
66167
66168
66169
66170
66171
66172
66173
66174
66175
66176
66177
66178
66179
66180
66181
66182
66183
66184
66185
66186
66187
66188
66189
66190
66191
66192
66193
66194
66195
66196
66197
66198
66199
66200
66201
66202
66203
66204
66205
66206
66207
66208
66209
66210
66211
66212
66213
66214
66215
66216
66217
66218
66219
66220
66221
66222
66223
66224
66225
66226
66227
66228
66229
66230
66231
66232
66233
66234
66235
66236
66237
66238
66239
66240
66241
66242
66243
66244
66245
66246
66247
66248
66249
66250
66251
66252
66253
66254
66255
66256
66257
66258
66259
66260
66261
66262
66263
66264
66265
66266
66267
66268
66269
66270
66271
66272
66273
66274
66275
66276
66277
66278
66279
66280
66281
66282
66283
66284
66285
66286
66287
66288
66289
66290
66291
66292
66293
66294
66295
66296
66297
66298
66299
66300
66301
66302
66303
66304
66305
66306
66307
66308
66309
66310
66311
66312
66313
66314
66315
66316
66317
66318
66319
66320
66321
66322
66323
66324
66325
66326
66327
66328
66329
66330
66331
66332
66333
66334
66335
66336
66337
66338
66339
66340
66341
66342
66343
66344
66345
66346
66347
66348
66349
66350
66351
66352
66353
66354
66355
66356
66357
66358
66359
66360
66361
66362
66363
66364
66365
66366
66367
66368
66369
66370
66371
66372
66373
66374
66375
66376
66377
66378
66379
66380
66381
66382
66383
66384
66385
66386
66387
66388
66389
66390
66391
66392
66393
66394
66395
66396
66397
66398
66399
66400
66401
66402
66403
66404
66405
66406
66407
66408
66409
66410
66411
66412
66413
66414
66415
66416
66417
66418
66419
66420
66421
66422
66423
66424
66425
66426
66427
66428
66429
66430
66431
66432
66433
66434
66435
66436
66437
66438
66439
66440
66441
66442
66443
66444
66445
66446
66447
66448
66449
66450
66451
66452
66453
66454
66455
66456
66457
66458
66459
66460
66461
66462
66463
66464
66465
66466
66467
66468
66469
66470
66471
66472
66473
66474
66475
66476
66477
66478
66479
66480
66481
66482
66483
66484
66485
66486
66487
66488
66489
66490
66491
66492
66493
66494
66495
66496
66497
66498
66499
66500
66501
66502
66503
66504
66505
66506
66507
66508
66509
66510
66511
66512
66513
66514
66515
66516
66517
66518
66519
66520
66521
66522
66523
66524
66525
66526
66527
66528
66529
66530
66531
66532
66533
66534
66535
66536
66537
66538
66539
66540
66541
66542
66543
66544
66545
66546
66547
66548
66549
66550
66551
66552
66553
66554
66555
66556
66557
66558
66559
66560
66561
66562
66563
66564
66565
66566
66567
66568
66569
66570
66571
66572
66573
66574
66575
66576
66577
66578
66579
66580
66581
66582
66583
66584
66585
66586
66587
66588
66589
66590
66591
66592
66593
66594
66595
66596
66597
66598
66599
66600
66601
66602
66603
66604
66605
66606
66607
66608
66609
66610
66611
66612
66613
66614
66615
66616
66617
66618
66619
66620
66621
66622
66623
66624
66625
66626
66627
66628
66629
66630
66631
66632
66633
66634
66635
66636
66637
66638
66639
66640
66641
66642
66643
66644
66645
66646
66647
66648
66649
66650
66651
66652
66653
66654
66655
66656
66657
66658
66659
66660
66661
66662
66663
66664
66665
66666
66667
66668
66669
66670
66671
66672
66673
66674
66675
66676
66677
66678
66679
66680
66681
66682
66683
66684
66685
66686
66687
66688
66689
66690
66691
66692
66693
66694
66695
66696
66697
66698
66699
66700
66701
66702
66703
66704
66705
66706
66707
66708
66709
66710
66711
66712
66713
66714
66715
66716
66717
66718
66719
66720
66721
66722
66723
66724
66725
66726
66727
66728
66729
66730
66731
66732
66733
66734
66735
66736
66737
66738
66739
66740
66741
66742
66743
66744
66745
66746
66747
66748
66749
66750
66751
66752
66753
66754
66755
66756
66757
66758
66759
66760
66761
66762
66763
66764
66765
66766
66767
66768
66769
66770
66771
66772
66773
66774
66775
66776
66777
66778
66779
66780
66781
66782
66783
66784
66785
66786
66787
66788
66789
66790
66791
66792
66793
66794
66795
66796
66797
66798
66799
66800
66801
66802
66803
66804
66805
66806
66807
66808
66809
66810
66811
66812
66813
66814
66815
66816
66817
66818
66819
66820
66821
66822
66823
66824
66825
66826
66827
66828
66829
66830
66831
66832
66833
66834
66835
66836
66837
66838
66839
66840
66841
66842
66843
66844
66845
66846
66847
66848
66849
66850
66851
66852
66853
66854
66855
66856
66857
66858
66859
66860
66861
66862
66863
66864
66865
66866
66867
66868
66869
66870
66871
66872
66873
66874
66875
66876
66877
66878
66879
66880
66881
66882
66883
66884
66885
66886
66887
66888
66889
66890
66891
66892
66893
66894
66895
66896
66897
66898
66899
66900
66901
66902
66903
66904
66905
66906
66907
66908
66909
66910
66911
66912
66913
66914
66915
66916
66917
66918
66919
66920
66921
66922
66923
66924
66925
66926
66927
66928
66929
66930
66931
66932
66933
66934
66935
66936
66937
66938
66939
66940
66941
66942
66943
66944
66945
66946
66947
66948
66949
66950
66951
66952
66953
66954
66955
66956
66957
66958
66959
66960
66961
66962
66963
66964
66965
66966
66967
66968
66969
66970
66971
66972
66973
66974
66975
66976
66977
66978
66979
66980
66981
66982
66983
66984
66985
66986
66987
66988
66989
66990
66991
66992
66993
66994
66995
66996
66997
66998
66999
67000
67001
67002
67003
67004
67005
67006
67007
67008
67009
67010
67011
67012
67013
67014
67015
67016
67017
67018
67019
67020
67021
67022
67023
67024
67025
67026
67027
67028
67029
67030
67031
67032
67033
67034
67035
67036
67037
67038
67039
67040
67041
67042
67043
67044
67045
67046
67047
67048
67049
67050
67051
67052
67053
67054
67055
67056
67057
67058
67059
67060
67061
67062
67063
67064
67065
67066
67067
67068
67069
67070
67071
67072
67073
67074
67075
67076
67077
67078
67079
67080
67081
67082
67083
67084
67085
67086
67087
67088
67089
67090
67091
67092
67093
67094
67095
67096
67097
67098
67099
67100
67101
67102
67103
67104
67105
67106
67107
67108
67109
67110
67111
67112
67113
67114
67115
67116
67117
67118
67119
67120
67121
67122
67123
67124
67125
67126
67127
67128
67129
67130
67131
67132
67133
67134
67135
67136
67137
67138
67139
67140
67141
67142
67143
67144
67145
67146
67147
67148
67149
67150
67151
67152
67153
67154
67155
67156
67157
67158
67159
67160
67161
67162
67163
67164
67165
67166
67167
67168
67169
67170
67171
67172
67173
67174
67175
67176
67177
67178
67179
67180
67181
67182
67183
67184
67185
67186
67187
67188
67189
67190
67191
67192
67193
67194
67195
67196
67197
67198
67199
67200
67201
67202
67203
67204
67205
67206
67207
67208
67209
67210
67211
67212
67213
67214
67215
67216
67217
67218
67219
67220
67221
67222
67223
67224
67225
67226
67227
67228
67229
67230
67231
67232
67233
67234
67235
67236
67237
67238
67239
67240
67241
67242
67243
67244
67245
67246
67247
67248
67249
67250
67251
67252
67253
67254
67255
67256
67257
67258
67259
67260
67261
67262
67263
67264
67265
67266
67267
67268
67269
67270
67271
67272
67273
67274
67275
67276
67277
67278
67279
67280
67281
67282
67283
67284
67285
67286
67287
67288
67289
67290
67291
67292
67293
67294
67295
67296
67297
67298
67299
67300
67301
67302
67303
67304
67305
67306
67307
67308
67309
67310
67311
67312
67313
67314
67315
67316
67317
67318
67319
67320
67321
67322
67323
67324
67325
67326
67327
67328
67329
67330
67331
67332
67333
67334
67335
67336
67337
67338
67339
67340
67341
67342
67343
67344
67345
67346
67347
67348
67349
67350
67351
67352
67353
67354
67355
67356
67357
67358
67359
67360
67361
67362
67363
67364
67365
67366
67367
67368
67369
67370
67371
67372
67373
67374
67375
67376
67377
67378
67379
67380
67381
67382
67383
67384
67385
67386
67387
67388
67389
67390
67391
67392
67393
67394
67395
67396
67397
67398
67399
67400
67401
67402
67403
67404
67405
67406
67407
67408
67409
67410
67411
67412
67413
67414
67415
67416
67417
67418
67419
67420
67421
67422
67423
67424
67425
67426
67427
67428
67429
67430
67431
67432
67433
67434
67435
67436
67437
67438
67439
67440
67441
67442
67443
67444
67445
67446
67447
67448
67449
67450
67451
67452
67453
67454
67455
67456
67457
67458
67459
67460
67461
67462
67463
67464
67465
67466
67467
67468
67469
67470
67471
67472
67473
67474
67475
67476
67477
67478
67479
67480
67481
67482
67483
67484
67485
67486
67487
67488
67489
67490
67491
67492
67493
67494
67495
67496
67497
67498
67499
67500
67501
67502
67503
67504
67505
67506
67507
67508
67509
67510
67511
67512
67513
67514
67515
67516
67517
67518
67519
67520
67521
67522
67523
67524
67525
67526
67527
67528
67529
67530
67531
67532
67533
67534
67535
67536
67537
67538
67539
67540
67541
67542
67543
67544
67545
67546
67547
67548
67549
67550
67551
67552
67553
67554
67555
67556
67557
67558
67559
67560
67561
67562
67563
67564
67565
67566
67567
67568
67569
67570
67571
67572
67573
67574
67575
67576
67577
67578
67579
67580
67581
67582
67583
67584
67585
67586
67587
67588
67589
67590
67591
67592
67593
67594
67595
67596
67597
67598
67599
67600
67601
67602
67603
67604
67605
67606
67607
67608
67609
67610
67611
67612
67613
67614
67615
67616
67617
67618
67619
67620
67621
67622
67623
67624
67625
67626
67627
67628
67629
67630
67631
67632
67633
67634
67635
67636
67637
67638
67639
67640
67641
67642
67643
67644
67645
67646
67647
67648
67649
67650
67651
67652
67653
67654
67655
67656
67657
67658
67659
67660
67661
67662
67663
67664
67665
67666
67667
67668
67669
67670
67671
67672
67673
67674
67675
67676
67677
67678
67679
67680
67681
67682
67683
67684
67685
67686
67687
67688
67689
67690
67691
67692
67693
67694
67695
67696
67697
67698
67699
67700
67701
67702
67703
67704
67705
67706
67707
67708
67709
67710
67711
67712
67713
67714
67715
67716
67717
67718
67719
67720
67721
67722
67723
67724
67725
67726
67727
67728
67729
67730
67731
67732
67733
67734
67735
67736
67737
67738
67739
67740
67741
67742
67743
67744
67745
67746
67747
67748
67749
67750
67751
67752
67753
67754
67755
67756
67757
67758
67759
67760
67761
67762
67763
67764
67765
67766
67767
67768
67769
67770
67771
67772
67773
67774
67775
67776
67777
67778
67779
67780
67781
67782
67783
67784
67785
67786
67787
67788
67789
67790
67791
67792
67793
67794
67795
67796
67797
67798
67799
67800
67801
67802
67803
67804
67805
67806
67807
67808
67809
67810
67811
67812
67813
67814
67815
67816
67817
67818
67819
67820
67821
67822
67823
67824
67825
67826
67827
67828
67829
67830
67831
67832
67833
67834
67835
67836
67837
67838
67839
67840
67841
67842
67843
67844
67845
67846
67847
67848
67849
67850
67851
67852
67853
67854
67855
67856
67857
67858
67859
67860
67861
67862
67863
67864
67865
67866
67867
67868
67869
67870
67871
67872
67873
67874
67875
67876
67877
67878
67879
67880
67881
67882
67883
67884
67885
67886
67887
67888
67889
67890
67891
67892
67893
67894
67895
67896
67897
67898
67899
67900
67901
67902
67903
67904
67905
67906
67907
67908
67909
67910
67911
67912
67913
67914
67915
67916
67917
67918
67919
67920
67921
67922
67923
67924
67925
67926
67927
67928
67929
67930
67931
67932
67933
67934
67935
67936
67937
67938
67939
67940
67941
67942
67943
67944
67945
67946
67947
67948
67949
67950
67951
67952
67953
67954
67955
67956
67957
67958
67959
67960
67961
67962
67963
67964
67965
67966
67967
67968
67969
67970
67971
67972
67973
67974
67975
67976
67977
67978
67979
67980
67981
67982
67983
67984
67985
67986
67987
67988
67989
67990
67991
67992
67993
67994
67995
67996
67997
67998
67999
68000
68001
68002
68003
68004
68005
68006
68007
68008
68009
68010
68011
68012
68013
68014
68015
68016
68017
68018
68019
68020
68021
68022
68023
68024
68025
68026
68027
68028
68029
68030
68031
68032
68033
68034
68035
68036
68037
68038
68039
68040
68041
68042
68043
68044
68045
68046
68047
68048
68049
68050
68051
68052
68053
68054
68055
68056
68057
68058
68059
68060
68061
68062
68063
68064
68065
68066
68067
68068
68069
68070
68071
68072
68073
68074
68075
68076
68077
68078
68079
68080
68081
68082
68083
68084
68085
68086
68087
68088
68089
68090
68091
68092
68093
68094
68095
68096
68097
68098
68099
68100
68101
68102
68103
68104
68105
68106
68107
68108
68109
68110
68111
68112
68113
68114
68115
68116
68117
68118
68119
68120
68121
68122
68123
68124
68125
68126
68127
68128
68129
68130
68131
68132
68133
68134
68135
68136
68137
68138
68139
68140
68141
68142
68143
68144
68145
68146
68147
68148
68149
68150
68151
68152
68153
68154
68155
68156
68157
68158
68159
68160
68161
68162
68163
68164
68165
68166
68167
68168
68169
68170
68171
68172
68173
68174
68175
68176
68177
68178
68179
68180
68181
68182
68183
68184
68185
68186
68187
68188
68189
68190
68191
68192
68193
68194
68195
68196
68197
68198
68199
68200
68201
68202
68203
68204
68205
68206
68207
68208
68209
68210
68211
68212
68213
68214
68215
68216
68217
68218
68219
68220
68221
68222
68223
68224
68225
68226
68227
68228
68229
68230
68231
68232
68233
68234
68235
68236
68237
68238
68239
68240
68241
68242
68243
68244
68245
68246
68247
68248
68249
68250
68251
68252
68253
68254
68255
68256
68257
68258
68259
68260
68261
68262
68263
68264
68265
68266
68267
68268
68269
68270
68271
68272
68273
68274
68275
68276
68277
68278
68279
68280
68281
68282
68283
68284
68285
68286
68287
68288
68289
68290
68291
68292
68293
68294
68295
68296
68297
68298
68299
68300
68301
68302
68303
68304
68305
68306
68307
68308
68309
68310
68311
68312
68313
68314
68315
68316
68317
68318
68319
68320
68321
68322
68323
68324
68325
68326
68327
68328
68329
68330
68331
68332
68333
68334
68335
68336
68337
68338
68339
68340
68341
68342
68343
68344
68345
68346
68347
68348
68349
68350
68351
68352
68353
68354
68355
68356
68357
68358
68359
68360
68361
68362
68363
68364
68365
68366
68367
68368
68369
68370
68371
68372
68373
68374
68375
68376
68377
68378
68379
68380
68381
68382
68383
68384
68385
68386
68387
68388
68389
68390
68391
68392
68393
68394
68395
68396
68397
68398
68399
68400
68401
68402
68403
68404
68405
68406
68407
68408
68409
68410
68411
68412
68413
68414
68415
68416
68417
68418
68419
68420
68421
68422
68423
68424
68425
68426
68427
68428
68429
68430
68431
68432
68433
68434
68435
68436
68437
68438
68439
68440
68441
68442
68443
68444
68445
68446
68447
68448
68449
68450
68451
68452
68453
68454
68455
68456
68457
68458
68459
68460
68461
68462
68463
68464
68465
68466
68467
68468
68469
68470
68471
68472
68473
68474
68475
68476
68477
68478
68479
68480
68481
68482
68483
68484
68485
68486
68487
68488
68489
68490
68491
68492
68493
68494
68495
68496
68497
68498
68499
68500
68501
68502
68503
68504
68505
68506
68507
68508
68509
68510
68511
68512
68513
68514
68515
68516
68517
68518
68519
68520
68521
68522
68523
68524
68525
68526
68527
68528
68529
68530
68531
68532
68533
68534
68535
68536
68537
68538
68539
68540
68541
68542
68543
68544
68545
68546
68547
68548
68549
68550
68551
68552
68553
68554
68555
68556
68557
68558
68559
68560
68561
68562
68563
68564
68565
68566
68567
68568
68569
68570
68571
68572
68573
68574
68575
68576
68577
68578
68579
68580
68581
68582
68583
68584
68585
68586
68587
68588
68589
68590
68591
68592
68593
68594
68595
68596
68597
68598
68599
68600
68601
68602
68603
68604
68605
68606
68607
68608
68609
68610
68611
68612
68613
68614
68615
68616
68617
68618
68619
68620
68621
68622
68623
68624
68625
68626
68627
68628
68629
68630
68631
68632
68633
68634
68635
68636
68637
68638
68639
68640
68641
68642
68643
68644
68645
68646
68647
68648
68649
68650
68651
68652
68653
68654
68655
68656
68657
68658
68659
68660
68661
68662
68663
68664
68665
68666
68667
68668
68669
68670
68671
68672
68673
68674
68675
68676
68677
68678
68679
68680
68681
68682
68683
68684
68685
68686
68687
68688
68689
68690
68691
68692
68693
68694
68695
68696
68697
68698
68699
68700
68701
68702
68703
68704
68705
68706
68707
68708
68709
68710
68711
68712
68713
68714
68715
68716
68717
68718
68719
68720
68721
68722
68723
68724
68725
68726
68727
68728
68729
68730
68731
68732
68733
68734
68735
68736
68737
68738
68739
68740
68741
68742
68743
68744
68745
68746
68747
68748
68749
68750
68751
68752
68753
68754
68755
68756
68757
68758
68759
68760
68761
68762
68763
68764
68765
68766
68767
68768
68769
68770
68771
68772
68773
68774
68775
68776
68777
68778
68779
68780
68781
68782
68783
68784
68785
68786
68787
68788
68789
68790
68791
68792
68793
68794
68795
68796
68797
68798
68799
68800
68801
68802
68803
68804
68805
68806
68807
68808
68809
68810
68811
68812
68813
68814
68815
68816
68817
68818
68819
68820
68821
68822
68823
68824
68825
68826
68827
68828
68829
68830
68831
68832
68833
68834
68835
68836
68837
68838
68839
68840
68841
68842
68843
68844
68845
68846
68847
68848
68849
68850
68851
68852
68853
68854
68855
68856
68857
68858
68859
68860
68861
68862
68863
68864
68865
68866
68867
68868
68869
68870
68871
68872
68873
68874
68875
68876
68877
68878
68879
68880
68881
68882
68883
68884
68885
68886
68887
68888
68889
68890
68891
68892
68893
68894
68895
68896
68897
68898
68899
68900
68901
68902
68903
68904
68905
68906
68907
68908
68909
68910
68911
68912
68913
68914
68915
68916
68917
68918
68919
68920
68921
68922
68923
68924
68925
68926
68927
68928
68929
68930
68931
68932
68933
68934
68935
68936
68937
68938
68939
68940
68941
68942
68943
68944
68945
68946
68947
68948
68949
68950
68951
68952
68953
68954
68955
68956
68957
68958
68959
68960
68961
68962
68963
68964
68965
68966
68967
68968
68969
68970
68971
68972
68973
68974
68975
68976
68977
68978
68979
68980
68981
68982
68983
68984
68985
68986
68987
68988
68989
68990
68991
68992
68993
68994
68995
68996
68997
68998
68999
69000
69001
69002
69003
69004
69005
69006
69007
69008
69009
69010
69011
69012
69013
69014
69015
69016
69017
69018
69019
69020
69021
69022
69023
69024
69025
69026
69027
69028
69029
69030
69031
69032
69033
69034
69035
69036
69037
69038
69039
69040
69041
69042
69043
69044
69045
69046
69047
69048
69049
69050
69051
69052
69053
69054
69055
69056
69057
69058
69059
69060
69061
69062
69063
69064
69065
69066
69067
69068
69069
69070
69071
69072
69073
69074
69075
69076
69077
69078
69079
69080
69081
69082
69083
69084
69085
69086
69087
69088
69089
69090
69091
69092
69093
69094
69095
69096
69097
69098
69099
69100
69101
69102
69103
69104
69105
69106
69107
69108
69109
69110
69111
69112
69113
69114
69115
69116
69117
69118
69119
69120
69121
69122
69123
69124
69125
69126
69127
69128
69129
69130
69131
69132
69133
69134
69135
69136
69137
69138
69139
69140
69141
69142
69143
69144
69145
69146
69147
69148
69149
69150
69151
69152
69153
69154
69155
69156
69157
69158
69159
69160
69161
69162
69163
69164
69165
69166
69167
69168
69169
69170
69171
69172
69173
69174
69175
69176
69177
69178
69179
69180
69181
69182
69183
69184
69185
69186
69187
69188
69189
69190
69191
69192
69193
69194
69195
69196
69197
69198
69199
69200
69201
69202
69203
69204
69205
69206
69207
69208
69209
69210
69211
69212
69213
69214
69215
69216
69217
69218
69219
69220
69221
69222
69223
69224
69225
69226
69227
69228
69229
69230
69231
69232
69233
69234
69235
69236
69237
69238
69239
69240
69241
69242
69243
69244
69245
69246
69247
69248
69249
69250
69251
69252
69253
69254
69255
69256
69257
69258
69259
69260
69261
69262
69263
69264
69265
69266
69267
69268
69269
69270
69271
69272
69273
69274
69275
69276
69277
69278
69279
69280
69281
69282
69283
69284
69285
69286
69287
69288
69289
69290
69291
69292
69293
69294
69295
69296
69297
69298
69299
69300
69301
69302
69303
69304
69305
69306
69307
69308
69309
69310
69311
69312
69313
69314
69315
69316
69317
69318
69319
69320
69321
69322
69323
69324
69325
69326
69327
69328
69329
69330
69331
69332
69333
69334
69335
69336
69337
69338
69339
69340
69341
69342
69343
69344
69345
69346
69347
69348
69349
69350
69351
69352
69353
69354
69355
69356
69357
69358
69359
69360
69361
69362
69363
69364
69365
69366
69367
69368
69369
69370
69371
69372
69373
69374
69375
69376
69377
69378
69379
69380
69381
69382
69383
69384
69385
69386
69387
69388
69389
69390
69391
69392
69393
69394
69395
69396
69397
69398
69399
69400
69401
69402
69403
69404
69405
69406
69407
69408
69409
69410
69411
69412
69413
69414
69415
69416
69417
69418
69419
69420
69421
69422
69423
69424
69425
69426
69427
69428
69429
69430
69431
69432
69433
69434
69435
69436
69437
69438
69439
69440
69441
69442
69443
69444
69445
69446
69447
69448
69449
69450
69451
69452
69453
69454
69455
69456
69457
69458
69459
69460
69461
69462
69463
69464
69465
69466
69467
69468
69469
69470
69471
69472
69473
69474
69475
69476
69477
69478
69479
69480
69481
69482
69483
69484
69485
69486
69487
69488
69489
69490
69491
69492
69493
69494
69495
69496
69497
69498
69499
69500
69501
69502
69503
69504
69505
69506
69507
69508
69509
69510
69511
69512
69513
69514
69515
69516
69517
69518
69519
69520
69521
69522
69523
69524
69525
69526
69527
69528
69529
69530
69531
69532
69533
69534
69535
69536
69537
69538
69539
69540
69541
69542
69543
69544
69545
69546
69547
69548
69549
69550
69551
69552
69553
69554
69555
69556
69557
69558
69559
69560
69561
69562
69563
69564
69565
69566
69567
69568
69569
69570
69571
69572
69573
69574
69575
69576
69577
69578
69579
69580
69581
69582
69583
69584
69585
69586
69587
69588
69589
69590
69591
69592
69593
69594
69595
69596
69597
69598
69599
69600
69601
69602
69603
69604
69605
69606
69607
69608
69609
69610
69611
69612
69613
69614
69615
69616
69617
69618
69619
69620
69621
69622
69623
69624
69625
69626
69627
69628
69629
69630
69631
69632
69633
69634
69635
69636
69637
69638
69639
69640
69641
69642
69643
69644
69645
69646
69647
69648
69649
69650
69651
69652
69653
69654
69655
69656
69657
69658
69659
69660
69661
69662
69663
69664
69665
69666
69667
69668
69669
69670
69671
69672
69673
69674
69675
69676
69677
69678
69679
69680
69681
69682
69683
69684
69685
69686
69687
69688
69689
69690
69691
69692
69693
69694
69695
69696
69697
69698
69699
69700
69701
69702
69703
69704
69705
69706
69707
69708
69709
69710
69711
69712
69713
69714
69715
69716
69717
69718
69719
69720
69721
69722
69723
69724
69725
69726
69727
69728
69729
69730
69731
69732
69733
69734
69735
69736
69737
69738
69739
69740
69741
69742
69743
69744
69745
69746
69747
69748
69749
69750
69751
69752
69753
69754
69755
69756
69757
69758
69759
69760
69761
69762
69763
69764
69765
69766
69767
69768
69769
69770
69771
69772
69773
69774
69775
69776
69777
69778
69779
69780
69781
69782
69783
69784
69785
69786
69787
69788
69789
69790
69791
69792
69793
69794
69795
69796
69797
69798
69799
69800
69801
69802
69803
69804
69805
69806
69807
69808
69809
69810
69811
69812
69813
69814
69815
69816
69817
69818
69819
69820
69821
69822
69823
69824
69825
69826
69827
69828
69829
69830
69831
69832
69833
69834
69835
69836
69837
69838
69839
69840
69841
69842
69843
69844
69845
69846
69847
69848
69849
69850
69851
69852
69853
69854
69855
69856
69857
69858
69859
69860
69861
69862
69863
69864
69865
69866
69867
69868
69869
69870
69871
69872
69873
69874
69875
69876
69877
69878
69879
69880
69881
69882
69883
69884
69885
69886
69887
69888
69889
69890
69891
69892
69893
69894
69895
69896
69897
69898
69899
69900
69901
69902
69903
69904
69905
69906
69907
69908
69909
69910
69911
69912
69913
69914
69915
69916
69917
69918
69919
69920
69921
69922
69923
69924
69925
69926
69927
69928
69929
69930
69931
69932
69933
69934
69935
69936
69937
69938
69939
69940
69941
69942
69943
69944
69945
69946
69947
69948
69949
69950
69951
69952
69953
69954
69955
69956
69957
69958
69959
69960
69961
69962
69963
69964
69965
69966
69967
69968
69969
69970
69971
69972
69973
69974
69975
69976
69977
69978
69979
69980
69981
69982
69983
69984
69985
69986
69987
69988
69989
69990
69991
69992
69993
69994
69995
69996
69997
69998
69999
70000
70001
70002
70003
70004
70005
70006
70007
70008
70009
70010
70011
70012
70013
70014
70015
70016
70017
70018
70019
70020
70021
70022
70023
70024
70025
70026
70027
70028
70029
70030
70031
70032
70033
70034
70035
70036
70037
70038
70039
70040
70041
70042
70043
70044
70045
70046
70047
70048
70049
70050
70051
70052
70053
70054
70055
70056
70057
70058
70059
70060
70061
70062
70063
70064
70065
70066
70067
70068
70069
70070
70071
70072
70073
70074
70075
70076
70077
70078
70079
70080
70081
70082
70083
70084
70085
70086
70087
70088
70089
70090
70091
70092
70093
70094
70095
70096
70097
70098
70099
70100
70101
70102
70103
70104
70105
70106
70107
70108
70109
70110
70111
70112
70113
70114
70115
70116
70117
70118
70119
70120
70121
70122
70123
70124
70125
70126
70127
70128
70129
70130
70131
70132
70133
70134
70135
70136
70137
70138
70139
70140
70141
70142
70143
70144
70145
70146
70147
70148
70149
70150
70151
70152
70153
70154
70155
70156
70157
70158
70159
70160
70161
70162
70163
70164
70165
70166
70167
70168
70169
70170
70171
70172
70173
70174
70175
70176
70177
70178
70179
70180
70181
70182
70183
70184
70185
70186
70187
70188
70189
70190
70191
70192
70193
70194
70195
70196
70197
70198
70199
70200
70201
70202
70203
70204
70205
70206
70207
70208
70209
70210
70211
70212
70213
70214
70215
70216
70217
70218
70219
70220
70221
70222
70223
70224
70225
70226
70227
70228
70229
70230
70231
70232
70233
70234
70235
70236
70237
70238
70239
70240
70241
70242
70243
70244
70245
70246
70247
70248
70249
70250
70251
70252
70253
70254
70255
70256
70257
70258
70259
70260
70261
70262
70263
70264
70265
70266
70267
70268
70269
70270
70271
70272
70273
70274
70275
70276
70277
70278
70279
70280
70281
70282
70283
70284
70285
70286
70287
70288
70289
70290
70291
70292
70293
70294
70295
70296
70297
70298
70299
70300
70301
70302
70303
70304
70305
70306
70307
70308
70309
70310
70311
70312
70313
70314
70315
70316
70317
70318
70319
70320
70321
70322
70323
70324
70325
70326
70327
70328
70329
70330
70331
70332
70333
70334
70335
70336
70337
70338
70339
70340
70341
70342
70343
70344
70345
70346
70347
70348
70349
70350
70351
70352
70353
70354
70355
70356
70357
70358
70359
70360
70361
70362
70363
70364
70365
70366
70367
70368
70369
70370
70371
70372
70373
70374
70375
70376
70377
70378
70379
70380
70381
70382
70383
70384
70385
70386
70387
70388
70389
70390
70391
70392
70393
70394
70395
70396
70397
70398
70399
70400
70401
70402
70403
70404
70405
70406
70407
70408
70409
70410
70411
70412
70413
70414
70415
70416
70417
70418
70419
70420
70421
70422
70423
70424
70425
70426
70427
70428
70429
70430
70431
70432
70433
70434
70435
70436
70437
70438
70439
70440
70441
70442
70443
70444
70445
70446
70447
70448
70449
70450
70451
70452
70453
70454
70455
70456
70457
70458
70459
70460
70461
70462
70463
70464
70465
70466
70467
70468
70469
70470
70471
70472
70473
70474
70475
70476
70477
70478
70479
70480
70481
70482
70483
70484
70485
70486
70487
70488
70489
70490
70491
70492
70493
70494
70495
70496
70497
70498
70499
70500
70501
70502
70503
70504
70505
70506
70507
70508
70509
70510
70511
70512
70513
70514
70515
70516
70517
70518
70519
70520
70521
70522
70523
70524
70525
70526
70527
70528
70529
70530
70531
70532
70533
70534
70535
70536
70537
70538
70539
70540
70541
70542
70543
70544
70545
70546
70547
70548
70549
70550
70551
70552
70553
70554
70555
70556
70557
70558
70559
70560
70561
70562
70563
70564
70565
70566
70567
70568
70569
70570
70571
70572
70573
70574
70575
70576
70577
70578
70579
70580
70581
70582
70583
70584
70585
70586
70587
70588
70589
70590
70591
70592
70593
70594
70595
70596
70597
70598
70599
70600
70601
70602
70603
70604
70605
70606
70607
70608
70609
70610
70611
70612
70613
70614
70615
70616
70617
70618
70619
70620
70621
70622
70623
70624
70625
70626
70627
70628
70629
70630
70631
70632
70633
70634
70635
70636
70637
70638
70639
70640
70641
70642
70643
70644
70645
70646
70647
70648
70649
70650
70651
70652
70653
70654
70655
70656
70657
70658
70659
70660
70661
70662
70663
70664
70665
70666
70667
70668
70669
70670
70671
70672
70673
70674
70675
70676
70677
70678
70679
70680
70681
70682
70683
70684
70685
70686
70687
70688
70689
70690
70691
70692
70693
70694
70695
70696
70697
70698
70699
70700
70701
70702
70703
70704
70705
70706
70707
70708
70709
70710
70711
70712
70713
70714
70715
70716
70717
70718
70719
70720
70721
70722
70723
70724
70725
70726
70727
70728
70729
70730
70731
70732
70733
70734
70735
70736
70737
70738
70739
70740
70741
70742
70743
70744
70745
70746
70747
70748
70749
70750
70751
70752
70753
70754
70755
70756
70757
70758
70759
70760
70761
70762
70763
70764
70765
70766
70767
70768
70769
70770
70771
70772
70773
70774
70775
70776
70777
70778
70779
70780
70781
70782
70783
70784
70785
70786
70787
70788
70789
70790
70791
70792
70793
70794
70795
70796
70797
70798
70799
70800
70801
70802
70803
70804
70805
70806
70807
70808
70809
70810
70811
70812
70813
70814
70815
70816
70817
70818
70819
70820
70821
70822
70823
70824
70825
70826
70827
70828
70829
70830
70831
70832
70833
70834
70835
70836
70837
70838
70839
70840
70841
70842
70843
70844
70845
70846
70847
70848
70849
70850
70851
70852
70853
70854
70855
70856
70857
70858
70859
70860
70861
70862
70863
70864
70865
70866
70867
70868
70869
70870
70871
70872
70873
70874
70875
70876
70877
70878
70879
70880
70881
70882
70883
70884
70885
70886
70887
70888
70889
70890
70891
70892
70893
70894
70895
70896
70897
70898
70899
70900
70901
70902
70903
70904
70905
70906
70907
70908
70909
70910
70911
70912
70913
70914
70915
70916
70917
70918
70919
70920
70921
70922
70923
70924
70925
70926
70927
70928
70929
70930
70931
70932
70933
70934
70935
70936
70937
70938
70939
70940
70941
70942
70943
70944
70945
70946
70947
70948
70949
70950
70951
70952
70953
70954
70955
70956
70957
70958
70959
70960
70961
70962
70963
70964
70965
70966
70967
70968
70969
70970
70971
70972
70973
70974
70975
70976
70977
70978
70979
70980
70981
70982
70983
70984
70985
70986
70987
70988
70989
70990
70991
70992
70993
70994
70995
70996
70997
70998
70999
71000
71001
71002
71003
71004
71005
71006
71007
71008
71009
71010
71011
71012
71013
71014
71015
71016
71017
71018
71019
71020
71021
71022
71023
71024
71025
71026
71027
71028
71029
71030
71031
71032
71033
71034
71035
71036
71037
71038
71039
71040
71041
71042
71043
71044
71045
71046
71047
71048
71049
71050
71051
71052
71053
71054
71055
71056
71057
71058
71059
71060
71061
71062
71063
71064
71065
71066
71067
71068
71069
71070
71071
71072
71073
71074
71075
71076
71077
71078
71079
71080
71081
71082
71083
71084
71085
71086
71087
71088
71089
71090
71091
71092
71093
71094
71095
71096
71097
71098
71099
71100
71101
71102
71103
71104
71105
71106
71107
71108
71109
71110
71111
71112
71113
71114
71115
71116
71117
71118
71119
71120
71121
71122
71123
71124
71125
71126
71127
71128
71129
71130
71131
71132
71133
71134
71135
71136
71137
71138
71139
71140
71141
71142
71143
71144
71145
71146
71147
71148
71149
71150
71151
71152
71153
71154
71155
71156
71157
71158
71159
71160
71161
71162
71163
71164
71165
71166
71167
71168
71169
71170
71171
71172
71173
71174
71175
71176
71177
71178
71179
71180
71181
71182
71183
71184
71185
71186
71187
71188
71189
71190
71191
71192
71193
71194
71195
71196
71197
71198
71199
71200
71201
71202
71203
71204
71205
71206
71207
71208
71209
71210
71211
71212
71213
71214
71215
71216
71217
71218
71219
71220
71221
71222
71223
71224
71225
71226
71227
71228
71229
71230
71231
71232
71233
71234
71235
71236
71237
71238
71239
71240
71241
71242
71243
71244
71245
71246
71247
71248
71249
71250
71251
71252
71253
71254
71255
71256
71257
71258
71259
71260
71261
71262
71263
71264
71265
71266
71267
71268
71269
71270
71271
71272
71273
71274
71275
71276
71277
71278
71279
71280
71281
71282
71283
71284
71285
71286
71287
71288
71289
71290
71291
71292
71293
71294
71295
71296
71297
71298
71299
71300
71301
71302
71303
71304
71305
71306
71307
71308
71309
71310
71311
71312
71313
71314
71315
71316
71317
71318
71319
71320
71321
71322
71323
71324
71325
71326
71327
71328
71329
71330
71331
71332
71333
71334
71335
71336
71337
71338
71339
71340
71341
71342
71343
71344
71345
71346
71347
71348
71349
71350
71351
71352
71353
71354
71355
71356
71357
71358
71359
71360
71361
71362
71363
71364
71365
71366
71367
71368
71369
71370
71371
71372
71373
71374
71375
71376
71377
71378
71379
71380
71381
71382
71383
71384
71385
71386
71387
71388
71389
71390
71391
71392
71393
71394
71395
71396
71397
71398
71399
71400
71401
71402
71403
71404
71405
71406
71407
71408
71409
71410
71411
71412
71413
71414
71415
71416
71417
71418
71419
71420
71421
71422
71423
71424
71425
71426
71427
71428
71429
71430
71431
71432
71433
71434
71435
71436
71437
71438
71439
71440
71441
71442
71443
71444
71445
71446
71447
71448
71449
71450
71451
71452
71453
71454
71455
71456
71457
71458
71459
71460
71461
71462
71463
71464
71465
71466
71467
71468
71469
71470
71471
71472
71473
71474
71475
71476
71477
71478
71479
71480
71481
71482
71483
71484
71485
71486
71487
71488
71489
71490
71491
71492
71493
71494
71495
71496
71497
71498
71499
71500
71501
71502
71503
71504
71505
71506
71507
71508
71509
71510
71511
71512
71513
71514
71515
71516
71517
71518
71519
71520
71521
71522
71523
71524
71525
71526
71527
71528
71529
71530
71531
71532
71533
71534
71535
71536
71537
71538
71539
71540
71541
71542
71543
71544
71545
71546
71547
71548
71549
71550
71551
71552
71553
71554
71555
71556
71557
71558
71559
71560
71561
71562
71563
71564
71565
71566
71567
71568
71569
71570
71571
71572
71573
71574
71575
71576
71577
71578
71579
71580
71581
71582
71583
71584
71585
71586
71587
71588
71589
71590
71591
71592
71593
71594
71595
71596
71597
71598
71599
71600
71601
71602
71603
71604
71605
71606
71607
71608
71609
71610
71611
71612
71613
71614
71615
71616
71617
71618
71619
71620
71621
71622
71623
71624
71625
71626
71627
71628
71629
71630
71631
71632
71633
71634
71635
71636
71637
71638
71639
71640
71641
71642
71643
71644
71645
71646
71647
71648
71649
71650
71651
71652
71653
71654
71655
71656
71657
71658
71659
71660
71661
71662
71663
71664
71665
71666
71667
71668
71669
71670
71671
71672
71673
71674
71675
71676
71677
71678
71679
71680
71681
71682
71683
71684
71685
71686
71687
71688
71689
71690
71691
71692
71693
71694
71695
71696
71697
71698
71699
71700
71701
71702
71703
71704
71705
71706
71707
71708
71709
71710
71711
71712
71713
71714
71715
71716
71717
71718
71719
71720
71721
71722
71723
71724
71725
71726
71727
71728
71729
71730
71731
71732
71733
71734
71735
71736
71737
71738
71739
71740
71741
71742
71743
71744
71745
71746
71747
71748
71749
71750
71751
71752
71753
71754
71755
71756
71757
71758
71759
71760
71761
71762
71763
71764
71765
71766
71767
71768
71769
71770
71771
71772
71773
71774
71775
71776
71777
71778
71779
71780
71781
71782
71783
71784
71785
71786
71787
71788
71789
71790
71791
71792
71793
71794
71795
71796
71797
71798
71799
71800
71801
71802
71803
71804
71805
71806
71807
71808
71809
71810
71811
71812
71813
71814
71815
71816
71817
71818
71819
71820
71821
71822
71823
71824
71825
71826
71827
71828
71829
71830
71831
71832
71833
71834
71835
71836
71837
71838
71839
71840
71841
71842
71843
71844
71845
71846
71847
71848
71849
71850
71851
71852
71853
71854
71855
71856
71857
71858
71859
71860
71861
71862
71863
71864
71865
71866
71867
71868
71869
71870
71871
71872
71873
71874
71875
71876
71877
71878
71879
71880
71881
71882
71883
71884
71885
71886
71887
71888
71889
71890
71891
71892
71893
71894
71895
71896
71897
71898
71899
71900
71901
71902
71903
71904
71905
71906
71907
71908
71909
71910
71911
71912
71913
71914
71915
71916
71917
71918
71919
71920
71921
71922
71923
71924
71925
71926
71927
71928
71929
71930
71931
71932
71933
71934
71935
71936
71937
71938
71939
71940
71941
71942
71943
71944
71945
71946
71947
71948
71949
71950
71951
71952
71953
71954
71955
71956
71957
71958
71959
71960
71961
71962
71963
71964
71965
71966
71967
71968
71969
71970
71971
71972
71973
71974
71975
71976
71977
71978
71979
71980
71981
71982
71983
71984
71985
71986
71987
71988
71989
71990
71991
71992
71993
71994
71995
71996
71997
71998
71999
72000
72001
72002
72003
72004
72005
72006
72007
72008
72009
72010
72011
72012
72013
72014
72015
72016
72017
72018
72019
72020
72021
72022
72023
72024
72025
72026
72027
72028
72029
72030
72031
72032
72033
72034
72035
72036
72037
72038
72039
72040
72041
72042
72043
72044
72045
72046
72047
72048
72049
72050
72051
72052
72053
72054
72055
72056
72057
72058
72059
72060
72061
72062
72063
72064
72065
72066
72067
72068
72069
72070
72071
72072
72073
72074
72075
72076
72077
72078
72079
72080
72081
72082
72083
72084
72085
72086
72087
72088
72089
72090
72091
72092
72093
72094
72095
72096
72097
72098
72099
72100
72101
72102
72103
72104
72105
72106
72107
72108
72109
72110
72111
72112
72113
72114
72115
72116
72117
72118
72119
72120
72121
72122
72123
72124
72125
72126
72127
72128
72129
72130
72131
72132
72133
72134
72135
72136
72137
72138
72139
72140
72141
72142
72143
72144
72145
72146
72147
72148
72149
72150
72151
72152
72153
72154
72155
72156
72157
72158
72159
72160
72161
72162
72163
72164
72165
72166
72167
72168
72169
72170
72171
72172
72173
72174
72175
72176
72177
72178
72179
72180
72181
72182
72183
72184
72185
72186
72187
72188
72189
72190
72191
72192
72193
72194
72195
72196
72197
72198
72199
72200
72201
72202
72203
72204
72205
72206
72207
72208
72209
72210
72211
72212
72213
72214
72215
72216
72217
72218
72219
72220
72221
72222
72223
72224
72225
72226
72227
72228
72229
72230
72231
72232
72233
72234
72235
72236
72237
72238
72239
72240
72241
72242
72243
72244
72245
72246
72247
72248
72249
72250
72251
72252
72253
72254
72255
72256
72257
72258
72259
72260
72261
72262
72263
72264
72265
72266
72267
72268
72269
72270
72271
72272
72273
72274
72275
72276
72277
72278
72279
72280
72281
72282
72283
72284
72285
72286
72287
72288
72289
72290
72291
72292
72293
72294
72295
72296
72297
72298
72299
72300
72301
72302
72303
72304
72305
72306
72307
72308
72309
72310
72311
72312
72313
72314
72315
72316
72317
72318
72319
72320
72321
72322
72323
72324
72325
72326
72327
72328
72329
72330
72331
72332
72333
72334
72335
72336
72337
72338
72339
72340
72341
72342
72343
72344
72345
72346
72347
72348
72349
72350
72351
72352
72353
72354
72355
72356
72357
72358
72359
72360
72361
72362
72363
72364
72365
72366
72367
72368
72369
72370
72371
72372
72373
72374
72375
72376
72377
72378
72379
72380
72381
72382
72383
72384
72385
72386
72387
72388
72389
72390
72391
72392
72393
72394
72395
72396
72397
72398
72399
72400
72401
72402
72403
72404
72405
72406
72407
72408
72409
72410
72411
72412
72413
72414
72415
72416
72417
72418
72419
72420
72421
72422
72423
72424
72425
72426
72427
72428
72429
72430
72431
72432
72433
72434
72435
72436
72437
72438
72439
72440
72441
72442
72443
72444
72445
72446
72447
72448
72449
72450
72451
72452
72453
72454
72455
72456
72457
72458
72459
72460
72461
72462
72463
72464
72465
72466
72467
72468
72469
72470
72471
72472
72473
72474
72475
72476
72477
72478
72479
72480
72481
72482
72483
72484
72485
72486
72487
72488
72489
72490
72491
72492
72493
72494
72495
72496
72497
72498
72499
72500
72501
72502
72503
72504
72505
72506
72507
72508
72509
72510
72511
72512
72513
72514
72515
72516
72517
72518
72519
72520
72521
72522
72523
72524
72525
72526
72527
72528
72529
72530
72531
72532
72533
72534
72535
72536
72537
72538
72539
72540
72541
72542
72543
72544
72545
72546
72547
72548
72549
72550
72551
72552
72553
72554
72555
72556
72557
72558
72559
72560
72561
72562
72563
72564
72565
72566
72567
72568
72569
72570
72571
72572
72573
72574
72575
72576
72577
72578
72579
72580
72581
72582
72583
72584
72585
72586
72587
72588
72589
72590
72591
72592
72593
72594
72595
72596
72597
72598
72599
72600
72601
72602
72603
72604
72605
72606
72607
72608
72609
72610
72611
72612
72613
72614
72615
72616
72617
72618
72619
72620
72621
72622
72623
72624
72625
72626
72627
72628
72629
72630
72631
72632
72633
72634
72635
72636
72637
72638
72639
72640
72641
72642
72643
72644
72645
72646
72647
72648
72649
72650
72651
72652
72653
72654
72655
72656
72657
72658
72659
72660
72661
72662
72663
72664
72665
72666
72667
72668
72669
72670
72671
72672
72673
72674
72675
72676
72677
72678
72679
72680
72681
72682
72683
72684
72685
72686
72687
72688
72689
72690
72691
72692
72693
72694
72695
72696
72697
72698
72699
72700
72701
72702
72703
72704
72705
72706
72707
72708
72709
72710
72711
72712
72713
72714
72715
72716
72717
72718
72719
72720
72721
72722
72723
72724
72725
72726
72727
72728
72729
72730
72731
72732
72733
72734
72735
72736
72737
72738
72739
72740
72741
72742
72743
72744
72745
72746
72747
72748
72749
72750
72751
72752
72753
72754
72755
72756
72757
72758
72759
72760
72761
72762
72763
72764
72765
72766
72767
72768
72769
72770
72771
72772
72773
72774
72775
72776
72777
72778
72779
72780
72781
72782
72783
72784
72785
72786
72787
72788
72789
72790
72791
72792
72793
72794
72795
72796
72797
72798
72799
72800
72801
72802
72803
72804
72805
72806
72807
72808
72809
72810
72811
72812
72813
72814
72815
72816
72817
72818
72819
72820
72821
72822
72823
72824
72825
72826
72827
72828
72829
72830
72831
72832
72833
72834
72835
72836
72837
72838
72839
72840
72841
72842
72843
72844
72845
72846
72847
72848
72849
72850
72851
72852
72853
72854
72855
72856
72857
72858
72859
72860
72861
72862
72863
72864
72865
72866
72867
72868
72869
72870
72871
72872
72873
72874
72875
72876
72877
72878
72879
72880
72881
72882
72883
72884
72885
72886
72887
72888
72889
72890
72891
72892
72893
72894
72895
72896
72897
72898
72899
72900
72901
72902
72903
72904
72905
72906
72907
72908
72909
72910
72911
72912
72913
72914
72915
72916
72917
72918
72919
72920
72921
72922
72923
72924
72925
72926
72927
72928
72929
72930
72931
72932
72933
72934
72935
72936
72937
72938
72939
72940
72941
72942
72943
72944
72945
72946
72947
72948
72949
72950
72951
72952
72953
72954
72955
72956
72957
72958
72959
72960
72961
72962
72963
72964
72965
72966
72967
72968
72969
72970
72971
72972
72973
72974
72975
72976
72977
72978
72979
72980
72981
72982
72983
72984
72985
72986
72987
72988
72989
72990
72991
72992
72993
72994
72995
72996
72997
72998
72999
73000
73001
73002
73003
73004
73005
73006
73007
73008
73009
73010
73011
73012
73013
73014
73015
73016
73017
73018
73019
73020
73021
73022
73023
73024
73025
73026
73027
73028
73029
73030
73031
73032
73033
73034
73035
73036
73037
73038
73039
73040
73041
73042
73043
73044
73045
73046
73047
73048
73049
73050
73051
73052
73053
73054
73055
73056
73057
73058
73059
73060
73061
73062
73063
73064
73065
73066
73067
73068
73069
73070
73071
73072
73073
73074
73075
73076
73077
73078
73079
73080
73081
73082
73083
73084
73085
73086
73087
73088
73089
73090
73091
73092
73093
73094
73095
73096
73097
73098
73099
73100
73101
73102
73103
73104
73105
73106
73107
73108
73109
73110
73111
73112
73113
73114
73115
73116
73117
73118
73119
73120
73121
73122
73123
73124
73125
73126
73127
73128
73129
73130
73131
73132
73133
73134
73135
73136
73137
73138
73139
73140
73141
73142
73143
73144
73145
73146
73147
73148
73149
73150
73151
73152
73153
73154
73155
73156
73157
73158
73159
73160
73161
73162
73163
73164
73165
73166
73167
73168
73169
73170
73171
73172
73173
73174
73175
73176
73177
73178
73179
73180
73181
73182
73183
73184
73185
73186
73187
73188
73189
73190
73191
73192
73193
73194
73195
73196
73197
73198
73199
73200
73201
73202
73203
73204
73205
73206
73207
73208
73209
73210
73211
73212
73213
73214
73215
73216
73217
73218
73219
73220
73221
73222
73223
73224
73225
73226
73227
73228
73229
73230
73231
73232
73233
73234
73235
73236
73237
73238
73239
73240
73241
73242
73243
73244
73245
73246
73247
73248
73249
73250
73251
73252
73253
73254
73255
73256
73257
73258
73259
73260
73261
73262
73263
73264
73265
73266
73267
73268
73269
73270
73271
73272
73273
73274
73275
73276
73277
73278
73279
73280
73281
73282
73283
73284
73285
73286
73287
73288
73289
73290
73291
73292
73293
73294
73295
73296
73297
73298
73299
73300
73301
73302
73303
73304
73305
73306
73307
73308
73309
73310
73311
73312
73313
73314
73315
73316
73317
73318
73319
73320
73321
73322
73323
73324
73325
73326
73327
73328
73329
73330
73331
73332
73333
73334
73335
73336
73337
73338
73339
73340
73341
73342
73343
73344
73345
73346
73347
73348
73349
73350
73351
73352
73353
73354
73355
73356
73357
73358
73359
73360
73361
73362
73363
73364
73365
73366
73367
73368
73369
73370
73371
73372
73373
73374
73375
73376
73377
73378
73379
73380
73381
73382
73383
73384
73385
73386
73387
73388
73389
73390
73391
73392
73393
73394
73395
73396
73397
73398
73399
73400
73401
73402
73403
73404
73405
73406
73407
73408
73409
73410
73411
73412
73413
73414
73415
73416
73417
73418
73419
73420
73421
73422
73423
73424
73425
73426
73427
73428
73429
73430
73431
73432
73433
73434
73435
73436
73437
73438
73439
73440
73441
73442
73443
73444
73445
73446
73447
73448
73449
73450
73451
73452
73453
73454
73455
73456
73457
73458
73459
73460
73461
73462
73463
73464
73465
73466
73467
73468
73469
73470
73471
73472
73473
73474
73475
73476
73477
73478
73479
73480
73481
73482
73483
73484
73485
73486
73487
73488
73489
73490
73491
73492
73493
73494
73495
73496
73497
73498
73499
73500
73501
73502
73503
73504
73505
73506
73507
73508
73509
73510
73511
73512
73513
73514
73515
73516
73517
73518
73519
73520
73521
73522
73523
73524
73525
73526
73527
73528
73529
73530
73531
73532
73533
73534
73535
73536
73537
73538
73539
73540
73541
73542
73543
73544
73545
73546
73547
73548
73549
73550
73551
73552
73553
73554
73555
73556
73557
73558
73559
73560
73561
73562
73563
73564
73565
73566
73567
73568
73569
73570
73571
73572
73573
73574
73575
73576
73577
73578
73579
73580
73581
73582
73583
73584
73585
73586
73587
73588
73589
73590
73591
73592
73593
73594
73595
73596
73597
73598
73599
73600
73601
73602
73603
73604
73605
73606
73607
73608
73609
73610
73611
73612
73613
73614
73615
73616
73617
73618
73619
73620
73621
73622
73623
73624
73625
73626
73627
73628
73629
73630
73631
73632
73633
73634
73635
73636
73637
73638
73639
73640
73641
73642
73643
73644
73645
73646
73647
73648
73649
73650
73651
73652
73653
73654
73655
73656
73657
73658
73659
73660
73661
73662
73663
73664
73665
73666
73667
73668
73669
73670
73671
73672
73673
73674
73675
73676
73677
73678
73679
73680
73681
73682
73683
73684
73685
73686
73687
73688
73689
73690
73691
73692
73693
73694
73695
73696
73697
73698
73699
73700
73701
73702
73703
73704
73705
73706
73707
73708
73709
73710
73711
73712
73713
73714
73715
73716
73717
73718
73719
73720
73721
73722
73723
73724
73725
73726
73727
73728
73729
73730
73731
73732
73733
73734
73735
73736
73737
73738
73739
73740
73741
73742
73743
73744
73745
73746
73747
73748
73749
73750
73751
73752
73753
73754
73755
73756
73757
73758
73759
73760
73761
73762
73763
73764
73765
73766
73767
73768
73769
73770
73771
73772
73773
73774
73775
73776
73777
73778
73779
73780
73781
73782
73783
73784
73785
73786
73787
73788
73789
73790
73791
73792
73793
73794
73795
73796
73797
73798
73799
73800
73801
73802
73803
73804
73805
73806
73807
73808
73809
73810
73811
73812
73813
73814
73815
73816
73817
73818
73819
73820
73821
73822
73823
73824
73825
73826
73827
73828
73829
73830
73831
73832
73833
73834
73835
73836
73837
73838
73839
73840
73841
73842
73843
73844
73845
73846
73847
73848
73849
73850
73851
73852
73853
73854
73855
73856
73857
73858
73859
73860
73861
73862
73863
73864
73865
73866
73867
73868
73869
73870
73871
73872
73873
73874
73875
73876
73877
73878
73879
73880
73881
73882
73883
73884
73885
73886
73887
73888
73889
73890
73891
73892
73893
73894
73895
73896
73897
73898
73899
73900
73901
73902
73903
73904
73905
73906
73907
73908
73909
73910
73911
73912
73913
73914
73915
73916
73917
73918
73919
73920
73921
73922
73923
73924
73925
73926
73927
73928
73929
73930
73931
73932
73933
73934
73935
73936
73937
73938
73939
73940
73941
73942
73943
73944
73945
73946
73947
73948
73949
73950
73951
73952
73953
73954
73955
73956
73957
73958
73959
73960
73961
73962
73963
73964
73965
73966
73967
73968
73969
73970
73971
73972
73973
73974
73975
73976
73977
73978
73979
73980
73981
73982
73983
73984
73985
73986
73987
73988
73989
73990
73991
73992
73993
73994
73995
73996
73997
73998
73999
74000
74001
74002
74003
74004
74005
74006
74007
74008
74009
74010
74011
74012
74013
74014
74015
74016
74017
74018
74019
74020
74021
74022
74023
74024
74025
74026
74027
74028
74029
74030
74031
74032
74033
74034
74035
74036
74037
74038
74039
74040
74041
74042
74043
74044
74045
74046
74047
74048
74049
74050
74051
74052
74053
74054
74055
74056
74057
74058
74059
74060
74061
74062
74063
74064
74065
74066
74067
74068
74069
74070
74071
74072
74073
74074
74075
74076
74077
74078
74079
74080
74081
74082
74083
74084
74085
74086
74087
74088
74089
74090
74091
74092
74093
74094
74095
74096
74097
74098
74099
74100
74101
74102
74103
74104
74105
74106
74107
74108
74109
74110
74111
74112
74113
74114
74115
74116
74117
74118
74119
74120
74121
74122
74123
74124
74125
74126
74127
74128
74129
74130
74131
74132
74133
74134
74135
74136
74137
74138
74139
74140
74141
74142
74143
74144
74145
74146
74147
74148
74149
74150
74151
74152
74153
74154
74155
74156
74157
74158
74159
74160
74161
74162
74163
74164
74165
74166
74167
74168
74169
74170
74171
74172
74173
74174
74175
74176
74177
74178
74179
74180
74181
74182
74183
74184
74185
74186
74187
74188
74189
74190
74191
74192
74193
74194
74195
74196
74197
74198
74199
74200
74201
74202
74203
74204
74205
74206
74207
74208
74209
74210
74211
74212
74213
74214
74215
74216
74217
74218
74219
74220
74221
74222
74223
74224
74225
74226
74227
74228
74229
74230
74231
74232
74233
74234
74235
74236
74237
74238
74239
74240
74241
74242
74243
74244
74245
74246
74247
74248
74249
74250
74251
74252
74253
74254
74255
74256
74257
74258
74259
74260
74261
74262
74263
74264
74265
74266
74267
74268
74269
74270
74271
74272
74273
74274
74275
74276
74277
74278
74279
74280
74281
74282
74283
74284
74285
74286
74287
74288
74289
74290
74291
74292
74293
74294
74295
74296
74297
74298
74299
74300
74301
74302
74303
74304
74305
74306
74307
74308
74309
74310
74311
74312
74313
74314
74315
74316
74317
74318
74319
74320
74321
74322
74323
74324
74325
74326
74327
74328
74329
74330
74331
74332
74333
74334
74335
74336
74337
74338
74339
74340
74341
74342
74343
74344
74345
74346
74347
74348
74349
74350
74351
74352
74353
74354
74355
74356
74357
74358
74359
74360
74361
74362
74363
74364
74365
74366
74367
74368
74369
74370
74371
74372
74373
74374
74375
74376
74377
74378
74379
74380
74381
74382
74383
74384
74385
74386
74387
74388
74389
74390
74391
74392
74393
74394
74395
74396
74397
74398
74399
74400
74401
74402
74403
74404
74405
74406
74407
74408
74409
74410
74411
74412
74413
74414
74415
74416
74417
74418
74419
74420
74421
74422
74423
74424
74425
74426
74427
74428
74429
74430
74431
74432
74433
74434
74435
74436
74437
74438
74439
74440
74441
74442
74443
74444
74445
74446
74447
74448
74449
74450
74451
74452
74453
74454
74455
74456
74457
74458
74459
74460
74461
74462
74463
74464
74465
74466
74467
74468
74469
74470
74471
74472
74473
74474
74475
74476
74477
74478
74479
74480
74481
74482
74483
74484
74485
74486
74487
74488
74489
74490
74491
74492
74493
74494
74495
74496
74497
74498
74499
74500
74501
74502
74503
74504
74505
74506
74507
74508
74509
74510
74511
74512
74513
74514
74515
74516
74517
74518
74519
74520
74521
74522
74523
74524
74525
74526
74527
74528
74529
74530
74531
74532
74533
74534
74535
74536
74537
74538
74539
74540
74541
74542
74543
74544
74545
74546
74547
74548
74549
74550
74551
74552
74553
74554
74555
74556
74557
74558
74559
74560
74561
74562
74563
74564
74565
74566
74567
74568
74569
74570
74571
74572
74573
74574
74575
74576
74577
74578
74579
74580
74581
74582
74583
74584
74585
74586
74587
74588
74589
74590
74591
74592
74593
74594
74595
74596
74597
74598
74599
74600
74601
74602
74603
74604
74605
74606
74607
74608
74609
74610
74611
74612
74613
74614
74615
74616
74617
74618
74619
74620
74621
74622
74623
74624
74625
74626
74627
74628
74629
74630
74631
74632
74633
74634
74635
74636
74637
74638
74639
74640
74641
74642
74643
74644
74645
74646
74647
74648
74649
74650
74651
74652
74653
74654
74655
74656
74657
74658
74659
74660
74661
74662
74663
74664
74665
74666
74667
74668
74669
74670
74671
74672
74673
74674
74675
74676
74677
74678
74679
74680
74681
74682
74683
74684
74685
74686
74687
74688
74689
74690
74691
74692
74693
74694
74695
74696
74697
74698
74699
74700
74701
74702
74703
74704
74705
74706
74707
74708
74709
74710
74711
74712
74713
74714
74715
74716
74717
74718
74719
74720
74721
74722
74723
74724
74725
74726
74727
74728
74729
74730
74731
74732
74733
74734
74735
74736
74737
74738
74739
74740
74741
74742
74743
74744
74745
74746
74747
74748
74749
74750
74751
74752
74753
74754
74755
74756
74757
74758
74759
74760
74761
74762
74763
74764
74765
74766
74767
74768
74769
74770
74771
74772
74773
74774
74775
74776
74777
74778
74779
74780
74781
74782
74783
74784
74785
74786
74787
74788
74789
74790
74791
74792
74793
74794
74795
74796
74797
74798
74799
74800
74801
74802
74803
74804
74805
74806
74807
74808
74809
74810
74811
74812
74813
74814
74815
74816
74817
74818
74819
74820
74821
74822
74823
74824
74825
74826
74827
74828
74829
74830
74831
74832
74833
74834
74835
74836
74837
74838
74839
74840
74841
74842
74843
74844
74845
74846
74847
74848
74849
74850
74851
74852
74853
74854
74855
74856
74857
74858
74859
74860
74861
74862
74863
74864
74865
74866
74867
74868
74869
74870
74871
74872
74873
74874
74875
74876
74877
74878
74879
74880
74881
74882
74883
74884
74885
74886
74887
74888
74889
74890
74891
74892
74893
74894
74895
74896
74897
74898
74899
74900
74901
74902
74903
74904
74905
74906
74907
74908
74909
74910
74911
74912
74913
74914
74915
74916
74917
74918
74919
74920
74921
74922
74923
74924
74925
74926
74927
74928
74929
74930
74931
74932
74933
74934
74935
74936
74937
74938
74939
74940
74941
74942
74943
74944
74945
74946
74947
74948
74949
74950
74951
74952
74953
74954
74955
74956
74957
74958
74959
74960
74961
74962
74963
74964
74965
74966
74967
74968
74969
74970
74971
74972
74973
74974
74975
74976
74977
74978
74979
74980
74981
74982
74983
74984
74985
74986
74987
74988
74989
74990
74991
74992
74993
74994
74995
74996
74997
74998
74999
75000
75001
75002
75003
75004
75005
75006
75007
75008
75009
75010
75011
75012
75013
75014
75015
75016
75017
75018
75019
75020
75021
75022
75023
75024
75025
75026
75027
75028
75029
75030
75031
75032
75033
75034
75035
75036
75037
75038
75039
75040
75041
75042
75043
75044
75045
75046
75047
75048
75049
75050
75051
75052
75053
75054
75055
75056
75057
75058
75059
75060
75061
75062
75063
75064
75065
75066
75067
75068
75069
75070
75071
75072
75073
75074
75075
75076
75077
75078
75079
75080
75081
75082
75083
75084
75085
75086
75087
75088
75089
75090
75091
75092
75093
75094
75095
75096
75097
75098
75099
75100
75101
75102
75103
75104
75105
75106
75107
75108
75109
75110
75111
75112
75113
75114
75115
75116
75117
75118
75119
75120
75121
75122
75123
75124
75125
75126
75127
75128
75129
75130
75131
75132
75133
75134
75135
75136
75137
75138
75139
75140
75141
75142
75143
75144
75145
75146
75147
75148
75149
75150
75151
75152
75153
75154
75155
75156
75157
75158
75159
75160
75161
75162
75163
75164
75165
75166
75167
75168
75169
75170
75171
75172
75173
75174
75175
75176
75177
75178
75179
75180
75181
75182
75183
75184
75185
75186
75187
75188
75189
75190
75191
75192
75193
75194
75195
75196
75197
75198
75199
75200
75201
75202
75203
75204
75205
75206
75207
75208
75209
75210
75211
75212
75213
75214
75215
75216
75217
75218
75219
75220
75221
75222
75223
75224
75225
75226
75227
75228
75229
75230
75231
75232
75233
75234
75235
75236
75237
75238
75239
75240
75241
75242
75243
75244
75245
75246
75247
75248
75249
75250
75251
75252
75253
75254
75255
75256
75257
75258
75259
75260
75261
75262
75263
75264
75265
75266
75267
75268
75269
75270
75271
75272
75273
75274
75275
75276
75277
75278
75279
75280
75281
75282
75283
75284
75285
75286
75287
75288
75289
75290
75291
75292
75293
75294
75295
75296
75297
75298
75299
75300
75301
75302
75303
75304
75305
75306
75307
75308
75309
75310
75311
75312
75313
75314
75315
75316
75317
75318
75319
75320
75321
75322
75323
75324
75325
75326
75327
75328
75329
75330
75331
75332
75333
75334
75335
75336
75337
75338
75339
75340
75341
75342
75343
75344
75345
75346
75347
75348
75349
75350
75351
75352
75353
75354
75355
75356
75357
75358
75359
75360
75361
75362
75363
75364
75365
75366
75367
75368
75369
75370
75371
75372
75373
75374
75375
75376
75377
75378
75379
75380
75381
75382
75383
75384
75385
75386
75387
75388
75389
75390
75391
75392
75393
75394
75395
75396
75397
75398
75399
75400
75401
75402
75403
75404
75405
75406
75407
75408
75409
75410
75411
75412
75413
75414
75415
75416
75417
75418
75419
75420
75421
75422
75423
75424
75425
75426
75427
75428
75429
75430
75431
75432
75433
75434
75435
75436
75437
75438
75439
75440
75441
75442
75443
75444
75445
75446
75447
75448
75449
75450
75451
75452
75453
75454
75455
75456
75457
75458
75459
75460
75461
75462
75463
75464
75465
75466
75467
75468
75469
75470
75471
75472
75473
75474
75475
75476
75477
75478
75479
75480
75481
75482
75483
75484
75485
75486
75487
75488
75489
75490
75491
75492
75493
75494
75495
75496
75497
75498
75499
75500
75501
75502
75503
75504
75505
75506
75507
75508
75509
75510
75511
75512
75513
75514
75515
75516
75517
75518
75519
75520
75521
75522
75523
75524
75525
75526
75527
75528
75529
75530
75531
75532
75533
75534
75535
75536
75537
75538
75539
75540
75541
75542
75543
75544
75545
75546
75547
75548
75549
75550
75551
75552
75553
75554
75555
75556
75557
75558
75559
75560
75561
75562
75563
75564
75565
75566
75567
75568
75569
75570
75571
75572
75573
75574
75575
75576
75577
75578
75579
75580
75581
75582
75583
75584
75585
75586
75587
75588
75589
75590
75591
75592
75593
75594
75595
75596
75597
75598
75599
75600
75601
75602
75603
75604
75605
75606
75607
75608
75609
75610
75611
75612
75613
75614
75615
75616
75617
75618
75619
75620
75621
75622
75623
75624
75625
75626
75627
75628
75629
75630
75631
75632
75633
75634
75635
75636
75637
75638
75639
75640
75641
75642
75643
75644
75645
75646
75647
75648
75649
75650
75651
75652
75653
75654
75655
75656
75657
75658
75659
75660
75661
75662
75663
75664
75665
75666
75667
75668
75669
75670
75671
75672
75673
75674
75675
75676
75677
75678
75679
75680
75681
75682
75683
75684
75685
75686
75687
75688
75689
75690
75691
75692
75693
75694
75695
75696
75697
75698
75699
75700
75701
75702
75703
75704
75705
75706
75707
75708
75709
75710
75711
75712
75713
75714
75715
75716
75717
75718
75719
75720
75721
75722
75723
75724
75725
75726
75727
75728
75729
75730
75731
75732
75733
75734
75735
75736
75737
75738
75739
75740
75741
75742
75743
75744
75745
75746
75747
75748
75749
75750
75751
75752
75753
75754
75755
75756
75757
75758
75759
75760
75761
75762
75763
75764
75765
75766
75767
75768
75769
75770
75771
75772
75773
75774
75775
75776
75777
75778
75779
75780
75781
75782
75783
75784
75785
75786
75787
75788
75789
75790
75791
75792
75793
75794
75795
75796
75797
75798
75799
75800
75801
75802
75803
75804
75805
75806
75807
75808
75809
75810
75811
75812
75813
75814
75815
75816
75817
75818
75819
75820
75821
75822
75823
75824
75825
75826
75827
75828
75829
75830
75831
75832
75833
75834
75835
75836
75837
75838
75839
75840
75841
75842
75843
75844
75845
75846
75847
75848
75849
75850
75851
75852
75853
75854
75855
75856
75857
75858
75859
75860
75861
75862
75863
75864
75865
75866
75867
75868
75869
75870
75871
75872
75873
75874
75875
75876
75877
75878
75879
75880
75881
75882
75883
75884
75885
75886
75887
75888
75889
75890
75891
75892
75893
75894
75895
75896
75897
75898
75899
75900
75901
75902
75903
75904
75905
75906
75907
75908
75909
75910
75911
75912
75913
75914
75915
75916
75917
75918
75919
75920
75921
75922
75923
75924
75925
75926
75927
75928
75929
75930
75931
75932
75933
75934
75935
75936
75937
75938
75939
75940
75941
75942
75943
75944
75945
75946
75947
75948
75949
75950
75951
75952
75953
75954
75955
75956
75957
75958
75959
75960
75961
75962
75963
75964
75965
75966
75967
75968
75969
75970
75971
75972
75973
75974
75975
75976
75977
75978
75979
75980
75981
75982
75983
75984
75985
75986
75987
75988
75989
75990
75991
75992
75993
75994
75995
75996
75997
75998
75999
76000
76001
76002
76003
76004
76005
76006
76007
76008
76009
76010
76011
76012
76013
76014
76015
76016
76017
76018
76019
76020
76021
76022
76023
76024
76025
76026
76027
76028
76029
76030
76031
76032
76033
76034
76035
76036
76037
76038
76039
76040
76041
76042
76043
76044
76045
76046
76047
76048
76049
76050
76051
76052
76053
76054
76055
76056
76057
76058
76059
76060
76061
76062
76063
76064
76065
76066
76067
76068
76069
76070
76071
76072
76073
76074
76075
76076
76077
76078
76079
76080
76081
76082
76083
76084
76085
76086
76087
76088
76089
76090
76091
76092
76093
76094
76095
76096
76097
76098
76099
76100
76101
76102
76103
76104
76105
76106
76107
76108
76109
76110
76111
76112
76113
76114
76115
76116
76117
76118
76119
76120
76121
76122
76123
76124
76125
76126
76127
76128
76129
76130
76131
76132
76133
76134
76135
76136
76137
76138
76139
76140
76141
76142
76143
76144
76145
76146
76147
76148
76149
76150
76151
76152
76153
76154
76155
76156
76157
76158
76159
76160
76161
76162
76163
76164
76165
76166
76167
76168
76169
76170
76171
76172
76173
76174
76175
76176
76177
76178
76179
76180
76181
76182
76183
76184
76185
76186
76187
76188
76189
76190
76191
76192
76193
76194
76195
76196
76197
76198
76199
76200
76201
76202
76203
76204
76205
76206
76207
76208
76209
76210
76211
76212
76213
76214
76215
76216
76217
76218
76219
76220
76221
76222
76223
76224
76225
76226
76227
76228
76229
76230
76231
76232
76233
76234
76235
76236
76237
76238
76239
76240
76241
76242
76243
76244
76245
76246
76247
76248
76249
76250
76251
76252
76253
76254
76255
76256
76257
76258
76259
76260
76261
76262
76263
76264
76265
76266
76267
76268
76269
76270
76271
76272
76273
76274
76275
76276
76277
76278
76279
76280
76281
76282
76283
76284
76285
76286
76287
76288
76289
76290
76291
76292
76293
76294
76295
76296
76297
76298
76299
76300
76301
76302
76303
76304
76305
76306
76307
76308
76309
76310
76311
76312
76313
76314
76315
76316
76317
76318
76319
76320
76321
76322
76323
76324
76325
76326
76327
76328
76329
76330
76331
76332
76333
76334
76335
76336
76337
76338
76339
76340
76341
76342
76343
76344
76345
76346
76347
76348
76349
76350
76351
76352
76353
76354
76355
76356
76357
76358
76359
76360
76361
76362
76363
76364
76365
76366
76367
76368
76369
76370
76371
76372
76373
76374
76375
76376
76377
76378
76379
76380
76381
76382
76383
76384
76385
76386
76387
76388
76389
76390
76391
76392
76393
76394
76395
76396
76397
76398
76399
76400
76401
76402
76403
76404
76405
76406
76407
76408
76409
76410
76411
76412
76413
76414
76415
76416
76417
76418
76419
76420
76421
76422
76423
76424
76425
76426
76427
76428
76429
76430
76431
76432
76433
76434
76435
76436
76437
76438
76439
76440
76441
76442
76443
76444
76445
76446
76447
76448
76449
76450
76451
76452
76453
76454
76455
76456
76457
76458
76459
76460
76461
76462
76463
76464
76465
76466
76467
76468
76469
76470
76471
76472
76473
76474
76475
76476
76477
76478
76479
76480
76481
76482
76483
76484
76485
76486
76487
76488
76489
76490
76491
76492
76493
76494
76495
76496
76497
76498
76499
76500
76501
76502
76503
76504
76505
76506
76507
76508
76509
76510
76511
76512
76513
76514
76515
76516
76517
76518
76519
76520
76521
76522
76523
76524
76525
76526
76527
76528
76529
76530
76531
76532
76533
76534
76535
76536
76537
76538
76539
76540
76541
76542
76543
76544
76545
76546
76547
76548
76549
76550
76551
76552
76553
76554
76555
76556
76557
76558
76559
76560
76561
76562
76563
76564
76565
76566
76567
76568
76569
76570
76571
76572
76573
76574
76575
76576
76577
76578
76579
76580
76581
76582
76583
76584
76585
76586
76587
76588
76589
76590
76591
76592
76593
76594
76595
76596
76597
76598
76599
76600
76601
76602
76603
76604
76605
76606
76607
76608
76609
76610
76611
76612
76613
76614
76615
76616
76617
76618
76619
76620
76621
76622
76623
76624
76625
76626
76627
76628
76629
76630
76631
76632
76633
76634
76635
76636
76637
76638
76639
76640
76641
76642
76643
76644
76645
76646
76647
76648
76649
76650
76651
76652
76653
76654
76655
76656
76657
76658
76659
76660
76661
76662
76663
76664
76665
76666
76667
76668
76669
76670
76671
76672
76673
76674
76675
76676
76677
76678
76679
76680
76681
76682
76683
76684
76685
76686
76687
76688
76689
76690
76691
76692
76693
76694
76695
76696
76697
76698
76699
76700
76701
76702
76703
76704
76705
76706
76707
76708
76709
76710
76711
76712
76713
76714
76715
76716
76717
76718
76719
76720
76721
76722
76723
76724
76725
76726
76727
76728
76729
76730
76731
76732
76733
76734
76735
76736
76737
76738
76739
76740
76741
76742
76743
76744
76745
76746
76747
76748
76749
76750
76751
76752
76753
76754
76755
76756
76757
76758
76759
76760
76761
76762
76763
76764
76765
76766
76767
76768
76769
76770
76771
76772
76773
76774
76775
76776
76777
76778
76779
76780
76781
76782
76783
76784
76785
76786
76787
76788
76789
76790
76791
76792
76793
76794
76795
76796
76797
76798
76799
76800
76801
76802
76803
76804
76805
76806
76807
76808
76809
76810
76811
76812
76813
76814
76815
76816
76817
76818
76819
76820
76821
76822
76823
76824
76825
76826
76827
76828
76829
76830
76831
76832
76833
76834
76835
76836
76837
76838
76839
76840
76841
76842
76843
76844
76845
76846
76847
76848
76849
76850
76851
76852
76853
76854
76855
76856
76857
76858
76859
76860
76861
76862
76863
76864
76865
76866
76867
76868
76869
76870
76871
76872
76873
76874
76875
76876
76877
76878
76879
76880
76881
76882
76883
76884
76885
76886
76887
76888
76889
76890
76891
76892
76893
76894
76895
76896
76897
76898
76899
76900
76901
76902
76903
76904
76905
76906
76907
76908
76909
76910
76911
76912
76913
76914
76915
76916
76917
76918
76919
76920
76921
76922
76923
76924
76925
76926
76927
76928
76929
76930
76931
76932
76933
76934
76935
76936
76937
76938
76939
76940
76941
76942
76943
76944
76945
76946
76947
76948
76949
76950
76951
76952
76953
76954
76955
76956
76957
76958
76959
76960
76961
76962
76963
76964
76965
76966
76967
76968
76969
76970
76971
76972
76973
76974
76975
76976
76977
76978
76979
76980
76981
76982
76983
76984
76985
76986
76987
76988
76989
76990
76991
76992
76993
76994
76995
76996
76997
76998
76999
77000
77001
77002
77003
77004
77005
77006
77007
77008
77009
77010
77011
77012
77013
77014
77015
77016
77017
77018
77019
77020
77021
77022
77023
77024
77025
77026
77027
77028
77029
77030
77031
77032
77033
77034
77035
77036
77037
77038
77039
77040
77041
77042
77043
77044
77045
77046
77047
77048
77049
77050
77051
77052
77053
77054
77055
77056
77057
77058
77059
77060
77061
77062
77063
77064
77065
77066
77067
77068
77069
77070
77071
77072
77073
77074
77075
77076
77077
77078
77079
77080
77081
77082
77083
77084
77085
77086
77087
77088
77089
77090
77091
77092
77093
77094
77095
77096
77097
77098
77099
77100
77101
77102
77103
77104
77105
77106
77107
77108
77109
77110
77111
77112
77113
77114
77115
77116
77117
77118
77119
77120
77121
77122
77123
77124
77125
77126
77127
77128
77129
77130
77131
77132
77133
77134
77135
77136
77137
77138
77139
77140
77141
77142
77143
77144
77145
77146
77147
77148
77149
77150
77151
77152
77153
77154
77155
77156
77157
77158
77159
77160
77161
77162
77163
77164
77165
77166
77167
77168
77169
77170
77171
77172
77173
77174
77175
77176
77177
77178
77179
77180
77181
77182
77183
77184
77185
77186
77187
77188
77189
77190
77191
77192
77193
77194
77195
77196
77197
77198
77199
77200
77201
77202
77203
77204
77205
77206
77207
77208
77209
77210
77211
77212
77213
77214
77215
77216
77217
77218
77219
77220
77221
77222
77223
77224
77225
77226
77227
77228
77229
77230
77231
77232
77233
77234
77235
77236
77237
77238
77239
77240
77241
77242
77243
77244
77245
77246
77247
77248
77249
77250
77251
77252
77253
77254
77255
77256
77257
77258
77259
77260
77261
77262
77263
77264
77265
77266
77267
77268
77269
77270
77271
77272
77273
77274
77275
77276
77277
77278
77279
77280
77281
77282
77283
77284
77285
77286
77287
77288
77289
77290
77291
77292
77293
77294
77295
77296
77297
77298
77299
77300
77301
77302
77303
77304
77305
77306
77307
77308
77309
77310
77311
77312
77313
77314
77315
77316
77317
77318
77319
77320
77321
77322
77323
77324
77325
77326
77327
77328
77329
77330
77331
77332
77333
77334
77335
77336
77337
77338
77339
77340
77341
77342
77343
77344
77345
77346
77347
77348
77349
77350
77351
77352
77353
77354
77355
77356
77357
77358
77359
77360
77361
77362
77363
77364
77365
77366
77367
77368
77369
77370
77371
77372
77373
77374
77375
77376
77377
77378
77379
77380
77381
77382
77383
77384
77385
77386
77387
77388
77389
77390
77391
77392
77393
77394
77395
77396
77397
77398
77399
77400
77401
77402
77403
77404
77405
77406
77407
77408
77409
77410
77411
77412
77413
77414
77415
77416
77417
77418
77419
77420
77421
77422
77423
77424
77425
77426
77427
77428
77429
77430
77431
77432
77433
77434
77435
77436
77437
77438
77439
77440
77441
77442
77443
77444
77445
77446
77447
77448
77449
77450
77451
77452
77453
77454
77455
77456
77457
77458
77459
77460
77461
77462
77463
77464
77465
77466
77467
77468
77469
77470
77471
77472
77473
77474
77475
77476
77477
77478
77479
77480
77481
77482
77483
77484
77485
77486
77487
77488
77489
77490
77491
77492
77493
77494
77495
77496
77497
77498
77499
77500
77501
77502
77503
77504
77505
77506
77507
77508
77509
77510
77511
77512
77513
77514
77515
77516
77517
77518
77519
77520
77521
77522
77523
77524
77525
77526
77527
77528
77529
77530
77531
77532
77533
77534
77535
77536
77537
77538
77539
77540
77541
77542
77543
77544
77545
77546
77547
77548
77549
77550
77551
77552
77553
77554
77555
77556
77557
77558
77559
77560
77561
77562
77563
77564
77565
77566
77567
77568
77569
77570
77571
77572
77573
77574
77575
77576
77577
77578
77579
77580
77581
77582
77583
77584
77585
77586
77587
77588
77589
77590
77591
77592
77593
77594
77595
77596
77597
77598
77599
77600
77601
77602
77603
77604
77605
77606
77607
77608
77609
77610
77611
77612
77613
77614
77615
77616
77617
77618
77619
77620
77621
77622
77623
77624
77625
77626
77627
77628
77629
77630
77631
77632
77633
77634
77635
77636
77637
77638
77639
77640
77641
77642
77643
77644
77645
77646
77647
77648
77649
77650
77651
77652
77653
77654
77655
77656
77657
77658
77659
77660
77661
77662
77663
77664
77665
77666
77667
77668
77669
77670
77671
77672
77673
77674
77675
77676
77677
77678
77679
77680
77681
77682
77683
77684
77685
77686
77687
77688
77689
77690
77691
77692
77693
77694
77695
77696
77697
77698
77699
77700
77701
77702
77703
77704
77705
77706
77707
77708
77709
77710
77711
77712
77713
77714
77715
77716
77717
77718
77719
77720
77721
77722
77723
77724
77725
77726
77727
77728
77729
77730
77731
77732
77733
77734
77735
77736
77737
77738
77739
77740
77741
77742
77743
77744
77745
77746
77747
77748
77749
77750
77751
77752
77753
77754
77755
77756
77757
77758
77759
77760
77761
77762
77763
77764
77765
77766
77767
77768
77769
77770
77771
77772
77773
77774
77775
77776
77777
77778
77779
77780
77781
77782
77783
77784
77785
77786
77787
77788
77789
77790
77791
77792
77793
77794
77795
77796
77797
77798
77799
77800
77801
77802
77803
77804
77805
77806
77807
77808
77809
77810
77811
77812
77813
77814
77815
77816
77817
77818
77819
77820
77821
77822
77823
77824
77825
77826
77827
77828
77829
77830
77831
77832
77833
77834
77835
77836
77837
77838
77839
77840
77841
77842
77843
77844
77845
77846
77847
77848
77849
77850
77851
77852
77853
77854
77855
77856
77857
77858
77859
77860
77861
77862
77863
77864
77865
77866
77867
77868
77869
77870
77871
77872
77873
77874
77875
77876
77877
77878
77879
77880
77881
77882
77883
77884
77885
77886
77887
77888
77889
77890
77891
77892
77893
77894
77895
77896
77897
77898
77899
77900
77901
77902
77903
77904
77905
77906
77907
77908
77909
77910
77911
77912
77913
77914
77915
77916
77917
77918
77919
77920
77921
77922
77923
77924
77925
77926
77927
77928
77929
77930
77931
77932
77933
77934
77935
77936
77937
77938
77939
77940
77941
77942
77943
77944
77945
77946
77947
77948
77949
77950
77951
77952
77953
77954
77955
77956
77957
77958
77959
77960
77961
77962
77963
77964
77965
77966
77967
77968
77969
77970
77971
77972
77973
77974
77975
77976
77977
77978
77979
77980
77981
77982
77983
77984
77985
77986
77987
77988
77989
77990
77991
77992
77993
77994
77995
77996
77997
77998
77999
78000
78001
78002
78003
78004
78005
78006
78007
78008
78009
78010
78011
78012
78013
78014
78015
78016
78017
78018
78019
78020
78021
78022
78023
78024
78025
78026
78027
78028
78029
78030
78031
78032
78033
78034
78035
78036
78037
78038
78039
78040
78041
78042
78043
78044
78045
78046
78047
78048
78049
78050
78051
78052
78053
78054
78055
78056
78057
78058
78059
78060
78061
78062
78063
78064
78065
78066
78067
78068
78069
78070
78071
78072
78073
78074
78075
78076
78077
78078
78079
78080
78081
78082
78083
78084
78085
78086
78087
78088
78089
78090
78091
78092
78093
78094
78095
78096
78097
78098
78099
78100
78101
78102
78103
78104
78105
78106
78107
78108
78109
78110
78111
78112
78113
78114
78115
78116
78117
78118
78119
78120
78121
78122
78123
78124
78125
78126
78127
78128
78129
78130
78131
78132
78133
78134
78135
78136
78137
78138
78139
78140
78141
78142
78143
78144
78145
78146
78147
78148
78149
78150
78151
78152
78153
78154
78155
78156
78157
78158
78159
78160
78161
78162
78163
78164
78165
78166
78167
78168
78169
78170
78171
78172
78173
78174
78175
78176
78177
78178
78179
78180
78181
78182
78183
78184
78185
78186
78187
78188
78189
78190
78191
78192
78193
78194
78195
78196
78197
78198
78199
78200
78201
78202
78203
78204
78205
78206
78207
78208
78209
78210
78211
78212
78213
78214
78215
78216
78217
78218
78219
78220
78221
78222
78223
78224
78225
78226
78227
78228
78229
78230
78231
78232
78233
78234
78235
78236
78237
78238
78239
78240
78241
78242
78243
78244
78245
78246
78247
78248
78249
78250
78251
78252
78253
78254
78255
78256
78257
78258
78259
78260
78261
78262
78263
78264
78265
78266
78267
78268
78269
78270
78271
78272
78273
78274
78275
78276
78277
78278
78279
78280
78281
78282
78283
78284
78285
78286
78287
78288
78289
78290
78291
78292
78293
78294
78295
78296
78297
78298
78299
78300
78301
78302
78303
78304
78305
78306
78307
78308
78309
78310
78311
78312
78313
78314
78315
78316
78317
78318
78319
78320
78321
78322
78323
78324
78325
78326
78327
78328
78329
78330
78331
78332
78333
78334
78335
78336
78337
78338
78339
78340
78341
78342
78343
78344
78345
78346
78347
78348
78349
78350
78351
78352
78353
78354
78355
78356
78357
78358
78359
78360
78361
78362
78363
78364
78365
78366
78367
78368
78369
78370
78371
78372
78373
78374
78375
78376
78377
78378
78379
78380
78381
78382
78383
78384
78385
78386
78387
78388
78389
78390
78391
78392
78393
78394
78395
78396
78397
78398
78399
78400
78401
78402
78403
78404
78405
78406
78407
78408
78409
78410
78411
78412
78413
78414
78415
78416
78417
78418
78419
78420
78421
78422
78423
78424
78425
78426
78427
78428
78429
78430
78431
78432
78433
78434
78435
78436
78437
78438
78439
78440
78441
78442
78443
78444
78445
78446
78447
78448
78449
78450
78451
78452
78453
78454
78455
78456
78457
78458
78459
78460
78461
78462
78463
78464
78465
78466
78467
78468
78469
78470
78471
78472
78473
78474
78475
78476
78477
78478
78479
78480
78481
78482
78483
78484
78485
78486
78487
78488
78489
78490
78491
78492
78493
78494
78495
78496
78497
78498
78499
78500
78501
78502
78503
78504
78505
78506
78507
78508
78509
78510
78511
78512
78513
78514
78515
78516
78517
78518
78519
78520
78521
78522
78523
78524
78525
78526
78527
78528
78529
78530
78531
78532
78533
78534
78535
78536
78537
78538
78539
78540
78541
78542
78543
78544
78545
78546
78547
78548
78549
78550
78551
78552
78553
78554
78555
78556
78557
78558
78559
78560
78561
78562
78563
78564
78565
78566
78567
78568
78569
78570
78571
78572
78573
78574
78575
78576
78577
78578
78579
78580
78581
78582
78583
78584
78585
78586
78587
78588
78589
78590
78591
78592
78593
78594
78595
78596
78597
78598
78599
78600
78601
78602
78603
78604
78605
78606
78607
78608
78609
78610
78611
78612
78613
78614
78615
78616
78617
78618
78619
78620
78621
78622
78623
78624
78625
78626
78627
78628
78629
78630
78631
78632
78633
78634
78635
78636
78637
78638
78639
78640
78641
78642
78643
78644
78645
78646
78647
78648
78649
78650
78651
78652
78653
78654
78655
78656
78657
78658
78659
78660
78661
78662
78663
78664
78665
78666
78667
78668
78669
78670
78671
78672
78673
78674
78675
78676
78677
78678
78679
78680
78681
78682
78683
78684
78685
78686
78687
78688
78689
78690
78691
78692
78693
78694
78695
78696
78697
78698
78699
78700
78701
78702
78703
78704
78705
78706
78707
78708
78709
78710
78711
78712
78713
78714
78715
78716
78717
78718
78719
78720
78721
78722
78723
78724
78725
78726
78727
78728
78729
78730
78731
78732
78733
78734
78735
78736
78737
78738
78739
78740
78741
78742
78743
78744
78745
78746
78747
78748
78749
78750
78751
78752
78753
78754
78755
78756
78757
78758
78759
78760
78761
78762
78763
78764
78765
78766
78767
78768
78769
78770
78771
78772
78773
78774
78775
78776
78777
78778
78779
78780
78781
78782
78783
78784
78785
78786
78787
78788
78789
78790
78791
78792
78793
78794
78795
78796
78797
78798
78799
78800
78801
78802
78803
78804
78805
78806
78807
78808
78809
78810
78811
78812
78813
78814
78815
78816
78817
78818
78819
78820
78821
78822
78823
78824
78825
78826
78827
78828
78829
78830
78831
78832
78833
78834
78835
78836
78837
78838
78839
78840
78841
78842
78843
78844
78845
78846
78847
78848
78849
78850
78851
78852
78853
78854
78855
78856
78857
78858
78859
78860
78861
78862
78863
78864
78865
78866
78867
78868
78869
78870
78871
78872
78873
78874
78875
78876
78877
78878
78879
78880
78881
78882
78883
78884
78885
78886
78887
78888
78889
78890
78891
78892
78893
78894
78895
78896
78897
78898
78899
78900
78901
78902
78903
78904
78905
78906
78907
78908
78909
78910
78911
78912
78913
78914
78915
78916
78917
78918
78919
78920
78921
78922
78923
78924
78925
78926
78927
78928
78929
78930
78931
78932
78933
78934
78935
78936
78937
78938
78939
78940
78941
78942
78943
78944
78945
78946
78947
78948
78949
78950
78951
78952
78953
78954
78955
78956
78957
78958
78959
78960
78961
78962
78963
78964
78965
78966
78967
78968
78969
78970
78971
78972
78973
78974
78975
78976
78977
78978
78979
78980
78981
78982
78983
78984
78985
78986
78987
78988
78989
78990
78991
78992
78993
78994
78995
78996
78997
78998
78999
79000
79001
79002
79003
79004
79005
79006
79007
79008
79009
79010
79011
79012
79013
79014
79015
79016
79017
79018
79019
79020
79021
79022
79023
79024
79025
79026
79027
79028
79029
79030
79031
79032
79033
79034
79035
79036
79037
79038
79039
79040
79041
79042
79043
79044
79045
79046
79047
79048
79049
79050
79051
79052
79053
79054
79055
79056
79057
79058
79059
79060
79061
79062
79063
79064
79065
79066
79067
79068
79069
79070
79071
79072
79073
79074
79075
79076
79077
79078
79079
79080
79081
79082
79083
79084
79085
79086
79087
79088
79089
79090
79091
79092
79093
79094
79095
79096
79097
79098
79099
79100
79101
79102
79103
79104
79105
79106
79107
79108
79109
79110
79111
79112
79113
79114
79115
79116
79117
79118
79119
79120
79121
79122
79123
79124
79125
79126
79127
79128
79129
79130
79131
79132
79133
79134
79135
79136
79137
79138
79139
79140
79141
79142
79143
79144
79145
79146
79147
79148
79149
79150
79151
79152
79153
79154
79155
79156
79157
79158
79159
79160
79161
79162
79163
79164
79165
79166
79167
79168
79169
79170
79171
79172
79173
79174
79175
79176
79177
79178
79179
79180
79181
79182
79183
79184
79185
79186
79187
79188
79189
79190
79191
79192
79193
79194
79195
79196
79197
79198
79199
79200
79201
79202
79203
79204
79205
79206
79207
79208
79209
79210
79211
79212
79213
79214
79215
79216
79217
79218
79219
79220
79221
79222
79223
79224
79225
79226
79227
79228
79229
79230
79231
79232
79233
79234
79235
79236
79237
79238
79239
79240
79241
79242
79243
79244
79245
79246
79247
79248
79249
79250
79251
79252
79253
79254
79255
79256
79257
79258
79259
79260
79261
79262
79263
79264
79265
79266
79267
79268
79269
79270
79271
79272
79273
79274
79275
79276
79277
79278
79279
79280
79281
79282
79283
79284
79285
79286
79287
79288
79289
79290
79291
79292
79293
79294
79295
79296
79297
79298
79299
79300
79301
79302
79303
79304
79305
79306
79307
79308
79309
79310
79311
79312
79313
79314
79315
79316
79317
79318
79319
79320
79321
79322
79323
79324
79325
79326
79327
79328
79329
79330
79331
79332
79333
79334
79335
79336
79337
79338
79339
79340
79341
79342
79343
79344
79345
79346
79347
79348
79349
79350
79351
79352
79353
79354
79355
79356
79357
79358
79359
79360
79361
79362
79363
79364
79365
79366
79367
79368
79369
79370
79371
79372
79373
79374
79375
79376
79377
79378
79379
79380
79381
79382
79383
79384
79385
79386
79387
79388
79389
79390
79391
79392
79393
79394
79395
79396
79397
79398
79399
79400
79401
79402
79403
79404
79405
79406
79407
79408
79409
79410
79411
79412
79413
79414
79415
79416
79417
79418
79419
79420
79421
79422
79423
79424
79425
79426
79427
79428
79429
79430
79431
79432
79433
79434
79435
79436
79437
79438
79439
79440
79441
79442
79443
79444
79445
79446
79447
79448
79449
79450
79451
79452
79453
79454
79455
79456
79457
79458
79459
79460
79461
79462
79463
79464
79465
79466
79467
79468
79469
79470
79471
79472
79473
79474
79475
79476
79477
79478
79479
79480
79481
79482
79483
79484
79485
79486
79487
79488
79489
79490
79491
79492
79493
79494
79495
79496
79497
79498
79499
79500
79501
79502
79503
79504
79505
79506
79507
79508
79509
79510
79511
79512
79513
79514
79515
79516
79517
79518
79519
79520
79521
79522
79523
79524
79525
79526
79527
79528
79529
79530
79531
79532
79533
79534
79535
79536
79537
79538
79539
79540
79541
79542
79543
79544
79545
79546
79547
79548
79549
79550
79551
79552
79553
79554
79555
79556
79557
79558
79559
79560
79561
79562
79563
79564
79565
79566
79567
79568
79569
79570
79571
79572
79573
79574
79575
79576
79577
79578
79579
79580
79581
79582
79583
79584
79585
79586
79587
79588
79589
79590
79591
79592
79593
79594
79595
79596
79597
79598
79599
79600
79601
79602
79603
79604
79605
79606
79607
79608
79609
79610
79611
79612
79613
79614
79615
79616
79617
79618
79619
79620
79621
79622
79623
79624
79625
79626
79627
79628
79629
79630
79631
79632
79633
79634
79635
79636
79637
79638
79639
79640
79641
79642
79643
79644
79645
79646
79647
79648
79649
79650
79651
79652
79653
79654
79655
79656
79657
79658
79659
79660
79661
79662
79663
79664
79665
79666
79667
79668
79669
79670
79671
79672
79673
79674
79675
79676
79677
79678
79679
79680
79681
79682
79683
79684
79685
79686
79687
79688
79689
79690
79691
79692
79693
79694
79695
79696
79697
79698
79699
79700
79701
79702
79703
79704
79705
79706
79707
79708
79709
79710
79711
79712
79713
79714
79715
79716
79717
79718
79719
79720
79721
79722
79723
79724
79725
79726
79727
79728
79729
79730
79731
79732
79733
79734
79735
79736
79737
79738
79739
79740
79741
79742
79743
79744
79745
79746
79747
79748
79749
79750
79751
79752
79753
79754
79755
79756
79757
79758
79759
79760
79761
79762
79763
79764
79765
79766
79767
79768
79769
79770
79771
79772
79773
79774
79775
79776
79777
79778
79779
79780
79781
79782
79783
79784
79785
79786
79787
79788
79789
79790
79791
79792
79793
79794
79795
79796
79797
79798
79799
79800
79801
79802
79803
79804
79805
79806
79807
79808
79809
79810
79811
79812
79813
79814
79815
79816
79817
79818
79819
79820
79821
79822
79823
79824
79825
79826
79827
79828
79829
79830
79831
79832
79833
79834
79835
79836
79837
79838
79839
79840
79841
79842
79843
79844
79845
79846
79847
79848
79849
79850
79851
79852
79853
79854
79855
79856
79857
79858
79859
79860
79861
79862
79863
79864
79865
79866
79867
79868
79869
79870
79871
79872
79873
79874
79875
79876
79877
79878
79879
79880
79881
79882
79883
79884
79885
79886
79887
79888
79889
79890
79891
79892
79893
79894
79895
79896
79897
79898
79899
79900
79901
79902
79903
79904
79905
79906
79907
79908
79909
79910
79911
79912
79913
79914
79915
79916
79917
79918
79919
79920
79921
79922
79923
79924
79925
79926
79927
79928
79929
79930
79931
79932
79933
79934
79935
79936
79937
79938
79939
79940
79941
79942
79943
79944
79945
79946
79947
79948
79949
79950
79951
79952
79953
79954
79955
79956
79957
79958
79959
79960
79961
79962
79963
79964
79965
79966
79967
79968
79969
79970
79971
79972
79973
79974
79975
79976
79977
79978
79979
79980
79981
79982
79983
79984
79985
79986
79987
79988
79989
79990
79991
79992
79993
79994
79995
79996
79997
79998
79999
80000
80001
80002
80003
80004
80005
80006
80007
80008
80009
80010
80011
80012
80013
80014
80015
80016
80017
80018
80019
80020
80021
80022
80023
80024
80025
80026
80027
80028
80029
80030
80031
80032
80033
80034
80035
80036
80037
80038
80039
80040
80041
80042
80043
80044
80045
80046
80047
80048
80049
80050
80051
80052
80053
80054
80055
80056
80057
80058
80059
80060
80061
80062
80063
80064
80065
80066
80067
80068
80069
80070
80071
80072
80073
80074
80075
80076
80077
80078
80079
80080
80081
80082
80083
80084
80085
80086
80087
80088
80089
80090
80091
80092
80093
80094
80095
80096
80097
80098
80099
80100
80101
80102
80103
80104
80105
80106
80107
80108
80109
80110
80111
80112
80113
80114
80115
80116
80117
80118
80119
80120
80121
80122
80123
80124
80125
80126
80127
80128
80129
80130
80131
80132
80133
80134
80135
80136
80137
80138
80139
80140
80141
80142
80143
80144
80145
80146
80147
80148
80149
80150
80151
80152
80153
80154
80155
80156
80157
80158
80159
80160
80161
80162
80163
80164
80165
80166
80167
80168
80169
80170
80171
80172
80173
80174
80175
80176
80177
80178
80179
80180
80181
80182
80183
80184
80185
80186
80187
80188
80189
80190
80191
80192
80193
80194
80195
80196
80197
80198
80199
80200
80201
80202
80203
80204
80205
80206
80207
80208
80209
80210
80211
80212
80213
80214
80215
80216
80217
80218
80219
80220
80221
80222
80223
80224
80225
80226
80227
80228
80229
80230
80231
80232
80233
80234
80235
80236
80237
80238
80239
80240
80241
80242
80243
80244
80245
80246
80247
80248
80249
80250
80251
80252
80253
80254
80255
80256
80257
80258
80259
80260
80261
80262
80263
80264
80265
80266
80267
80268
80269
80270
80271
80272
80273
80274
80275
80276
80277
80278
80279
80280
80281
80282
80283
80284
80285
80286
80287
80288
80289
80290
80291
80292
80293
80294
80295
80296
80297
80298
80299
80300
80301
80302
80303
80304
80305
80306
80307
80308
80309
80310
80311
80312
80313
80314
80315
80316
80317
80318
80319
80320
80321
80322
80323
80324
80325
80326
80327
80328
80329
80330
80331
80332
80333
80334
80335
80336
80337
80338
80339
80340
80341
80342
80343
80344
80345
80346
80347
80348
80349
80350
80351
80352
80353
80354
80355
80356
80357
80358
80359
80360
80361
80362
80363
80364
80365
80366
80367
80368
80369
80370
80371
80372
80373
80374
80375
80376
80377
80378
80379
80380
80381
80382
80383
80384
80385
80386
80387
80388
80389
80390
80391
80392
80393
80394
80395
80396
80397
80398
80399
80400
80401
80402
80403
80404
80405
80406
80407
80408
80409
80410
80411
80412
80413
80414
80415
80416
80417
80418
80419
80420
80421
80422
80423
80424
80425
80426
80427
80428
80429
80430
80431
80432
80433
80434
80435
80436
80437
80438
80439
80440
80441
80442
80443
80444
80445
80446
80447
80448
80449
80450
80451
80452
80453
80454
80455
80456
80457
80458
80459
80460
80461
80462
80463
80464
80465
80466
80467
80468
80469
80470
80471
80472
80473
80474
80475
80476
80477
80478
80479
80480
80481
80482
80483
80484
80485
80486
80487
80488
80489
80490
80491
80492
80493
80494
80495
80496
80497
80498
80499
80500
80501
80502
80503
80504
80505
80506
80507
80508
80509
80510
80511
80512
80513
80514
80515
80516
80517
80518
80519
80520
80521
80522
80523
80524
80525
80526
80527
80528
80529
80530
80531
80532
80533
80534
80535
80536
80537
80538
80539
80540
80541
80542
80543
80544
80545
80546
80547
80548
80549
80550
80551
80552
80553
80554
80555
80556
80557
80558
80559
80560
80561
80562
80563
80564
80565
80566
80567
80568
80569
80570
80571
80572
80573
80574
80575
80576
80577
80578
80579
80580
80581
80582
80583
80584
80585
80586
80587
80588
80589
80590
80591
80592
80593
80594
80595
80596
80597
80598
80599
80600
80601
80602
80603
80604
80605
80606
80607
80608
80609
80610
80611
80612
80613
80614
80615
80616
80617
80618
80619
80620
80621
80622
80623
80624
80625
80626
80627
80628
80629
80630
80631
80632
80633
80634
80635
80636
80637
80638
80639
80640
80641
80642
80643
80644
80645
80646
80647
80648
80649
80650
80651
80652
80653
80654
80655
80656
80657
80658
80659
80660
80661
80662
80663
80664
80665
80666
80667
80668
80669
80670
80671
80672
80673
80674
80675
80676
80677
80678
80679
80680
80681
80682
80683
80684
80685
80686
80687
80688
80689
80690
80691
80692
80693
80694
80695
80696
80697
80698
80699
80700
80701
80702
80703
80704
80705
80706
80707
80708
80709
80710
80711
80712
80713
80714
80715
80716
80717
80718
80719
80720
80721
80722
80723
80724
80725
80726
80727
80728
80729
80730
80731
80732
80733
80734
80735
80736
80737
80738
80739
80740
80741
80742
80743
80744
80745
80746
80747
80748
80749
80750
80751
80752
80753
80754
80755
80756
80757
80758
80759
80760
80761
80762
80763
80764
80765
80766
80767
80768
80769
80770
80771
80772
80773
80774
80775
80776
80777
80778
80779
80780
80781
80782
80783
80784
80785
80786
80787
80788
80789
80790
80791
80792
80793
80794
80795
80796
80797
80798
80799
80800
80801
80802
80803
80804
80805
80806
80807
80808
80809
80810
80811
80812
80813
80814
80815
80816
80817
80818
80819
80820
80821
80822
80823
80824
80825
80826
80827
80828
80829
80830
80831
80832
80833
80834
80835
80836
80837
80838
80839
80840
80841
80842
80843
80844
80845
80846
80847
80848
80849
80850
80851
80852
80853
80854
80855
80856
80857
80858
80859
80860
80861
80862
80863
80864
80865
80866
80867
80868
80869
80870
80871
80872
80873
80874
80875
80876
80877
80878
80879
80880
80881
80882
80883
80884
80885
80886
80887
80888
80889
80890
80891
80892
80893
80894
80895
80896
80897
80898
80899
80900
80901
80902
80903
80904
80905
80906
80907
80908
80909
80910
80911
80912
80913
80914
80915
80916
80917
80918
80919
80920
80921
80922
80923
80924
80925
80926
80927
80928
80929
80930
80931
80932
80933
80934
80935
80936
80937
80938
80939
80940
80941
80942
80943
80944
80945
80946
80947
80948
80949
80950
80951
80952
80953
80954
80955
80956
80957
80958
80959
80960
80961
80962
80963
80964
80965
80966
80967
80968
80969
80970
80971
80972
80973
80974
80975
80976
80977
80978
80979
80980
80981
80982
80983
80984
80985
80986
80987
80988
80989
80990
80991
80992
80993
80994
80995
80996
80997
80998
80999
81000
81001
81002
81003
81004
81005
81006
81007
81008
81009
81010
81011
81012
81013
81014
81015
81016
81017
81018
81019
81020
81021
81022
81023
81024
81025
81026
81027
81028
81029
81030
81031
81032
81033
81034
81035
81036
81037
81038
81039
81040
81041
81042
81043
81044
81045
81046
81047
81048
81049
81050
81051
81052
81053
81054
81055
81056
81057
81058
81059
81060
81061
81062
81063
81064
81065
81066
81067
81068
81069
81070
81071
81072
81073
81074
81075
81076
81077
81078
81079
81080
81081
81082
81083
81084
81085
81086
81087
81088
81089
81090
81091
81092
81093
81094
81095
81096
81097
81098
81099
81100
81101
81102
81103
81104
81105
81106
81107
81108
81109
81110
81111
81112
81113
81114
81115
81116
81117
81118
81119
81120
81121
81122
81123
81124
81125
81126
81127
81128
81129
81130
81131
81132
81133
81134
81135
81136
81137
81138
81139
81140
81141
81142
81143
81144
81145
81146
81147
81148
81149
81150
81151
81152
81153
81154
81155
81156
81157
81158
81159
81160
81161
81162
81163
81164
81165
81166
81167
81168
81169
81170
81171
81172
81173
81174
81175
81176
81177
81178
81179
81180
81181
81182
81183
81184
81185
81186
81187
81188
81189
81190
81191
81192
81193
81194
81195
81196
81197
81198
81199
81200
81201
81202
81203
81204
81205
81206
81207
81208
81209
81210
81211
81212
81213
81214
81215
81216
81217
81218
81219
81220
81221
81222
81223
81224
81225
81226
81227
81228
81229
81230
81231
81232
81233
81234
81235
81236
81237
81238
81239
81240
81241
81242
81243
81244
81245
81246
81247
81248
81249
81250
81251
81252
81253
81254
81255
81256
81257
81258
81259
81260
81261
81262
81263
81264
81265
81266
81267
81268
81269
81270
81271
81272
81273
81274
81275
81276
81277
81278
81279
81280
81281
81282
81283
81284
81285
81286
81287
81288
81289
81290
81291
81292
81293
81294
81295
81296
81297
81298
81299
81300
81301
81302
81303
81304
81305
81306
81307
81308
81309
81310
81311
81312
81313
81314
81315
81316
81317
81318
81319
81320
81321
81322
81323
81324
81325
81326
81327
81328
81329
81330
81331
81332
81333
81334
81335
81336
81337
81338
81339
81340
81341
81342
81343
81344
81345
81346
81347
81348
81349
81350
81351
81352
81353
81354
81355
81356
81357
81358
81359
81360
81361
81362
81363
81364
81365
81366
81367
81368
81369
81370
81371
81372
81373
81374
81375
81376
81377
81378
81379
81380
81381
81382
81383
81384
81385
81386
81387
81388
81389
81390
81391
81392
81393
81394
81395
81396
81397
81398
81399
81400
81401
81402
81403
81404
81405
81406
81407
81408
81409
81410
81411
81412
81413
81414
81415
81416
81417
81418
81419
81420
81421
81422
81423
81424
81425
81426
81427
81428
81429
81430
81431
81432
81433
81434
81435
81436
81437
81438
81439
81440
81441
81442
81443
81444
81445
81446
81447
81448
81449
81450
81451
81452
81453
81454
81455
81456
81457
81458
81459
81460
81461
81462
81463
81464
81465
81466
81467
81468
81469
81470
81471
81472
81473
81474
81475
81476
81477
81478
81479
81480
81481
81482
81483
81484
81485
81486
81487
81488
81489
81490
81491
81492
81493
81494
81495
81496
81497
81498
81499
81500
81501
81502
81503
81504
81505
81506
81507
81508
81509
81510
81511
81512
81513
81514
81515
81516
81517
81518
81519
81520
81521
81522
81523
81524
81525
81526
81527
81528
81529
81530
81531
81532
81533
81534
81535
81536
81537
81538
81539
81540
81541
81542
81543
81544
81545
81546
81547
81548
81549
81550
81551
81552
81553
81554
81555
81556
81557
81558
81559
81560
81561
81562
81563
81564
81565
81566
81567
81568
81569
81570
81571
81572
81573
81574
81575
81576
81577
81578
81579
81580
81581
81582
81583
81584
81585
81586
81587
81588
81589
81590
81591
81592
81593
81594
81595
81596
81597
81598
81599
81600
81601
81602
81603
81604
81605
81606
81607
81608
81609
81610
81611
81612
81613
81614
81615
81616
81617
81618
81619
81620
81621
81622
81623
81624
81625
81626
81627
81628
81629
81630
81631
81632
81633
81634
81635
81636
81637
81638
81639
81640
81641
81642
81643
81644
81645
81646
81647
81648
81649
81650
81651
81652
81653
81654
81655
81656
81657
81658
81659
81660
81661
81662
81663
81664
81665
81666
81667
81668
81669
81670
81671
81672
81673
81674
81675
81676
81677
81678
81679
81680
81681
81682
81683
81684
81685
81686
81687
81688
81689
81690
81691
81692
81693
81694
81695
81696
81697
81698
81699
81700
81701
81702
81703
81704
81705
81706
81707
81708
81709
81710
81711
81712
81713
81714
81715
81716
81717
81718
81719
81720
81721
81722
81723
81724
81725
81726
81727
81728
81729
81730
81731
81732
81733
81734
81735
81736
81737
81738
81739
81740
81741
81742
81743
81744
81745
81746
81747
81748
81749
81750
81751
81752
81753
81754
81755
81756
81757
81758
81759
81760
81761
81762
81763
81764
81765
81766
81767
81768
81769
81770
81771
81772
81773
81774
81775
81776
81777
81778
81779
81780
81781
81782
81783
81784
81785
81786
81787
81788
81789
81790
81791
81792
81793
81794
81795
81796
81797
81798
81799
81800
81801
81802
81803
81804
81805
81806
81807
81808
81809
81810
81811
81812
81813
81814
81815
81816
81817
81818
81819
81820
81821
81822
81823
81824
81825
81826
81827
81828
81829
81830
81831
81832
81833
81834
81835
81836
81837
81838
81839
81840
81841
81842
81843
81844
81845
81846
81847
81848
81849
81850
81851
81852
81853
81854
81855
81856
81857
81858
81859
81860
81861
81862
81863
81864
81865
81866
81867
81868
81869
81870
81871
81872
81873
81874
81875
81876
81877
81878
81879
81880
81881
81882
81883
81884
81885
81886
81887
81888
81889
81890
81891
81892
81893
81894
81895
81896
81897
81898
81899
81900
81901
81902
81903
81904
81905
81906
81907
81908
81909
81910
81911
81912
81913
81914
81915
81916
81917
81918
81919
81920
81921
81922
81923
81924
81925
81926
81927
81928
81929
81930
81931
81932
81933
81934
81935
81936
81937
81938
81939
81940
81941
81942
81943
81944
81945
81946
81947
81948
81949
81950
81951
81952
81953
81954
81955
81956
81957
81958
81959
81960
81961
81962
81963
81964
81965
81966
81967
81968
81969
81970
81971
81972
81973
81974
81975
81976
81977
81978
81979
81980
81981
81982
81983
81984
81985
81986
81987
81988
81989
81990
81991
81992
81993
81994
81995
81996
81997
81998
81999
82000
82001
82002
82003
82004
82005
82006
82007
82008
82009
82010
82011
82012
82013
82014
82015
82016
82017
82018
82019
82020
82021
82022
82023
82024
82025
82026
82027
82028
82029
82030
82031
82032
82033
82034
82035
82036
82037
82038
82039
82040
82041
82042
82043
82044
82045
82046
82047
82048
82049
82050
82051
82052
82053
82054
82055
82056
82057
82058
82059
82060
82061
82062
82063
82064
82065
82066
82067
82068
82069
82070
82071
82072
82073
82074
82075
82076
82077
82078
82079
82080
82081
82082
82083
82084
82085
82086
82087
82088
82089
82090
82091
82092
82093
82094
82095
82096
82097
82098
82099
82100
82101
82102
82103
82104
82105
82106
82107
82108
82109
82110
82111
82112
82113
82114
82115
82116
82117
82118
82119
82120
82121
82122
82123
82124
82125
82126
82127
82128
82129
82130
82131
82132
82133
82134
82135
82136
82137
82138
82139
82140
82141
82142
82143
82144
82145
82146
82147
82148
82149
82150
82151
82152
82153
82154
82155
82156
82157
82158
82159
82160
82161
82162
82163
82164
82165
82166
82167
82168
82169
82170
82171
82172
82173
82174
82175
82176
82177
82178
82179
82180
82181
82182
82183
82184
82185
82186
82187
82188
82189
82190
82191
82192
82193
82194
82195
82196
82197
82198
82199
82200
82201
82202
82203
82204
82205
82206
82207
82208
82209
82210
82211
82212
82213
82214
82215
82216
82217
82218
82219
82220
82221
82222
82223
82224
82225
82226
82227
82228
82229
82230
82231
82232
82233
82234
82235
82236
82237
82238
82239
82240
82241
82242
82243
82244
82245
82246
82247
82248
82249
82250
82251
82252
82253
82254
82255
82256
82257
82258
82259
82260
82261
82262
82263
82264
82265
82266
82267
82268
82269
82270
82271
82272
82273
82274
82275
82276
82277
82278
82279
82280
82281
82282
82283
82284
82285
82286
82287
82288
82289
82290
82291
82292
82293
82294
82295
82296
82297
82298
82299
82300
82301
82302
82303
82304
82305
82306
82307
82308
82309
82310
82311
82312
82313
82314
82315
82316
82317
82318
82319
82320
82321
82322
82323
82324
82325
82326
82327
82328
82329
82330
82331
82332
82333
82334
82335
82336
82337
82338
82339
82340
82341
82342
82343
82344
82345
82346
82347
82348
82349
82350
82351
82352
82353
82354
82355
82356
82357
82358
82359
82360
82361
82362
82363
82364
82365
82366
82367
82368
82369
82370
82371
82372
82373
82374
82375
82376
82377
82378
82379
82380
82381
82382
82383
82384
82385
82386
82387
82388
82389
82390
82391
82392
82393
82394
82395
82396
# -*- coding:utf-8 -*-

*******************************************************************************
    実装ログ
-------------------------------------------------------------------------------

2023-04-03

  * main (adjust-builtin-wrappers): IFS= が蚭定されおしたう @ bash-5.0 (reported by pt12lol) [#D2030]
    https://github.com/akinomyoga/ble.sh/issues/311

    POSIXLY_CORRECT=y の環境で IFS= ble/bash/read を実行しおいた為に IFS= が関
    数呌び出し埌も残る様になっおしたったのだった。

    ? 然し䞍思議なのは䜕故か bash-5.0 だけで振る舞いが再珟するずいう事。
      bash-5.1 以降は関数呌び出しの倉数代入は posix であっおも環境に残らない様
      になっおいるのは良い。然し、bash-4.4 以前に぀いおは bash-5.0 ず同様に環境
      に tempenv が残る様に芋える。䜕故この時にだけ問題がないのだろうか。或いは、
      䜕凊か別のレベルで local IFS が蚭定されおいるずいう事か、或いは呌び出し元
      の local POSIXLY_CORRECT=y は圱響を䞎えないずいう事なのだろうか。よく分か
      らないが取り敢えずは問題は封じた筈なので気にしない事にする。

    取り敢えず関数呌び出しの前に倉数代入を眮かない様にする。明らかに ble.sh の
    内郚だけで䜿われる関数に぀いおは気にしなくお良い。util.sh の䞀般のラむブラ
    リ関数に぀いおはちゃんず posix を避ける様にする事にする。

    ? これよりも前には問題にならなかったのかずいうのが疑問である→どうも詊しお
      みた所 read や builtin read では tempenv は posix モヌドであったずしおも
      環境には残らない様である。぀たり、本圓にシェル関数特有の振る舞いだったず
      いう事である。

      builtin read から ble/bash/read に眮き換えられたのが a5b10e8b である。こ
      れは #D1981 に関係しおいる。

2023-04-02

  * bgproc: bash-4.2 での bgproc#start で {bgproc[0]} は存圚しないずいう゚ラヌメッセヌゞ [#D2029]

    これは exec {fdvar}redirect で発生しおいる゚ラヌだった。bash-4.1,4.2では
    {fdvar} の fdvar ずしお配列芁玠には察応しおいない。

  * bgproc: シェルの終了時に即座に匷制終了するオプションを぀ける? (motivated by bkerin) [#D2028]
    https://github.com/akinomyoga/ble.sh/discussions/309#discussioncomment-5498921

    然し実際にそれが良い事なのか分からない。ずいうか珟状の実装ではそうはなっお
    いないのだったか? → child session はちゃんずすぐに終了する。然し端末が閉じ
    ない。これは stderr, stdout, stdin の䜕れかが未だ開いたたたになっおいるのが
    原因ず思われる。

    .kill ではちゃんず党郚閉じおいる筈ず思ったがよく考えたらスタヌトしたプロセ
    ス自䜓が stderr を保持しおいるのが原因の気がする。

    そのたた匷制終了するずいうのもどうかずいう気がするが、それならばそれで良い。

    * done: 或いは終了チェックの interval をより短くする。これは
      ble/util/bgproc#stop/.wait で䜿っおいる 1000 ずいう倀を蚭定できる様にすれ
      ば良い。然し、これを倉曎したずしお実際に終了にかかる時間がそんなに速くな
      るのだろうか。

      うヌん。或いは conditional-sync の progressive-weight を䜿う? ず思ったが
      conditional-sync は新しいサブシェルを埅぀物なので単に或る条件を埅぀ずいう
      事には䜿えない。conditional-sync を拡匵しお任意の条件を埅぀事ができるよう
      にする可胜性も考えたが、

      a うヌん。或いはコマンドを開始するのではなくお既存のプロセスを埅぀ずいう
        機胜を持たせる? この時に conditional-sync に足りおいないのは kill を二
        段階で行う機胜である。SIGKILL を送る様にするオプションは実装しおいるが、
        kill で駄目だった時に段階的に SIGKILL を送るずいう機胜は実装しおいない。
        そういう機胜も远加しお良いかもしれない。

        うヌん。取り敢えず conditional-sync を2回呌び出しお二回目で SIGKILL を
        指定すれば良いのだず気づいたので conditional-sync 自䜓に段階的に kill
        を実行する機胜は実装しなくお良かった。

      b 或いはコマンドが空の時には指定された条件だけを埅぀ずいう振る舞いにする。
        この堎合にはコマンドの kill たでは実行しない。

      然しもし原因が .kill の interval による物なのだずしおも、
      stdout/stderr/stdin を封じおいる限りは生きおいるずいうのは .kill が原因な
      のではないのでは? 然し、プロセスが瞬間的に終了する事ができなかった堎合に
      は .kill による自動 kill が起動する迄は bgproc が保持しおいる stderr が開
      いたたたである。然し、その堎合には timeout になるたで盞圓埅たなければなら
      ない (既定では 10sec である。或いは SIGKILL たで曎に 10sec ある)。

      * ok: ず思ったがもしかするず .kill 自䜓が fd を保持しおいるから bg
        process が終了しない可胜性? ず思ったがそれも倉だ。.kill 自䜓は fd を閉
        じおから呌び出しおいる筈 → 実際に確認した。

    ? ok: ずころで set -m しお起動した bgproc のなかで曎にパむプやサブシェルな
      どを立ち䞊げた時に曎に別の PGID になっおいるずその別の PGID たでは kill
      しきれないのでは。なので set +m を䞭で実行しなければならないのでは。

      →ず思ったが、実隓しおみた限りでは set -m が実際に効果を持぀のはそれを呌
      び出したサブシェルだけの様である。なので曎に入れ子で呌び出された物に関し
      おは敢えお set -m を実行しない限りはちゃんず元の pgid に属する様になっお
      いる。

    即座に終了する方法に぀いお考えたがこれは単に kill-timeout を 0 に蚭定すれば
    良いのでは。結局向こうで起こっおいる事が䜕か分からないのでどうしようもない。

    * 2023-04-03 うヌん。即座に終了しないのは subshell の stdout/stderr/stdin
      を閉じおいおも、ble/fd で保持しおいる fd が残っおいるからでは。
      ble/fd#finalize を呌び出せば良いだろうか。或いは tty に関しおは
      ble/fd#finalize での自動 close を抑制しおいただろうか。

      →確認しおみるず ble/fd#finalize には tty は登録されおいない様だ。ずいう
      か寧ろ msleep 等が䜿っおいる fd を削陀しおしたう様だから䞭で sleep が䜿え
      なくなっおしたう。ble/fd#finalize は呌び出しおも仕方がない。

      うヌん。埅避しおいる fd を閉じおも駄目の様である。どうも builtin exit 0
      を呌び出しお終了しようずしおいるのだがその時に redirect をしおいる。その
      redirect によっお保管しおいる fd が未だ生きおいる様だ。぀たり、本圓に党お
      閉じようず思ったら redirect によっお保管しおいる物も党お閉じる必芁がある。
      すべお閉じる為には fd を列挙しなければならない。

      a 䞀定の範囲の fd を党お閉じる? linux (もしくは bash) は珟圚の所は 255 付
        近に redirect にの fd を保管しおいる様だが os によっおはもっず巚倧な倀
        に保存しおいるかもしれない。なので可胜性のある fd を党おスキャンするず
        いう蚳にも行かない気がする。

      b 或いは /proc/$BASHPID/fd の䞭にある物を党お閉じる? 然しこれも䜿えるシス
        テムが限られおいる。

      たた fd をスキャンしお閉じるずしおも msleep 等が䜿っおいる fd を閉じおし
      たうずサブシェルの動䜜に問題を起こしおしたう。これに぀いおは -t で刀定し
      お端末だけを閉じる様にすれば良い気もする。

  * make: むンストヌル時に元のコメントなどの情報ぞの pointer を぀ける (suggested by bkerin) [#D2027]
    https://github.com/akinomyoga/ble.sh/discussions/309#discussioncomment-5498921

    make_command.sh install からでは元の゜ヌスがどれかは原理的には分からないが、
    取り敢えず珟状では ble.sh 以倖は党お察応するファむルが同名で存圚しおいるの
    で、その仮定の䞋でファむル名を含める事にした。ble.sh に぀いおも ble.pp ず
    src/*.sh を党お含める事にした。

    果たしおコメントを削陀しないむンストヌルが本圓に必芁なのかは謎だが䞀応機胜
    ずしおは぀けおおく事にした。䜕れにしおも元々ある日本語のコメントは個人甚の
    物であっお他の人に芋せる為のものではない。

  * bgproc: bash-3 で idle.cancel がないず衚瀺される [#D2026]

    実装を改めお確認しおみたらそもそも bash-3 に察する考慮が党く入っおいない。
    然し、将来的に bash-3 でも idle を䜿える様にする可胜性を考えるず単にバヌゞョ
    ンで刀定するのもよくない気がする。結局 function#try で調敎する事にする。

2023-03-26

  * menu-complete (linewise): 長い行がある時に衚瀺が厩れる (reported by bkerin) [#D2025]
    https://github.com/akinomyoga/ble.sh/issues/307

    これは実装を詳しく調べおみたら遞択時の郚分曎新の時の幟䜕を蚘録する郚分で、
    描画範囲を限定した時の蚘録が残っおいないのが原因だった。そもそも linewise
    は詊隓的に最初に実装したもので䜙り真面目に実装されおいない感じがする。その
    埌で desc の実装でもっずちゃんず実装されおその時に限定された描画範囲に぀い
    おちゃんず察応が行われおいる。その desc に䜿われた仕組みを linewise からも
    䜿うだけで良かった。

    然しそれずは別に長い候補を入力した時に panel の高さが倉わった時に menu の高
    さを制限した䞊で再描画を行う仕組みが欲しい。これに぀いおは簡単ではなさそう
    なので別の項目で議論する事にする。

2023-03-16

  * edit: bind -x で PS1 も䞀時的に埩元する (requested by adoyle-h) [#D2024]
    https://github.com/akinomyoga/ble.sh/issues/304

    lincheney/fzf-tab-completion で退避䞭の䞀時 PS1 が衚瀺されるずいうから䜕か
    ず思ったら自分で PS1 を出力しおいるのだった。

  * 2023-03-06 menu-complete: 番号で遞択する (requested by bkerin) [#D2023]
    https://github.com/akinomyoga/ble.sh/discussions/284

    これは実は実装はそんなに倧倉ではない気がする。

    LASTWIDGET のチェックは必芁?  吊、他のものは党お抜けるから関係ない? ず思っ
    たが TAB や cursor key 等の移動コマンドの埌も番号はリセットしたい。なのでや
    はり LASTWIDGET はチェックする。番号が溜たっお䞀臎する物がなくなったら䞀぀
    ず぀叀い文字を削陀しお䞀臎するものが出るたで削る。䞀぀も䞀臎しなかったら削
    る前にリセットしお新しい文字自䜓をなかった事にする?

    詊しに実装しおみたが操䜜性に疑問が残る。先ず menu-complete の䞭に入らないず
    番号で遞択できない。䞀方で、menu を衚瀺しおいるだけの堎合にも遞択しようずす
    るのが自然の気がする。

    a menu-complete の倖からでも M-0 等で遞択できる様にするずしおも
      menu-complete に入らずに select しおも仕方がない。

      もう䞀぀の問題点は menu が衚瀺されおいたらどの文脈であっおも M-0 で menu
      に入っおしたうのかずいう事。auto-menu を実装しおいたりするず実質的に M-0
      は垞に menu に入っおしたうずいう事になり操䜜できない。或いは、TAB を二回
      抌した時に complete に入るのず同じ様に、LASTWIDGET が complete だった時に
      M-0 で menu-complete に入るずいうのは手の気がする。

      曎にもう䞀぀の問題点は menu の䞭に番号を衚瀺しおいない時でも番号による遞
      択を有効にするのかずいう事 → これは M-0 等のキヌを䜿っおいる時点で、実際
      に番号が衚瀺されおいるかどうかに関係なく menu-complete に入るずいう事で良
      い気がする。

    b 或いは、menu-complete の倖で M-0 等で匕数を入力し始めたらその堎で
      menu-complete に入るずいう可胜性も考えられる。

    * どの menu-style に぀いおも番号を衚瀺する機胜が欲しい。

      蚭定名を倉曎する?

        bleopt menu_item_prefix
        bleopt menu_item_prefix_linewise
        bleopt menu_item_prefix_align
        bleopt menu_item_prefix_desc

      ず思ったが珟圚の蚭定名は他の蚭定ず共に menu_STYLE_NAME の圢で䞀貫しおいる。
      これを壊すのも倉な気がするので、既存のルヌルは保持する。党䜓の蚭定を䞀括
      で倉曎するオプションを甚意したい気がするが、その名前は䜕にするか。単に
      menu_prefix で良いだろうか。

        bleopt menu_prefix
        bleopt menu_linewise_prefix
        bleopt menu_align_prefix
        bleopt menu_desc_prefix

      取り敢えず align ず desc に぀いお候補番号に察応した。dense は察応しおいな
      い。が、完党性を期する為にはやはり dense も察応した方が良い気がする。→察
      応した。

    * done: wiki, blerc: menu_prefix, menu_{aling,dense,linewise,desc}_prefix

    * 返信

      for key in {0..9}; do ble-bind -m vi_imap -f "$key" 'append-arg enter-menu'; done
      for key in {0..9}; do ble-bind -m menu_complete -f "$key" 'menu/append-arg always'; done

2023-03-14

  * 2021-10-26 ble/builtin/read: WINCH を受信できおいない気がする [#D2022]
    もしかするず subshell の䞭では受信できないずいう事なのかもしれない。

    2023-03-14 winsize を曎新する関数を䜜ったのでこれにも察応する事にする。

    % ず思ったが WINCH を受信できおいない? 問題は WINCH を受信しおも LINES
    % COLUMNS が曎新されない事ず思ったが、そもそも WINCH を受信できおいないずいう
    % 事なのだった。
    % →即時 WINCH を受信できる蚳では無いがナヌザヌが文字を入力した時にちゃんず
    % 受信できおいる。

    subshell の䞭で実行するずちゃんず内郚で蚭定した trap が発火しおいる様に芋える。

    * fixed: ble/builtin/read/TRAPWINCH でも update-winsize を呌ぶ事にした。ず
      思ったが 個別に色々凊理するよりも単にここで ble/application/onwinch を呌
      び出しおしたうのが自然である→その様に修正した。

    x fixed: "bash: ble/term/visible-bell:/clear: そのようなファむルやディレク
      トリはありたせん" ずいう゚ラヌが発生する。/clear は
      ble/term/visible-bell/.erase-previous-visible-bell から呌び出されるが、こ
      の関数は $_ble_base_run/$$.visible-bell.* に属しおいる物を党お削陀しよう
      ずする。なので subshell で蚭定された物も削陀しようずする。

      この時芪 shell で䞀床も visible-bell を䜿っおいないず visible-bell が初期
      化されおいない状態になっおいお問題が生じる。

      或いは subshell で発生した visible-bell は subshell だけで管理する事にし
      お subshell を抜ける時に始末する事にする? subshell ずいうか read を抜ける
      時に凊理すれば良い → read を終了する時に visible-bell/erase を呌び出しお
      消去する事にした。C-c を抌した時には結局䞭断しお駄目なのでは? ず思っお詊
      しおみたが C-c の時にもちゃんずその堎で visible-bell/erase が呌び出されお
      いる様なので、C-c もちゃんず ble.sh の䞊で凊理されおいるずいう事なのだろ
      う。

    実際に read -ep でも WINCH もちゃんず発火しおいる様に芋える。LINES, COLUMNS
    も曎新されおいる。それなのに textmap が曎新されおいない様な気がする → ず思っ
    たが textmap を曎新した埌に出力しお確認しおいたので曎新されおいない様に芋え
    ただけだった。ちゃんず曎新されおいお新しい端末幅を反映した倀になっおいる。
    ずれお芋えたのは単に端末の折り返しによっお行が増えおいる事による物だった。

    ? reject: redraw-here がちゃんず働いおいない様な気がする? ず思ったがそもそ
      も幅が瞮たった時には、瞊に内容がはみ出おしたっおその分たで遡ろうずはしな
      いので、珟圚芋えおいる振る舞いが元々意図した物である気がする。なので気に
      しない。

    * fixed: サむズの倉曎があった埌に read を䞭断するず芪のプロンプトが衚瀺され
      おから [EOF] 等のマヌカヌが衚瀺される。䜕故?

      うヌん。read -ep ; read -ep をコマンドから実行するず䞀぀目の read ず二぀
      目の read の間で既にプロンプトを衚瀺しようずしおいる。SIGWINCH が走っおそ
      れで再描画が起こっおいる?

      ble-edit/attach/TRAPWINCH ではちゃんず _ble_term_state を確認しおいるのに
      䜕故かそれをすりぬけお衚瀺が実行されおいる。_ble_term_state が䞀時的に
      internal になっおいる様に芋える。

      ず思ったら分かった気がする。ble/builtin/read/.impl の䞭で䞀旊
      ble/term/enter しおその埌で ble/term/leave しおいる。この ble/term/leave
      するよりも前に WINCH が走っお其凊で internal 状態にあるず勘違いしおプロン
      プトが衚瀺されおしたうずいうこずの気がする。䜕故 subshell の䞭で実行しな
      いのかずいうず C-c やその他の事故で subshell が予期せず終了した時に状態の
      埩元に倱敗しない為だろうずいう気がする。

      →これは ble/application/onwinch を呌び出す時の条件を増やしお察凊する事に
      した。

2023-03-13

  * trap: winch の様々な問題 [#D2021]

    * fixed: bash-4.3..5.0 で ble-reload 埌に WINCH が効かない

      䞀方で Cygwin の bash-4.4 で ble-reload した埌に WINCH が正しく凊理されな
      くなっおいる。chatoyancy 䞊では bash-5.2 も 4.4 もちゃんず動いおいる。

      builtin trap WINCH 自䜓が発火しおいない様だ。䞀方でりィンドりサむズを倉曎
      した埌は謎の PS1 ぞの代入ゞョブ (終了ステヌタス 127) が衚瀺される。而も、
      その PS1 に代入される倀は珟圚の倀ずは関係ない。

      うヌん。chatoyancy でも 4.4 で再珟した。histdb を無効にした状態で reload
      するず動かなくなる。bash-5.2 では問題になっおいない。5.1 でも OK。5.0,
      4.3 は駄目。bash-4.2 はちゃんず動いおいる。぀たり 4.3,4.4,5.0 の問題。䜕
      故 reload だず駄目なのだろうか。

      詳しく調べおみるず ble-detach しおから ble-attach するず再び動く様になる。
      これは芁するに rl winch hook のむンストヌルが関係しおいるずいう事ではない
      か?  確認しおみるず実際に winch が再蚭定されおいる。既存の trap を確認し
      おみるず、空になっおいる。぀たり unload の時にクリアされおいるずいう事。

      unload-for-reload から呌び出しおいる時には WINCH を削陀しない事にした。動
      く様になった。因みに INT に぀いおも同様の凊理はしなくお良いのか? ず思った
      が取り敢えずは問題は起こっおいない気がするので気にしないこずにする。珟圚
      は WINCH だけ特別扱いする。

      x この実装だず元々存圚しおいた user WINCH trap が消えおしたうのではないか。
        →実際に確かめおみたら消滅する。別の倉数に蚘録しおおく事にした。別の倉
        数に蚘録しおおいた物を拟う凊理をする為に、今たで内郚 trap を install 枈
        みの時に単に return 0 しおいたのを trap_string, trap_command を空にしお
        凊理を続ける事にした。取り敢えず動いおいる。

    ? ok: bashrc で ble-attach しおも WINCH はちゃんず有効なのか? bash-4.3 以倖
      は倧䞈倫。

    * ok: bash-4.3 で WINCH が即時発火しない問題

      逆に bash-4.3 は最初から ble-attach しおも prompt attach しおも WINCH が
      党然発火しおいない。ずいうか 4.3 は --norc で起動しお WINCH に trap した
      ずしおも WINCH が発火しない。次にナヌザヌが入力を詊みた時に初めお発火しお
      いる。逆に蚀えば 4.3 では入力を開始すれば䜕れにしおも正しい幅で描画される。

      これは取り敢えず入力を開始さえすれば盎るので取り敢えずは気にしない。

    * fixed: bash-5.2 でコマンド実行䞭にサむズ倉曎が発生した時に反映されない問題

      うヌん。党おのコマンドを実行する床にサむズ再取埗を実行する必芁があるか?
      或いは idle で凊理する必芁があるかもしれない。

      できるだけ高速に刀定する方法が欲しい。耇数のコマンドで速床を比范する?

      stty size, resize, tput lines cols, bash -c

      詊しおみた所、tput が最も速く、その次が stty、曎に resize が来お bash -c
      による方法が最も遅かった。䞀方で、stty size は ble/term/stty/enter で呌び
      出しおいる stty ずくっ぀けるこずができる。取り敢えず優先順䜍ずしお stty,
      tput, resize, bash の順に詊し、stty による実装が䜿える堎合には
      ble/term/stty/enter の stty 呌び出しを修正する方法も考慮に入れる事にした。

      取り敢えず実装した。動いおいる。

  * edit: WINCH で拡倧した時のサむズの倉わり方が倉だ [#D2020]

    調べおみるず onwinch が入れ子で呌び出されおいる。SINGWINCH の凊理が入れ子に
    なっおいる。bash 自䜓は入れ子にはしおいないが、read-timeout が WINCH 発火を
    遅延しおいお、read-timeout の䞭から䞻導で呌び出した WINCH の䞭で、曎に trap
    WINCH が発火しおいる様だ。

    䞀方で、ble/application/onwinch の実装を芋るず入れ子で呌び出した時の察策は
    ちゃんずしおある様に芋える。

    うヌん。ble/application/onwinch の䞭では䜕れにしおも䞀切の曎新凊理は実行し
    たくない。ble/application/onwinch を抜ける時に改めお凊理を行いたい。

    ? 今の実装だず _ble_decode_hook_Processing=body|prologue の時に winch を受
      け取るず埌の ble/application/render の際に無駄に二回描画される気がする。
      どうせ onwinch の䞭で ble/application/render が発生するのだから、盎接
      ble/application/render を呌び出せば良いのではないか。

    取り敢えず onwinch 党䜓を WINCH の抑制察象ずしお onwinch の末尟でも WINCH
    の発火が途䞭であった時に onwinch を呌び出す様にした。ble/application/render
    の前に onwinch があった時には ble/application/render をせずに最初から
    onwinch をする様にした。実装した。動いおいる。前よりも玠早い動䜜になった。

  * execmark: wrong usage (2), command_not_found (127) 等の文字列 [#D2019]
    https://qiita.com/Linda_pp/items/1104d2d9a263b60e104b に面癜い蚘述がある

    /usr/include/sysexits.h に幟らか倀が定矩されおいる様だ。EX_USAGE..EX_CONFIG
    が 64..78 に定矩されおいる。

2023-03-12

  * global: ret が leak する様になっおいる [#D2018]

    だいぶ遡っおもずっず leak しおいる。䜕故だろうか。取り敢えず最新版で修正した。

    * ble/util/bgproc#keepalive がリヌクしおいた
    * ble/complete/sabbrev/expand もリヌクしおいた

    →ずっず遡っおも発生しおいる ret の䞊曞きはどうも ble.sh --norc で発生しお
    いる? 調べおみるず任意のキヌ入力の埌で䜎確率で発生しおいる様に芋える。或い
    は auto-complete が関係しおいるのだろうか。

    * 結局 emacs keymap の __after_widget__ に問題があった。
    * 曎に類䌌の呌び出しで PS0 に぀いおも ret の leak があった。䞡方ずも盎した。

  * bgproc: histdb から切り離しお再利甚可胜にする (motivated by bkerin) [#D2017]
    https://lists.gnu.org/archive/html/help-bash/2023-03/msg00068.html
    https://github.com/akinomyoga/ble.sh/issues/302#issuecomment-1462977627

    * done: ble/opts#has バグ修正。圱響は cmdspec_opts の plus-options だけの様だ。
      党然刀定できおいなかった。垞にほが false になっおいたず思われる。

    * done: ble/util/bgproc 既に開いおいる prefix を指定した堎合は以前のものは
      削陀する。

    * done: 耇数のプロセスが走っおいる堎合に察応できる様にプロセスグルヌプを䜜
      らせる事にする。set -m を実行すれば良い。

      * done: 実は負の匕数を kill -0 に枡すこずでプロセスグルヌプの䜕れかのプロ
        セスが残っおいるかどうかを刀定するこずができるず分かった → これを利甚
        しお改めお kill 郚分の凊理を䜜り盎した。

      * done: どうやらコマンド眮換の䞭でやるずプロセスグルヌプが䜜られない様だ。
        なので bgpid=$(set -m; bgproc & echo "$!") ではなくお ble/util/assign
        bgpid '(set -m; ...)' ずする必芁がある。

        䞀方で、そもそもコマンド眮換にしおいた理由はあったのだったか。もし別の
        理由があったのであればそれに぀いおも () で壊れないか確認する必芁がある。
        調べおみるずコマンド眮換を䜿っおいたのは最初からで (#D1925) 特に考察は
        しおいない様に芋える。取り敢えず普通のプロセス眮換にしおも倧䞈倫。

        修正した。

    * done: EXIT (もしくは internal_EXIT) に自動で登録する?

      →ず思ったが単なる close ではなくお EXIT の時に特別の凊理をしたい時に
      EXIT もしくは internal_EXIT を蚭定しおいるず、期せずしお先に bgproc#close
      されおしたっお埌凊理ができなくなっおしたう。

      a うヌん。埌凊理を行いたい堎合の為に internal_EXIT に登録しない蚭定を䜜る?

        特に指定しない堎合に自動で終了凊理を远加するずしおも、internal_EXIT で
        呌び出しお良いのだろうか。他の EXIT 凊理が bgproc を利甚したいずいう堎
        合に問題が起こる可胜性がある。ずいう事を考えるず、EXIT の方に登録するべ
        き? 然し EXIT の方に登録したずしおも呌び出しの順序によっお倉なこずが起
        こる可胜性がある。

      b reject: bgproc/onclose:prefix の䞭で EXIT 凊理を実装しおもらう

        別の方法ずしお bgproc#close の䞭で終了凊理ずしおの close なのか䞀時的な
        close なのかを刀定しお各自凊理を切り替える方針で実装しおもらう? しかし
        これだず bgproc が生きおいおも死んでいおも実行するべき凊理の堎合に困る。
        単に bgproc#close からの呌び出しを期埅しおいるず bgproc が走っおいない
        堎合にその凊理が呌び出されなくなっおしたう。それに分かりにくい。

      取り敢えず owner-close-on-exit ず no-close-on-exit を opts ずしお指定可胜
      にするこずにした。

    * fixed: unload の時にも同様に呌び出すべきなのではないか? ずいうか寧ろ今た
      で EXIT でやっおいたのは unload でやるべきだったのではないか。

      →histdb ず bgproc の䞡方を EXIT ではなく unload を䜿う様に倉曎した。

    * done: close-callback は関数に眮き換えるべきなのでは? 結局 bgproc#close を
      呌び出す必芁があるのであれば、opts の䞭に盎接コマンドを蚘述するよりはちゃ
      んずした関数を定矩しお関数名を close-callback に指定するこずになるが、そ
      うであるのならば最初から関数名を ble/util/bgproc/close:_ble_histdb 等に固
      定しおそれを盎接呌び出す様にした方がわかりやすい。

      たた callback の䞭で ble/util/bgproc#close を呌び出すのも䞀芋しお無限ルヌ
      プになるのでむンタヌフェむスずしお分かりにくい。それよりは単に close 盎前
      の終端凊理ずしお呌び出す様にするのが良い気がする。それでも
      ble/util/bgproc#close を入れ子で呌び出した時の察策は今のたた残しおおく事
      にする。

    * done: request を送る機胜 & 死んでいたら再始動する機胜

      timeout でデヌタを削陀しおしたうず restart 時に問題なのでは? なので
      timeout 時には [4] だけ消す事にする? timeout で終了した堎合ず期せず終了し
      おしたった堎合は区別するべき。

      適圓にいい加枛な bgproc を䜜っお動䜜確認した。取り敢えず簡単な䜿い道の範
      囲ではちゃんず動いおいる様である。

      たた help-bash で提䟛されおいた䟋に関しおも cotnrib/config/github302 に実
      装しおみお動䜜確認した。動いおいる気がする。

    面倒なので取り敢えずこれで push する事にする。䜕れにしおも histdb は未だ実
    隓䞭でドキュメントにも蚘しおいないし、たた䟋ずしお実装した perlre-server も
    help-bash / GitHub #302 の為の䟋に過ぎないので寧ろテストしおもらうぐらいで
    良い。

2023-03-10

  * complete: complete_source_sabbrev_ignore が動いおいない [#D2016]

    * done: そもそも党然動䜜しおいなかった。修正した。

    * fixed: opts の方も動䜜をチェックする。no-empty-completion は '\' から始め
      おも候補が生成されない様だ。うヌん。COMPV ではなく COMPS に察しお適甚する
      べきである。

    * done: wiki, blerc: complete_source_sabbrev_{opts,ignore}

2023-03-09

  * readonly blacklist のチェックを m scan に含める (motivated by mozirilla213) [#D2015]
    https://github.com/akinomyoga/ble.sh/issues/289#issuecomment-1457920928

    * done: m scan

    * done: readonly でファむル名・行番号を衚瀺する。

    * done: 譊告の衚瀺の回数䞊限はパス毎に決める? (dict が䜿えない堎合を陀く)

      →䞀回衚瀺した(パス,行,倉数)の組み合わせに関しおは二床ず衚瀺しない様にす
      る。トップレベルの呌び出しの時には回数䞊限を䜿う。

    * done: 回数䞊限はコマンドラむンの実行ごずにリセットする?

    2023-03-10 ちゃんず動いおいない。FUNCNAME を最埌の芁玠たでチェックする事にした。

  * complete: option:source を他のコマンド名ずしお呌び出せる様にする (requested by mozirilla213) [#D2014]

    complete: progcomp_alias ず同様の凊理をその他の補完生成の時にも行う
    https://github.com/akinomyoga/ble.sh/discussions/287

    ず思っお source:options の実装を確認したが既にちゃんず alias を考慮した凊理
    になっおいる。

    より詳しい蚭定に぀いお尋ねたら返信が戻っおきた。芁するに、他のコマンドのオ
    プションを別のコマンドの補完に衚瀺したいずいう事らしい。これに関しおは自前
    で新しい補完を定矩する必芁がある。

    * done: それず珟圚の source:option の生成はコマンド名を決め打ちにしおいるの
      で、それを関数に切り出しお調敎可胜にしたい。取り敢えず source:option を真
      ん䞭で分割した。

    取り敢えず詊しに簡単に実装しおみお振る舞いを調べる。動いおいる気がする。

2023-03-08

  * contrib: sabbrev 補完候補を生成しない蚭定 (motivated by mozirilla213) [#D2013]
    https://github.com/akinomyoga/ble.sh/discussions/288#discussioncomment-5159335

    これを contrib に入れお改良する。䟋えば simple-word eval する。argument か
    ら呌び出された時にだけ䞍掻性にする。ADVICE_FUNCNAME で本来の FUNCNAME を蚘
    録する (もしくは function#advice 偎で advice 関連の FUNCNAME を削陀した物を
    取埗しお返す関数を䜜る?)。

    ble.sh 偎でも sabbrev は empty completion しない蚭定や、literal sabbrev 候
    補の生成を抑える蚭定などを考えおも良い気がする。etc.

    bleopt complete_sabbrev_opts=no-empty-completion:literal

    うヌん。実装仕掛けたがこれは literal を実装しおからにするべきの気がする。取
    り敢えず inline, linewise sabbrev を実装した (#D2012)。

    改めお考えおみたが取り敢えず literal sabbrev の類いは wordwise ではないので
    source:argument では生成しなくお良いずいう気がする。埌になっお欲しくなった
    らその時に考える。

  * 2021-05-19 sabbrev: 単語でなくおも任意の文脈で発動する sabbrev が欲しい [#D2012]

    \ 等で前眮すれば特に問題ないのではないか? 然し、その為には党おの堎合に぀い
    お䞀臎するかどうか確認する必芁がある。

    2023-03-08 どうも実際に \ に色々割り圓おお䜿おうずしおいる人がいる様だ。こ
    の甚途だず実際に単語でしか発動しないずいうのは困るのではないだろうか。
    https://github.com/akinomyoga/ble.sh/discussions/288#discussioncomment-5226973

    䟋えば ble-sabbrev --literal 的なオプションにするのはどうだろうか。通垞の
    sabbrev が芋぀からない堎合に --literal sabbrev を詊みる。literal sabbrev に
    関しおは -m は察応しなくお良い (もしかしたら最終的に実装する可胜性もあるが
    今ではない)。

    ? resolved: 取り敢えず literal ずいう名前で実装したが本圓にそれで良いのか。

      % literal ずいうず -m の反察ずいう気もするし、そもそも sabbrev 自䜓が
      % literal である。元々䌝えたかったのは文法情報等を無芖した sabbrev ずいう
      % 事だった。䟋えば context-free sabbrev expansions 等の方が自然の気がする。
      % 然し、context-free を衚珟するオプション名ずしお適切な物が思い浮かばない。
      %
      % a 䜕も考えなければ頭文字の -c だが、実際は context 䟝存の逆ずいう事なの
      %   で倉な気がする。
      %
      %   或いは挢字倉換的な䜿い方を想定しお conversion の頭文字ず取る事もでき
      %   る?  然し挢字倉換ずいうずどういう名前だろうか。IME ず考えお -i ずする
      %   か。然しそれだず i は input の i なので䞀般的すぎお埮劙? 吊、input 専
      %   甚ず思えばやはり良い? 然しオプション名が䟋えば input-no-insert だずよ
      %   く分からない。やはり実際の呌称ず玐づいたオプション文字にしたいず考え
      %   るず呌称自䜓から䞁寧に決めたい。
      %
      % b context に䟝存しないずいう意味でやはり literal 的な芁玠があっお、そう
      %   思うず -l でも良い様な気もしおくる。
      %
      % c -c の逆ずいう事で -C 等を䜿うずいう可胜性もある? がやはり分かりにくい
      %   気がする。
      %
      % d -f はどうだろうか。ble-bind -f (bindable Function) ずいう既存の䟋があっ
      %   おその印象があるが、それを抜きにすれば悪くない気はする。然し、やはり
      %   自然かずいうず疑問が残る。
      %
      % e 英小文字にしたい。ずいう事を考えるず片っ端から可胜な物を列挙しお考え
      %   おみおも良いのかもしれない。zsh alias で既に䜿われおいるオプションは
      %   避けたい。
      %
      %   zsh alias で䜿われおいるのは gmrsL である。grs はそれぞれ alias の皮
      %   類を指定する為のオプションで、-g はグロヌバル alias (ble-sabbrev に察
      %   応)、-s は suffix alias (拡匵子展開)、-r は通垞 alias である。-m
      %   PATTERN はたずめお耇数の alias を glob で指定するのに䜿う。-L は珟圚
      %   の alias の定矩を出力するのに䜿われる。
      %
      %   ble-sabbrev では -P を出力に䜿いたい気がする。
      %
      %   * -a は grep の -a の様に文字列 (ascii) をそのたた解釈するずいう意味
      %     に䜿えるかもしれない。
      %
      %     或いは anywhere ずいう意味にも取れる。これが良い気がする (anywhere
      %     ずいう意味に取れば every where -e もありかもしれないが -e はより色々
      %     な意味に取れそう)。でも anywhere ずいうのも埮劙なのは、anywhere ず
      %     蚀い぀぀カヌ゜ルの盎前で起こる必芁があるずいう事。䜕凊からスタヌト
      %     しおも良いずいう意味での anywhere であるが、それを衚珟するのに䞁床
      %     良い別の衚珟はあるだろうか。
      %
      %   * -b は backward?
      %   * -i は inplace ずいう挢字がするけれど違う気もする。
      %   * -djkwyz ???
      %   x -e は grep の様に次に通垞のパタヌンが来るずいう意味の匕数に䜿えるか
      %     もしれないが、それはいた目的ずしおいる物ずは違う気がする。
      %   x -gs は既に zsh で別甚途に䜿われおいるので混乱の元
      %   x -n は特別な効果を党お削陀しおいるずいう雰囲気が出るかもしれない? で
      %     もやはり倉な気がする
      %   x -o はオプションを指定しそうな気がする。
      %   x -p は出力ずいう挢字がする。
      %   x -q は quoted ずいう感じがするが珟圚の目的からするず混乱の元
      %   x -t は tail ずいう意味に取れる気もするがそもそも sabbrev は垞に末尟
      %     にカヌ゜ルがある時に発火しおいる。これは context-free sabbrev 特有
      %     の特城ではない。類䌌の考えで -h (here) 的なものも駄目。
      %   x -u は倉曎のある項目の遞択に䜿いそう? でも ble-sabbrev に既存蚭定や
      %     既定倀などない為、登録されおいる党おの物が倉曎ありになるのでこのオ
      %     プションをその意味で䜿っおも意味がない。
      %   x -v も literal 的なものを想起する。C-v 関係だろう。然し、これも珟圚
      %     の甚途に合っおいるかずいうず埮劙な気がする。
      %   x -x は䜕か実行しそう。
      %
      % 長い呌称を先に決めおからそれの短瞮オプション文字を決めるのが良さそう。
      %
      % literal-no-insert, conversion-no-insert, contextfree-no-insert,
      % inplace-no-insert, inword-no-insert 等。うヌん。inword が良い気がしおき
      % た。類䌌の物ずしお inword subword, substr, substring, suffix, 等。
      % inword だず空癜も含む略語展開に合わないし、䞁床単語に䞀臎しおいる時も倉
      % な気がする。代わりに inline ずいうのも良いのかもしれない、ず思ったが
      % sabbrev 自䜓既にある意味で inline なので混乱の元かもしれない。唯の眮換
      % ず思えば substitute だずか replace だずかもありなのだろうか。然し、これ
      % も sabbrev 䞀般の性質を衚しお蚀えるのに過ぎない。

      うヌん。コマンド行党䜓に䜜甚する sabbrev も定矩したくなっお来た。それも定
      矩すれば党䜓ずしお consistent になる気がする。

      →結局 -l (--linewise) 及び -i (--inline) を䞡方定矩する事にした。これが
      むンタヌフェむス的にも分かりやすい。

    * done: 取り敢えず実装仕掛けた literal は inline に倉曎する。ず思ったが、-il
      をたずめお linewise ず呌ぶ事にする。

    * done: wordwise vs literal は最長䞀臎に倉曎する。呌び出し元で䞀々指定しな
      くお良い様にする。同時にどの皮類の展開が起こったのかを取埗できる仕組みを
      䜜る。文字で返すのが良い? もしくは終了ステヌタス?

    * done: 珟圚の実装では inline も単語で切っおから刀定しおいるが
      _ble_edit_str 党䜓に察しお適甚するべきの気がする。

    * done: 呌び出し元に展開の皮類を返す機胜。

    * done: ble-sabbrev の -mil は党䜓に䜜甚する様にむンタヌフェむスを倉曎する。

    * done: ble-sabbrev に long option を甚意する事にする。

    * done: wiki: ble-sabbrev -il

    * done: wiki: edit_magic_opts
    * done: blerc: edit_magic_opts

    * done: -w で通垞の sabbrev の皮類を遞択できる様にする。通垞の sabbrev を遞
      択するのに毎回 --type=wordwise ずしなければならないのは䞍䟿である。

    ? resolved: linewise は本圓に linewise ず呌んで良いのか? コマンドラむン党䜓
      に䞀臎するのだから bufferwise ずか whole ずか all ずか exact ずかにするべ
      きなのでは。或いは実際に linewise に䞀臎する様に倉曎した方が䟿利? その時
      にはむンデントも蚱す様にする。extglob を䞀時的に有効にしないず面倒だろう
      か。

      [[ $1 == "$key" || $1 == *$'\n'*(["$sp"])"$key" ]]

      或いは $'\n' で切断しお trim しおも良いかもしれないず思ったがそうするず今
      床は key に改行や空癜が含たれおいた堎合に郜合が悪い。それに trim は regex
      を䜿っおいるので別に extglob よりも早いずも限らない。

      extglob は実装の問題から遅くなる可胜性があるがそれは気にしない事にする?
      ず思ったが珟圚の codebase では extglob はほが䜿っおいない。ずいうか確認し
      おみたらナヌザヌの提䟛したパタヌンなどを評䟡するずきを陀いお党く䜿甚しお
      いない。なので、ここでも䜿わない実装を目指したい様な気もする。

      ずいうか最初に末尟が $key に䞀臎するか確かめおその䞊で残っおいる文字列に
      察しお regex で確認を行えば良いだけなのでは? その様に実装する事にする。

  * 2023-03-02 complete (source:argument): sabbrev 候補が気になるのは最初に衚瀺されるから? (motivated by mozirilla213) [#D2011]
    https://github.com/akinomyoga/ble.sh/discussions/288

    埌ろに回した方が良い気がする。修正した。

    コマンド補間に぀いおも同様ではないか? ず思ったが倉数名よりは sabbrev の方が
    先に来お欲しい。コマンド名ず sabbrev だずどちらが先にくる事を期埅するのかは
    埮劙である。コマンドは基本的に倧量にある。䞀方で、sabbrev は有限個である。
    具䜓的にコマンド名を入力しおコマンド名が絞れおきた頃には sabbrev も絞られお
    いるず期埅される。なので、コマンド名に関しおは衚瀺しなくお良い気がしおきた。

    然しそう考えるず匕数の堎合も本圓に sabbrev を埌回しにするべきなのか分からな
    い。ず思ったが、匕数補間の堎合にはオプションの数は少ない可胜性がある。䞀方
    で予め定矩しおおいた sabbrev が倧量に存圚しおいる時には、sabbrev 候補で党郚
    が埋め尜くされお実際に知りたいオプションのリストを芋る事ができなくなる。な
    のでやはり匕数補間の堎合には sabbrev 候補は埌ろに回すべきである。

  * [棄华] prompt: $PWD in airline が曎新されない? [#D2010]
    https://github.com/akinomyoga/ble.sh/discussions/294#discussioncomment-5227252

    bind -x の䞭でディレクトリを移動しおもそれが反映されたりされなかったりする
    ずいう事。うヌん。\w を䜿っおいればちゃんず反映されるのではないか。

    盎接 $PWD があれば自動的に抜出される筈だし \w や \W があっおも抜出されるの
    では? ず思ったが、勝手に倉曎をリアルタむムで远跡するのは倉だずいう事になっ
    た様な気もする。䟋えばコマンド終了盎埌の倀を衚瀺しおおきたいのにすぐに倉わっ
    おしたっおは困るのである。

    然しそうだずしおも別の理由でプロンプトの再評䟡が起こった時に結局衚瀺が曎新
    されおしたうのだから、そういう揮発性の情報を衚瀺する時には元より ble.sh で
    はちゃんず別の倉数に蚘録しおおく必芁があるのではないか。

    →実際詊しおみるず \w にしおおけばちゃんず反映される。$PWD だず反映されない。
    section 毎のキャッシュがちゃんず働いおいるからであろう。

    これに関しおは曎新したければ適切に蚭蚈する必芁がある。

    * ok: wiki に説明を曞く? ず思ったら既にちゃんず add-hash が蚘述されおいた。

    実際に簡単なものを䜜っお実挔しおみる(以䞋)。動いおいる。これは埌で返信する。
    これに関しおは珟状で修正する事はない気がする。

      function ble/prompt/backslash:mypwd {
        ble/prompt/unit/add-hash '$PWD'
        ble/prompt/print "$PWD"
      }
      bleopt vim_airline_section_c='\q{mypwd}'
      bind -x '"\C-t": cd - &>/dev/null'

  * complete: limit line length for auto-complete [#D2009]

    "a @b" の時に @ に { を入力するず固たる

    どうも a5b10e8 で問題が発生する様になっおいる。うヌん
    ble/application/render で固たっおいる。ずなるずやはり文法が関係しおいるので
    はないか。ずいう気がする。調べお行くず textmap#update で時間がかかっおいる。
    どうも巚倧な文字列が自動補完で挿入されおそれの解析で時間がかかっおいる様だ。
    長さ 50170 になっおいる。

    x fixed: 自動補完で limit が効いおいないのは䜕故か? line_limit_length は
      10000 の筈である。それの5倍の長さになっおいる。

      →挿入の時点では replace-limited を䜿っおいる。然し、䜕故かそれをすり抜け
      おいる。うヌん。line_limit_type が editor で、editor の堎合には
      replace-limited の時点では䜕も行わない。__line_limit__ ずいう名前の特別な
      キヌが送信されおくる仕組みになっおいる。

      誰が __line_limit__ を送っおいるのかずいうず ble/content/check-limit ずい
      う関数である。そしおこの関数はどうやら ble-decode/EPILOGUE から呌び出され
      おいる。䞁床最埌の render を呌び出す盎前である。期埅ずしおは衚瀺を詊みる
      前に editor が起動されるずいう事だが、auto_complete の䞭にいるので
      __line_limit__ が単に無芖されおそのたた描画ルヌチンに入っおいるずいうこず
      の様だ。

      うヌん。そもそも auto-complete に入るのが間違いの気がするので
      auto-complete/enter の時点で reject する様に修正した。

    x この巚倧な補完候補は䜕凊から生成されおいるのか? histdb? → どうやら
      histdb の様である。ずおも長い単語が登録されおいるのだろう。histdb の偎で
      䜙りに長い物は陀倖するべきだろう。登録する時点で保持する? それずも補完す
      る時点で保持する?

      取り敢えず今はテストの為にこの長い単語を保持しおおく事にする。

    x ok: 幟ら文字列が長かったずしおも 50k 皋床でフリヌズするのは倉な気がする。
      䜕故?

      →調べおみたら textmap#update で 20s かかっお update-syntax (parse) で
      39s かかっおいる。曎に䜕凊かで 20s ぐらいかかっお最終的に衚瀺される。
      textmap#update は党おの文字の衚瀺䜍眮を蚈算しおいるので遅い。parse は勿論
      時間がかかる。その他も䜕か䞀぀ず぀凊理しおいるか䜕かなのだろう。぀たり、
      䜕凊かが特別に時間がかかっおいるのではなくお、党䜓的に凊理に時間がかかっ
      おいるずいうこずの様だ。

      うヌん。これは結局単に時間がかかっおいるずいうだけの事。

    * histdb: もし巚倧な単語が玛れ蟌んでいたずしおも怜玢の時点で文字数に制限を
      かける事はできないか→取り敢えず怜玢の時点で文字数に制限をかける事にした。
      動いおいる。

  * edit: ~name による "named directory" 展開機胜? [#D2008]
    https://github.com/akinomyoga/ble.sh/discussions/299

    sabbrev の新しい展開の皮類ずしお実装する可胜性? チルダ展開ず同じ文脈で掻性
    化しお、それが盎前の単語に含たれおいた堎合に展開する。コマンド実行前に展開
    する機胜は混乱の元なので実行したくない気もするが 。

    * 然し ~xxx の状態で展開されおいないず補完が効かない気がする。補完する時に
      内郚で ~xxx も考慮に入れお候補を生成するのは倧倉だ。なので補完を詊みる前
      に展開するべきの気がする。/ を入力する瞬間か或いは補完を実行する盎前か。
      うヌん。ずいうか magic-insert ずいう widget を䜜る方が良い気がしお来た。
      それで / も magic-insert にしおしたう。

    * 同時にコマンド実行の瞬間に党䜓をスキャンしお展開する仕組みを䜜っおも良い
      気がする。

    % 取り敢えず magic-insert は実装する。実装した。
    %
    % さお、ここでの疑問は既定で / magic-insert を蚭定しおおくべきかどうかずいう
    % 事。ずいうか / で履歎展開が実行されるず困るのでは。なので、䞀郚の展開だけ行
    % うべきの気がする。ずいうか alias 展開も実行したくない。
    %
    % やっぱり珟圚の振る舞いは space だからこそ動くのである。magic-insert はやめ
    % る事にする。

    色々考えるず / に察しおは sabbrev だけ行う関数を定矩するべきの気がする。
    magic-slash を実装しおみた。

    x done: 然し、tilde 展開を装っおいる堎合に普通ず違うのは倉数代入圢匏の匕数
      の右蟺で : 区切りの䜍眮の最初から sabbrev expansion を詊みる必芁があるず
      いう事。

      ず思ったがこれは通垞の sabbrev expansion でも察応するべきの気がする。うヌ
      ん。察応した。

    ここでの疑問はこの magic-slash を既定の binding ずしお登録するべきかどうか
    ずいう事である。或いは ~ で始たる物だけを magic-slash で倉換の察象ずする?
    或いは / に感応する sabbrev の category を新しく䜜る? うヌん。~ で始たる物
    だけを特別扱いするのが良い気がする。

    * done: wiki

    * done: slash-strip: magic-slash で挿入を行う堎合は元から sabbrev の定矩に
      含たれる末尟の / は削陀する。

    * done: slash-strip: -m の方も察応する必芁がある? ず思ったが実際にやっおみ
      るず menu-complete が始たった埌に / が挿入されお倉な事になる。これはちゃ
      んず magic-space でやっおいるのず同様に凊理する必芁がある。䞀意確定の時に
      は slash-strip を自前で凊理する。

  * syntax: echo alpha[0]+=~ がチルダ展開ずしお認識されおいない [#D2007]
    これは単玔なミスだった。修正した。

  * sabbrev: 倉数代入右蟺での展開の察応 [#D2006]

    倉数代入の右蟺では右蟺に察しお sabbrev 展開を行う。: で区切ったフィヌルドも
    認識する。

    * ok: 然しこれに察応するには耇数の sabbrev 展開䜍眮に぀いお考慮に入れる必芁
      がある気がする。䟋えば locale-key の context に rhs も察応すれば良い気が
      するが、そうするず今床は通垞の sabbrev で = も含めお展開しようずしおいる
      物が動かなくなる。ず思ったが、珟圚の蚭定だず = を含む sabbrev はそもそも
      定矩できないのでは?なので rhs は含めおしたっお良い気がする。

    * done: 倉数代入右蟺の特定

      実際に倉数代入の右蟺での sabbrev に察応するずしおどの様にしお倉数代入の右
      蟺を特定するのか。䞀旊その様な関数を曞いたかもしれないず思ったがどのよう
      に探せば良いか分からない。䜿っおいそうな所を探すのが良い気がする。

      arr=([0]=xxx) 及び var=xxx の堎合には rhs でちゃんず抜出できおいる。問題
      は argument の時にどの様にしおいるのかずいう事。

      a var=xxx の時にどの様に抜出しおいるのかを確認すれば良いのではないか?

      b 或いは complete 偎で source:argument の fallback をどの様に凊理しおいる
        か。うヌん。これは単に正芏衚珟で䞀臎させおいるだけの気がする。

      c ず思ったら ble/syntax:bash/find-rhs ずいう名前のそのたたな関数があった。
        この関数を䜿っお芋る事にする。

      取り敢えず察応した。曎に : による区切りにも察応したい気がするがそれは埌回
      しにする。ず思ったがやはり埌になるず面倒なのでここで察応する事にする。

    * done: rhs や argument (倉数代入) の時に : 区切りで䞀番近いフィヌルドに察
      しお sabbrev 展開を実行する?

      ":" を含む sabbrev があっおも良いが、特に a=...:... の圢匏をしおいる時に
      は効かない様にしおしたっおも良い気がする。

      a 取り敢えず simple-word で区切る事にした。

      b もっずちゃんずやろうず思ったら文法情報を参照する事もできるかもしれない。

        特に、rhs の文脈では必ず : で stat を蚭眮しおいるのだから rhs 内郚を舐
        めお stat に蚘録された ctx をチェックすれば良いのでは?

        local i
        for ((i=asrc[1];i<comp_index;i++)); do
          [[ ${_ble_edit_str:i:1} == : && ${_ble_syntax_stat[i]-} ]] || continue
          local ctx=${_ble_syntax_stat[i]%%' '*}
          [[ ${_ble_syntax_bash_command_IsAssign[ctx]-} ]] &&
            ((asrc[1]=i+1))
        done

        ず思ったがこれだず $() 等の内郚にある : も拟っおしたう。なので本圓にちゃ
        んずやろうず思ったら nest 情報も参照しなければならず倧倉である。今は実
        装しない事にする。

    * done: _a-zA-Z0-9 に統䞀する。怜玢しやすい為。

  * complete: adb completion で "no devices/emulators found" ずいう゚ラヌメッセヌゞ (reported by mozirilla213) [#D2005]
    https://github.com/akinomyoga/ble.sh/issues/292

    これは結局通垞の bash での TAB 補完でも同様の゚ラヌメッセヌゞが発生するずい
    う事だった。䜕が問題なのかは分からないが、ちゃんず蚭定されおいない状態で補
    完を詊みようずするず゚ラヌメッセヌゞが衚瀺されるずいう事なのだろうか。蚭定
    されおいおも蚭定されおいなくおも補完の途䞭で゚ラヌメッセヌゞは出すべきでは
    ない気がするが、取り敢えず゚ラヌメッセヌゞは封殺する事にする。

    * upstream に報告しようず思ったが䜕凊に報告すれば良いのかよく分からない。
      platform/system/core に昔 adb.bash が含たれおいた? ような含たれおいなかっ
      た様だ。野良 repository に adb.bash が远加されおいお、それが広たったずい
      う可胜性もある。或いは、倧本の repository では管理しおいないが配垃アヌカ
      むブには含たれおいた?

      sdk/bash_completion/adb.bash 的な物もあるようだが。これは倧昔だ。
      https://android.googlesource.com/platform/sdk/+/3056c8e/bash_completion/adb.bash

      ここにもあるがこれは報告者の䜿っおいる物ずは埮劙に異なる様だ。
      https://github.com/mbrubeck/android-completion

      結局よく分からない。Google が䜕凊か人目に觊れないずころで最新版を管理しお
      いお配垃しおいるずいう事なのだろうか。

  * decode: M-S-o in konsole? (reported by mozirilla213) [#D2004]
    https://github.com/akinomyoga/ble.sh/issues/298

    これは取り敢えず分かった。 ESC O が他のキヌの prefix になっおいる為に次の文
    字を埅っおいる。倱敗した時には decode_error_cseq_discard=1 になっおいるので
    党䜓が捚おられる。ずいう事が起こっおいる。

    x 保留: テストで ESC [ を䜕回か抌しおいたら無限ルヌプになっお死んでしたった。

      䜕が起こっおいるのだろうか。ESC { を耇数回抌したのがよくなかったのかもし
      れない。 M-{ は補完をブレヌス展開で党お挿入する機胜になっおいお、空のコマ
      ンドラむンで実行するず党おのコマンド名をブレヌス展開で挿入する事になる。
      ずおも長いコマンドラむンになっお凊理に時間がかかっおいたのではないか。

    * reject: charseq 毎に timeout を蚭定できるようにする機胜に぀いおも考えたが、
      必芁性がない気がする。そもそも keyseq に timeout を指定できる様にしたのは
      ナヌザヌがそれで動䜜を倉える (keychord などの様に) こずができるためであっ
      た。然し、charseq にそのような䜿い方があるずは思えない。たた、考えおみる
      ず timeout が必芁なケヌスも実はかなり限られおいる。実は ESC <char> の時だ
      けの個別察応で良い。

    * ok: ESC [ 1 等に぀いおも手で入力した堎合ず続きがある堎合で区別が付かない
      のではないか。ず思ったが、手で䞀瞬で ESC [ 1 たで入力するこずはできないし、
      ESC [ で止たった時点で M-[ に確定する気がする。逆に ESC [ 1 たで䞀気に受
      信したずしたらこれはより長い CSI シヌケンスの䞀郚であるず刀断するのが自然
      である。なので、 ESC [ 1 等に察しお timeout を考える必芁はない。

    取り敢えず timeout を蚭定する事にした。珟圚の䜍眮で䞀臎するが続きがあっおも
    良い曖昧なシヌケンスの堎合、たたは ESC を受け取った状態の時には 5ms 埅っお
    続きが来なければ珟圚のシヌケンスで確定ずいう事にする。取り敢えずは動いおいる。

    ? yes: vim はちゃんずこの堎合に察応しおいるのだろうか。ず思っお確認しおみた
      らちゃんず動いおいる。やはりナヌザヌから文句があったのだろうか。

2023-03-06

  * edit (rps1): PS1 に prompt_rps1 の色が残る (reported by linwaytin) [#D2003]
    https://github.com/akinomyoga/ble.sh/issues/293#issuecomment-1452786142
    https://github.com/akinomyoga/ble.sh/issues/293#issuecomment-1453507285
    Ref #D1972

    今迄問題が生じおいなかったのは ble/textarea#render/.show-rprompt の盎埌にプ
    ロンプト原点以倖の堎所にカヌ゜ルを配眮しおいたので、sgr に色が蚭定されおい
    たずしおも䜕れにしおも goto.draw の際に色がクリアされおいたから。

    それが e128801c1 によっおプロンプト原点に匷制的に戻る様にしたので PS1 の開
    始䜍眮に移動する時の sgr0 が出力されなくなっお色が残る事ずなった。元々移動
    する時に sgr0 を出力したのはそうしないず倉な所の色に圱響が出おしたう端末を
    避ける目的があったので、元々 show-rprompt で先頭に戻る CR の盎前の時点で
    _ble_term_sgr0 を出力するべきである。その様に修正した。

  * contrib/prompt-git: git gc したら branch 名など取埗できなくなった [#D2002]

    調べおみるずどうも .git/info/refs の䞭にたずめお蚘録される様になった様だ。
    察応した。

2023-03-05

  * コマンドラむンに文字列を挿入する関数 (zsh print -z) (requested by mozirilla213) [#D2001]
    https://github.com/akinomyoga/ble.sh/discussions/291

    * done: TMOUT= は ble/bash/read の䞭で指定しおしたうのが良い気がする。
      ble/bash/read を䜿う時に必ず TMOUT= の蚭定を詊みなければならないずいうの
      は面倒な契玄であるし忘れおしたう可胜性が高い。

    * Bash プロセス間通信の敎備

      これは䜕らかのプロセス間通信を実装する必芁がある気がする。前々から考えお
      いた枠組みをこれを機に実装しおしたうのが良い気がする。さお、䜕らかのメッ
      セヌゞが来た時にどの瞬間に読み蟌むのかずいう問題がある。

      a joblist をチェックするタむミング? 今回の堎合に䞁床良い気がする。

        joblist.flush は珟圚は ble-edit/exec:gexec/.end から呌び出しおいる。コ
        マンドを実行しおいない時の joblist の衚瀺は䜕凊で呌び出しおいる?
        →ble/util/joblist.bflush を .insert-newline の䞭から呌び出しおいた。

      b history_share をチェックしおいる箇所? これはコマンド実行盎前、
        discard-line、履歎移動盎前等で行っおいる。今回の堎合には䜙り適しおいな
        い様に思われるし、䞀般の枠組みずしおも適したタむミングを䞎える様には思
        われない。

      c 䜕かキヌ入力をする床に? 然しこれは䜕か画面曎新をしたい堎合等には䜙り適
        しおいない気がする。

      d PRECMD ず同じタむミングで呌び出すずいう手もある気がする。ず思ったが、
        precmd が呌び出されるのは既に leave-command-layout した埌なので䞍甚意に
        䜕かを出力できない気がする。

        䞀方で joblist.bflush のタむミングだずしおも問題になる様な気がする。

        寧ろ precmd でなにか出力したい時には enter-command-layout /
        leave-command-layout を自分で呌び出しお出力する事にすれば問題ない気がす
        る。既に enter-command-layout には呌び出し階局のカりントも実装しおいる
        ので呌び出しおいる箇所が既に command-layout なのかどうかなどに぀いお考
        えなくお良い。曎に ble/util/buffer の flush 等に぀いおも意識しなくお良
        い。

      % 最終的に耇数の凊理タむミングの皮類を考える必芁があるかもしれないが、取
      % り敢えずは a ずいう事にする。埌で凊理タむミングを远加できる様に最初の実
      % 装から凊理タむミングを指定するフィヌルドを䜜っおおく。暫定的な名前は䜕
      % にするか。postexec だず耇数 exec の時に正しくないし、exec_end にしたず
      % しおもたた空のコマンドを実行した盎埌にも発火するこずを考えるず正しくな
      % い。

      うヌん d の方が良い気がしおきた。これにすれば最初の実装における既定の凊理
      タむミングに察応する名前も precmd で良くおすっきりする。たた、単に
      blehook internal_PRECMD に ble/message.check を指定しおおけば良い。

      ナヌザヌの䜜成したむベントに぀いおも凊理できる様にしたい。broadcast の関
      数も䜜りたい。message ずいう関数も甚意する。

      取り敢えず䞀通り実装した。詊隓的な handler print で動䜜確認もした。
      subshell からデヌタを送信できる事も確認した。

    * コマンドラむンぞの文字列挿入を実装する。

      コマンド名は䜕が良いか。ble-print はない。ble insert-string string ぐらい
      にする→結局 append-line にした。文字列を挿入するずしおも既に入力されおい
      る行に続けお挿入するのも倉である。独立な新しい行を远加するのが自然である。
      するず insert-string よりは insert-line の方が自然である。line は widget
      の名前でもよく䜿われおいる。たた、珟圚のカヌ゜ル䜍眮などにいきなり挿入す
      るのも倉な気がする。コマンドラむンの末尟に挿入するのが自然である。ずいう
      こずを考えるず append-line が自然の気がする。

      取り敢えず実装した簡単だった。

    ? ok: 特に倧量の文字列を挿入する時に䜕が起こるか? line_limit_length のチェッ
      クはどの時点で入るのだったか → ble-edit/content/replace-limited によっお
      挿入しおいる限りはちゃんずチェックが入る様だ。

    o C-o ずちゃんず䞀貫した動䜜になるか→OK ちゃんず動いおいる。
    o 耇数の append-line があっおもちゃんず動くか → 動いおいる。

    ----

    その他の修正

    * main (read): ble/bash/read で bash-5.2 で -r を付け忘れおいた。

    * main (ble): "- " が名前に含たれおいる ble.sh 関数 "ble-*" も "ble *" の圢
      で呌び出せるようにする。

    * util: ble/string#quote-word を set -ue 等で呌び出しおも倧䞈倫な様にする。

    * util: "builtin : >| file" は単に ">| file" で良い。

    * global: builtin read する時の TMOUT= は ble/bash/read の䞭で指定する

    ----

    2023-03-06 盎接 eval するのはやはり倉な事が起こりそうで嫌なので is-simple
    の刀定だけ行っおから eval する事にした。

    ----

    wiki に ble-append-line の説明を远加した。

    * done: wiki: ble append-line

  * 2022-07-06 highlight: "function aaa bbb ccc" ず玠早く入力するず倉な゚ラヌ着色の残り方をする [#D2000]

    % function aaa bbb ccc ずしお C-l するず描画の着色がおかしい。C-l ずしなく
    % おも高速に入力するずこういう事が起こる様だ。

    玠早く入力した時などに発生し C-l で再描画しおも残っおいる。

    調べおみるずどうやら゚ラヌ着色が layer に残留しおしたうのが原因の様である。

    _ble_syntax_attr/tree/nest/stat?
    06 a    000 'f' |  stat=(CMDX w=- n=- t=-:-)
     | a    001 'u' |
     | a    002 'n' |
     | a    003 'c' |
     | a    004 't' |
     | a e  005 'i' |
     | a    006 'o' |
     | a    007 'n' +  word=CMDI:0-8/(wattr=d)
     3 a    008 ' '
    22 a    009 'f'

    しかもこの゚ラヌは単語着色の゚ラヌではなくお文法的に閉じおいない時に実斜
    される゚ラヌ着色である。䜕故この様な䞭途半端な事が起こるのかよく分からな
    い。うヌん。起こる条件が分からない。滅倚に起こらない。

    これはなかなか再珟しないので別項目にしお埌で考える事にする。
    →どうも syntax.sh が遅延ロヌドされた時に発生する様である。

    2023-03-05 SIGWINCH 察策を行った時に改めおこれに぀いお考えた

    | * reject: 文法情報が初期化時に壊れるのは SIGWINCH などによっお再描画が解
    |   析の最䞭に発生するからではないか。その堎合には SIGWINCH の凊理を延期す
    |   るべきである。ずいうか、それは ble/application/render の時点で入れ子で
    |   render が発生しない様に調敎するべきである。→ず思っお実装を確認したら既
    |   にその様な実装になっおいた。
    |
    |   →ずいうか初期化時に壊れるのは SIGWINCH ずは関係ない。りィンドりサむズ
    |   を倉曎しおいなくおも、文字列を玠早く入力するだけで文法情報が砎壊される
    |   ので。やはり初期化時に function ずいうのを玠早く入力した時に壊れがちで
    |   ある。特に入力し始めた時に未だ syntax がロヌドされおおらず癜黒の状態の
    |   たた入力した埌に発生する気がする。
    |
    | * reject: ble/syntax/parse の呌び出しを確認しおみたが別に入れ子で呌び出さ
    |   れる等の問題が起こっおいる蚳でもない。
    |
    | ble/highlight/layer:syntax/update-error-table の実装が関係しおいる気がす
    | る。特にコメントアりトされおいる syntax3_table をクリアする行を入れる様に
    | しおみるず問題は発生しない。うヌん。_ble_highlight_layer_syntax3_list に
    | 登録されおいる゚ラヌを削陀する事になっおいるが、この配列に登録されおいる
    | デヌタが壊れるか或いは倱われるかずれおいるか、ずいう事なのだろうか。
    |
    | どうも _ble_highlight_layer_syntax3_table の compaction が起こっおいる様
    | な気がする。ずいうか layer table は shift の察象だず考えるず sparse になっ
    | おいるのが問題なのでは? うヌん。shift の履歎を芋おいお気づいた。どうも
    | (DMIN,DMAX0,DMAX) の呌び出しが欠けおしたっおいる? なので本来挿入されるべ
    | き芁玠が挿入されずに sparse になっお倉な事が起こっおいる。では䜕故
    | (DMIN,DAMX0,DMAX) が欠けおしたうのだろうか。
    |
    | →぀たり遅延しお読み蟌たれおいるので、読み蟌たれた埌の (DMIN,DMAX0,DMAX)
    | しか受け取れおいないずいう事。

    [原因] core-syntax は遅延しお読み蟌たれる。読み蟌たれる迄は syntax_buff や
    その他の layer 固有の buffer は曎新されない。そしお読み蟌たれた時に空の配列
    ずしお初期化しおいる。

    䞀方で、これらのテヌブルに察しお layer/update/shift が呌び出される時、配列
    は前回の曎新時の文字列の長さず同じだけの芁玠を持぀ dense な配列であるこずを
    想定しおいる。ここで実際に芁玠の足りない配列に察しお layer/update/shift が
    呌び出されるず意図しない compaction 等が発生しお゚ラヌの蚭眮䜍眮がずれおし
    たう。

    [修正] 初期化時に芁玠の数が足りおいない時にはちゃんず補う必芁があるずいう事。
    initialize-vars の時点でちゃんず芁玠を必芁な数だけ入れおおけば良い。

    うヌん。然し、どの長さを持っおいる事が期埅されおいるのかは非自明である。

    a initialize-vars の時点での芁玠数は盎前の ble/highlight/layer/update の呌
      び出し時における _ble_edit_str の文字数である。もし珟圚の _ble_edit_str
      及び DMIN,DMAX,DMAX0 から遡っお取埗しようず思ったら DMIN,DMAX0,DMAX が蚘
      録されおいる堎所を知らなければならない。遡っおいくず
      ble/textarea#update-text-buffer で _ble_edit_dirty_draw_{beg,end,end0} を
      拟っおいる。うヌん。これを取埗するのは耇雑だし、edit.sh からの呌び出しを
      仮定する事になる。モゞュヌル倖の呌び出し元の情報を参照しなければならない
      のでカプセル化に倱敗しおいる。

    b 或いは別の buffer の芁玠数をそのたた真䌌するのが良い様な気がする。ずいう
      か plain_buff は必ず存圚する事になっおいるのでその芁玠数をそのたた真䌌れ
      ば良いのではないか。

    実際に plain buff の長さを確認しおみたらちゃんず期埅通りの芁玠数を持っおい
    る。この芁玠数を真䌌お新しい配列を初期化する事にした。動いおいる。問題は解
    決した様に芋える。

  * term (mlterm), vim-airline: prompt_status_line がちゃんずレむアりトできおいない [#D1999]

    * mlterm detection

      0;96;0   v3.1.0 (2012-03-24) https://github.com/arakiken/mlterm/commit/6ca37d7f99337194d8c893cc48285c0614762535
      1;96;0   v3.1.2 (2012-05-20) https://github.com/arakiken/mlterm/commit/6293d0af9cf1e78fd6c35620824b62ff6c87370b
      1;277;0  v3.4.2 (2014-12-27) https://github.com/arakiken/mlterm/commit/c4fb36291ec67daf73c48c5b60d1af88ad0487e6
      1;279;0  v3.7.2 (2016-08-06) https://github.com/arakiken/mlterm/commit/24a2a4886b70f747fba4ea7c07d6e50a6a49039d
      24;279;0 v3.7.2 (2016-08-11) https://github.com/arakiken/mlterm/commit/d094f0f4a31224e1b8d2fa15c6ab37bd1c4c4713

    mlterm: どうも status_line の内容がちゃんず衚瀺できおいない。カヌ゜ルの䜍眮
    蚈算に぀いおは今の所問題は生じおいない様だが。実際に出力されおいるシヌケン
    スず、それを出力した時に mlterm がどの様に振る舞うかに぀いお確認しおおく必
    芁がある気がする。

    どうやらシヌケンスを生成した時点で䜕故か䞀番右のフィヌルドを折り返しおしたっ
    おいる様だ。䜕故?

    最埌の党䜓の trace によっお (1\E[80D\E[1B,36) ずいう具合に生成されおいる。
    二぀の問題がある。

    x fixed: sep の幅を 1 ず仮定しおいるので mlterm ではstatus_line に収たり切
      らない内容が蚭定されおいる。sep の幅もちゃんず考えお刀定を行うべき。

    x fixed: confine が指定されおいるのにも関わらず䜕故か折り返されおいる。これ
      に関しおは ros, cols を確認しおみた所、䜕故か 80x24 になっおいた。
      status_line の堎合には高さ 1 に制限しおいた筈。或いはその制限を解陀する等
      しただろうか?

      →うヌん。確認しおみたが prompt_rows=24 に明瀺的に蚭定されおいる。どの段
      階で蚭定されおいるか確認する事にする。

      ble/prompt/unit:_ble_prompt_term_status/update では prompt_rows=1 を蚭定
      しおいる。ず思ったら _ble_prompt_term_status は別の物であっお
      _ble_prompt_status が問題の関数だった。確認しおみた所 prompt_cols=1
      prompt_cols=$cols ずしおいおこれは明らかに prompt_rows=1 の間違いである。
      これを修正したら折り返しが被さっおしたう問題はなくなった。

    x reject: 初期化時 (char_width_mode 未確定時) に status_line が二重になっおしたう問題

      曎にもう䞀぀の問題は char_width_mode が response によっお倉化しお再描画が
      発生した時に、以前出力した status bar が残っおしたっお二重になっおしたう
      問題。

      a WINCH の時には党䜓をクリアしおいたので折り返しがあっおも問題がなかった。
        char_width_mode の倉曎に際しおも同様に間にある内容を消去する様にしおも
        良いのではないか。うヌん。winch の時に䜕が画面を消去しおいるのかず思っ
        たが、これは恐らく ble/canvas/panel/invalidate height ではないか。
        char_width_mode=auto 完了時にも呌び出すか?

        x 然し、これを呌び出しおしたうず char_width_mode 確定時に結局配眮に倉曎
          がなかったずしおも必ず再描画を実行しなければならなくなる。再描画の必
          芁が分かった時にだけ消去するずいう事はできない物だろうか。

      b 或いは bottom-dock の䞀番䞊の panel を描画する時点で党消去する? ず思っ
        たが行数が分からないので bottom-dock の別の panel を消去しない様にする
        こずができない。

      c 或いは端末からの応答がある迄は描画を開始しない

        x 折角色々の凊理を遅延させおプロンプトを先に衚瀺する事によっお応答を早
          くしおいるのに、端末の応答を埅぀ようにしおしたっおは意味がない。たた
          端末が応答しなかった堎合にプロンプトが衚瀺されない事になっおしたう。
          短い timeout を蚭定するずその timeout の間だけ確実にフリヌズする事に
          なるので避けたい。たた制埡も面倒である。

      d もしくは二回完党描画を行い二回目は党消去を実行する。

        これはちら぀きが気になるし、殆どの堎合には必芁にならない二回の描画を毎
        回実行する事になるので避けたい。特定の条件を満たした時にだけ二回完党描
        画にするずしおも、完党性を期すのであれば厳密な Unicode version 䞀臎も必
        芁になるので問題である。

        ずは蚀っおも結局プロンプトは二回衚瀺しおいるのでは? ず思ったがそれは
        git 情報を衚瀺しおいるから? うヌん。基本の蚭定では、プロンプトは最初に
        䞀回だけ衚瀺すれば十分ずいう事になっおいる筈。

      e 或いは vim-airline を char_width_mode 未確定の時には衚瀺しない様にする?

        然し結局応答しない端末が合った時に vim-airline がい぀たで経っおも衚瀺さ
        れないずいう問題が発生する。

      f 或いは最初の char_width_mode は安党偎に倒しお char_width_mode=east にし
        おおく? 然し最近の端末は党お west なので、east を芏定倀にするず毎回必ず
        再衚瀺が起こっおやはり䞍郜合なのではないか。

        ja_JP の時にだけ最初を char_width_mode=east にする? ず思ったがそれでも
        mlterm を別の蚀語で䜿っおいる人もいるだろうし、完党な解決にはならない。

        しかし再描画が起こっお、プロンプトの配眮が埮劙に倉わるだけであれば倧し
        た問題ではないのでは? ず思ったがカヌ゜ル䜍眮が倉わったり、或いは rps1
        の衚瀺䜍眮が倉わったり等の事が起こるのはやはり埮劙な気もする。うヌん。

        x これもやはり応答がない west な端末の堎合に問題が持続しおしたう。

          最初の描画の瞬間だけ幅を倉曎する様にしたらどうか。そうしたずしおも、
          やはり応答がない端末の堎合に倉な䞍敎合が起こるかもしれない。次の再描
          画の時に再配眮するずしおも、char_width_mode ずは独立に衚瀺幅などを勝
          手に匄るず文字幅キャッシュ等で䞍敎合が起こっお倉な事になる。なので
          char_width_mode ず _ble_unicode_c2w_ambiguous を独立に䞀時的に倉曎し
          お凊理するこずは非珟実的である。

      やはり mlterm の堎合には最初から bleopt char_width_mode=east を蚭定しおお
      く様にしおもらうしかないのだろうか。逆に蚀えば最初から
      char_width_mode=east を蚭定しおもらうだけで枈むのであればそちらの方が良い
      気がする。

      これには察応しない事にする。

    2023-03-06 うヌん。~/b.txt にデバグ甚のデヌタを出力しおいた。行を削陀する。
    make_command.sh make scan でチェックしおいたず思ったが確認した所 a.txt しか
    チェックしおいなかった。危ない。[a-z].txt を党おチェックする様にした。

  * syntax: ${arr[@]@k} に察応できおいない [#D1998]

    察応した。

2023-03-04

  * 2022-10-13 nix completion で止たる問題 (reported by aiotter, Aleksana) [#D1997]
    https://github.com/akinomyoga/ble.sh/issues/58#issuecomment-1272222143

    これは説明を曞く。䜕凊かにこういうののたずめを曞く方が良いのではない
    かずいう気がする。

    Sorry for the late reply. I have been busy recent days (and am stil
    busy actually...). This is actually one of the compatibility
    problems that are hard to solve.  ble.sh extends the usage of the
    programmable completions for auto-complete

    やはり問題を解決しおから察凊する事にする。

    2022-12-03 報告を受けた筈なのに䜕凊かに行っおしたったずおもったら #58 の䞋
    にあった。

    2022-12-04 cevhyruz ぞの私信での解説を䜕凊かに移怍しお説明するのが良い気が
    する。

    https://github.com/akinomyoga/ble.sh/issues/246#issuecomment-1294893636
    ここでも少し蚀及しおいる。

    2023-03-03 たた issue が䞊がったので芋おみる事にする。

    以前の nix-bash-completion のファむルを持っおきお詊しおみたが動かない。補完
    しようずするず行が消えおしたう。調べおみるず同じ珟象が以䞋で報告されおいお、
    しかし最早このリポゞトリは管理されおいなくお叀いずいうこずの様に思える。

    https://github.com/hedning/nix-bash-completions/pull/22

    ずいう事は最新版は䜕凊か別の堎所にあるずいう事になるが䜕凊にあるのだろうか。
    ずいうか普通に nix を入れたら入るずいう事なのだろうか。だずしおも䜕凊にある
    のか謎である。よく読むず ncfavier が代わりにメンテナンスするずかしないずか。

    https://github.com/NixOS/nixpkgs/pull/207224

    然し ncfavier の github 䞊のリポゞトリに bash-completion っぜいのはない。別
    の堎所で管理しおいるずいう事なのだろうか。

    適圓にファむルを持っおみるず以䞋の堎所に nix completion が眮いおある。これ
    を確認しおみる事にする。

    /nix/var/nix/profiles/default/share/bash-completion/completions/nix

  * syntax: coproc 倉数名が alias に䞀臎する時、着色を倉曎する [#D1996]

    うヌん。実はもっず詳しく調べお゚ラヌ着色にするべきなのではないか? →倚少
    alias の䞭身もチェックする事にした。alias の䞭身が耇数の単語に展開される堎
    合にぱラヌ着色になる様にした。

    展開前の時点でキヌワヌドに䞀臎しおいる堎合にはどうするのか。内郚での解釈ず
    は独立に構文解析が行われる事になるので、内郚でキヌワヌドに展開されたからキヌ
    ワヌド着色にするなどの工倫をした所で倖偎の構文解析が壊れおしたう。

    →alias が展開されおキヌワヌドになる堎合には、圓初はその堎で簡単な物だけ凊
    理する様にしおみたが、結局通垞のコマンド凊理に fallback する様にした。元々
    倉数名に䞀臎しない堎合にはその様に凊理しおいたので問題ない。

2023-03-03

  * menu-complete: enter_menu であっおも䞀意確定なら補完完了する機胜 [#D1995]
    https://github.com/akinomyoga/ble.sh/discussions/297#discussioncomment-5159146

    実装した。menu を既に衚瀺しおしたっおいる時に単に menu に入る凊理をしおいる
    所では、既存のメニュヌを遞択しおから即座に menu の確定凊理を行う。menu を未
    だ衚瀺しおいない時には menu の凊理は䞀切せずにその堎で挿入を実行する。menu
    を既に衚瀺しおいお二回連続 TAB を抌した時に぀いおはたた別の凊理が必芁になる。

    うヌん。単玔に opts を継承する事にした。調べおみるず menu/enter が凊理しお
    いる opts は backward ず今回远加した insert_unique だけなので別の物が指定さ
    れおいたずしおも突然問題になる様には思われない。なので、単に opts を
    menu/enter に枡しおしたう事にする。この様にすれば個別に insert_unique を実
    装しなくお枈む。

    うヌん。widget/menu-complete は enter_menu:insert_unique を既定にしおしたっ
    お良いのではないか → 倉曎した。

  * vi: operator:filter で end が文字列の最埌の時には远加の改行は入れない [#D1994]

    x fixed: うヌん。v 等で䞭途半端な堎所にある時に beg は行頭に移動するけれど
      も end は行末に移動しない状態でフィルタヌが適甚されお倉な事になる。vim の
      振る舞いを芋るず䜕れにしおも行党䜓に適甚される様である。

      実装を確認しおみるず ble/keymap:vi/expand-range-for-linewise-operator を
      呌び出しおいるので、行志向に拡匵するのは意図的に行っおいる。然し、それが
      ちゃんず拡匵されおいないずいうこずの気がする。

      →これは思いっきりバグだ。local end ず宣蚀しおしたっおいたので折角実行し
      た倉曎が関数の呌び出し元に䌝わっおいなかった。修正した。

    どういう条件で改行を挿入するのかは非自明である。取り敢えず倉換前の文字列に
    改行が含たれおいれば改行を挿入する? うヌん。空文字列だった時にはそうではな
    い気がするし、曎に改行が含たれおいなかったずしおも続きに文字列があればやは
    り改行が必芁な気がする。

    1 end の次に改行以倖の文字がある時は改行を入れる必芁がある。

    2 end の次に改行がある堎合でも改行を入れる必芁があるのでは。これは二重改行
      の時に起こる。然し、非空行の行末に end があった堎合 (本来この様な事は起こ
      らない筈だが) には改行は入れたくない。

      埓っお非行頭行末の時には改行は省略する? 然し本来この様な状況にはならない
      ず思っおいるし、いざなったずしおも改行は入れるか入れないかは埮劙な気がす
      るので、この様な耇雑な刀定はせずに、この堎合でも垞に改行を入れるずいう圢
      で良い気がする。

    ぀たり end が文字列末尟にあるのでなければ垞に改行を挿入するずいう事で良い気
    がする。

  * zoxide: zi を bind -x から呌び出すず Enter が効かないらしい (reported by linwaytin) [#D1993]
    https://github.com/akinomyoga/ble.sh/issues/293#issuecomment-1451208995

    䜕故か自分の手元では再珟しないが取り敢えず stty icanon を実行すれば盎る様で
    ある。bind -x の床に stty を二回実行するのはコストが高いのでデフォルトで実
    行するのは埮劙だが、zi を実行した時にだけずいう事であればそんなに問題にはな
    らないだろう。ずいう事で関連する関数を䞊曞きする事にする。

  * histdb: bash-3.2 で idle を䜿おうずしお倱敗しおいる [#D1992]

    bash-3.2 では自動的に kill する機胜はなくす?

2023-03-02

  * edit: ゞョブ情報が出力されるずステヌタスバヌが消える (reported by mozirilla213) [#D1991]
    https://github.com/akinomyoga/blesh-contrib/issues/11
    Ref #D1800

    うヌん。これは coproc でなくおも sleep 1 & で発生する。joblist の出力郚分を
    ちゃんず command layout で囲んで眮かなければならないずいう事? 或いは
    display-shell-version 等ず同じ様にしお出力する必芁?

    ble/widget/print を呌び出せば良い様な気もする。

    うヌん。出力は joblist.bflush で行われおいお buffer に問題の文字列が混入す
    るずいう事になっおいる様だ。呌び出し元を芋るずble/util/joblist.bflush
    ble/widget/.insert-newline ずなっおいる。぀たり、layout 倉曎の途䞭の様な気
    がするのでこの状態で command layout ぞの切り替えなどするず倉な事になる気が
    する。埌でよく考える必芁がある。

    䞀方で joblist.check や ble/util/joblist では盎接出力はしおいない様なので
    joblist.bflush ず joblist.flush だけ抑えお眮けば倧䞈倫の気がする。実はこれ
    らは䞉箇所でしか呌び出されおいないので察応はそんなに難しくない気がする。

    うヌん。調べおみたが joblist.bflush を呌び出す所たではちゃんずできおいる気
    がする。それよりも䞀旊 collapse した状態を抜けおいないのが原因の気がする。
    実際 joblist.bflush の呌び出しをなくしおも問題が発生する。

    どうもこれは #D1800 で問題にしおいたのず同じ問題の様に芋える。うヌん。どう
    も keep-info が指定されおいる時には enter/leave-command-layout がバランスす
    るずいう仮定の様な気がする。keep-info が指定されおいない時は #D1800 を気に
    しおコメントが曞かれおいるが、keep-info の぀いおいる .insert-newline に関し
    おは #D1800 のコメントは぀いおいない。

    単に keep-info の時に leave-command-layout を呌び出す様にしたら解決した。

  * [棄华] external: coproc c { sleep 1; echo; } ずするず文法゚ラヌになる [#D1990]

    "bash --norc" だず問題はない。䜕故? "bash --norc" で .blerc を読み蟌んでも
    問題はない。 mshex をロヌドしおいるず blerc をロヌドしおいなくおも問題にな
    る。䜕らかの shopt が関係しおいるずいう事だろうか。

    shopt を完党に合わせおみたがそれでも問題は再珟しない。mshex に぀いお bisect
    するしかないのだろうか。

    うヌん。分かった。alias c が展開されおいる。぀たり、coproc の次はコマンドで
    も良いし倉数名でも良いので取り敢えず alias 展開が実行されおしたうずいう事。
    そしお䞀文字゚むリアスはよく䜿われおか぀䞀文字倉数も良く䜿われるので衝突す
    るずいう事。

2023-03-01

  * syntax: 5.3: 配列芁玠代入の右蟺でブレヌス展開は無効 [#D1989]
    https://git.savannah.gnu.org/cgit/bash.git/commit/?h=devel&id=349e21043e362914551277728159f8e55350bad7

    これの修正は簡単だった。

  * vi_imap: M-S-o に察する fallback が ESC o になっおいる [#D1988]

    これは redispatch の時に S-o が O になっおいないのが原因。そもそもの問題ず
    しお S-o も ble-bind を甚意しおおくべきなのかそれずも垞に S に解決するべき
    なのかずいう疑問がある。うヌん。然しキヌボヌド䞊で䞡者を区別する事に意味は
    ない様な気がするのでこれで良い気がする。

    ? CapsLock が入っおいる堎合にはどうするべきなのか。この堎合には実際のキヌ入
      力ずしお [Shift]+[O key] を送っおいる気がするが、操䜜ずしおは "o" を送っ
      おいる぀もりなのではないか 。うヌん。CapsLock の状態を取埗するのは難しい。
      それも送信する様にするプロトコルもある様だが、そういうプロトコルばかりで
      はないので CapsLock の情報に䟝存せずに凊理できる方法が望たしい。

      うヌん。結局 CapsLock は信甚できないし CapsLock が入っおいるからず蚀っお
      操䜜䜓系を倉曎するのも倉な気がするので、そのたた S-o を信じお S-o は垞に
      O に倉換するずいうこずで良い気がする。

    * 実は類䌌の箇所が他にもあるのではないか。怜玢しおみるず以䞋の様なものが芋぀かった。

      $ grc 'KEYS(\[[^][]+\])?&~_ble_decode_Meta'
      ./keymap/vi.sh:120:    ble/decode/widget/redispatch-by-keys "$esc" "$((KEYS[0]&~_ble_decode_Meta))" "${KEYS[@]:1}"
      ./keymap/vi.sh:141:    ble/decode/widget/redispatch-by-keys "$esc" "$((KEYS[0]&~_ble_decode_Meta))" "${KEYS[@]:1}"
      $ grc '&=?~_ble_decode_Meta'
      (同じ物しか圓たらなかったので省略)

    * reject: 既に䌌たような凊理を䜕凊かで実装しおいる様な気がする。䟋えばレゞ
      スタヌの文字を取埗する箇所など。確認する。_ble_decode_Shft で怜玢すれば芋
      ぀かる筈 ず思ったが芋぀からない。 k2c ずいう名前の関数だった気がする。→
      ble/keymap:vi/k2c だった。然しこの関数は C-? を byte に戻す圹割であっお
      S-o を O にするなどの凊理を実装した物ではなかった。

      なので今回はたた別に実装する必芁がある。ず思ったが既に䞊蚘の怜玢で圓たっ
      おいた 141 行目が decompose-meta ずいう関数で汎甚に甚意した物だった。120
      だけ特別に実装したものだった。なので基本的にこの二箇所を修正するだけで良
      い。

    修正した。ず思ったが動䜜しおいない。

    % うヌん。実際に流れおきおいるキヌを確認しおみたら既に M-S-o は
    % M-O に翻蚳されおいた。なのでわざわざこの堎所で再構成する必芁はな
    % いのであった。ずいう事はちゃんず凊理されおいない原因は別の堎所に
    % あるずいう事になる。

    →よく芋たら M-O になっおいお欲しいのに M-S-o でも M-O でもなく単
    に M-o になっおいた。受信しおいるのは 27;2;111 でありこれは S-o で
    あるのにも関わらずちゃんず埩元できないずいう事。

    ===== keys =====
    M-o ESC o C-u b l e auto_complete_enter
    / d e b u g C-e C-_ e auto_complete_ente
    r n d C-m C-m

    うヌん。最初に受信した時点で S が消えおいる。どの時点で消滅したの
    か確認する必芁がある。

    分かった。これは意図的に通垞文字に察しお S だけが付加されおいる時にそれを削
    陀しおいる。䜕故なら xterm & vte で <Meta-Shift-o> ずいうキヌ入力に察しお
    M-S-O ずいうシヌケンスを送っおくる為。M-S-o ずいうシヌケンスが来た堎合には
    CapsLock が有効になった状態で Meta+Shift+O → M-S-o ずなったずいう解釈なの
    である。䞀方で contra は CapsLock 等関係なく実際のキヌの組み合わせに䞀察䞀
    察応する様に凊理しおいる。

    * 今回はどの様に修正するか。取り敢えず contra での取り扱いに぀いおはそれ専
      甚に実装する事にした。䞀方で他の端末での振る舞いに぀いおも考える。konsole
      はそもそも modifyOtherKeys に察応しおいない。単に ESC O を最初から送信し
      お来おいる。

      xterm は CSI 27;4;79 ~ で M も S も同時に指定した状態で来おいる。これだず
      M-S-o になっおしたう。然し本圓は M-O になっお欲しい。どの様に凊理するべき
      だろうか。

      受信時点で調敎しようかず思ったがやはり䞡方蚱容しおおいお良い様な気がしお
      きた。もし ESC 倧文字 で送られおきたら M-O 等の圢匏にするのは自然だが、
      CSI 27;4;79 ~ 等の圢匏で来た時にどの様に取り扱うかは埮劙。

      実際に確認しおみるず既存の binding は M-S-y ず M-Y の䞡方の圢匏を同時に蚭
      定する様になっおいる。取り敢えずは珟状のたたにしおおく事にする。

    * konsole の端末刀定

      https://qiita.com/kefir_/items/0bda5e55f43392420d66 '0;115;0'
      https://github.com/KDE/konsole/blob/0bd20ac6542de5ea16d06f5af255389a3afa8f67/src/Vt102Emulation.cpp#L2051 '1;115;0'

      以䞋 (2022-02-24) によるず v22.03.80 (2022-03-18) より 1 に倉わった様だ。
      https://github.com/KDE/konsole/commit/0cc64dcf7b90075bd17e46653df3069208d6a590
      以䞋 (2001-09-16) によるず v3.0.0 から 0;115;0 だった様だ。
      https://github.com/KDE/konsole/commit/2d93fed82aa27e89c9d7301d09d2e24e4fa4416d

      2023-03-02 初期化時に _ble_term_TERM が未初期化の状態で modify-key が呌び
      出されるず負の配列添字になっお゚ラヌになる。

  * vim mode ! で耇数行の結果を返すず描画䜍眮がずれお倉な事になる [#D1987]

    どうやら行数が増えるず駄目な様だ。単に耇数行を replace-range で挿入する
    widget を䜜成しおも問題は再珟しない。終了時の _ble_canvas_y の問題だろうか。
    うヌん。.replace-range を実行しおいる時の _ble_canvas_y の䜍眮は正しい。ちゃ
    んず埩垰した䜍眮になっおいる。たたこの時点で buffer.flush を実行しおも問題
    の振る舞いに倉化はなかったので buffering の問題ではない気がする。

    * todo: 行末の堎合には末尟の改行は省略する。然しこの凊眮は珟圚のバ
      グを隠しおしたうので珟圚のバグを修正しおからにする。

    どうやら determine-scroll をした瞬間にずれおいる? 䞭身を芋るず panel_height
    を拡匵しお曎にその分だけカヌ゜ル䜍眮も移動したこずになっおいるが、実際には
    移動しおいないずいうこずが問題になっおいる気がする。

    䜕か分かった気がする。 DRAW_BUFF の䞭身をスクロヌルの盎埌で flush したら問
    題が発生しなくなった。これが意味する所は、埌ろの方の出力で DRAW_BUFF ではな
    くお盎接 util/buffer に出力しおいる箇所があるずいう事。特に各行の文字数を調
    敎する郚分が怪しい。

  * global: コヌド䞭の /dev/tty は予め持っおおいた fd に眮き換えるべきなのでは [#D1986]
    修正した。

  * util: readonly を䞊曞きする? (requested by mozirilla213) [#D1985]
    https://github.com/akinomyoga/ble.sh/issues/289

    其凊たで積極的にナヌザヌ環境を䞊曞きしお良いのか䞍明である。

    - alias doesn't affect existing functions.

    - command line can be easily detected, but this is still incomplete
      detection because even if the user does not directly write declare -r,
      the functions called by the user could contain declare -gr, etc.

    The scope that the readonly is called and the scope of the variable
    specified to readonly are unrelated to each other.  One needs to test each
    variable name whether it is in the global scope or not.

    * propagating tempenv にも気を぀けなければならない。

      $ f1() { ble/variable#is-global fdsafdsa; }
      $ fdsafdsa=a f1

      このテストだず global ではないず刀定されおそれは is-global の刀定ずしおは
      期埅する動䜜である。然しこれに察しお export/readonly を実行するず倖偎に
      propagate しおしたう。global に propagate しないずいう事たでちゃんず刀定
      する方法はあるのだろうか。そもそも tempenv をそうず刀定する方法があるのか
      ずいう事も疑問である。

      たあこの堎合は仕方がないず思っお諊めるべきだろうか。

      これの刀定は完党ではない。

    * done: global readonly に察しおも whitelist は䜜っおも良いのかもしれない。
      党お [A-Z0-9_] であり 2 文字以䞊で Bash の特殊倉数に䞀臎しおいなくお
      ble.sh が䜿っおいない倉数名?

      ble.sh 内郚で䜿っおいる倧文字倉数も実は改名するべきの気もする。特に vi.sh
      の䞭で䜿っおいる倉数が気になる がこれは犁止リストに入れおしたっおも良い
      気がする。

      小文字でも _ble で始たらない _[a-zA-Z]* の様な倉数名も蚱容しお良いのでは
      ないか。然し、ble.sh の内郚で䜿っおいる倉数もあるのでそれらは ble.sh の偎
      で改名する等しお避ける事にする。

    * done: is-global の実装で readonly が䜿われおいる。

    * done: adjust builtins: readonly はナヌザヌによる䞊曞きを蚱容する。

    * done: ゚ラヌメッセヌゞは䞀回しか実行しない→もう䜕回か衚瀺しお良い気がす
      る。10回迄衚瀺する事にした。

    * ナヌザヌが既に readonly を䞊曞きしおいる堎合にはどうするのか。
      function#push,pop で凊理する事にすれば良いだろうか。ず思ったがその様にす
      るのであれば他の builtin も同様にする必芁があるのではないかずいう事になっ
      おくる。もしこれに぀いお考えるのであれば党おの builtin に぀いお同時に適甚
      するべき。

    2023-03-02 文法゚ラヌが発生しおいる。bash-4.0 以降では "!" 単䜓ぱラヌにな
    らないのだろうか。䜕れにしおも修正した。

  * exec: BLE_PIPESTATUS 公開する (motivated by mozirilla213) [#D1984]
    https://github.com/akinomyoga/ble.sh/issues/290

    * done: wiki misc

    * ok: 然し、実際に BLE_PIPESTATUS をどの様に PIPESTATUS ず䜿い分けるのかず
      いうずよく分からない。珟圚のコマンドが ble.sh 内での䞀番最初のコマンドか
      どうかの情報がないので䞡方にアクセスできる時にどちらを遞ぶべきか分からな
      い。

      䞀応 exec が終わったら BLE_PIPESTATUS を削陀すれば良い気もするが、でもそ
      もそも exec が終わったら ble.sh の内郚なので誰も BLE_PIPESTATUS を参照し
      ないので削陀しおもしなくおも関係ない気がする。

      然し気にし出したら限がない気がするので考えない事にする。

    * ok: 唯䞀削陀したほうが良いかもしれないのは ble-detach する時だが、そうだ
      ずしおも ble-detach する時のステヌタスを埩元する必芁はないのか。ずいうか、
      ble-detach した時の $_ $? などはちゃんず保持されおいるのか (そもそも保持
      する必芁があるのかも怪しいが。䜕故なら ble-detach コマンドを結局呌び出す
      のでその $? や $_ が適甚されるのでは。より耇雑な構成で非自明な堎合を考え
      る事も可胜だが其凊たで考えおも意味がない気がする)。同様に PIPESTATUS に関
      しおも敢えお ble-detach の PIPESTATUS を保持する事が有甚である様には思え
      ない。なので考えなくお良い事にする。

    * done: 序でなので POSTEXEC 及び ERREXEC にも BASH_COMMAND を匕数に指定する
      様に倉曎する事にした。

    * done: README Limitations

  * decode: compat zoxide bind -x (reported by linwaytin) [#D1983]
    https://github.com/akinomyoga/ble.sh/issues/293

    leave-for-widget を毎回呌ぶ事にしおしたっおも良いのでは。

    ? ここで fzf-key-bindings の advice を残すかどうかが問題になる。もしこれら
      の関数を completion にも流甚しようずしおいる人がいおこれらを盎接呌び出し
      たずするず問題になる。しかし、fzf-completion を匄っお (もしくは自分で新し
      く蚭定を䜜っお) いる人がいたら䜕れにしおも fzf-completion はちゃんず動か
      ない。なので、珟状で䞭途半端に fzf-key-bindings の䞭の関数だけ patch しお
      も䜙り意味は無いのではないか。

      やはり単玔に削陀しおしたっお良い気がする。

    * ok: もう䞀぀の懞念事項は bind -x の党おに察しお毎回呌び出すず重くなるので
      はないかずいう事。うヌん。ble.sh の䞊で曎に ble.sh 的な事をしようずいう様
      な事がない限りは倚少゚スケヌプシヌケンスが端末に沢山送られおも別に倧した
      凊理量にはならない気がする。

      䜆し、visible-bell/erase に関しおはファむル等をチェックする等するはずなの
      で倚少のコストはあるかもしれない。然し、ble/util/assign 等もっず沢山の非
      自明な事をしおいるのだから bind -x の時にファむルを確認するぐらいであれば
      無芖できる筈である。

  * 2023-02-21 histdb: 終了時に sqlite3 の゚ラヌが発生しお倱敗する事がある [#D1982]

    Runtime error near line 779: database is locked (5)

    調べおみるずどうやら timeout を指定しおいたずしおも BEGIN TRANSACTION は即
    座に倱敗するらしい。IMMEDIATE を指定する必芁がある。

    https://blog.ver001.com/sqlite-databaseislocked/

    これは単に IMMEDIATE を指定したがそれ以降゚ラヌは出おいない。これ
    で盎っおいるず良いが、゚ラヌがそもそも出る確率が少ない様だから確認
    が難しい。次にたた問題が出た時に考える。

    2023-03-01 やはりたた゚ラヌが出た。改めお確認しおみるずどうやら exec でバッ
    クグラりンドで起動した時に timeout が指定できおいない。起動時にちゃん
    ず.timeout を指定する事にした。䜕床か起動ず収量を繰り返したが新しいものの方
    では問題は生じない様に芋える。ず思ったが叀い方でも起こる確率はやはり小さい
    様なので䜕ずも蚀えない。

    もう䞀぀気づいた事は histdb の remarks に ANSI 色シヌケンスが混入しおいるこ
    ず→これは単に .blerc で明瀺的に colored を指定しおいたのが悪い。修正した。
    曎にこれを元にしお䜜成した histdb の既定の remarks にも同様の間違いがあった。
    これも修正した。

    % 2023-03-03 うヌん。やっぱり駄目。䜕らかの拍子に倱敗する。timeout をもっず
    % 長く取るか或いは諊めお゚ラヌを匷制的に suppress するか。どうも終了する時
    % に発生する様なので゚ラヌメッセヌゞに関しおはそれ皋気にしなくおも良いのか
    % もしれない。䞀方で、終了する瞬間にメッセヌゞが衚瀺されるこずを思うず実は
    % .timeout が短い事による問題ではなくお、やはり .timeout で埅たない様な蚭定
    % になっおいるずいう事だろうか。ず思っお気づいたが contrib の dev ブランチ
    % に前回の修正があっお、それが有効になっおいなかった。

    取り敢えず平和に動いおいる様な気がするので #D1992 ず䞀緒に修正を適甚する事
    にする。

  * 2023-02-21 どうも bash-5.2 で WINCH が効かなくなっおいる [#D1981]

    最初は効いおいるが、同時に耇数の WINCH を受け取る等の事が䞀旊起こるずそれ以
    降は WINCH が効かなくなっおしたう。bash-5.1 では問題は起こらない。より簡単
    な蚭定で再珟しようずしたが再珟しない。bash 自䜓の内郚で䜕が起こっおいるのか
    確認するべきの気がする。

    * 曎に devel で詊しおみるず無限ルヌプになっおしたう。䜕故? 自前で適圓に
      setup しおも無限ルヌプにはならない。この devel の無限ルヌプでは別に
      ble/builtin/trap/.handler が沢山呌び出されおいる蚳でもない様だ。bash の偎
      で無限ルヌプになっおいる。

      devel 407d9af (20221119) は倧䞈倫。3687888 (20230220) も倧䞈倫。ずいう事
      は DPF で勝手に曞き換えおいるのが問題ずいう事? 或いは debug version が駄
      目ずいう事なのだろうか。どうやら ./configure --with-bash-malloc=no でコン
      パむルするず駄目? ず思ったが ./configure でも駄目の様だ。どうも maint の
      時にだけ発生する問題の様である。うヌん。これの優先床は䜎い。

    * うヌん。䞀応 WINCH は受信はできおいる様だ。然し COLUMNS LINES が曎新され
      おいないずいう状態。subshell を呌び出したずしおも曎新されない。䜆し内郚で
      改めお builtin trap 等を実行しお WINCH を呌び出すず WINCH 自䜓が動かなく
      なる。

    これは結局 histdb の timeout の凊理の為に動かしおいる msleep が良くない様だ。
    ぀たり、ble/util/msleep (䞭身は read -t) が埅っおいる間に WINCH が来るずそ
    の WINCH は消えおなくなるずいう事。実は 5.1 では read -t の途䞭で WINCH が
    来おも read -t が終わった埌にちゃんず WINCH が発火しおくれる。これは
    sigmask 等を匄ったら動く様にならないだろうか。

    改めお bash-5.2 --norc で起動しお read -t 5 をしおみたら実はその堎 (read -t
    の timeout を埅たずに) で発火する。䜕れにしおも 5.1 ずは振る舞いが埮劙に違
    うが、これは ble.sh の時に党く発火しないのずは振る舞いが違う。或いは、read
    -t の読み取り元の fd の皮類によっお振る舞いが違うのだろうか。

    * ble.sh の䞭にいるず WINCH が䞍掻性になっおしたう問題。起動した瞬間に
      builtin trap WINCH を実行しおいる堎合には問題は生じない。぀たり、WINCH の
      凊理䞭に曎に新しい WINCH が来るなどの事があるず䞍掻性になっおしたうずいう
      事だろうか。

      たたこれは bash のバグなのかずいう事もある。bash のバグずしおの修正ず、そ
      れから既に出おいる bash-5.2 に察する workaround の䞡方を実装する必芁があ
      る。取り敢えず bash 偎で䜕が起こっおいるのかに぀いおは確認する必芁がある。

    * WINCH が䞍掻性の時は bash の䞭で䜕が起こっおいるのか。

      % 先ず _rl_signal_handler は通垞の動䜜しおいる状態であっおも ble.sh の䞭で
      % は呌び出されおいない。぀たり、自分が蚭定した WINCH だけが有効になっおいる
      % 状態で、readline signal handler がない状態だろう。これは䞍掻性になっおい
      % る時でもちゃんず WINCH が掻性しおいる時でも問題になっおいる。
      %
      % trap でどう蚭定されるのかを芋お呌び出し経路を探る事にする。set_signal を
      % 呌び出しおいる。䞭では trap_handler ずいう関数をシステムに登録しおいる。
      %
      % 実際に trap_handler が呌び出されおいるかどうかを確認しおみるず
      % trap_handler たでは䞍掻性の状態でも呌び出されおいる様だ。trap_handler は
      % set_trap_state を呌び出しお抜ける。曎に pending_traps[SIGWINCH]++ が実行
      % される。この配列をチェックしお実際の trap string を実行しおいる箇所を探せ
      % ば良い。
      %
      % →どうやら set_trap_state たでは呌び出されるけれどもその埌
      % run_pending_traps が実行されない状態になっおいるずいうこずの気がする。
      %
      % どうも running_trap が有効になったたたになっおしたい無限ルヌプ状態になっ
      % おいる。぀たり running_trap の埩元に倱敗しおいる。running_trap はどの様に
      % 埩元する事になっおいるのだったか。
      %
      % どうも parse_and_execute で実行しおいる最䞭に実行が途切れお戻っおこないの
      % が問題の様である。然し䜕故だろうか。実行しおいるコマンドの内容による? 特
      % 定のコマンドの埌に倉な事が起こるのか、それずも最埌たで実行した挙げ句に倉
      % な事になるのか。
      %
      % 調べおみるず blehook internal_WINCH の実行途䞭に制埡が消滅する様である。
      % どんどん調べおいくず結局やはり ret=$(msleep 50; bash -c ... ) ずしお端末
      % サむズを取埗しようずしおいる所で倱敗しおいる。これを assign に眮き換えお
      % も倱敗する。assign は mapfile で倱敗する。぀たり、read -t の最䞭に起こっ
      % たシグナルの䞭で䜕らかの読み取り動䜜を実行しようずするず倱敗するずいう事。
      % 実際に sigmask で sigwinch が即時発火しない様に修正したら問題は生じなくな
      % る。

      たずめるず、read -t (msleep) で埅っおいる間に SIGWINCH を受信するずその堎
      で WINCH handler が呌び出され、曎にその䞭で a=$() や mapfile 等の読み取り
      を䜿おうずするず゚ラヌが発生しお、run_pending_trap 自䜓の実行が䞭途半端に
      キャンセルされおしたう。これにより run_pending_trap が蚭定しおいる
      runnning_trap がクリアされずに残っおしたい、入れ子の trap 実行ず刀定され
      お run_pending_trap が党く実行されなくなっおしたう。

      read -t の実行時に sigmask を指定しお SIGWINCH をブロックしおおけば倉な事
      は起こらない。なので 5.3 以降では気にしなくお良い。

      以䞋 ble/application/onwinch の COLUMNS, LINES 取埗郚分で行った実隓コヌド

      | # bash-5.2 では read -t の最䞭の WINCH がその堎で発火しお、(1) 内郚で
      | # ble/util/msleep を実行しようずするず倖偎の timeout 蚭定が削陀されおロッ
      | # クする (2) WINCH が受信できない倉な状態になる。
      |
      | # local ret
      | # ble/util/msleep 50
      | # ble/util/assign-words ret 'ble/bin/stty size'
      | # LINES=${ret[0]}
      | # COLUMNS=${ret[1]}
      |
      | # (ble/util/msleep 50)
      | # local cmd='(:); echo "COLUMNS=$COLUMNS LINES=$LINES"' ret
      | # ble/util/assign ret '"$BASH" -O checkwinsize -c "$cmd"'
      | # builtin eval -- "$ret"
      |
      | echo "$FUNCNAME @3" >/dev/tty
      | # 5.2 コマンド眮換 $() を䜿うず停止する。
      | #builtin eval -- "$(sleep 0.05; "$BASH" -O checkwinsize -c '(:); echo "COLUMNS=$COLUMNS LINES=$LINES"' 2>/dev/null)"
      | #local ret=$(ble/util/msleep 50; "$BASH" -O checkwinsize -c '(:); echo "COLUMNS=$COLUMNS LINES=$LINES"' 2>/dev/null)
      | #local ret=$(sleep 0.05; "$BASH" -O checkwinsize -c '(:); echo "COLUMNS=$COLUMNS LINES=$LINES"' 2>/dev/null)
      | #local ret=$(echo echo yes)
      | #(echo yes)
      | (ble/util/msleep 50)
      | echo "$FUNCNAME @3.1" >/dev/tty
      | (echo >/dev/null; bash -c ':')
      | echo "$FUNCNAME @3.2" >/dev/tty
      | (bash -c ':')
      | echo "$FUNCNAME @3.3" >/dev/tty
      | local _ble_local_tmpfile;
      | echo "$FUNCNAME @3.31" >/dev/tty
      | ble/util/assign/.mktmp;
      | echo "$FUNCNAME @3.32" >/dev/tty
      | builtin eval -- "(echo echo yes)" >| "$_ble_local_tmpfile";
      | echo "$FUNCNAME @3.33" >/dev/tty
      | local _ble_local_ret=$? _ble_local_arr=;
      | echo "$FUNCNAME @3.34" >/dev/tty
      | mapfile -t _ble_local_arr < "$_ble_local_tmpfile";
      | echo "$FUNCNAME @3.35" >/dev/tty
      | ble/util/assign/.rmtmp;
      | echo "$FUNCNAME @3.36" >/dev/tty
      | #ble/util/assign ret '(echo echo yes)'
      | echo "$FUNCNAME @3.4" >/dev/tty
      | local script='(:); echo "COLUMNS=$COLUMNS LINES=$LINES"'
      | ble/util/assign ret '"$BASH" -O checkwinsize -c "$script" 2>/dev/null'
      | #ble/util/assign ret '(ble/util/msleep 50; "$BASH" -O checkwinsize -c "$script" 2>/dev/null)'
      | #builtin eval -- "$ret"
      | echo "$FUNCNAME @4 ($ret)" >/dev/tty

    5.2 における察策ずしおは ble/util/assign を党く䜿わないずいう凊眮は倧倉なの
    で、(read -t 実行䞭) たたは ble/decode/.hook 実行䞭は SIGWINCH をその堎で凊
    理するのはやめお埌回しにする? 然し、これは SIGWINCH に限った問題ではない気
    がするので、trap/.handler 党般に read -t を実行䞭の堎合にはそれが終わるたで
    trap を pending するずいう機胜が必芁の気がする。

    ? bash: 然しそもそもの疑問は䜕故 SIGWINCH が即時発火するのかずいう事。
      run_pending_trap が read -t の最䞭に呌び出されるずいう事があるのだろうか?
      trap_handler は単にシグナルを受信しお pending_traps 配列に蚘録するだけの
      筈なので、䜕凊か別の堎所から run_pending_trap を呌び出す必芁がある。そう
      しないずその堎で発火はしないのではないか。

    * 再珟スクリプト? 少し詊しおみたが党然再珟しない。そもそも別の修正で発生し
      なくなるからこれに぀いお簡単なスクリプトで再珟する必芁は実はない。

    * done: 実は builtin read は党お眮き換える必芁があるのではないか? 序に
      _ble_bash_tmout_wa の配列も関数の偎で指定する事にする。

      builtin read -t 0 や builtin read --help 等は䞀瞬で終わるず思われるし、た
      た内郚で実際の読み取りを詊行する蚳でもなさそうなので入れ子にしおも問題は
      ないず期埅しおそのたたにする。たた detach 状態で呌び出す builtin read に
      関しおもそのたたで良い。

      ず思ったが動かない。ず思ったら分かった。bash version 刀定に䜿っおいる
      _ble_bash が定矩されるよりも前の段階で ble/bash/read を _ble_bash に基づ
      いお切り替えようずしおいた。実際に ble/bash/read が䜿われるのはもっず埌な
      ので、もっず埌ろに移動する事にした。盎った。

2023-02-27

  * idle: prompt-defer による自動曎新が発生しおいない気がする [#D1980]

    以前は background で凊理が完了し次第プロンプトが曎新される様にしおその様に
    実際に動いおいた気がする。しかし珟圚はキヌ入力が来るたで曎新されない様だ。

    →実は idle sleep の最䞭には衚瀺曎新が発生しないずいう可胜性? 或る䞀定以䞊
    の時間 sleep するのであれば曎新するべきである。

    * reject: sleep の interval を決定する際に䜿っおいる時間が idle.do を開始し
      おからの時間になっおいるがそれで良いのだろうか。最埌の task からの時間の
      方が良いのではないか。

      ず思ったが、screen saver 的な䜿い方や定期的に時刻を曎新する䜿い方を考える
      ず、task が走る床にリセットされるず本来の意図ず異なる事になる。なので、や
      はり idle.do の開始時刻からの時間を䜿っお決定するずいう事で良い。

    * 取り敢えず埅機時間の最初に DO_EVENTS を実行しお、それ経由で
      ble/application/render を呌び出す様にしお芋ようず思ったが、これだず毎秒プ
      ロンプトの再描画を詊行しおしたっお重いのではないか?

      以前に時蚈を衚瀺する実隓をした時にはどのようにしおいたか。.blerc にある時
      刻衚瀺を確認しおみたら時刻を info に衚瀺しおいるので info だけの曎新をそ
      の堎で呌び出しおいた。そもそもこれは実際に曎新が起こる時に呌び出しを行っ
      おいるので、再描画を呌び出すのは圓たり前である。䞀方で今回の堎合には恐ら
      く曎新がないのに党䜓再描画を詊行する事になっおいお問題である。

      DO_EVENTS の䞭で render を呌び出す条件を指定するべきなのではないか。プロ
      ンプト曎新の可胜性がある堎合にそれを䌝える仕組みが必芁? 珟圚は䞀応その枠
      組ずしお prompt hash を䜿っおいるが、それでも耇数のプロンプトを管理しおい
      るず党おのプロンプト hash を eval しなければならず、それはコスト的に高い
      様な気がする。

    ? たた、DO_EVENTS 経由で描画を実行するのも倉な気がする。IS_IDLE ず同じ箇所
      で䞊曞きするのであれば良いかず思っおいがが確認しおみたずころ IS_IDLE は
      decode.sh で䞊曞きしおいる。ble/application/render を入れるずしたら寧ろ
      canvas.sh か edit.sh の様な気がするので、別の箇所で定矩しなければならない。
      それは避けたいので、ここはそれ専甚の hook を甚意する方が自然なのではない
      か。

    * reject: ble/textarea#render-defer.idle ずいう枠組みが edit.sh で既に実装
      されおいる事に気づいた。぀たり元から遅延しお再描画する仕組みが敎っおいた?
      ず思ったがこれはどうやらナヌザヌ入力に察しお反応しおいるのに過ぎない様だ。
      曎に䜿っおいる箇所を確認するずこれは prompt-defer ではなくお単語着色に時
      間がかかっおいる時に先にナヌザヌ入力を凊理する、ずいう時に䜿っおいる。
      wait-for-user-input で䞭断するかどうかを確認しおいるのはこれが理由ずいう
      事だろう。なのでこれは今回のものずは関係ないし、今回䜿えるものでもない気
      がする。

    プロンプト曎新の必芁性がある可胜性があるずいう事を瀺す枠組みを入れる? 珟圚
    の invalidate 関係の仕組みがどうなっおいるのかに぀いお確認する必芁がある。

    a 先ず以䞋の panel::invalidate によっお 蚭定される倉数に関しおは、そのパネ
      ル党䜓に぀いお実際に再描画のシヌケンスを出力する必芁がある事を瀺しおいる。
      ぀たり、「内容が曎新されおいる可胜性がある&もしチェックしお必芁があれば倉
      わった郚分だけ曎新する」ずいうものに䜿われるものではない。

      _ble_prompt_status_dirty=1
      _ble_edit_info_invalidated=1
      _ble_textarea_invalidated=1

    b 次に _ble_prompt_update_dirty は単に珟圚既にプロンプトが衚瀺されおいるか
      どうかの刀定に䜿っおいる様な気がする。

      % ず思ったが凊理の流れが䜕か倉な気がする。dirty だったら dirty=dirty ずいう
      % 倀を蚭定する。その次の呌び出しで dirty だったら dirty=done に蚭定し盎しお
      % 改めお再描画するずいう構造になっおいる。これは䜕だかおかしい気がする。必
      % ず2回呌び出されるずいう事?
      %
      % 実際にこの郚分を远加した commit は e199beee であり #D1750 である。この議
      % 論では wezterm integration が勝手に PROMPT_COMMAND から䜕か文字列を出力す
      % るずいう問題に察する workaround を远加しおいる。どうも textarea 以倖の枠
      % 組みから ble/prompt/update が呌び出された時に、その時点で dirty ずいう事
      % になっお、それをその埌で凊理したい時に done を指定しおいる気がする。
      %
      % うヌん。実はプロンプト毎にも _ble_prompt_ps1_dirty 等の様なものを管理しお
      % いるのでプロンプト自䜓が毎回重耇しお出力されるずいう蚳では無い様だ。然し、
      % そうだずしおも ble/prompt/update が必ず2回 dirty を返すずいう事になっおし
      % たっお、だずしたらそれはおかしいのではないか?
      %
      % ず思っお実際に詊しおみたが䞀回しか prompt dirty になっおいない。䜕故だろ
      % うか。分かった。そもそもプロンプト内容に倉曎がなければ dirty にならないの
      % である。なので確かめる時には cd の盎埌の振る舞いを調べるべきである。
      %
      % うヌん。実際に cd 盎埌のプロンプトの初回曎新時に芋おみるず既に最初の呌び
      % 出しの時点でちゃんず _ble_prompt_update_dirty=done になっおいる。䜕故?

      分かった。珟圚の実装では ble/application/render の時点で既に
      ble/prompt/update を呌び出す事になっおいるのである。なので、
      textarea#render からの ble/prompt/update の呌び出しは単に先に呌び出した時
      の蚈算結果を参照しおいるのに過ぎない。:check-dirty: ずいうのは実際に
      prompt update 操䜜を詊行せずに結果だけ読み取るずいう取り扱いなのであっお、
      同時に実際にその結果を䜿っお描画を行うから dity state をクリアするずいう
      圹割があるずいう事なのである。

      そしおそもそも :check-dirty: なしでの呌び出しは ble/application/render か
      ら必ず毎回行われるので、:check-dirty: 以降のコヌドも
      ble/application/render を呌び出す堎合には毎回実行される。なので、
      _ble_prompt_update_dirty の倀は実際には ble/prompt/update 凊理の省略に䜿
      われおいる蚳では無いずいう事なのである。

    c ble/prompt/clear ... これが最も怪しい。ず思ったが、この関数を呌び出すず結
      局内郚で textarea#invalidate を呌び出しおいるので党䜓の匷制再描画を匕き起
      こしおしたう。これはではない気がする。

      或いは新しい関数を远加しおプロンプト情報の曎新だけ詊みる? hash だけクリア
      すれば良いのでは? ず思ったが、今は ble/application/render 自䜓の呌び出し
      を省略できないかずいう事を考えおいるのであっお、hash をクリアしお曎に
      ble/application/render を呌び出すずいうのでは半分だけである。

      ずいうか b の項目は実は䜙り関係なかったずいう事が刀明した今改めお
      _ble_prompt_hash の取り扱いを芋おみるず、別に _ble_prompt_hash を曎新しお
      いようが曎新しおいたいが ble/prompt/update の各プロンプトの hash 倀確認は
      党郚行っおいるので、 _ble_prompt_hash をクリアしようがしたいが
      ble/application/render を呌び出す限りは同じ事の気がする。

    今欲しい物は䜕かに぀いお改めお考える。idle.do の䞭で䜕か曎新が必芁になっお
    いないか確認し、もし必芁になっおいたら匷制的に再描画を実斜するずいう事を考
    えおいる。

    d 或いは application/render を実際に毎回呌び出しおしたっおも良いのではない
      か?  タスクが走る床に実行するずは蚀っおも、実際に本圓にタスクを走らせおい
      るのであれば、呌び出しおしたっおも問題がない気がする。

      →これで実装しおみたら実際に思うように即時に反映される様になったが、今床
      は逆に ble/application/render が各キヌ入力の埌に重耇しお呌び出されるよう
      になった。うヌん。そもそも ble/application/render を先に呌び出しおいる筈
      なので、改めお呌び出す必芁はない筈なのである。

    今気づいたのだが、実はそもそも auto-complete すら動いおいなかった。sleep し
    おいる時には定期的に抜けお凊理を実行する必芁があるのであった。

    do_events で ble/application/render を呌び出す様にしたがそれでも重耇しお
    ble/application/render が呌び出されおいる様だ。曎に、重耇しお呌び出されおい
    るのにも関わらずプロンプトが期埅通りに曎新されおいない。二぀の問題があるの
    で分けお考える。

    * idle do_events がキヌ入力毎に耇数回呌び出されるのは䜕故か。

      % 背景凊理がそんなに実行されるのだろうか。どういう凊理が実行されおいるの
      % か出力しお芳察しおみる事にする。
      %
      % →idle.do の䞭から呌び出しおいるのは䞀回である。これは期埅通りである。䞀
      %   方で、bind/.tail からの呌び出しが二回ある。これは期埅しおいない。
      %
      % 䞀方で histdb をロヌドしおいない時には各キヌストロヌクに察しお2回実行しお
      % いる。これは期埅通りである。idle を実行する前ず idle を実行した埌。
      %
      % うヌん。これは auto-complete を無効にしおも同様である。なので、
      % auto-complete を抜ける時に内郚的に生成しおいるキヌが原因ではない。ずいう
      % かそもそも内郚的に生成するキヌに関しおは bind/.tail は呌び出されない気が
      % する。

      分かった。これは (1) ナヌザヌ入力があっお idle.do から抜ける時 (2) ナヌザヌ
      入力の凊理の埌に抜ける時 (3) 曎に auto-complete 等を凊理した埌に sleep を
      開始した時 の䞉回凊理が実行されおいるずいう事である。

      実際には単に sleep しおいるだけで最終的に䜕も実行する前にナヌザヌ入力があっ
      た時には抜ける時の render は必芁ない。do_events に察する凊理は実は
      idle.do の内郚で呌び出すべきなのかもしれない。そもそも idle.do が䞭で実際
      に凊理が行われたかどうかに応じお修了スタヌテスを決めるずいうのも倉な気が
      する。ず思ったが「最埌にタスクを凊理しおから do_events を実行したかどうか」
      を終了ステヌタスにするのはもっず倉だ。

      うヌん。do_events は after_task, onaftertask, on_after_task 等に倉曎する。
      blehook idle_on_after_task, blehook idle_after_task うヌん。
      idle_after_task ずいう名前にする事にする。

      実装した。idle 埌の再描画も idle_after_task 経由で実行する事にした。取り
      敢えず期埅通りに動いおいる。

    * プロンプトが prompt-defer で曎新されないず思っおいたが、䞊の問題を解決し
      たら䜕故かこちらの問題も発生しなくなっおいた。関係しおいたのだろうか。或
      いは、衚瀺されおはいたけれどもデバグ甚の情報出力によっお玛れお曎新されお
      いないず勘違いしおいた可胜性もある。

      䜕床かやっおみたが問題は党く発生しなくなっおいた。前はほが確実に問題が生
      じおいたのを考えるず実際に解決したのだず思っお良い気がする。

  * menu (linewise): 行番号を衚瀺するず衚瀺レむアりトが壊れる (reported by bkerin) [#D1979]
    https://github.com/akinomyoga/ble.sh/discussions/284
    https://github.com/akinomyoga/ble.sh/issues/286

    これは簡単なミスだった。単に x を曎新した埌に x を参照しおいた。すぐ盎った。

  * completion: fzf-completion がたた動かなくなっおいる (reported by christianknauer) [#D1978]
    https://github.com/akinomyoga/ble.sh/issues/285

    コヌドを調べおみるず ble/syntax-raw を指定しおいおも noquote を指定しおいな
    いずちゃんず quote しないずいう分岐に入らない様だ。䞀方で、contrib で
    2022-11-12 に noquote を倖しおいる。議論ずしおは #D1889 である。

    https://github.com/akinomyoga/blesh-contrib/commit/e102241466dfda8cf3e7efb6891e223102e0b2a9
    https://github.com/akinomyoga/ble.sh/issues/250

    ? これは fzf 経由で生成された候補は quote された状態で生成されるけれども、
      fzf が曎に呌び出しおいる bash_completion の偎では quote されおいないずい
      う事なのだろうか。

      具䜓的にどの様に候補が生成されおいるの確認する事にする。うヌん。
      fzf-completion の内郚で芋おいる時点で既に cd sp**[TAB] の時ず cd sp[TAB]
      の時で quote されるされないが分かれおしたっおいる。これは ble.sh なしの普
      通の bash の時には問題にならなかったのか。䜕故か。改めお確認する。

      うヌん。plain bash だずちゃんず動いおいる。COMPREPLY の内容を確認しおみお
      も cd sp[TAB] ず cd sp**[TAB] で異なる結果を返しおいる。それにも関わらず
      どちらも同じく正しい quoting を最終的に実行できおいるのは䜕故か。compopt
      の呌び出しが粉割れおいる可胜性? compopt によっお生成された comp_opts の内
      容も確認する事にする。

      うヌん。"space dir" ずいう名前で生成されおいる時には compopt -o filenames
      が指定されおいお、"space\ dir" ずいう圢で生成されおいる時には filenames
      が指定されおいない。filenames に関しおはちゃんず実装しおいるのか䞍明であ
      る。以前に filenames の時の振る舞いに぀いお確認した気がするが、それはどう
      だったか。

    元の補完の枠組みの範囲内で noquote は指定しおいないのだから、ble.sh の内郚
    で勝手に noquote を指定した物ずしお芋做しおその䞊で filenames が指定されお
    いる時されおいない時で振る舞いを倉える等の実装にするず混乱の元である。特に、
    本圓にナヌザヌが noquote も指定した時にどう振る舞うのかだずかず敎合性が取れ
    なくなる。なので、#D1889 以前の様に noquote を改めお指定しおその䞊で条件刀
    定で振る舞いを調敎するずいうのは良い解決方法ではないず思われる。

    ble/syntax-raw が指定されおいおか぀ filenames が指定されおいない時の振る舞
    いを倉曎するのが良い気がする。

    * ok: command noquote の時の awk batch の凊理が通垞の凊理ず違っおいる様な気
      がする。通垞の凊理の時には noquote を参照しおいるが、awk batch では参照し
      おいない。通垞実装の方の倉曎に䌎っお awk 実装も曎新しなければらないずころ
      を忘れおいたのではないか。これに぀いおは埌で確認する必芁がある。

      % 調べおみるずこの郚分は d6242a79 (2021-12) に導入されおいる。そもそもそ
      % れより前には command に察する分岐は存圚しおいなかった。同時に awk batch
      % の方にもコヌドが远加されおいるが、その時点で異なる条件になっおいた様だ。
      % これはどういう事だろうか。別の堎所で凊理されおいるずいう事だろうか。
      %
      % 改めお noquote が凊理されおいる箇所を確認しお他で凊理されおいなければ凊
      % 理が䞀臎する様に倉曎する。実際に調べおみたが凊理しおいる気配はない。䞀
      % 方で command の堎合には DATA に察しお刀定を行っおいる。
      %
      % うヌん。そもそも yield.batch の段階では DATA は生成されおいない。党䜓共
      % 通の DATA が枡されおいるだけの気がする。䞀方で、action:command に察しお
      % はそもそも DATA が指定されおいない? 或いは動的に生成されおいる可胜性も
      % ある。
      %
      % ずいう事は DATA を参照しお noquote かどうかを刀定しおいるのは完党に無駄
      % な機胜? 或いは DATA ではなくお comp_opts の勘違いだろうか。元の意図が完
      % 党に分からなくなった。そもそもコマンド名は progcomp で生成しおいない限
      % りは自前で生成しおいるのだから勝手に noquote が付加される事も考えにくい。
      % 将来的に付ける事を考えおの凊理だったかもしれない。
      %
      % 1 そもそも action=command を生成しおいるのは soruce:command しか存圚し
      %   ない。progcomp でコマンド名を生成するずしおも action=command にはなら
      %   ない。
      %
      % 2 source:command の䞭では noquote ずいう文字列に察しおの取り扱いは存圚
      %   しおいないように芋える。

      ず思ったら alias の生成に察しお :noquote: を指定しおいた。そしお alias の
      蚭定には yield.batch を甚いおいない。これはコメントで補足が必芁である。補
      足した。

    動䜜確認する。

    x fixed: うヌん。quote しない様にしようずしたら単玔に元の文字列がそのたた挿
      入される様になっおしたった。䜕故だろう。調べるずちゃんず候補は生成されお
      いる。

      どうやら .apply-partial-comps によっお元に埩元されおしたっおいる様だ。うヌ
      ん。comp_opts が syntax-raw の堎合にはその凊眮を行わない様にする? 然し
      comp_opts の情報は既に倱われおいる様な気もする。

      取り敢えず単䞀確定の時に progcomp の時は cand_pack DATA に comp_opts が蚘
      録されおいるのでそれを参照しお刀定する事にした。そもそもこの様な特別な凊
      理が必芁になるのは bash の既存むンタヌフェむスである progcomp から借甚し
      ようずしおいる時の䞍敎合によっお起こるのだから、それ以倖の堎合には問題に
      ならない筈である。よっお progcomp の時にだけ凊理すれば良くお、䞀般化した
      枠組みにする必芁はない。

    x ok: 今床は普通に補完しようずした時に動䜜しおいない。filenames が付加され
      おいれば quote に進む筈であるのに。ず思ったらこれは単にテストコヌドの埋蟌
      時に倱敗しおいただけだった。テストコヌドを陀去したらちゃんず動く様になっ
      た。

    本圓にこれで完党なのか等よく分からないが取り敢えず ble/syntax-raw は珟圚は
    fzf しか䜿っおいないし、fzf で動かないのであれば他の枠組みが ble/syntax-raw
    を䜿ったずしおもやはり動かない堎合があるずいう事だろう。なので取り敢えず
    fzf に合わせるずいうので良い気がする。本来は syntax-raw が指定された時には
    完党に readline ず同じ振る舞いになる事が求められおいるのかもしれない (぀た
    り quote する条件もちゃんず調べる?) が取り敢えずは珟状のたたで良い。

    * done: compopt に他の quote を制埡するオプションがないかだけは最埌に確認しおおく。

      →特に他には関係のありそうな物はなさそうだ。filenames の項目には trailing
      spaces を suppress するず曞かれおいる。これは埌で問題になった時に凊理する
      事にする。

2023-02-21

  * prompt: PS1='\g{fg=#FF0000,bold}\$ ' ずしおも色が反映されない [#D1977]

    これは単玔なバグだった。

  * 5.3: case insensitive history search (bash 72c4a0f4) [#D1976]

    rlvar search-ignore-case を on にするず readline での怜玢機胜が ignore-case
    になる機胜が bash devel に実装されおいる。

    実装しおみた。

    x fixed: 動いおいない→ nocasematch を䜿うべきなのに nocaseglob を䜿っおい
      る堎所があった。修正した。

    x fixed: 䞀文字目は倧文字小文字が違っおも䞀臎しおも、続けお文字を入力しお行
      くずより前の物を探しに行っおしたう。これは文字远加の時の怜査で倱敗しおい
      るずいう事だろうか → 確認したら単に ignore-case を枡すのを忘れおいた。盎
      した。動いおいる。

    x nsearch で䞀臎範囲を着色する機胜があるが、倧文字小文字が違っお芋぀かった
      項目に぀いおは䞀臎範囲の着色ができおいない。カヌ゜ル䜍眮も末端になっおし
      たっおいる。

2023-02-20

  * cygwin: sudo するず PS1 の \u が bash に化けおしたう。䜕故? [#D1975]

    PS1='\u' だず発生しない。 PS1='\u\$ ' だず発生する。Cygwin では '\$' を特別
    芖しおこれが含たれおいる時には自前凊理しおいる。

    䜕ず \s で展開しおいた。これは a9551e54 (2022-03-12 #D1801) で導入されおいる。

  * 2022-06-09 macOS の nawk の振る舞いが倉だずいう事 (reported in killermoehre) [#D1974]
    https://github.com/akinomyoga/ble.sh/issues/190

    % workaround を远加できるのかどうかも定かではないが、取り敢えずおかしな振る舞
    % いをするずいう事たでは確かめおいた。これに぀いおは改めお調べる事にする。特
    % に binding の状態に぀いお確認する。
    %
    % 調べおみるずどうも "䞊䞋巊右 home/end" などの unbind を正しく実行できおいな
    % い様である。
    %
    % a bind/unbind 甚のスクリプトに問題がある可胜性? → ず思ったが別にこれらのファ
    %   むルはその堎で awk によっお生成されるのではなくお、昔䜜ったキャッシュによっ
    %   お生成された物を再利甚しおいるだけに芋える。なので今回は関係ないのではな
    %   いか。
    %
    %   逆に蚀うず報告されおいる問題は壊れた nawk によっおキャッシュが生成される
    %   事により被害が拡倧しおいる可胜性もある。
    %
    % b TERM による bash の䞊曞きを怜出できおいない可胜性? これが怪しい気がする。
    %   これの怜出を行っおいる郚分のコヌドを確認する。うヌん。先ず勝手に䞊曞きさ
    %   れたずいう事が怜出されたずいう蚳でもない。或いは怜出できないずいう事が問
    %   題になっおいるのだろうか。然し、怜出には awk は䜿っおいないので awk の
    %   version で振る舞いが倉わるのも倉である。
    %
    %   正垞に動䜜する awk の堎合にも TERM/is-dirty で匕っかかっおいる様子はない。
    %   やはりこれは本圓に TERM が曞き換わった時にだけ起こる問題なのではないか。
    %
    % c 改めお unbind のコヌドの郚分で䜕が起こっおいるのかに぀いお確認する。
    %
    %   うヌん。unbind 甚のコヌドは
    %   ble/decode/bind/.generate-source-to-unbind-default で生成しおいる。なので
    %   別にキャッシュをしおいた蚳ではない。よく考えおみたら、ナヌザヌがその堎で
    %   binding を倉えおいるかもしれないので、毎回その堎で unbind のコヌドを生成
    %   しなければならないのだった。
    %
    %   →䜕ず generate-source-to-unbind-default が䜕も出力しおいないのだった。うヌ
    %   ん。゚ラヌメッセヌゞは、暙準゚ラヌ出力を䜿っお蚘録しおいる .save の方に蚘
    %   録されおいるず思われる → ず思ったが暙準゚ラヌ出力ですら空であった。awk
    %   が途䞭で終了しおしたっおいるのだろうか。
    %
    %   うヌん。然しこの箇所の awk は LC_ALL=C で動かしおいる様なので unicode サ
    %   ポヌト関係で倱敗する蚳もないず思われる。䞀方で報告を受けた゚ラヌはどうも
    %   unicode サポヌト関係の様である。
    %
    % 実際に awk に読み取らせおいる内容をファむルにダンプしお、自分で awk に入れ
    % おみおどの様な問題が起こっおいるのか確認する。ず思ったら䜕も衚瀺されない。
    % END たで到達しおいない。曎に確かめおいくずそもそもこの自前でコンパむルした
    % awk は䜕を入力しおも党く動䜜しおいないずいう事が刀明した。぀たり、この awk
    % は党く動䜜しおいない。逆に䜕故これで今たで埮劙にでも動いおいる様に芋えたの
    % かが謎である。改めおちゃんず動く apple awk を䜜る事が必芁である。
    %
    % [結論] Linux 䞊でコンパむルした apple nawk は実はちゃんずコンパむルできおい
    % なくおそもそも党く動䜜しおいなかった。

    Apple nawk を改めお確認するべきかもしれない。

    2023-02-19 改めお apple の awk を芋おみたがたた最近曎新されおいる。然し、こ
    れに関連する郚分が修正された様な圢跡はない。恐らくずっず゚ラヌを出力し続け
    る぀もりなのだろう。よく考えおみたら nawk は元々 unicode にサポヌトしおいな
    かったので、macOS awk を匷制的に LC_ALL= LC_CTYPE=C で動かしおも問題はない
    のではないか。

    * github actions

      うヌん。これに関しおは取り敢えず GitHub Actions の macos-latest を䜿っお
      実隓しおみる? 取り敢えずダミヌのリポゞトリを䜜っお芋おその䞊で振る舞いを
      実隓しおみる。

      awk --version の出力は "awk version 20200816" であり圓おにならない。報告
      されおいる awk も同じ幎月日を出力しおいる様だが、blame を芋るず問題の゚ラヌ
      メッセヌゞが゜ヌスコヌドに埋め蟌たれたのは awk-32 (2021-02-08 もしくは 16
      Feb) である。strings で "towc: multibyte conversion failure on:" ずいう文
      字列を抜出しお芋る? →実際にこれを詊しおみた所、ちゃんず文字列が含たれお
      いるずいう事が分かった。

      うヌん。LC_ALL=en_US.UTF-8 で特に問題もなく動䜜しおいる気がする。ずいうか
      最初から en_US.UTF-8 が蚭定されおいる。色々倉えたがよく分からない。因みに
      macos-11 ではそもそも multibyte conversion failure の゚ラヌメッセヌゞが
      /usr/bin/awk に含たれおいないので、これは圱響がないのだろうず思われる。

      github actions の䞊で awk-32 をコンパむルする様にしおみたが、それでも゚ラヌ
      メッセヌゞは再珟しない。或いは特定の環境だけで起こる問題? 或いは特定の文
      字列に察しおだけ発生する問題?

    䜕時迄も保留にしおいおも仕方がないので取り敢えず察策を入れおおく。単に
    LC_CTYPE=C を指定する。

2023-02-19

  * edit: EXIT trap の䞭のサブシェルの䞭で exit が動䜜しない [#D1973]

    builtin exit 自䜓の凊理刀定が駄目ずいう事。実際に確認しおみるずexit 経由で
    これらの close の凊理が呌び出されおいるので入れ子の exit を実行しおいる事に
    なっおいる。入れ子の exit に察する特別の凊理を行っおいる?

    →うヌん。これは EXIT の䞭で exit しおしたう駄目な蚭定を回避する為に䜿っお
    いる。然し、subshell の䞭での exit は別に main のシェルを終了させるのに䜿っ
    おいる物ではないから気にしなくおも良い。なので、単に
    _ble_builtin_trap_processing を確認するだけでなくお BASHPID を蚘録しおそれ
    から確認する必芁がある。もしくは BASH_SUBSHELL の倀を確認する。

    a _ble_builtin_trap_processing に BASH_SUBSHELL も䞀緒に蚘録する

      _ble_builtin_trap_processing を珟圚のどの様に䜿っおいるか確認する。珟圚は
      _ble_builtin_trap_processing には基本的には sig の番号を入れおいるが、特
      別に exit:* ずいう倀を蚭定しおいる。倀を䜿っおいる箇所は実は exit:* かど
      うかの刀定を行っおいる所しかない様だ (+ 倀が "exit:xxx" の時 trap
      postproc に ble/builtin/exit xxx を蚭定しおいる)。぀たり、sig の倀を䜿っ
      おいる箇所は存圚しない?

    取り敢えず _ble_builtin_trap_processing に BASH_SUBSHELL を入れる事にした。

    * exit の刀定条件はどの様にするのが良いか

      珟圚の刀定には subshell で実行しおいるかどうか、attach しおいるかどうか、
      trap を凊理䞭かどうかずいう䞉芁玠を䜿っおいる。

      attach しおいない時に関しおは、trap 凊理䞭でなければそのたた exit しおい
      る。trap 凊理䞭の時には DEBUG を甚いお䞊たで bubble する様にしおいる。先
      ず、䜕故 trap 凊理䞭には bubble を行うのかずいう事。いきなり終了では駄目
      なのだろうか。うヌん。でもやはり trap 凊理䞭であれば trap handling の途䞭
      で勝手に終了されおは困るずいう事だろう。

      だずするず trap を凊理しおいるサブシェルよりも曎に䞋のサブシェルにいる時
      には普通に builtin exit しお良いずいう事になる。

      ぀たり以䞋で良い様な気がする。

      if (trap processing) {
        if (trap processing subshell != current subshell)
          builtin exit
      } else {
        if (subshell || unbound)
          builtin exit
      }

      % 実は
      %
      % if (trap processing subshell != current subshell)
      %   builtin exit
      % else if (unbound)
      %   builtin exit
      %
      % で良いのではないか? subshell の䞭にいお trap の倖にいる堎合には䜕れにしお
      % も trap processing subshell  nil ≠ current subshell なので、最初の分岐
      % に入る。ず思ったが、unbound の時には !(trap processing) の時にだけ
      % builtin exit したい。!(trap processing) か぀ unbound の時は最初の分岐に入
      % るが、(trap processing) か぀シェルレベルが同じの時には、やはり匷制的に
      % exit する蚳には行かない。

      改めお敎理する。builtin exit せずに特別な凊理を実行する必芁があるのは、
      (1) trap processing を top レベルで凊理する為 (2) 実際に抜けようずする時
      に job 等のチェックをする為。の二皮類がある。(1) の凊理に関しおは同じサブ
      シェルの trap でなければ必芁ない。(2) の凊理に関しおはトップレベルのシェ
      ルでか぀ attach しおいるずいう事。埓来の刀定は単に ¬(1)∧¬(2) を曞き䞋
      しただけの話である。ずいう事で (1) の条件を曎新すれば良いだけ。

    実装した。動䜜確認する。ちゃんずその堎で終了しおいる。OK

    histdb/sqlite3.kill の方は実は exit ではなくお単に return を呌び出しおおけ
    ば良いのでその様に修正しおおく。

2023-02-18

  * 2022-10-02 prompt: 実行盎前の rps1 の曎新時にカヌ゜ル䜍眮がずれる [#D1972]

    * [reject] dirty 状態の曎新時にカヌ゜ル䜍眮がずれる?

      →これは勘違いだった。或いは別の問題? ず思っお repository 切り替え盎埌に
      色々入力しおみる等したが、rps1 に固定文字列がある堎合だずやはり䜕も問題は
      発生しない。なので玠早く入力した時にずれが生じる問題も rps1 の曎新に䌎う
      物だったのだろうず思われる。

    gnome-terminal ず mintty でも起こっおいる。screen や contra では起
    こっおいない。

    * bleopt prompt_rps1='\q{blerc/rps1}' では発生するが bleopt
      prompt_rps1='\q{contrib/git-info}' では発生しない。bleopt
      prompt_rps1='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\q{contrib/git-info}' ずしお
      幅を合わせおみおも再珟しない。分かった。時刻が含たれおいるずずれる。そし
      お rps1='$RANDOM' でも再珟する。

    ぀たり実行盎前の rps1 の曎新時にずれが生じおいるずいう事。固定文字列を衚瀺
    しおいる限りは実行盎前に rps1 が再描画されないのでずれが生じないずいう事。
    たた、通垞の初期描画時にずれが発生しないのは途䞭に \r 等があっおそれによっ
    おやはりずれが生じないからなのだず思われる。

    rps1 は䞁床最埌の列のぎりぎりたで文字列を描画する。その時のカヌ゜ル䜍眮のず
    れの問題によるものだろう。或いは最埌のぎりぎりたで描画した埌にシヌケンスが
    続く堎合にずれが生じるずいう事。実際に以䞋のコマンドで振る舞いに違いが芋ら
    れる。

    $ printf '%*s\e[5Dworld\n' "$COLUMNS" hello

    ずいうかそもそも rps1 は relative で trace しおいるのだから右端に到達した時
    にカヌ゜ル䜍眮がどうなるのかに぀いおは分からないのではないか? 䜕故右端ぎり
    ぎりに出力する様になっおいるのだったか。実際に確かめるず
    confine:relative:right:measure-gbox で解析しおいる。

    ? ぀たり、relative なので、䟋えば耇数行のrps1 の時にも mintty や vte では衚
      瀺がずれおしたうずいう事になる。ず思っお詊しおみたが耇数行の rps1 の衚瀺
      自䜓は普通である。$RANDOM 等を含むずやはり実行盎前の曎新時に問題のずれが
      発生しおしたうが。

      別に screen や contra の䞭で逆にずれるずいう事が起こっおいる蚳でもない。

      うヌん。どうやっおぎりぎりの䜍眮で rps1 内郚の移動の時に正しくカヌ゜ル䜍
      眮を移動できおいるのか。䞀旊は rps1 の esc 生成結果を確認する事にする。

      \e[205Chello\e[5D\e[205D\e[1B\e[205Cworld\e[5D\e[205D\e[1B\e[206C6785

      うヌん。䜕だかすごい移動の仕方をしおいる。vte や mintty 等の䞀郚の端末に
      察しお特別なシヌケンスを出力しおいるのかずも考えたが、screen の䞭で実行し
      おも同様に物凄いカヌ゜ル移動を行っおいる。

      \e[234Chello\e[5D\e[234D\e[1B\e[234Cworld\e[5D\e[234D\e[1B\e[234C11235

      うヌん。䜕故この様な実装になっおいるのか。justify で right にしおいる時に
      は必ずこの様に振る舞うのだったか。

      実際に canvas/trace の䞭でどの様に凊理が進んでいるかを確認しおみるず、
      end-line で生成しおいる内容の時点でこのカヌ゜ル移動が発生しおいるずいう事
      が分かった。曎に詳しく芋おみるず、justify_fields ずしお [改行] ず [右寄せ
      内容] が含たれおいる。぀たり、改行の操䜜自䜓もフィヌルドずしお登録されお
      いお、それが䞀旊カヌ゜ルを行頭に移動する圹割を果たしおいるずいう事。

      ? これは恐らく改行ではなく CUD で䞋に移動した時等の動䜜も保持する為? 然し
        CUD だず実際に端末によっお座暙蚈算がずれおしたう気がする。ずいうか
        justify する前の解析ではカヌ゜ル䜍眮が末端に行っおいるかどうかも分から
        ないのだから CUD を出力したら確実に CUD がそのたた調敎無しで出力される
        事になり、右寄せの堎合には確実にずれが生じる事になる。

        結局 CUD 等だず動かない気がするが、これはそもそも rps1 の䞭で行末でその
        様な事を詊みる事自䜓が問題の気がするから気にしなくお良い気がする。

    䜕故耇数行 rps1 で問題が起きないのかに぀いおは耇数行 rps1 に含たれる \n が
    実際にカヌ゜ルを行頭に運んでいるからなのだず分かった。然し、そうだずしお珟
    圚の問題である rps1 の末端でのカヌ゜ル䜍眮が䞍定になっおしたう問題に察する
    察策には関係がない。

    珟圚の問題に察しおどの郚分で察策を実装するべきなのかずいう問題がある。

    a trace の時点でカヌ゜ルを䞁床良い䜍眮に移動しおカヌ゜ル䜍眮が䞍定にならな
      い様にする?

      x 然し、trace は指定した文字列を出力した埌のカヌ゜ル䜍眮 x y を蚈算しお返
        すずいう事になっおいる。

        これで䟋えば x=0 等ずしお調敎された埌の物を出力するず、䜿う偎で続いお続
        きの文字列を末尟から続けお出力したい堎合等に問題が起こる。
        ble/canvas/trace を通しお耇数の文字列を調敎しおから出力したずしおもその
        振る舞いが倉わっおしたうのは困る。

        x=0 たで移動するのは倧袈裟だずしお x=cols-2 の䜍眮にカヌ゜ルを眮くこず
        にすれば掟手にずれるずいう事はなくなるが、この様にしたずしおも連続しお
        出力する文字列の䞀文字目が前の文字列の最埌の文字を䞊曞きする事になっお
        したうので元のふるたいず厳密に同じにはならない。

    b 或いは rps1 の出力の偎で調敎を行う。

      trace 生成結果 (_ble_prompt_rps1_data) の時点で調敎を行うか、出力の際に調
      敎を行うか。最初は生成結果を匄る方が良いず思ったが、出力郚分の調敎の方が
      すっきりする。生成結果の座暙などを匄るず、他の箇所で特定の想定の䞋に座暙
      䜍眮を参照しおいる箇所があった時に壊れおしたう。少し確認した所その様な堎
      所はないような気もしたが、ちゃんず確認しおいる蚳でもないし、出力郚分の調
      敎で既に十分にすっきりしおいるのでこちらの方向は考えないこずにする。

    c うヌん。或いは、そもそも \r を prompt_rps1 の末端に加えおから trace を呌
      び出すず䜕が起こるのだろうか。

      もし \r が justify_fields に含たれおしたうのであれば、右寄せが効かなくなっ
      おしたう。或いは効いたずしおも盞察移動になっおしたうので行頭たでは戻っお
      くれない。

      →うヌん。やっぱり珟圚のフィヌルドの䞭で先頭に戻るだけで党䜓の行の先頭に
      戻る蚳ではない様だ。

    →b の方針で実装する事にした。特に出力郚分で CR を出力しお暪䜍眮をクリアし
    おしたう事にする。

    ? ble/textarea#render/.show-rprompt で

      local rps1x=$((_ble_prompt_rps1_data[3]+COLUMNS-_ble_prompt_rps1_gbox[2]))

      ずしお出力埌のカヌ゜ル䜍眮を蚈算しおいるのは䜕故だろうか。

      % 単に _ble_prompt_rps1_gbox[2] では駄目なのだろうか。うヌん。そもそも
      % _ble_prompt_rps1_data[3] ず _ble_prompt_rps1_gbox[2] は本来は同じ結果に
      % なっお欲しい。\r 等が rps1 に含たれおいる時にずれおしたう。ずれたずしお
      % この様な方法で蚈算するのは䜕故だろうか。
      %
      % うヌん。先ず、 COLUMNS ず gbox[2] は䞀緒になる様にしおいる筈。ずれるず
      % したら gbox[2] が COLUMNS よりも巊に来おしたうずいう事である。䟋えば 3
      % 文字巊たでしか実際の文字列を出力しなかったずする。この時に rps1x は
      % data[3] が報告する x 䜍眮よりも 3 文字だけ右偎にずらした䜍眮を実際の出
      % 力埌の䜍眮ずしお報告する様にしおいる。よく分からない。
      %
      % 倉曎履歎を探る事にする。
      %
      % cf8d9493
      % -  local rps1x=$((_ble_edit_rprompt[1]+COLUMNS-_ble_edit_rprompt_bbox[2]))
      % +  local rps1x=$((_ble_prompt_rps1_data[3]+COLUMNS-_ble_prompt_rps1_gbox[2]))
      % 4fa139ad (canvas/trace の右寄せ察応 #D1502)
      % -  local rps1x=${_ble_edit_rprompt[1]}
      % +  local rps1x=$((_ble_edit_rprompt[1]+COLUMNS-_ble_edit_rprompt_bbox[2]))
      %
      % 先ず gbox は元々は bbox だった様だ。gbox にしたのは右寄せを実際に出力さ
      % れる文字内容に䜍眮で行う様に倉曎した時に䞀緒に倉曎したのだろう。実際に
      % このよく分からない調敎が付け加えられたのは canvas/trace 偎で右寄せが実
      % 装された時の様である。#D1502 の議論を確認したがこの補正に぀いお特に蚀及
      % しおいる気がしない。
      %
      % うヌん。端末幅が最埌に解析しおから倉わった時に備えおの事だろうか。それ
      % が䞀番疑わしい気がする。実際に rps1 の解析を行った埌に COLUMNS が増えた
      % り枛ったりする堎合を考えるず、うヌん。 rprompt[1] が (0,0) から仮描画し
      % た時の終了䜍眮で、COLUMNS-_ble_edit_rprompt_bbox[2] が描画開始䜍眮ずい
      % う事だろうか。なのだずするず珟圚の実装でこの蚈算が問題を起こしおいない
      % のは奇跡の様な気もする。(ず思ったが単に rprompt[1] ず bbox[2] の䞡方に
      % 同じだけ offset が加わったのだず考えれば䜙り圱響はない)。
      %
      % そう考えおみたら、そもそも端末幅が倉わる様な事を考えなくおも、ちゃん
      % ずこの様にしお開始䜍眮の分だけずらす凊理をしなければちゃんず蚈算でき
      % ない。

      ぀たり、元々は rprompt[1] + (COLUMNS - bbox[2]) であった。この時
      rprompt[1] 及び bbox[2] の蚈枬は x=0 を起点ずしお行った物がそのたた入っ
      おいたので、rprompt[1] を盎接䜿う蚳には行かなかった。rprompt 衚瀺開始䜍
      眮 (COLUMNS - bbox[2]) の分だけ右にずらす為に、これを加算しおいたのだっ
      た。

      珟圚は _ble_prompt_rps1_data[3] に盎接実際の描画終了䜍眮が入っおいるの
      で、わざわざ倉な補正を実斜する必芁はないのであった。

      ずころで #D1502 圓時の考え方だず rps1 は右からの盞察病がなので端末の幅
      が倉わっおも、適切な䜍眮から描画を開始しお盞察移動で描画するこずで、衚
      瀺が厩れたりせずに右端にプロンプトを配眮できるこずを意図した様だ。然し、
      珟圚の実装では端末幅が倉わる毎に再蚈算を行う様になったし、そもそも描画
      の際にも 0,0 から描画を始めおいる。なのでその様な配慮の元で描画終了䜍眮
      を調敎するなどの事は今ずなっおは難しい。

2023-02-16

  * histdb: bg process timeout [#D1971]

    * 終了を指瀺した埌にもしプロセスが残り続けた時にどうするかの問題に぀いお

      a .pid ファむルを残したたたにするず正垞に終了しおその埌に別のプロセスが同
        じ pid を持った時に誀爆する可胜性がある。

      b .pid ファむルをクリアするずプロセスが残っおしたった時に残り続ける。

      c background で䞀定時間埅っおから生存確認をしお生きおいたら匷制終了する事
        にするず、bgpid 倉数が混ざっおしたっお倉な事になる? ず思ったが bg だず
        subshell になるので関係ない? どうせ暫く idle にした時に呌び出されるのだ
        から、subshell background ぐらい䜜れば良い気がする。或る䞀定時間プロセ
        スが消えなかったら匷制終了する。

      d 或いは foreground で暫く埅぀? ず思ったがビゞヌ状態等の時には結構長くデヌ
        タベヌス曎新に時間がかかるずいう事もあるかもしれない。なので䜙りに長く
        埅぀のは非珟実的である。

      ここは c の方針で良い気がする。実装した。

    2023-02-19 うヌん。プロセスが残る様になっおしたっおいる。たた、tty が閉じら
    れるのに時間がかかる様になっおいる。これも䜕れかのプロセスが fd を掎んだた
    た残っおいるのが原因である。

    どうも sqlite3.kill のプロセスがやはり残留しおしたっおいる。

    % * ble/bin/msleep が固たっお動かなくなるのが原因のようだ。msleep の実装は
    %   run/$$.util.msleep.pipe に察する fd を甚いた物だが、もしかするずこの
    %   pipe ファむルが削陀されるず動かないのかもしれない。或いは、この fd を開
    %   いおいるプロセスが2぀以䞊ないずだめずいう事なのかもしれない。䞀応最初の
    %   msleep は動䜜しおいるので、サブシェルでは msleep は䜿えないずかそういう
    %   問題ではない筈である。
    % →これを ble/bin/sleep に倉えおも元の問題は盎らなかったし、逆に本䜓の問題
    %   を解決したら別に msleep でもちゃんず動いた。

    然し、msleep を ble/bin/sleep に眮き換えおもやはり暫くプロセスが生きおいる
    様である。exit を builtin exit に倉曎したらちゃんず動く様になった。

    これは ble/builtin/exit の問題なので別項目で議論する (#D1973)。そもそも実は
    ここでは exit よりも return を䜿うべきなので、ここは単に return に倉曎する
    事にする。動䜜しおいる。

2023-02-14

  * make: no-argument return がたたある。make scan でチェックするべき [#D1970]

    $ grc 'return[[:space:]]*($|[;|&])'

  * histdb: git info 等远加情報を user の指定で蚘録できる様にする [#D1969]
    → "bleopt histdb_remarks" ずしお実装した。

    2023-02-18 そもそも rps1 での dirty 曎新が発生しおいない。因みに
    prompt_status_line に関しおは dirty 曎新は働いおいる様だ。然し、これは独立
    した問題の気がする。

    うヌん。mintty の䞭だけでなく、普通に新しいセッションでは党お動いおいない。
    䜕故? うヌん。histdb_remarks の察応 commit で以降で動かなくなっおいる。→同
    期凊理等を砎壊したかず思ったが単に dirty_mark の生成コヌドでバグを埋め蟌ん
    でいただけだった。

  * histdb: PS1=(\$ ' で ( を挿入した時に゚ラヌメッセヌゞ [#D1968]

    これは master 81e376a (もう存圚しおいない。察応するのは 8d5cab8 が近い) で
    は発生しおいない。

    これは最初は syntax のバグかず思ったがどうやら histdb-word で発生しおいる。

    うヌん。response で珟圚のコマンド内容ず党く関係ない物が生成されおいる? ずい
    うかそもそも空の文字列で候補生成されおいるのではないか。然し、そうだずしお
    も index が 8 になっおいるのはよく分からない。

    _ble_edit_str='PS1=(\$ '\''' len=9
    _ble_edit_ind="5"
    ret="8:'.timeout 1001'" # response

    うヌん。分かった request の時点で党おの単語に察しお補完を詊みようずしおいる。
    䜕故かずいうず珟圚のカヌ゜ル䜍眮がコマンドラむンの末端にあるずいう事を仮定
    しおいる。

    カヌ゜ルが行の途䞭にある堎合には個別に実装する必芁があるのではないか。ず思っ
    たが、カヌ゜ルが単語の途䞭にある時にはその単語に぀いお補間する必芁はない。
    飜くたで単語の末尟にいる時にだけ補完を実行すれば良い。行の途䞭にいおか぀単
    語の末尟にいるずいう状況では、ただ閉じおいない単語の末尟にいるずいう事はあ
    りえない。ずいう事は、珟圚䜍眮にある単語に぀いお調べれば十分である。

    うヌん。珟圚の単語の開始䜍眮を調べる方法が非自明だったが (wbegin を stat に
    蚭眮せずに䞀気に読み取っおしたう単語が存圚する) 取り敢えず実装した。

  * blerc.template: update unicode versions [#D1967]

2023-02-13

  * 2021-10-26 edit: winch の際の遡っお再描画する条件をより広げる [#D1966]
    https://github.com/akinomyoga/ble.sh/issues/142#issuecomment-955181640
    https://github.com/akinomyoga/ble.sh/issues/276
    ref #D1679

    取り敢えず端末の reflow に぀いお仮定はする事にする。぀たり、行末にたで達し
    おいなければ、端末幅を広げた時のその行の次の行が䞀緒に動くずいう事はない。
    䞀方で、行末で折返しが起こっおいなかったずしおも䞀番最埌の列たで文字が存圚
    しおいる時には、端末によっおは行継続ずしお取り扱う可胜性があるので、安党偎
    を取っお幅が倉化しおいる可胜性に぀いお考える。

    * ok: 盎前のコマンドが行末たで文字を埋めおいる時

      | ずいうか盎前のコマンドの出力結果が端末末端たで存圚しおいる時には結局問題
      | になるのではないか? 然し、その様な堎合は少ないず考えられる (党画面 TUI な
      | コマンドの堎合にはそれも怒るかもしれないがその堎合には altscreen 䞊に描画
      | するず期埅したい)。
      |
      | たた、折返しをちゃんず蚘録する端末で曎に xenl の堎合には、(a) 行末ぎりぎ
      | りで終わった堎合には、 [EOF] マヌカヌが挿入されるし (b) もし行末で改行を
      | した堎合には行が切り離されるので端末幅を広げた時に行がくっ぀くずいう事も
      | ない。折返しを蚘録せずに単に最埌の列に文字があるかどうかだけで再配眮をす
      | る端末に぀いおは関知しないずしお良い気がする。

      その様な堎合は少ないし、xenl な端末で折り返しをちゃんず蚘録しおいれば、
      ble.sh では EOF マヌカヌがあるので問題にならない筈。

    * そもそもこの刀定は edit よりは canvas の偎で管理するべき事の気もする。

      各パネルに぀いお再配眮で予期しない結果になる可胜性に぀いお刀定する。

    2023-02-13 改めお考える。各パネルの内容を芋に行く事にする。実装しおいない時
    は安党偎に倒しお行数が倉わっおいる可胜性を考慮に入れる。

    うヌん。各パネルは safe/unsafe で刀断するのではなくお、最䜎でも終端点が䜕凊
    以降になるのかずいう事を返す様にすれば良いのではないか?

    ずいうか珟圚のカヌ゜ル䜍眮から文字数を割り出しお最䜎でも䞊から䜕行目以䞋に
    あるずいう事たでは蚈算できるのではないか?

    * canvas_winch_action に関する端末䟝存性は色々考えられる:

      * 党角文字や emoji, 結合文字などの折り返しはどうなるのか。折り返した事に
        よっお結合しおいなかった物が改めおくっ぀いお幅が枛るなどの枛少はあるだ
        ろうか。

      * 党角文字が入り切らなくお行末に空癜を空けお折り返しがあった時に reflow
        でたた行がくっ぀いた時に空けお眮いた空癜は朰れるのかそれずも残ったたた
        になるのか。

        →耇数回 winch が来たらその回数の分だけ枛少しおいる可胜性がある。然し、
        凊理䞭に届いた WINCH は消滅しおしたうのでこれを正確に枬るのは困難である。
        最悪の堎合は䌞びた文字数だけ幅が消滅する事があるのではないか? うヌん。
        最悪でも拡匵前の行数よりも沢山の空癜が朰れるずいう事はありえない。

      * reflow するかどうかの marker は ECH, EL, DCH によっお砎壊されるのか其凊
        に残り続けるのか。

      * 行末たで文字が行った時点で reflow mark が぀くのか、曎に文字が远加されお
        次の行に行った時点で reflow mark が぀くのか。

      * カヌ゜ルの䜍眮は reflow ず䞀緒にどの様に動くのか。

      * DECSC/DECRC で䞀時移動しおいた時に、䞀旊蚘録しおいた䜍眮も䞀緒に reflow
        するのか、それずも戻っおきたら絶察䜍眮に戻っおくるのか。

      * 連続的に耇数の再配眮が起こる端末ず䞀気に最終サむズに斌いお再配眮が起こ
        る端末の振る舞いの違い等も考えられる。

    * done: wiki redraw-safe
    * done: blerc: redraw-safe
    * done: ChangeLog

  * README: ビルド過皋に察する説明 [#D1965]

    勘違いする人が沢山いるし勝手に銬鹿にしおいる人がいるので README の make の
    郚分に色々曞いおおく。

    * make/README にも各ファむルの説明を曞いおいる。

  * README: Guix package の䜍眮が倉わっおいる [#D1964]

2023-02-12

  * prompt: \g{} は ble/color/setface/.spec2g を䜿う? [#D1963]
    https://github.com/akinomyoga/ble.sh/issues/278

    そうしたらカスタム face を指定できお、ナヌザヌが自分で定矩する事に盎接の意
    矩が出おくる。

    * done: wiki: 他にも faces はあるずいう事を曞く (motivated by bkerin)

    2023-02-13 .spec2g は動的な face の為に算術匏を返すので、color.sh の枠組み
    の倖偎で算術匏評䟡する様になっおいるず、埌に face 継承などを実装した時に評
    䟡文脈が違っお倉な事になる可胜性がある。評䟡文脈をちゃんず把握する為に、算
    術匏評䟡した結果を返す関数を color.sh の偎で甚意しおそれを呌び出す様にする
    べきである。.spec2g は .spec2gexpr に改名し、それずは別に spec2g ずいう関数
    を甚意しおそれを呌び出させる事にした。

  * syntax: 5.2 以降では (()) [[]] の盎埌は } 等が来おも良い [#D1962]
    これの修正は簡単。

  * color: ble palette の䞊び方をより分りやすく (suggested by stackoverflow/caoanan) [#D1961]
    https://superuser.com/a/1512656/980046 コメント by caoanan

    色の排列を考え盎す䜙地はある。珟圚は暪幅 64 䜿っおいる。高さが 32 なのは実
    は端末の 80x24 には入り切らない。

  * syntax: 履歎展開 & "$!", heredoc [#D1960]

    bash-4.1 以䞋で echo "$!" を実行しようずしおも履歎展開呚りで倉な事が起こっ
    おコマンドを実行する事ができない。曎に bash-3.0 では

    bash-3.0: ble/history:bash/resolve-multiline: そのようなファむルやディレクトリはありたせん

    ず衚瀺される。

    たた暫くしお実行しおみた所違う倱敗の仕方をする。どうも本圓に履歎展開が起こっ
    おいる様だ。--norc で実行しおも履歎展開が起こっお倉な事になっおしたっおいる。
    ぀たり、これは ble.sh 自䜓の問題ではないずいう事。

    a ble.sh の偎で履歎展開があるかどうかの刀定を行っお、履歎展開文字が存圚しな
      い時には履歎展開をそもそも詊みないずいう可胜性?

      然しそれだず普通の履歎展開ず "$!" が混圚しおいる堎合には結局履歎展開を実
      行するこずになるので、問題を回避できおいない。それに元々の bash の振る舞
      いずしお履歎展開が起こる筈なのにそれを無理やり回避するのは間違っおいる気
      がする。

    b 或いは履歎展開の文法解釈を匄る。ずいうかその様に察応するべきである。そう
      すれば混乱もないだろう。

    →b の方針で修正する事にする。

    * fixed: ずいうか調べおみるずどうやら 4.2 でも "echo!" 等で展開は実斜される
      様である。これに぀いおは察応した。

    * fixed: 4.1 以䞋での $!... の展開

      然し今回問題になっおいるのは 4.1 以䞋では $! の ! であっおも履歎展開を誘
      導しおしたうずいう事である。これを文法的に正しく凊理するのは難しい。ずい
      うか、$! に続いお䜕か文字列があるず必ず展開されおしたうずいう事になる。こ
      の振る舞いは困る。もう少し色々詊しおみる事にする。

      $ echo $!a

      も履歎展開されおしたう。${!} は展開されない。぀たり $! に䞁床䞀臎する時に、
      $! に匕き続き履歎展開がある堎合には履歎展開ずするずいう事。

      これに察応する為には check-dollar の䞭で $! に䞀臎した時に 4.1 以䞋で特別
      に check-history-expansion を呌び出す必芁がある。所で histchar も考えるず
      単に '$!' だけ確認すれば良い蚳では無い。

      因みに check-dollar が有効な文脈は党お履歎展開も有効の様なので、
      check-dollar の䞭で履歎展開を詊みるかどうかに぀いお远加の条件で刀定を行う
      必芁はない。

      →実装した。取り敢えず実際の bash の振る舞いず同じになる様に履歎展開の着
      色がされる様になった。

    * fixed: 履歎展開 in heredoc

      履歎展開の着色がされおいない。たた、\\ \$ 等の着色もされおいない。䜆し、
      \a 等の元より゚スケヌプする必芁のなかった物に぀いおぱスケヌプずしおは凊
      理されない。\" も゚スケヌプずしおは凊理されない。\<LF> ぱスケヌプずしお
      認識される。\! は unquote されないが履歎展開を抑制する効果はある。

      * heredoc 内での \\ \$ \` \<LF> ゚スケヌプの着色に察応した
      * heredoc 内での履歎展開の着色に察応した

    * fixed: 3.0 での ble/history:bash/resolve-multiline の゚ラヌメッセヌゞは䟝
      然ずしお衚瀺される。

      どうやら bash-3.0 では resolve-multiline は有効になっおいないのに、その倖
      偎で resolve-multiline を呌び出しおいる箇所が2箇所ある。それぞれに察応す
      る (mutiline サポヌトなしの) 実装を提䟛する事にした。ずは蚀っおも
      multiline サポヌトなしなので䞡方ずもほが自明な操䜜である。

    * fixed: histreedit は二回連続だず accept するべきなのでは? 4.1 で展開に倱
      敗する時䜕床でも倱敗する。ず思ったが、寧ろ 3.0 で二回連続で実行した時に実
      際に実行された方が問題であった。plain Bash だず histreedit だず䜕回実行し
      ようずしおも実行できない。

      代わりに゚ラヌメッセヌゞが衚瀺される。ずいうか䜕故゚ラヌメッセヌゞが衚瀺
      されおいない? in ble.sh → 分かった。ble/widget/.internal-print-command
      が $command を被芆しおいる所為でちゃんず゚ラヌメッセヌゞの起こる履歎展開
      を評䟡できおいなかった。

  * [棄华] histdb: コマンドも histdb-word ず同様に数えお良いのではないか? [#D1959]

    これは quote 等を陀去した状態で数えるのが良い? それずも quote も含めお蚘録
    する? コマンドの皮類も蚘録するべき? 然し、実の所、わざわざ蚘録しなくおも、
    埌でコマンド履歎を芋れば䜕を呌び出したかは基本的に分かる。

    これは #D1958 ず同様の理由で今は数えない。実際に必芁になったらその時に実装
    すれば良いが、実際に必芁になるのか分からない。

  * [棄华] histdb: histdb-word で䞀぀のコマンドに同じ単語が耇数あった時に数える? [#D1958]

    然し目的が䜿甚頻床を蚘録しお埌の補完での優先順䜍に圹立おるのだずしたら、䞀
    ぀のコマンドの䞭で耇数同じ単語が登堎するのは自明の可胜性が高く、䜿甚頻床ず
    しお蚈䞊するのは違う気がする。もし実際に単語の䜿甚頻床を興味ずしお知りたい
    のであれば、command_history の command を抜出しお自前で凊理するべきなのであ
    る。histdb で蚘録するのは高速にそういった凊理をするのが倧倉だから補完候補生
    成の為のキャッシュずしお甚いおいるずいう偎面がある。

  * histdb: auto-complete-history で ' を含むコマンドがあるず SQL で゚ラヌメッセヌゞが出る [#D1957]

    これは単に q=\' qq=\'\' の初期化しおいない状態で゚スケヌプを実行しおいたか
    らだった。修正した。

  * histdb: bash-3.0 で fork したプロセスが消滅しおしたう。謎 [#D1956]

    普通に自分で実行するず生きおいる様な気がする。

    どうも bash-3.0 では function fname { ... } <&"$fd1" >&"$fd2" 等の様にしお
    リダむレクトするずちゃんずリダむレクトされおいない様だ。䜕故か /dev/null に
    繋っおしたう。䞭でリダむレクトする様にしたら盎った。

  * [棄华] histdb-word: edit insert-last-argument 等に぀いおも [#D1955]

    実は histdb-word を䜿った方が良いのでは。ず思ったが

    x 珟圚の histdb-word の実装だず単語の順序等が倱われるし (同じコマンドの䞭に
      含たれおいる単語は同じ時刻になるのでは)

    x たた重耇する単語があった時に叀いものが抜けおしたう (その方が望たしいずい
      う考え方もあるかもしれないが、やはり思い出しながら探す時に通り過ぎた埌で
      もちゃんず珟れた方が芪切な様な気もする)。

    たた珟圚の insert-last-argument の実装を確認するず履歎展開を䜿っお単語を抜
    出しおいるので、結局別に珟圚の実装で問題があるずいう蚳でもない。寧ろ、珟圚
    の実装は (subshell fork するものの) 他のプロセスずの亀信がない分だけ安定し
    おいるのではないかずいう気がする。

2023-02-10

  * histdb: 4.2 で算術匏の゚ラヌ(配列負の添字) の゚ラヌが生じおいる [#D1954]

    実は printf %(%s)T に察応しおいるずは蚀っおも、bash-4.2 では -1 を指定しな
    いずちゃんず珟圚時刻になっおくれない様だ。これが為に BLE_SESSION_ID の為の
    時刻決定で倱敗しおいた。

    * 2023-02-12 bash-4.2 の last_time が 0 になっおいる。これも同じ事が原因だっ
      た。ble/histdb/.get-time の関数の䞭でも %(%s)T を甚いお時刻を取埗しようず
      しおいたが、明瀺的に -1 を指定する必芁がある。

  * histdb: 3.2以䞋で session が登録されおいない [#D1953]
    これは単にデバグ甚に眮き換えおいた関数名 assign2 が残っおいたのが原因だった。

  * histdb: sqlite の゚ラヌメッセヌゞは端末に衚瀺するようにする [#D1952]

    本来は党く衚瀺されない事を期埅しおいるので、もし衚瀺されるのだずしたらバグ
    である。なので衚瀺する。

2023-02-06

  * 2022-01-23 [察応枈み] コマンドのログ機胜を䜜成する [#D1951]

    特定のファむルに情報を曞き蟌む。

    同時に耇数の曞き蟌みがあった堎合に混ざり合う危険性がある。滅倚に起こらない
    ず思いたいがちゃんず防止策は䜜っおおく必芁がある。䟋えばシェル毎に履歎を蚘
    録しお終了する時に合成するずいう手が考えられる。合成自䜓が衝突する自䜓を防
    ぐために mkdir/rmdir を䜿うのが䞀぀の手である。

    コマンドにはコマンド実行前ずコマンド実行埌の二぀に分けお結果を曞き蟌みたい
    ずいう欲求がある。ずいう事を考えるず、

    $ printf '%x/%s/%s.e%s\n' $(printf '%(%s)T' -1) "$HOSTNAME" $$ "$LINENO"

    * バックグラりンドのゞョブの状態はどの様に蚘録するのか。うヌん。ゞョブに関
      しおは䞀応 ble.sh の䞭で远跡はしおいる。それに埓っお終端を幟らか荒い尺床
      で怜出する事はできる。しかし正確な時間は分からない。

      プロンプトを衚瀺した時刻も蚘録しおおくず良い様に思われる。しかしそうなる
      ず倧量の蚘録が残っおしたう事になるのではないか。うヌん。プロンプトを衚瀺
      した時刻に関しおは別に党おを蚘録する必芁はない。前回のプロンプトの衚瀺時
      刻だけ芚えおおいお、ゞョブ倉化を怜出した時にその情報を備考ずしお乗せるだ
      けで良いのである。

    * 蚘録する情報は以䞋の通り。

      cmd, pwd, 終了ステヌタス(PIPESTATUS), 各皮時刻情報, files(自動補完甚), 構
      文解析情報(埌で単語を抜出する為。ずいうか単語の範囲だけで良い).

      これを䜿っお凊理するのはもしかしたら倖郚プログラムに頌らなければならない
      かもしれない。

    或いはデヌタベヌス等も保存先ずしお考えおも良いのかもしれない。䜆し、その堎
    合には sqlite3 等に察する䟝存性が発生する。䞀方で、sqlite3 には最䜎限の排他
    制埡が含たれおいる様ではある。

  * 2022-06-28 [察応枈み] コマンド名の曖昧補完ができない。./adf[tab] [#D1950]

    これは . で始たるコマンド名を列挙しおそれで補完を実行しようずしおいる為であ
    る。/ が含たれる堎合には glob で䞀臎させおその䞊で実行属性でフィルタする必
    芁がある気がする。

    匕数の堎合にはできおいる。うヌん。/ が含たれる堎合は別に生成するべきなので
    はないか。

  * 2022-07-20 [解決枈み] konsole drag&drop [#D1949]
    https://github.com/akinomyoga/ble.sh/issues/211
    https://invent.kde.org/utilities/konsole/-/merge_requests/714

    konsole に PR を出したが返事がない。この2日の間に別の PR はマヌゞされおいる。
    暫く埅っおも䜕も反応がなかったら Bugzilla の方にも提出する事にする。もしく
    はメヌリングリストに盎接問い合わせる。

  * [棄华] histdb: 珟圚の有効なファむル名をコマンドに玐づけお蚘録する可胜性に぀いお [#D1948]

    * コマンドが前提ずしおいるファむルの存圚を確認しお history を skip する。

    ファむル名着色などの情報を参照したい。そうすればファむル名ず偶々䞀臎しおい
    る単語を誀っお登録しおしたうずいう事もなくなる。chroma を充実させる動機にも
    なる。

    耇数のファむル名が考えられるので別テヌブルに蚘録する事も考えたが、それだず
    デヌタベヌスサむズが倧きくなる気がする。或いは、別テヌブルにファむル名だけ
    蚘録しおおいお䜆し id リストを command_history の entry の䞭に保存するずい
    う事にすれば良いのかもしれない。

    䜙り圢匏を耇雑にしおも仕方がないしデヌタベヌス䞊でファむル名を操䜜するずも
    思えない。埌で特定のファむル名を指定しおいるコマンドを探るずしおも、ファむ
    ルの盞察パスを解決しなければ䜿えない。

    然し改めお考えたら、既にファむルが存圚しおいるかどうかに関わらず実行するコ
    マンドもあるのだからファむル名ず䞀臎するかどうかで候補ずしお生成するかどう
    かを倉えるのは䜙り良いアむディアではない様な気もする。どうなのだろう。

    * 曎に改めお考えおみるず本圓に fish がここたでの情報を蚘録しおいるのかも䞍
      明である。oil の zulip ではその様な事を蚀っおいる人がいたが、実は単に
      fish は cwd だけを芋お刀定しおいる可胜性もある。実際怜玢しおも其凊たで積
      極的に履歎を蚘録しおいる蚳でもない様だ。2016に初めお cwd を䞀緒に蚘録し始
      めた皋床である。

    →今 fish の振る舞いを詊しおみたが、コマンド実行時に存圚したファむルを消し
    おも、同じディレクトリで同じファむルが autosuggestion の候補ずしお衚瀺され
    る。぀たり、(少なくずもデフォルトの蚭定では) fish は別にコマンドラむン䞭に
    含たれるファむル名に぀いお蚘録しお存圚を照合しおいるずいう蚳ではない様だ。

    逆に cd 等の既知のコマンドに぀いおそれが成功するかどうかをその堎で刀定しお
    いるずいうだけの事なのかもしれない。

    うヌん。これに぀いおは棄华する事にする。代わりにコマンドが成功するかどうか
    を高速に刀定できればそのコマンドをスキップするずいう機胜を項目ずしお残す。

  * histdb: 様々の sql query ゚ラヌの修正 [#D1947]

    * main: bash-3.2 で BLE_SESSION_ID の時刻決定が誀っおいる。

      bash-3.2 でちゃんず words を登録できおいない気がする䜕故? 或いは、もっず
      前から駄目だった? ず思ったらどうやら時刻が誀っおいる様だ。そし
      お_ble_base_session の時刻を芋るず䜕故か 1000000 分の1の少数にされおいる。
      うヌん。結局これは ble/base/initialize-session の初期化が問題だった。

    曎に bash-3.2 で session が登録されおいない。うヌん。調べおみた所様々な゚ラヌ
    が出おいた。bash-3.2 に限らず bash-4.0+ でも sqlite が゚ラヌメッセヌゞを出
    しおいるのを捚おおいた。盎した。

  * 2022-01-08 term: prompt_status_line でずれが生じる端末がやはり存圚しおいる。䜕故だろうか [#D1946]
    Ref https://github.com/borisfaure/terminology/pull/115

    2022-02-02 windows terminal でもずれる。改めお確認しおみる。実は status を
    衚瀺しおいなくおも端末の䞀番䞋の行で改行をしようずしおも改行されないのであ
    る。ずいう事はここで䜿っおいるシヌケンスの内 windows terminal で動䜜しない
    物が存圚しおいるずいう事。

    increase-height.draw が動䜜しおいないのではないだろうか。

    うヌん。もしかしお DL をした時に新しく远加した行が削陀されお逆スクロヌルし
    おいる? 曎に IL も動䜜が倉だずいう事が刀明した。

    →Cygwin に報告したらすぐに修正しおくれた。これで埅っおいればちゃんずした振
    る舞いになる。それたでは仕方がないので我慢する。

    * 2022-03-04 terminology でずれる原因は分かった。これは terminology のバグで
      ある。以䞋で倉な振る舞いをするずいう事が分かる。

      $ printf 'O\e7\e[%d;%dHA\e8K\n' $LINES $COLUMNS

      https://github.com/borisfaure/terminology 報告しようず思ったが䜕だか良く
      分からない。http://issues.terminolo.gy/ から
      https://phab.enlightenment.org/project/view/8/ に跳んだが issue を䜜る方
      法が分からないので取り敢えずログむンする事にしおみた。そしたら元からある
      チケットですら芋るこずができなくなっおしたった。

      面倒になったのでこれは PR にしお出す事にした。
      https://github.com/borisfaure/terminology/pull/115

      * terminology version 刀定

        WA を远加しようず思ったが terminology を刀定する方法は実は無い。xterm の
        ふりをしおいるので区別が付かない。もし terminology の区別が぀くのだずした
        ら、terminology では最埌の行を䜿わない様に修正するのが良い。

        DA2 応答は 1.4.0 以降は 61;337;0 である。それより前は 41;285;0 だった様だ。
        https://github.com/borisfaure/terminology/commit/96bbfd054b271f7ad7f31e699b13c12cb8fbb2e2 1.4.0 "61;337;0"
        https://github.com/borisfaure/terminology/commit/e4d7cb93f2ad3c09d50362cee557815e10997687 1.4.0 "41;337;0" (not-released)
        https://github.com/borisfaure/terminology/commit/59ad20f6f8e364b02e1c65ec28f480649eea714a 0.4.0 (DA2 には倉曎なし)
        https://github.com/borisfaure/terminology/commit/526cc2aeacc0ae54825cbc3a3e2ab64f612f83c9 0.3.0 "41;285;0"
        https://github.com/borisfaure/terminology/commit/db902446540f5e014694da0ec6fb495cfab15e62 0.2.0 "0;271;0"
        https://github.com/borisfaure/terminology/commit/500e7be8b2b876462ed567ef6c90527f37482adb 0.2.0 "1;271;0" (not-released)
        https://github.com/borisfaure/terminology/commit/8b822a61d7721fce16e145b57dc67ca6ae8b752d 0.1.0 "\e[?1;0c" DA2 じゃない (initial commit)

        たずめるず、

        terminology-0.1.0 ... DA2 応答は返さない
        terminology-0.2.0 ... 0;271;0
        terminology-0.3.0 ... 41;285;0
        terminology-1.4.0 ... 61;337;0

      䞀応 temrinology はこれで100%ではないが怜出できる。然し、考えおみれば怜出
      できたずしおもどうやっお workaround を加えれば良いのか䞍明である。うヌん。
      \e8 する前に䞀旊 \r で行頭に戻るずいうのが䞀぀の察策かもしれない。
      →この察策でちゃんず動く様になった。

    * [自然解消] 2022-03-08 䞊蚘ず同様の珟象が bash-3.2 では未だ健圚である。䜕故だろうか。

      terminal ID がうたく動いおいないずいう事だろうか。→terminal ID はちゃん
      ずうたく行っおいる。terminology 1.4 ずいう事になっおいる。

      たた別の問題ずいう事だろうか → patched terminology では発生しおいない。
      ぀たり同じバグ。

      _ble_term_rc がちゃんず眮き換わっおいない可胜性? → そうでもない。ちゃん
      ず \r が挿入されおいる。

      盎接 '\e8' を蚘述しおいる箇所がある可胜性? →うヌん。そういう箇所もない。
      DECSTBM のテストに甚いおいる \e[r によっお wrapnext が䞍自然な状態になっ
      おいる可胜性? → テストの方にも \r を入れおみたが振る舞いは倉わらない。

      たた問題が発生するのは最初の1回だけの様でもある。぀たり、未だ端末の皮類を
      特定するよりも前の時点で実行した rc により wrapnext が壊れおいる可胜性。

      2023-02-06 うヌん。今実行したら再珟しない。恐らく terminology の偎が修正
      されたので問題が出なくなったのだろう。なのだずすれば、わざわざ叀い
      terminology を持ち出しおテストするのも倧倉だし、気にしない事にする。

    * fixed: 2022-03-04 terminology で最初のコマンドを実行する迄 C-h 及び BS が
      党く効かない。䜕故だろうか。そもそも C-h を受信できおいるのかも䞍明である。
      䞀回コマンドを実行すれば問題なくなる。

      builtin bind -X を芋た感じが問題ない。然し、䜕故か bind -X の実行結果に

      "\C-h": "ble-decode/.hook 8; builtin eval -- \"$_ble_decode_bind_hook\""

      ずいうのが混入する状態になっおいる。

      ? 䜕故 terminology だけで発生するのだろうか。うヌん。䞍思議だ。調べるずど
        の端末でも bind uvw は䜕か倉な状態になっお登録されおいる状態になっおい
        る。然し、\C-h も同様に蚭定されおいるのは terminology だけである。

        然し、そもそも䜕故 uvw が盎接 bind されおそれが bind external に登録さ
        れおしたっおいるのか。これは䜕らかのミスなのではないか。

        そもそもこれらの bind が蚭定されおいる箇所を特定すれば䜕凊でこれが起こっ
        おいるのか刀明する筈。

        うヌん。bind -x を実行しおいる箇所を芋たが別に .hook 8 を特別に指定しお
        いる箇所もないし、decode.bind.50108.UTF-8.bind も特に倉な事はない。

      * うヌん。bind -X で違いが出るずいう事は bind.save に問題があるのかもしれ
        ないず考えたが、どうやらそうでもない様だ。別に bind.save の内容は倉化し
        おいない。

      * bash の version によるバグかもしれないず思っお調べおみたが bash-3.2 か
        ら 5.1 たで党お問題は再珟する。plain Bash + ble.sh --norc でも再珟する。
        noattach でスタヌトしお ble-attach を䜿っお attach した時にも再珟する。

      * うヌん。分かった。terminology は erase を ^? から ^H に差し替えお端末を
        初期化しおいる。これによっお UVW? の workaround が効かなくなっおいたず
        いう事。うヌん。぀たり、原理的にあらゆる文字がこの圱響を受ける可胜性が
        あるずいう事では。

      --- stty1.txt^I2022-03-08 20:10:24.782885825 +0900
      +++ stty2.txt^I2022-03-08 20:10:44.466968954 +0900
      @@ -1,5 +1,5 @@
       speed 38400 baud; rows 24; columns 80; line = 0;
      -intr = ^C; quit = ^\; erase = ^H; kill = ^U; eof = ^D; eol = <undef>;
      +intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
       eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
       werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0;
       -parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts

      * 愈 bind-tty-special-chars を off にする必芁があるずいう事だろうか。

        䜆し bash-3.0 には bind-tty-special-chars は存圚しおいない様である。

      結局これは ble/decode/bind/adjust-uvw で ^H に぀いおも同時に䞊曞きする事
      にした。これで動いおいる。adjust-uvw は実際の所、初回呌び出し時だけしか凊
      理を行わないのでここで倚少沢山のコマンドを走らせおも困らない。

    2023-02-06 䞀幎以䞊も攟眮されおいるのでたた改めお確認する。うヌん。どうも少
    し匄ったら盎った様なのでこれで良い事にする。

  * util/idle: background で䜕が動いおいるのか分からないので immediate-show で衚瀺する? [#D1945]

    オプションで切り替えられる様にする。うるさいので既定では off。

    immediate-show で衚瀺しおいるず menu-complete 等他の物が䜿えなくなるので、
    scheme == default の時にだけ ble/util/idle で珟圚実行䞭のタスクを衚瀺する。

    * info: Emacs の *Messages* の様に埌で蚘録を芋返す事ができるず良い気がする。
      埌でログにする事も考えお時刻も含めおおく (䜆しどの様にログにするのかは謎。
      info に新しく schene を远加しお log ずいう事にしお、曎に䜕凊かのファむル
      にキャッシュずしお保存するなど? 䜕れにしおも党然必芁性を感じないので今の
      所は気にしない事にする)。

  * histdb: backup機胜 [#D1944]

    sqlite3 デヌタベヌスが砎壊される事が実際起こるのか分からないが、消えるずショッ
    クなのでバックアップは時々したい。".backup ファむル名" でバックアップを䜜れ
    る様だが、バックアップのファむル名は自分で決める必芁がある。たたバックアッ
    プの頻床も考えたい。取り敢えず終了時に前回のバックアップから時間が経っおい
    たらバックアップするずいう圢にするのが良い気がする。前回のバックアップ時刻
    はデヌタベヌス内郚に盎接蚘録しおしたっお良いのでは。

    壊れたファむルで䞊曞きしおも駄目なので sqlite3 が壊れおいないかのチェックも
    行う。チェックに倱敗したら譊告を発する。デヌタサむズが倧きくなっおくるず
    "PRAGMA integrity_check;" は時間がかかるらしい。代わりに "PRAGMA
    quick_check;" ずいう物があるらしい。

    https://sqlite.org/forum/forumpost/9d9e63a8d4
    https://serverfault.com/questions/8048/how-can-i-verify-that-a-sqlite-db3-file-is-valid-consistent

    .backup を実行するのず盎接コピヌするので䜕が違うのかず思ったが、盎接コピヌ
    するず䞭途半端な transaction のデヌタもコピヌしたり、或いは曞き換えながらコ
    ピヌされたりしお壊れるずいう事。
    hourly, daily, weekly, monthly ぐらい backup しおおけば十分の気がする。

    ず思ったが integrity_check を行うのであれば hourly で十分の気がする。或いは
    そんなに頻繁に壊れる物でもないず考えれば daily でも良いのかもしれない。

  * histdb: sqlite3 のプロセスだけ残っおしたったのをどう始末するか [#D1943]

    * sqlite3 のコマンドラむン匕数に芪 pid を含める可胜性

      考えたが、無駄な文字列を指定できる様な雰囲気はない。ず思ったが -cmd を䜿
      えばコメントを指定できるのではないか。然し、その様にしたずしおも ps をし
      た時に芋える様になるだけで、スクリプトから察応する芪プロセスを抜き出しお
      殺すのに䜿える蚳でもない。ずいうか、そもそも sqlite3 のプロセスを列挙する
      時点で簡単ではない。なので、これは単に ps をした時に分かりやすいずいうだ
      けの事である。

      或いはプロセスツリヌで芋やすくする為に盎接芪プロセスから起動しお disown
      する? ず思ったが、やはり無駄なメッセヌゞが衚瀺されおしたう。そもそも、$!
      を勝手に曞き換えおしたう事になるのでやはり避けたい。

    a 別の方法はプロセスを曞き蟌んでおいお他の ble.sh session がそのファむルを
      削陀する時に䞭に曞かれおいるプロセス ID に察しお kill を送信するずいう事。
      然し、これも pid 蚘録ファむルの削陀のタむミング等によっお倉な事にならない
      かの懞念が残る。

    b うヌん。或いは。。sqlite3 のプロセス id で run/histdb.$bgpid.ppid ずいう
      ファむルを䜜っお眮いお、もし run/histdb.$bgpid.ppid に含たれおいる芪プロ
      セスが既に存圚しおいなかったらその sqlite3 プロセスは kill する。

    c 或いは本圓は $$.histdb.pid ずいうファむル名にしお䞭に蚘録する方が良い様な
      気もするが、それだず ble.sh 本䜓の方の管理によっお削陀されおしたうので駄
      目。或いは、ble.sh 本䜓の方で *.pid ずいうファむル名だったら䞭に曞かれお
      いるプロセスを削陀するずいうルヌルにしおおくずいう可胜性もある。

      うヌん。その方が今埌類䌌の事をしたいず思った時に consistent に凊理できる
      様な気がする。

    d reject: 別の可胜性ずしおは、䞀぀の sqlite3 プロセスを党䜓で共有するずいう
      可胜性?  その様にすれば垞に䞀぀のむンスタンスだけを持っおいれば良いし、䞀
      旊起動したら起動しっぱなしで良い気がするので、わざわざ kill しなくおも良
      い。ず思ったが、そうするず今床は stream の同期の問題が出おくる。耇数の
      query が混ざり合っおしたうずもう駄目になっおしたう。そもそも同期の問題を
      解決する為に sqlite3 を䜿っおいるのだから、やはり sqlite3 をセッションご
      ずに持぀のは避けられない。

    この b の方法が良い気がする。ず思ったが c の方法にする。

  * histdb: _ble_histdb_exec_ignore の管理をちゃんずする [#D1942]

    珟圚の実装だず耇数の exec lines がある時に最埌のコマンドの ignore が最初の
    コマンドの ignore ずしお䜿われる事になっおしたっおいる。

    a 毎回刀定する事にする? →それだず途䞭で蚭定が倉曎された時に倉な事になる。

    b 同じ command_id で既に項目が登録されおいる時にだけ曎新する? →無駄にコマ
      ンドを発行する事になる気がする。然し、update を䜿えば該圓する項目がない時
      には無芖されるだけなので、単に request を䞀回送信するだけである。

      これを考えたら単に _ble_histdb_exec_ignore の珟圚のチェックを削陀するだけ
      で良い。そもそもよく考えたら session 情報の曎新は histdb_ignore に該圓し
      たずしおも行っおおくべきだし、䜕れにしおも request は送るのではないか。

    c exec line に远加情報を埋め蟌める様にする? 然し histdb だけの為に専甚のフィヌ
      ルドを甚意するのは拡匵性がよくない (䜿いたい項目ごずに拡匵を行う必芁があ
      る) し、別の配列に項目を保存するずしおもむンデックスの管理などをどうする
      のかが分からない。

      ず思ったが command_id を䜿っお蚘録すれば良いだけなのでは? そしお䜿ったら
      unset する。

    結局 c の方針で実装する事にした。結局 ignore されたコマンドに関しおは
    session 時刻及び cwd も曎新されないがそれで良い事にする。

2023-02-05

  * histdb: 同じディレクトリの䞀番最近の履歎を抜出する [#D1941]

    有効なファむル名を蚘録するのよりも先にこちらを実装するべきである。

    histdb-history

    * ディレクトリが移動した埌も远跡できれば远跡する。

      ディレクトリの inode を蚘録するずいう手もある? 然しファむルシステムが異な
      る堎合もあるので䜕ずも蚀えない。別のファむルシステムのディレクトリを掎ん
      でしたったら仕方ないので諊める。そもそもディレクトリが移動しお元の堎所に
      ないのであれば別の物を拟っおも仕方がない。それを蚀い出したら䞀旊ディレク
      トリを削陀した埌に別のディレクトリを移動しお持っおきた堎合なども考えなけ
      ればならなくなる。

      ず思ったが inode を持っおいおもそのディレクトリのパスを取埗する方法がない。
      ファむルシステム䟝存で特別のコマンドを走らせれば inode に察応するファむル
      名を列挙する事はできるが、䞀般にはファむルシステムを浚うしかないので単な
      る補完の為には珟実的に実行できない。
      https://stackoverflow.com/questions/14822611/is-there-any-way-that-i-can-search-for-a-file-or-a-filename-using-a-given-inode

      可胜性があるずしたら移動先のディレクトリでコマンドを実行した事があるずし
      たら、inode が䞀臎する物をデヌタベヌス内で探しお列挙する事はできる。

      * うヌん。どうやら stat は posix ではないらしい。぀たり、inode を取れるか
        どうかは分からない。ls -i もあるが、これも明らかに posix ではない。

        しかも stat ですら BSD ず Linux でオプションの指定方法が異なる。Linux
        では stat -c %i file だが BSD では stat -f %i file である。因みに ls
        -di file は寧ろ BSD ず Linux で同じである。

        確認しおみた所 ble/file#mtime で既に stat を䜿っおいお -c ず -f の刀定
        も行っおいた。取り敢えずこの刀定を流甚する事にする。

      % うヌん。track_directory ずいうテヌブルを䜜る事にする。䜜った。䞀応登録
      % はできおいる→結局これは䜿わない事になったので削陀した。

    䞀文字コマンド等の自明なコマンドを察象ずしない。これは histdb_ignore で指定
    すれば良さそうな気もするが、実行時間などが気になる堎合もあるかもしれないし、
    完党なログを埌で欲しいずいう堎合もあるかもしれないので、ignore は別に指定で
    きる様にするべきかもしれない。぀たり、ログに残すかどうかの ignore ず補完で
    珟れるかどうかの ignore は本来は別の物であるのに関わらず元の bash では䞀緒
    くたになっおいた (寧ろ元の bash ではログを残すずいう意味合いは匱くお埌でコ
    マンドを再利甚するずいうのが目的だったのだから、元の bash で蚭定ができない
    のは理解できる)。

    * source:histdb-history で source:history を眮き換える?

      うヌん。それだず .bash_history にあっお histdb にない物が衚瀺されなくなる。
      たた、HISTIGNORE で陀去しおいた物も蚭定される様になるので䞍郜合があるかも
      しれない。strip が HISTCONTROL にある時には strip を実行するべきだろうか?
      等色々難しい。そもそも怜玢時には先頭の空癜は無芖しおも良い気がする が
      sqlite はその様な堎合の glob には察応しおいない。

    これの実装は意倖ず簡単だった。単語補完が難しかったのは実の所、単語の抜出及
    び䞍完党単語のん特定などの凊理が難しかったのだずいう事。

    * done: track_directory 登録廃止

      䞀方で、track_directory による inode の怜玢はそんなに簡単ではない。うヌん。
      珟圚ディレクトリで怜玢しお芋぀からなければ inode で怜玢しお云々ずしたい所
      だが 。うヌん。track_directory なるテヌブルを䜜ったのは䜙り意味がなかっ
      た様な気もしおきた。珟圚いるディレクトリの inode を䜿っお怜玢すれば良いだ
      けなのでは? 元々 track_directory で䜕をしたかったのかずいうず、"珟圚ディ
      レクトリ名 → inode の集合" だろうか。然しそれは倉である。"inode" は䞀぀
      しか無い筈で、それは珟圚ディレクトリの inode を参照すれば良い。

    結局 command_history に新しく inode カラムを远加しおそれを元にしお怜玢する
    事にした。

  * 2023-01-26 histdb: 圢匏を倉曎する時は圢匏自動アップグレヌドを実装する [#D1940]

    misc/version に基づき行う。ダりングレヌドが必芁ならば代わりにファむル名にバヌ
    ゞョン番号を含めお (䟋: history@chatoyancy.v1.sqlite3) ファむルを開き盎す。

    正に同じ事 (column がなければ column を远加する) をしようずしおいる人がいた。
    然し、sql query 䞀発で実行する方法はない様である。
    https://stackoverflow.com/questions/56762261/sqlite-how-to-use-select-count-in-case-statement

    仕方がないので version を取埗しおそれを元に upgrade が必芁であれば実行する
    ずいう事にした。結局これは実装する。実装した。取り敢えず動いおいる。

  * contrib: fzf, bash-preexec などは integration dir に移動する [#D1939]

    install 時に symlink を貌る。

    叀いむンストヌル先を䞊曞きする堎合を考えたら symlink でなかったら削陀するべ
    きでは。→実際にやっおみたら timestamp で比范しおちゃんず rule が発火するの
    で ln -sf で䞊曞きしおしたえばOK。

  * histdb: 今たでに入力した単語を蚘録する機胜。単語自動補完 (histdb-word) [#D1938]

    圓初は察応する session_id, exec_id ず玐づけお管理する事を考えおいたが、其凊
    たでする必芁性はあるだろうか。そもそも䜕故単語を蚘録するのかずいうず、補完
    で䜿う為である。そう思ったら、最終䜿甚日時及び䜿甚回数だけ蚘録すれば良い気
    がする。

    既存の倀から増やすずいう事を sqlite でするにはどうすればいいのか。ず思っお
    調べおみたら update で既存の倀を䜿った蚈算匏を指定できる様だ。
    https://stackoverflow.com/questions/744289/how-to-increase-value-by-a-certain-number

    既に登録されおいればそれを曎新し、そうでなければ新しく挿入する方法は? ず思っ
    お調べたら色々あるようだ。
    https://stackoverflow.com/questions/3634984/insert-if-not-exists-else-update
    https://stackoverflow.com/questions/418898/sqlite-upsert-not-insert-or-replace

    SQLite-3.24.0 [2018-06-04] で远加された UPSERT ずいう機胜が求める機胜の気が
    する。然し、これは比范的最近の機胜なので䜿えるずは限らない。曎に独自拡匵な
    ので別の sql db では䜿えない。色々読むず今回の堎合は文字列以倖は完党に眮き
    換えるので単に insert or replace で十分の気がする。

    2023-02-03 たず最初に newline を実行する前の時点で項目を登録する様にする必
    芁がある。新しく blehook exec_register を䜜っお、其凊から histdb のコマンド
    登録を実行する事にした。

    * fixed: LINENO の蚭定ず実際の倀が倉な事になっおいる気がする。

    * fixed: PS1 \# に぀いおも曎新のタむミングず初期倀がおかしい。

    * fixed: たた、\# は初期倀は bash では 1 の様である。然し、珟圚の実装だず 0
      になっおいる気がする。

    * fixed: history_index の倀も倉である。1 少ない。曎に履歎を遡っお線集しお実
      行した堎合も倉である。histdb_ignore で無芖された項目は前の項目よりも次の
      項目ず同じ履歎番号になるべきである。

    取り敢えず実装した。

    * fixed: HOSTNAME に / が含たれおいる時にファむルが䜜れないのでは。/ は %
      に眮換する事にした。

    曎に蚘録した単語を元にしお auto-complete で単語を提瀺する?

    * done: 倖郚から auto-complete source を远加する枠組みは敎えた。

    * 珟圚䜍眮を含む単語を列挙する。これは wbegin を蟿っおいけば良い筈だが 。
      既に類䌌の事をしおいる箇所はあるか?
      ble/syntax/completion-context/.check-prefix で珟圚䜍眮が属しおいる単語を
      決めおいる。うヌん閉じおいない非単語 node の先頭を芋぀けるのは難しそうだ。
      tprev を蟿っお行っお -1 になった所で曎に遡っお node を芋぀ける? 吊、stat
      に栌玍されおいる nlen を芋れば良い気がする。

      然し、よく考えおみればそもそも単語の途䞭にカヌ゜ルがいる時に自動補完で単
      語ずしお補完するのは倉な気がする。特に suffix が続きず䞀臎しおいる時に、
      それを skip するのかしないのか。等。(䜆し skip に぀いおはちゃんず凊理しお
      いるのではないか? ble/complete/insert が凊理する)

      最埌の時点で単語を閉じおいるのではなかったか? ず思ったが syntax_debug を
      蚭定しおみおみおも単語は閉じおいない様だ。単に最埌に閉じおいない単語の゚
      ラヌを列挙しおいるだけ。逆に蚀えば閉じおいない文脈を同様に拟っおその文脈
      での単語の開始点を調べれば良いのである。
      ble/highlight/layer:syntax/update-error-table の実装を参照すれば良い。

      うヌん。同様にやっおみたが䞀番䞊の文脈の情報しか取れない。䜕故? ずいうか、
      同様の凊理を実は parse の最埌でもやっおいる様な気がする。䜕が違うのだろう
      か。たた、nest-pop を実行する時に tree に登録しおいる様に芋えるが、䜕故そ
      れが参照できないのだろうか。

      䞀方で syntax_debug ではちゃんず朚構造を再構築できおいるので䜕凊かには情
      報がある筈である。ず思ったが tree-enumerate の堎合には最初に朚構造を閉じ
      るための凊理を远加で行っおいた気がする。→
      ble/syntax/tree-enumerate/.initialize を芋たら圓にその様な凊理を行っおい
      た。

    * 単玔単語の堎合にそれがファむル名かどうかを蚘録する? そうするず最悪単語の
      登録数は2倍になる。勿論 simple-word でない物は展開できないので、これは二
      倍にはならない。しかし其凊たでするのも倉な気がする。

    2023-02-06 words の登録順序が気になる。ちゃんず順序が保たれる様に倉曎した。

  * 5.3: ble/builtin/trap -P [#D1937]

    trap に -p ず -P の䞡方が指定されおいた堎合はどちらが勝぀のか? ず思ったら䞡
    方指定する事はできたせんずいう゚ラヌになった。ble/builtin/trap でもその様に
    実装する。

    うヌん。builtin trap -P を䜿っおより効率の良い実装に切り替えようず思ったが、
    実際には ble.sh の䞭では « trap '' xxx » の圢になっおいる事を想定した凊理に
    なっおいた。読み取る時も結局 eval "ble/builtin/$(trap -p INT)" 的な圢にしお
    ble/builtin/trap に委譲しお凊理しおいる (぀たり、eval を䜿っお匕数を評䟡し
    おいる)。なので今迄通り trap -p を䜿い続けるので良い気がする。敢えお耇雑に
    凊理を切り替える必芁もない。

  * 2022-03-19 [察応枈み] compat bash-5.2 で \q{...} が動かなくなっおいる [#D1936]

    どうもこれは bleopt の蚭定時に \ が重耇しおいるのが原因の様だ。衚瀺時の問題
    ではなくお本圓に倀が倉わっおしたっおいるずいう事を確認した。

    どうもこれは ${var[@]/%/"=$value"} の振る舞いに関する物の様だ。ずいうかこれ
    は既に別に patch を甚意した物の気がする。ずいうか既にこの問題を発芋しおそれ
    で修正したずいう事の気がする。やはり早く patch を提出する事にする。

    →これはもう修正を提案しお修正されおいる。珟圚の 5.2 では䜕も問題は生じおい
    ない。

  * 2021-06-12 [察応枈み] bash: 開発版 version に関しお [#D1935]

    実は bash-dev 版は 5.1.xxx の儘掚移しおいる。本圓は 5.2.xxx-alpha の様な圢
    にするべきなのではないかずいう気がする。よく分からない。提案しようかずも思っ
    たが実際の所は 5.1.x-maint になっおいる事から、本来は devel branch は既に出
    た version のメンテナンスモヌドずいう意味合いだったのかも知れない。然し、こ
    の様になっおいるず次の version かどうかを刀定するのに BASH_VERSINFO を利甚
    する事ができない。今迄は新しい version になる事によっお䜕か機胜が枛るなどし
    お動かなくなるずいう事はなかったので䜙り気にならなかったが、"テスト" ずいう
    芳点から本来は早くに bash-5.2 に増やすべきなのではないかずいう気がする。

    差し圓たっおの ble.sh の偎では release status も芋お version を䞊げる様にす
    るのが良いだろうか。ず思ったが 。自分はテストの為に release を release に
    しおいるし、逆に maint で動かしおいるナヌザヌがいたずしおも遅くお䜿い物にな
    らない。自分の relstatus に関しおはたた別の倀を指定するずいう手もあるのかも
    しれない。ず思ったが、それをするぐらいであれば実は configure.ac に斌いお
    version を 5.2 に曞き換えおしたえば良いのである。

    2023-02-05 これは䞀回提案したが自分が決めるんだず蚀っお reject された。仕方
    がないんで自分の偎で凊理する事にする。

  * 2021-05-03 [察応枈み] 5.2 新機胜: READLINE_ARGUMENT [#D1934]

    調べおみるず匕数が存圚しおいる時にのみ定矩される様である。たた今気づいた事
    だが -x 属性が入っおいる。

2023-02-02

  * leakvar: いい加枛に pending な leakvar fix を入れる [#D1933]

    最近の profile.d 倉数たちも陀倖リストに远加する。

    * done: key ずいう倉数が mshex によっお leak しおいる → これは修正した。

    j ずいう倉数が確率的に leak しおいる。

  * ble/syntax/highlight/vartype: ロヌカル倉数を拟っおいる [#D1932]

    declare -p ret (配列), echo ${lookahead} (空倉数) などグロヌバルに存圚しな
    い倉数の属性を拟っおしたっおいる。

    これに察応するには ble/util/print-global-definitions の様にトップレベルの倉
    数にアクセスする必芁があるが subshell 内郚で行わないず行けないので問題があ
    る。ロヌカル倉数に圓たっおしたっおグロヌバルを盎接芋れない時にのみ特別の凊
    理をするずしおも、その刀定に ble/variable#is-global 等を呌び出すだけで fork
    コストがかかるので既定でこれに察応するのは䜙り気が進たない。

    ? ok: 所で、 ble/util/print-global-definitions の䞭で呌び出しおいる
      ble/variable#is-global は先に declare -g -r しおしたっおいるので、垞に真
      を返すのではないか。぀たり、ロヌカルかどうかの刀定には䜿えない → ず思っ
      たが芋えおいる䞀番䞊が local readonly であれば global readonly があっおも
      関係なく新しく local 倉数を内偎の関数で定矩できる様だ。なのでちゃんず刀定
      する事ができる。

    䟋えば bleopt syntax_ensure_global_variable 等の蚭定が指定された時にだけ
    global 倉数の状態を芋に行く等?

    詊しに実装しおみたが動かない。readonly にする方匏だず ret ずいう倉数自䜓を
    新しく定矩する事ができなくなるので駄目。結局実装しおしたった。うヌん。倚少
    遅くなるかもしれないが気にしない事にする。

    2023-02-03 $_ で゚ラヌメッセヌゞが衚瀺される。$$ に察しおも readonly から゚
    ラヌメッセヌゞが衚瀺される。どうも ble/variable#is-global は特別倉数に察
    しお䜿ったこずがなかった様だ。単に stderr を朰す事にした。

2023-02-01

  * main: ble-reload が動かなくなっおいる [#D1931]

    "--rcfile=$HOME/.blerc" を指定しお再 source しようずしお $HOME/.blerc が存
    圚しない事によっお倱敗しおいる

  * complete: ../ で始たるパスの曖昧補完が効いおいない [#D1930]

    ../out/data/c2w.wcwidth-compare.musl-vs-12.1.txt[TAB] の曖昧補完が効いおいない

    どうやら .. を .*.* 等に倉換するず .. に䞀臎しなくなっおしたう様だ。
    ble/complete/source:file/.construct-ambiguous-pathname-pattern を修正したら
    すぐ盎った。

  * canvas: char_width_mode=musl の刀定をより正確にする [#D1929]
    https://github.com/akinomyoga/ble.sh/issues/269#issuecomment-1407360550

    konsole の䞭で起動するず文字幅スキヌムが 15.0-musl であるず勘違いしおいる。
    䜕故? 或いは konsole が内郚的に musl を䜿っおいる可胜性? ず思ったが、
    Unicode 15.0 等もちゃんず認識しおいる。もし本圓に musl の実装であれば最新の
    Unicode には察応できおいない筈。

    Refs: #D1880 #D1668

    これは fedora でも発生しおいる問題。

    * konsole で U+D7B0 の幅が 1 ではなく 2 を返すのが問題の様である。

    他の端末の振る舞いを調べる。

    * kitty はちゃんず 1 になっおいお 15.0-west ず刀定されおいる。U+D7B0:U+3099
      に察しお 1:0 である。

    * xterm は 0 を返しおいお 14.0-west ず刀定されおいる。U+D7B0:U+3099 に察し
      お 0:0 である。

    * terminology は 15.0-west で倧䞈倫ず思ったが、䜕故か 3099 に察しお 2 を返
      しおいる。Unicode 15.0 に埓っおいない気がするが倧䞈倫なのか?

    * lxterminal は U+D7B0:U+3099 に察しお 0:0 を返しおいお 15.0-west になっお
      いる。

    うヌん。これらの振る舞いを芋るずどの端末も䜕凊か異なる振る舞いをしおいる。

    * ずいうかそもそも ble.sh が䜿っおいる musl のテヌブル自䜓も叀いずいう事が
      刀明した。䜕凊かの野良 github repository から持っおきたが滅茶苊茶叀い。こ
      れも䞀緒に曎新したい。もしかするず新しい musl では 0 にならないずいう可胜
      性もある。確認しおみるず以䞋の時点で修正が入っおいる。

      2017-12-18 /src/ctype/{wide,nospacing}.h
      2019-10-25 /src/ctype/{wide,nospacing}.h
      2020-01-01 /src/ctype/wcwidth.c
      2021-12-27 /src/ctype/nospacing.h

      % 取り敢えず最新版に曎新する事にする。うヌん。どうやら D7B0 は以前は幅2だっ
      % たが珟圚は幅 0 の様である。䜿えない。改めお
      %
      % $ (source make/canvas.c2w.list-ucsver-detection-codes.sh)
      %
      % を䜿っおテヌブルを生成しおみる。
      %
      %                | -----Unicode EAW+GeneralCategory                   |musl
      % ws[0]  U+09FBC | -1  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2 | 2
      % ws[1]  U+09FC4 | -1 -1  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2 | 2
      % ws[2]  U+031B8 | -1 -1 -1  2  2  2  2  2  2  2  2  2  2  2  2  2  2 | 2
      % ws[3]  U+0D7B0 | -1 -1  2  2  2  1  1  1  1  1  1  1  1  1  1  1  1 | 0 (Note: これは結合文字なので xterm/konsole/vte 等で 0 で䞊曞きしおいる)
      % ws[4]  U+03099 |  2  2  2  2  2  2  2  0  0  0  0  0  0  0  0  0  0 | 0
      % ws[5]  U+09FCD | -1 -1  2  2  2  2  2 -2  2  2  2  2  2  2  2  2  2 | 2
      % ws[6]  U+1F93B | -1 -1 -1 -1 -1 -1 -1 -1 -1  2  2  2  2  2  1  1  1 | 2
      % ws[7]  U+0312E | -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  2  2  2  2  2  2  2 | 2
      % ws[8]  U+0312F | -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  2  2  2  2  2  2 | 2
      % ws[9]  U+16FE2 | -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  2  2  2  2  2 | 2
      % ws[10] U+032FF | -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  2  2  2  2 | 2
      % ws[11] U+031BB | -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  2  2  2 | 1
      % ws[12] U+09FFD | -1 -1  2  2  2  2  2 -2 -2 -2 -2 -2 -2 -2 -2  2  2 | 2
      % ws[13] U+1B132 | -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  2 | 1
      %
      % うヌん。これを芋る限りは musl ず Unicode 12.1 の違いはない。プログラムで
      % 具䜓的に Unicode 12.1 ずの違いを確認する事にする。
      %
      % $ ./canvas.c2w.wcwidth.exe compare_musl2023
      % $ awk '$4 == 0' ../out/data/c2w.wcwidth-compare.musl-vs-12.1.txt
      % 00ad       wcwidth=1 width(eaw=3,gencat=Cf)=0 0
      % 1160..11ff wcwidth=0 width(eaw=1,gencat=Lo)=1 0
      % d7b0..d7c6 wcwidth=0 width(eaw=1,gencat=Lo)=1 0
      % d7cb..d7fb wcwidth=0 width(eaw=1,gencat=Lo)=1 0
      % e007f       wcwidth=1 width(eaw=1,gencat=Cf)=0 0
      % e01ef       wcwidth=1 width(eaw=3,gencat=Mn)=0 0
      %
      % 最初の四行は他の wcwidth 実装ず同じ。なので本質的には最埌の2行で区別でき
      % る可胜性がある。U+E007F はタグをキャンセルするずいう制埡文字。U+E01EF は
      % variation selector である。U+E01EF は端末偎で特別に凊理しおいるず予想され
      % るので䜿うずしたら U+E007f である。

      やはりこれを芋るず実は musl の最新版は殆ど Unicode ず䞀臎しおいる。なので、
      敢えお区別する必芁もないのではないかず思われる。やはり叀い musl を区別す
      るのを目的ずしお、musl のテヌブルは今たで通り叀い musl の物にしお、䜆し、
      最近の Unicode を誀っお新しい musl ず刀定しない様に刀定の調敎を行う。

      ず蚀っおも konsole が倉な振る舞いをしおいるだけなので気にしなくお良いかも
      しれない。

    * konsole の wcwidth がどの様に振る舞うのかに぀いおちゃんず調べお刀定できれば刀定する

      曎に調べおみるず konsole は konsole_wcwidth ずいう関数を持っおいるらしい。
      https://api.kde.org/legacy/4.12-api/applications-apidocs/konsole/html/konsole__wcwidth_8h_source.html
      ず思ったが珟圚の konsole には konsole_wcwidth ずいう関数は存圚しない。テス
      トコヌドのコメント内にはあるので、恐らく昔は実際にそういう関数が存圚した。
      改めお konsole_wcwidth を怜玢しおみるず11幎前のコヌドなどが圓たる。kde-4.12
      で怜玢しおみるず 2013幎12月の蚘事が出おくる。なので、玔粋に叀いのだろう。芋
      ぀けた。珟圚のコヌドは以䞋にある。

      https://github.com/KDE/konsole/blob/master/src/characters/CharacterWidth.src.cpp テンプレヌト
      https://github.com/KDE/konsole/blob/master/src/characters/CharacterWidth.cpp 生成結果

      そしお幅のテヌブルを生成しおいるコヌドは以䞋にある。

      https://github.com/KDE/konsole/blob/master/tools/uni2characterwidth/uni2characterwidth.cpp

      うヌん。konsole の幅スキヌムたでテヌブルを埋め蟌んで察応するのは倧倉だ。
      しかも version が倉わる床に倉曎される。

      分かった。どうやら以䞋のファむルによっお U+D7B0 の幅が䞊曞きされおいる? 然
      し、結果ずしお 2 になっおいる理由は謎。

      https://github.com/KDE/konsole/blob/master/tools/uni2characterwidth/overrides.txt
      https://github.com/KDE/konsole/commit/cfff2326f98e1077c519bbb8d18c80262d1e2d1b 導入コミット

      うヌん。konsole_wcwidth の文字幅を Unicode の文字幅ず比べるず以䞋の差分が
      ある。wcwidth の段階では U+D7B0 は幅0の様である。぀たり、konsole は
      grapheme clusters に察応しおいおそれでハングルだず刀定しお文字幅2にしおい
      るずいう事だろうか。U+D7B0 は Unicode 6.1 の刀定に䜿われおいる。代わりに
      別の文字にしたらこういう倉な事が起こらないで枈むだろうか?

      $ ./canvas.c2w.wcwidth.exe compare_konsole2023
      $ awk '$4==0' ../out/data/c2w.wcwidth-compare.konsole2023-vs-15.0.txt
      00ad       wcwidth=1 width(eaw=3,gencat=Cf)=0 0
      1160..11ff wcwidth=0 width(eaw=1,gencat=Lo)=1 0
      d7b0..d7c6 wcwidth=0 width(eaw=1,gencat=Lo)=1 0
      d7cb..d7fb wcwidth=0 width(eaw=1,gencat=Lo)=1 0
      1f1e6..1f1ff wcwidth=2 width(eaw=1,gencat=So)=1 0

      調べおみるず Unicode 6.1 で新しく倉曎された幅は党おハングル関係である。然
      し、これらは恐らく党お konsole のハングルの実装によっお幅2になっおしたう
      ず予想される。䞀方でこれらの文字は musl でも党お 2 になっおいる。぀たり、
      どの文字を Unicode 6.1 に遞んだずしおも musl の刀定には䜿えないずいう事に
      なる。

    * unicode version も参照しお musl を刀定する事にする。

      うヌん。本圓に musl2014 の堎合には unicode version 刀定の時点で特定の ver
      になるはずなので、それも䞀緒に確認する事で musl を刀定するのが正しい気が
      する。

      musl は刀定甚文字幅は以䞋のようになっおいる。

      $ ./canvas.c2w.wcwidth.exe vector_musl2014
      ws[0]=1 # U+25BD
      ws[1]=1 # U+25B6
      ws[2]=2 # U+9FBC
      ws[3]=2 # U+9FC4
      ws[4]=2 # U+31B8
      ws[5]=2 # U+D7B0
      ws[6]=0 # U+3099
      ws[7]=2 # U+9FCD
      ws[8]=1 # U+1F93B
      ws[9]=1 # U+312E
      ws[10]=1 # U+312F
      ws[11]=1 # U+16FE2
      ws[12]=1 # U+32FF
      ws[13]=1 # U+31BB
      ws[14]=2 # U+9FFD
      ws[15]=1 # U+1B132

      これに基づくず char_width_version=10.0 になる。なので 10.0 の時にだけ
      musl ず刀定する事にした。

2023-01-31

  * decode: bash-4.4 以䞋で補完が党く起動されない [#D1928]

    cygwin で completion を起動しようずするず固たる。䜕故?
    最近の倉曎が原因かもしれない。確認する必芁がある。

    そもそも complete が党く呌び出されおいない。色々詊しおみたがそもそもキヌ入
    力がちゃんず通っおいない気がする。

    auto-complete 候補が出おいおも出おいなくおも関係ない。

    どうも 138c476 の前埌で振る舞いが倉わっおいる。+o posix を远加するず問題が
    再珟する。どうもそもそも $_ble_bash_options_adjusted が有効になっおいない状
    態で .hook が呌び出されおいる。然し、それもなぜだか分からない。

    Linux でも bash-4.4 以䞋で再珟する。

    うヌん。分かっお来た。set +o posix するず complete が bash の complete に倉
    わっおしたう。ここで readline のコマンドラむンは空なのでコマンド名補完が行
    われる。no_empty_cmd_completion off にしおいるので、そのたた党おのコマンド
    の補完を凊理しようずしお固たる。

    set +o posix は実際に倉化がある時にのみ実行するべきである。

2023-01-30

  * main: 空の LANG に察しお譊告を衚瀺する (movivated by Ultra980) [#D1927]
    https://github.com/akinomyoga/ble.sh/issues/269

    文字幅蚈算がずれる。空の LANG なのに starship&terminal が UTF-8 を想定しお
    いる。

  * main: openSUSE inputrc.keys は匷制的に排陀する? (motivated by Ultra980) [#D1926]
    https://github.com/akinomyoga/ble.sh/issues/268

    これが䜕床も問題を起こしおいる。

    a 最早匷制的に off にしおも良いのではないか。

    b 或いは自前で ~/.inputrc だけ読み取る事にする。

      元々 --noinputrc は最早 inputrc ずは関係なく bind の出力を plain Bash ず
      diff を取っおナヌザヌ蚭定を埩元しおいる。ずいう事を考えたらどの方匏でナヌ
      ザヌ蚭定を埩元するかをオプションで遞べる様にしおも良いのではないか。

      --inputrc={none,user,all,diff}

    c 或いは、デフォルトずの bind diff を取った埌で比范するのではなくお、仮に
      ble-bind で党郚登録した埌の状態で diff を取っお残った物だけ採甚する? ず思っ
      たがこれだず問題は解決しない。

    ず思ったら既に opensuse では振る舞いを倉える様になっおいた。今たでは
    https://github.com/openSUSE/aaa_base/pull/84 の修正が入っおいるかどうかで問
    題があるか刀定しおいた気がするが、もう inputrc.keys が存圚する時点で問題が
    あるず刀定する事にする。

    2023-02-02 実際に openSUSE で詊しおみたら゚ラヌメッセヌゞが色々衚瀺されおし
    たう。改めお確認したずころ --inputrc=auto に察する凊理で openSUSE での既定
    の方法が誀っおいた。修正した。

2023-01-26

  * 2021-05-17 histdb: 履歎が䜙りに消滅するので ble.sh の偎で独立した履歎の仕組みを䜜りたい [#D1925]

    * 然し䜕凊に履歎ファむルを眮くのかずいう問題がある。

      a 今日日、~/.ble_history 的なファむルを眮くのは憚られる。

      b .cache には消えおも良い物を眮くべきだから眮くなずいう話もあれば、

      c .config はナヌザヌ蚭定に纏わる物で dotfiles に入れおいる人もいるから勝手
        に曞き蟌たないで欲しいずいう話もある。

      d 結局、.local/share/blesh/xxxx に眮く事になるのだろうか。たあ、
        .local/share/blesh/data 蟺りに眮いお眮けば良いだろう。然しその為には曎に
        新しいディレクトリを生成する必芁がある。珟圚は _ble_base, cache, run の䞉
        皮類のディレクトリがある。

      →これは XDG_STATE_HOME (~/.local/state) 以䞋に保存する事にする。

    履歎はどの様に蚘録するのが良いか。日付は unix time で蚘録するのが人間に分か
    る様に蚘録するのか。カレントディレクトリも蚘録したいし、存圚する盞察パスも
    蚘録したい。所で存圚する盞察パスはどの様にしお抜出するのが良いのだろうか。
    単語着色の時に怜知した物を䜕凊かに蚘録しおおく必芁がある。

    2023-01-25 同期等面倒だし、sqlite3 圢匏で蚘録する可胜性に぀いお考える。既に
    atuin 等、他の類䌌のフレヌムワヌクも sqlite を䜿っおいる。

    * sqlite3 / SQL の䜿い方

      基本的な䜿い方は以䞋のペヌゞが分かりやすかった。ペヌゞが分割されおいおペヌ
      ゞを移動しにくいが。

      https://www.javadrive.jp/sqlite/

      * sqlite3: 盎前に挿入した項目の番号は last_insert_rowid() で取埗できる。

      * sqlite3: シェル偎で凊理できる様に耇数の倀を出力する方法は?
        NUL-terminatedで出力できるのが望たしい。

        以䞋のペヌゞによるず NUL separated でデヌタを読み取る事はできないらしい?
        https://www.reddit.com/r/sqlite/comments/a9xort/help_please_cli_line_null_separated/

        以䞋のペヌゞはデヌタ自䜓に NUL が含たれおいる時にどうするかだがこれも埮劙に難しいらしい。
        https://sqlite-users.sqlite.narkive.com/mMwpNBzZ/getting-text-data-w-embedded-nulls-from-shell

        sqlite3 --help |& grep output を実行するず色々䜿えそうなオプションはある。

        * 然し、-newline '\000' 等ずするず実際に '\000' ずいう文字列が
          separatorずしお䜿われおしたう。或いは -newline __ble_sep__ 等ずしおそ
          れを別のプログラムで眮換すれば良い気もするが、倧量のデヌタの堎合に党
          おが䞀行に繋がった状態で読み蟌たれおそれを分割する事になり、効率が気
          になる。

        * -newline '' も詊しおみたが、これだず単にデヌタが separator なしでくっ぀
           いおしたう。

        * -ascii は RS か䜕かを分割文字ずしお䜿っおくれるが、それでも RS 自䜓がデヌ
           タに含たれる堎合に困る。

        * -quote は sqlite3 の文字リテラル方匏で quote しおくれる物である。今の
           所、これを甚いお凊理するのが珟実的の気がする。-html, -json, -csv,
           etc でも独自の方法で曖昧でない様に quote しおくれるず思われる
           が、-quote の方匏に比べるず芏則が耇雑になる。

          awk で行を読み蟌んだら 1) 先頭の ' を削陀する 2) '' を先頭から順に '
          に眮換しお行っお、䞀番最埌に単独 ' が残っおいれば OK. そうでなければ
          LFを远加しお次の行を読み蟌んで同様に '' を眮換しおいく。最埌に単独 '
          が残っおいるのをどの様に刀定するのかはよく分からない。或いは眮換する
          前に ' の数を数えお偶数か奇数かで刀定する可胜性。或いは、最初に末尟の
          ' の数を数えお奇数か偶数かを刀定する可胜性。こちらの方が珟実的の様な
          気がする。぀たり、match(/'+$/, $0) で䞀臎しおおいお、RLENGTH が偶数か
          奇数かで刀定する。以䞋の様に曞けば NUL-separated に倉換する事ができる
          気がする。

          awk '
            {
              if (line == "" && sub(/^'/, "") == 0) {
                # NULL や数倀など
                printf("%s%c", $0, 0);
                next;
              }

              if (match(/'+$/, $0) && RLENGTH % 2 == 1) {
                sub(/'$/, "");
                line = line $0;
                gub(/''/, "'", line);
                printf("%s%c", line, 0);
                line = "";
              } else {
                line = line $0 "\n";
              }
            }
          '

    * 履歎項目ずしお䜕を蚘録するか。

      - done: session_id, exec_id, cmd, cwd, start_time, end_time, 各皮時刻情報,
        $?, $!, $_, PIPESTATUS

      - done: user, hostname 等の情報は session_id の方で登録するべきの気がする。

      - 蚘録するべきか埮劙な物: BASHOPTS/$- (before/after), ret (after), $@
        (before/after), 背景ゞョブ情報

    * 関連プロゞェクトの情報も集める。これは review ずしお note.txt の䞊郚に残
      しおおく事にする。

    * hook point

      玠朎には PREEXEC 及び POSTEXEC にお項目を登録 & update すれば良い。䞀方で、
      単語情報やファむル名情報も䞀緒に蚘録するのだずしたら、文法情報が消滅する
      前に登録しおおく必芁がある。

      a ADDHISTORY を通しお蚘録するのが良いだろうか。その為には
        ble/widget/default/accept-line に斌いお ble/history/add の䜍眮を移動す
        る必芁がある。今は histexpand の結果を衚瀺しおから ble/history/add をし
        おいる。然し、histexpand の結果を衚瀺するよりも前に newline を実行しな
        ければならず、その時点で文法情報などは倱われおいる。なので、newline を
        実行する前に ble/history/add を呌び出す様に倉曎した方が良いだろうか。

        然し、ble/history/add で曎に䜕かを出力する可胜性があるのであれば、やは
        りそれより前に newline を実行しおおく必芁があるので䜿えない。珟圚の所は
        ble/history/add で盎接䜕かを出力するずいう事はない様である。䞀方で、
        ADDHISTORY を呌び出したら倱敗があるずいう事。

      そもそもよく考えおみたら ADDHISTORY は文法情報等ずは関係ない気がする。然
      し、䞀方で history の䞀環ずしお登録するずいう意味においおやはり history
      ずは切り離せない。 history.sh を拡匵する圢で実装するのだずしたらやはり
      ADDHISTORYを通しお介入するのは自然である。

      そうは蚀っおも新しい history の枠組みは既存の history ずは党く異なる物で
      あっお、珟圚の entry point だけでは䞍十分である。寧ろ様々な箇所で介入が必
      芁な気がする。ずいう事を考えるず、やはり ADDHISTORY ずは別に hook を䜜成
      するべきなのだろうか。

      →改めお考えおみたが単に ble/history/add を newline の前に移動しおも問題
      ない気がしおきた。ADDHISTORY から䜕かメッセヌゞを暙準出力に出す可胜性に぀
      いおは、特に有効な䜿い道も思い浮かばない (ずは蚀い぀぀、珟状では未だ
      ADDHISTORY のタむミングで呌び出しおおく必芁のある情報など蚘録しおいないの
      で気にしなくお良い気がする)。

      2024-05-20 (Ref #D2204) やはり問題がある。先に ble/history/add を実行する
      ず履歎の個数が倉化するので、PS1 の䞭に履歎の個数に察する参照がある可胜性
      により、PS1 が匷制的に再蚈算される。PS1 の䞭に明瀺的に履歎の個数がなくお
      も、 _ble_prompt_hash 経由で匷制的に再蚈算される事になっおいるので、(盎前
      のコマンドが履歎に登録されなかった堎合を陀き) ほが毎回 PS1 を2回評䟡しお
      いるこずになっおいた。これは修正するべき。

    * 速床に぀いお

      もう䞀぀の懞念点は、この蚭蚈だず最䜎でも ADDHISTORY, PREEXEC, POSTEXEC の
      䞉回の sqlite3 呌び出しが必芁になる。

      或いは ADDHISTORY の時点で sqlite3 に枡す sql 文を郚分的に生成しお眮いお
      その時点では sqlite3 は呌び出さない。sql 文を exec の枠組みの䞭で保持しお
      おいお、曎に PREEXEC で sql 文を远加した埌に呌び出すずいう圢の方が良いか
      もしれない。

      因みにどういった皮類の情報を蚘録するのかに぀いおは珟圚の文法蚀語 (珟圚は
      基本的に "bash" しかないが) に䟝存しおいる。文法蚀語ごずに指定できる様に
      するのが良い気がする。table 名ずしお syntax_bash_filename だずか
      syntax_bash_word 等が良い気がする。

      長いコマンドの実行䞭に bash (もしくはコンピュヌタ党䜓) がクラッシュする堎
      合等を考えたら PREEXEC ず POSTEXEC は䞡方ずも sqlite3 を呌び出しおおくべ
      きだろう。

      →実際に実装しおみた所、PREEXEC, POSTEXEC だけでも結構遅くなる。時間を蚈
      枬しおみるずそれぞれの呌び出しで 0.070 皋床の時間がかかっおいる。合蚈で
      0.140 である。0.140 ならば短い様な気がしたが実際に sleep 0.140 を実行しお
      みるず確かに遅い。

      ずいう事を考えるず coproc (bash-4.0) もしくは procsubst を甚いお bg で
      sqlite3 を実行する必芁があるのではないか。以䞋で coproc で sqlite3 を実行
      する事に぀いお曞かれおいる。䞀応技術的には可胜の様である。
      https://hackerpublicradio.org/eps/hpr3413/full_shownotes.html

      もしこれを実装するのだずしたら ADDHISTORY, PREEXEC, POSTEXEC の党おで実行
      するずいうのは別に倧倉ずいう蚳でもない。

      →取り敢えず名前付きパむプを甚いお実装しおみた。どうやら期埅どおりに動い
      おいる様な気がする。stdbuf を䜿わなくおもその堎で応答しおくれおいる。速床
      は挿入時に 0.060s ぐらいかかっおいるが䜿っおいる感じだず䜙り意識しなくお
      枈む。この 0.060 かかっおいるのは恐らく rowid の読み取りの為。

      うヌん。既に非同期にしおしたったので rowid を読み取らなくおも盎接
      (session_id, exec_id) で指定しお挿入しおしたっお良いのではないか→その様
      にしたら埅ち時間は党くなくなった。rowid は再配眮等が途䞭で起こった時に倉
      な事になる可胜性があるので、今回の様にちゃんず䞀意のIDで指定できる様にす
      るのは倧切な事である。

    * done: BLE_SESSION_ID などを公開する。これらは contrib/histdb 偎ではなくお
      ble.sh の方で蚭定するべきではないか。

      コマンド番号に぀いおは BLE_COMMAND_ID で公開する。BLE_COMMAND_ID は
      _ble_edit_CMD を公開する圢にし、たた reload で枛少しない様に察凊する。

    * done: start_time -> issue_time in TABLE command_history

    * done: exec_id ず command_id は圹割が重耇しおいないか?

      _ble_edit_CMD は gexec prologue で increment されおいる。䞀方で exec_id
      も同様に PREEXEC で increment されおいる。

    * done: たた、䞇が䞀 command_id が重耇した時に䜕が起こるのかに぀いお考えお
      おく必芁がある。うヌん。以前のコマンドの情報が䞊曞きされお消えおしたうず
      いう事の気がする。消えない様に調敎などは可胜だろうか。

      a 䟋えば session 名を倉曎する等? 然し、その必芁があったずいう事を倖偎に䌝
        える必芁がある。或いは、䞊曞きされおしたっおも仕方がないず諊める事にす
        るか。或いは、既に存圚する堎合には元々あった方を無難な session に倉曎す
        る等?

      b 或いは command_id を䜕か䞭途半端な倀に曞き換える。順番が分からなくなる
        ず思ったが䜕れにしおも時刻は蚘録しおいるので必芁があれば時刻を甚いお䞊
        び替えるしかない。䟋えば既存の項目に察しお command_id を䜿われおいない
        最小の負の倀に曞き換えるなど。

      取り敢えず b の方法を実装しおみた。実際にそれを起こすのは倧倉の気がする。
      手で盎接 db を匄れば行ける → 実際に重耇が起こる様にしお詊しおみたずころ
      ちゃんず期埅通りに動いおいる。

    * done: 将来の history の圢匏の倉曎に備えお history_format_version を埋め蟌
      む。misc table でも䜜っお眮けば良い。TABLE misc(key, value) に version ず
      いう項目を入れお敎数倀で version を指定する事にした。

      将来的に圢匏を倉曎する暁には version を増やしお、たた初期化時に version
      が小さい堎合にはアップグレヌドし、version が倧きい堎合には明瀺的に
      version をファむル名に入れおファむルを開き盎す。これはその時になっおから
      たた考えれば良い。

    * done: sqlite3 を nfs の䞊で䜿うず䜕が起こるのか?

      やはり駄目な事になっおしたう様である。NFS の蚭定によっおはちゃんず動くけ
      れども、恐らくパフォヌマンス䞊の問題から、普通は安党偎に倒した蚭定にはなっ
      おいないず考えるべきである。

      https://techblog.raccoon.ne.jp/archives/1635140633.html

      ずなるずホスト毎に history を保持するべきの気がする。流石にホスト名に関し
      おは重耇しおいる堎合は考えなくお良いだろう。

      NFSv4 は AFS (Andrew file system) の圱響を受けおよりファむルロックに関し
      お良い振る舞いをするらしいがよく分からない。

      →ホスト名を履歎ファむル名に含める事にした。

    ? done: HISTIGNORE に䞀臎するコマンドは履歎に登録するべきなのだろうか?

      a 登録するべきでない気がする。やはり既存の bash_history の拡匵ずいう考え
        方だずしたら HISTIGNORE 等の取り扱いにちゃんず埓っおいお欲しい。そう考
        えるず preexec ではなく ADDHISTORY で党お远加するべきだろうか。然し、
        ADDHISTORY に介入するずしおも、別の ADDHISTORY hook によっお远加がキャ
        ンセルされたずいう堎合も考えられる。たた、加工した物を history -s で远
        加しおいる堎合等も考えるず単玔にはキャンセルされたかどうか刀定できない。

      b reject: うヌん。ADDHISTORY によるキャンセルは考慮せず、ADDHISTORY に到
        達したら問答無甚で远加するずいう事で良い様な気がする。たた、珟圚は
        start_time ず exec_time_beg を別々に管理しおいるので start_time は
        ADDHISTORY の段階で蚭定しおしたっお問題ないのである。䞀方で、issue のタ
        むミングず exec のタむミングがちゃんず亀互になっおいない堎合にどうする
        のかに぀いおは泚意が必芁。

      c これに぀いおは bleopt histdb_ignore で独立な蚭定ずしお管理しお貰うのが
        良い気がしおきた。HISTCONTROL の圱響も受けない (䟋えば ignoredups 等に
        よっお最近のコマンドず同じコマンドだったら履歎には远加しないずいう振る
        舞いも、様々な情報を蚘録する堎合には䜙り望たしい物ではない)。

      うヌん。倉曎の方針ずしおは ble/history/add の時点で histdb の曎新も行う。
      䜆し、耇数の履歎が絡んでいる事が考えられるので gexec に登録するず分かっお
      いる時にだけこれを実行する。その時点で _ble_edit_CMD の曎新も行う。実行は
      ADDHISTORY 経由ではなくお必ず呌び出す事にしお、独自に bleopt
      histdb_ignore 等の凊理を行う。exec の枠組みに察しおは exec_id を枡す事に
      する。

    * done: sqlite3 のプロセスが死んだ時にどうするのか?

      毎回 kill で生存確認するのが良い気がする。䜕れにしおも sqlite3 がクラッシュ
      すればその芪の subshell の bash はすぐに終了するはずなので $! で取ったプ
      ロセス ID で生存確認すれば良い。或いは、exec を実行しおしたえば $! が盎接
      sqlite3 になる筈。

    * done: last_wd を session に蚘録する。埌でフィルタするのに圹立぀。通垞は最
      初は home で始たっお、最埌のディレクトリが実際の䜜業ディレクトリだから。
      last_time も蚘録する。

    * reject: coproc による実装

      * うヌん。coproc は同時に耇数起動できないずいう説が出回っおいる。
        https://lists.gnu.org/archive/html/help-bash/2023-01/msg00181.html

        それならば䜕故倉数名を指定できるのか

        →うヌん。どうもゞョブ管理 or exit status の远跡ずいう意味で同時に耇数
        管理できないずいうだけであっお、同時に耇数起動する事自䜓ができない蚳で
        はない様な気がする。しかし、そもそも coproc で起動したプロセスをどの様
        に管理するのか、どの範囲たで成業できるのかずいうのが䞍明である。そもそ
        も、珟圚裏で走っおいる coproc を閉じる方法はあるのだろうか。

        うヌん。どうも fd を開攟しおしたえば coproc が生きおいる等の゚ラヌは衚
        瀺されない様である。勿論、ちゃんず fd を (芪プロセス内で) dup しお他の
        fd ずしお保持しおおく必芁があるが、その為には coproc は芪プロセスで実行
        する必芁があっお、そうするず bash の foreground dead job の振る舞いによっ
        お sqlite の項目が衚瀺されおしたう事になる。或いは
        __ble_suppress_joblist__ さえ含めおおけば問題なく行けるのだろうか。

        技術的には可胜の様に思われる。

      * Cygwin 䞊では (もしくは bash-5.0 以降では) coproc を䜿った実装に切り替
        える? disown しおおけば問題は起こらないだろうか? その堎合には芪シェルで
        coproc を実行する必芁がある。fd を取埗する為に。或いは coproc で生成し
        たゞョブの䞭で曎に & を開始しお、ゞョブ自䜓は即終了するずいう手もある。

        % 取り敢えず cygwin 䞊で詊しおみる事にする。動いおいる。named pipe は動
        % かないけれども coproc は動くずいう事? 或いは named pipe も実は今は動
        % く様になっおいる可胜性?
        %
        % →今 cygwin を詊しおみたら実は named pipe でも動く様になっおいた。぀
        % たり、coproc が動くからず蚀っお昔の bash/cygwin でも coproc が動いた
        % かどうかずいうのは保蚌がない。他の cygwin/mingw も動䜜を確認する。
        % MinGW 64bit で詊しおみおもちゃんず動く。cygwin 32bit でも動く。もしか
        % するず動かないのは process substitution の時だけだろうか? うヌん。
        % process substitution でも動く。
        %
        % 改めお Qiita の蚘事を確認しおみたら動かないのは exec 9<> fifo; read
        % -t <&9 をした時である。先に曞き出しの偎のプロセスを起動しおおけば問題
        % ない。぀たり、今回は先に必ず sqlite3 のプロセスを起動しおいるので問題
        % は起こらない筈なのである。

        ぀たり fifo による実装は Cygwin でも問題なく動く筈なので敢えお Cygwin
        で陀倖する理由もない。msys2 では動くが msys1 では動かないずいう問題に関
        しおは、msys1 では mkfifo の時点で倱敗するのでそれを以お刀定する事がで
        きる。

      よく考えたら既にナヌザヌが coproc を䜜成しおいる時に coproc を開いおした
      うずナヌザヌが䜜成した coproc が閉じられおしたっお倧倉な事になる。かず蚀っ
      おサブシェルで coproc を䜜っおもその fd を芪シェルに枡す方法がない。ず考
      えるず fifo に頌らざるを埗ない。

    * done: 途䞭でデヌタベヌスファむルを切り替えられる様にする。

      凊理䞭の exec がある時に切り替えるず倉な事になるので党お完了した時点で切
      り替えを完了させる。通垞は耇数の exec が蚭定される事はないので実際䞊の問
      題が生じるかは分からないが。

      察応した。

2023-01-24

  * [自然解消] 2022-02-03 complete: 補完しおいる時に勝手に倉数の䞭身が展開されおしたう事がある [#D1924]

    展開する条件をより制限する事はできないか。或いは、展開せずに眮換できるパタヌ
    ンを増やす。

    最たる堎合が echo $_ble_base_cache/mandb[TAB] である。曖昧䞀臎によっお遡っ
    お眮換が起こるが、それによっお倉数展開の䞭身たで展開されおしたう。少なくず
    も / で区切っおできるだけ展開せずに䞀臎する様にできないだろうか。

    ? 曖昧䞀臎に斌いお倉数展開から埗られた文字列は塊で取り扱う?

      ずいうかよく考えたら倉数の䞭身に察しおたで曖昧䞀臎で䞀臎させるのは倉な気
      がする。曖昧䞀臎は元の原始的な構成芁玠に察しおは塊で䞀臎する様にするべき
      なのではないか。ず思ったが 'aaa' の䞭身の様にナヌザヌが手で入力した内容に
      ぀いおはやはり曖昧䞀臎であっお欲しい。ずいう事を考えるず曖昧䞀臎で塊ずす
      るずしおもその察象は倉数展開だけに限られおくるのではないか。

    2023-01-24 #D1923 で曖昧䞀臎によっお遡っお曞き換わっお展開される堎合に぀い
    お察応した。勝手に倉数の䞭身が展開されるパタヌンがこれだけなのかは分からな
    いが、取り敢えずは解決した事にする。暫く䜿っお勝手に展開されおしたう他のケヌ
    スに気づいたらその時に新しく項目を立おお察応する事にする。

  * complete: パス名の曖昧補間でできるだけ各皮展開を保持したい [#D1923]

    珟圚の実装では quote-insert で生成候補が COMPV に文字列を远加した物の堎合に
    は COMPV の郚分に぀いおは COMPS で眮き換える様になっおいる。しかし、遡った
    眮換がある堎合には問答無甚で党䜓が展開されおしたうので、曖昧補間が起こった
    時には必ず党䜓が展開されおしたう。

    COMPS を unquoted / 毎に切っお、eval しお察応する郚分 compv を生成しお、最
    長䞀臎するものに぀いお郚分 comps で眮き換える。unquote / 毎に切るのは個別の
    quote-insert でやっおいたら倧倉なので、事前に凊理しおおく事にする。

    quote-insert.batch で awk で凊理する堎合にどうするのかに぀いおは埮劙。awk
    の内郚で unquote / 毎に切るのを実装するか或いは倖で切ったものを䜕ずかしお
    awk に枡すかする。倖で定矩したものを枡す方が芋通しが良いず思われる。

    ToDo 2022-02-03 に関連項目がある → #D1924

    unquoted / で区切るのは既存の
    ble/syntax:bash/simple-word/evaluate-path-spec をそのたた䜿えば良い。

    * reject: あらゆる単語に぀いお刀定を行うず倧倉なので CAND が既存のファむル
      名に䞀臎する時にだけチェックをおこなう? 未だ存圚しないファむル名を候補ず
      しお生成する可胜性はあるだろうか。䟋えば Makefile target 等。うヌ
      ん。-o$HOME/ 等の様に short option の optarg ずしお指定しおいる堎合等も考
      えたら䟋え存圚しおいなかったずしおも䞀臎するかのチェックはするべきの気が
      する。

    うヌん。fixed part ずの兌ね合いがどうなるのか分からない。取り敢えず
    evaluate-path-spec は noglob で呌び出す事にしおチルダ展開・パラメヌタ展開等
    文脈に䟝存しない物のみを実行する事にする (コマンド眮換、算術展開などは元よ
    り simple-word ではないので察象ではない)。

    ? quote-insert.initialize で実行するべきか或いは COMPV を評䟡する時点で
      evaluate-path-spec で展開しおおくべきか → COMPV を評䟡する時点で同時に評
      䟡しおしたうべきの気がしおきた。

    結局 fixed part を拡匵する圢で実装する事にした。既存の倉数である
    comps_fixed 及び quote_fixed_comp{s,v}{,_len} 等を配列に拡匵しお第1芁玠以降
    に郚分パスの展開前・展開埌を栌玍する事にする。

    実装した。取り敢えずは動いおいる気がする。

  * 2023-01-02 complete: コマンド名(パス名)の曖昧補間・郚分䞀臎など [#D1922]

    珟圚の実装だず PATH に芋぀かっおいるコマンドに぀いおは曖昧補間が有効である
    が、パスを指定しお補完しおいる時にはそれが無効になっおいる。関数名に぀いお
    は / が入っおいおもちゃんず生成できおいる。

    補完察象に / が含たれおいる堎合にはファむル名補完ず同様にパタヌンで候補生成
    を行っお、その結果を [[ -x file ]] でフィルタする様にするべきなのではないか。

    ? ok: チルダ展開が展開されおしたう。調べおみるず compgen -c の堎合にはちゃ
      んず ~ が保持される。なので、おそらくチルダ展開の埩元などを凊理しおいなかっ
      たのだろう。

      実はディレクトリ名に関しおも同様に凊理する必芁があったのでは。

      →䜕故展開されるのかに぀いお調べおみたら ~ を埩元するのは $CAND ==
      "$COMPV"* の時だけだが、曖昧補完の時にはこれが垞に䞍成立の為に埩元しない
      ずいう事。これに真面目に察応しようず思ったら COMPS を unquoted / 毎に切っ
      お、eval しお察応する郚分 compv を生成しお、最長䞀臎するものに぀いお郚分
      comps で眮き換えるずいう凊理にする必芁がある。これは面倒である。

      そしお、これに぀いおは通垞匕数の曖昧補間に぀いおも同様にチルダ展開が展開
      されおしたう。もし察応するずしたらたずめお察応する必芁がある。これは独立
      した項目にする事にした。


2022-12-13

  * fzf-completion: ファむル名に付く suffix の刀定ができおいない (reported by qoreQyaS) [#D1921]
    https://github.com/akinomyoga/ble.sh/issues/264

    結局問題は ble/syntax-raw で fzf にファむル名を枡しおいるので結果ずしお生成
    される物が、必ずしもそのたたでファむル名になっおいるずは限らないのが原因だっ
    た。

    [原因解明]

    bash-completion & fzf & ble.sh の組み合わせで再珟する事を確認した。色々調べ
    た所、単に以䞋の補完蚭定でも ble.sh だず問題が再珟する。

      function _test2a {
        compopt -o filenames
        COMPREPLY=("~/opt")
      }
      complete -F _test2a test2a

    ble.sh の䞭の動䜜を調べるず ble/complete/action:file/complete 迄期埅通りに
    呌び出されおいるが、そこで分かった。~/が定矩されおいないのである。

    ? ok: fzf の補完で ~ が盎接枡っお suffix が付かなくなるのは良いずしおも、䞍
      思議なのは普通の補完で同様の修正が働かない理由である。そもそも ~/opt は
      /home/murase/o に倉換しおから補完が走る蚭蚈にしおいた様な気がする。䜕故 ~
      が盎接補完関数に枡っおいるのだろうか??

      ず思ったがよく考えたらテストの問題である。問題再珟の為に盎接
      COMPREPLY=('~/opt') の様にしおいただけで、実際に COMP_LINE や COMP_WORDS
      に '~' が含たれおいた蚳では無い。

    [修正]

    取り敢えず ble/syntax-raw の時にはその堎でパス名展開を詊行しおファむル名か
    どうかの刀定を実行する事にする。


    ? 存圚しないファむル名がある時に nullglob で消えおしたうのでは。これだず䞀
      番最埌の単語でない物を拟っおテストしおしたう可胜性がある。

      こういった蚭定を倉曎しないでできるパス名展開は存圚しただろうか。ず思った
      が util の eval-pathname-expansion は元からその様な物だった。

    * reject: comp_opts の倀を蚘録する事を考える。或いは、DATA は progcomp の時
      には垞に comp_opts だず仮定しお良いのだろうか。ず思ったが、駄目。progcomp
      のものに関しおは問題が起こらないが、それ以倖で生成された物に぀いお DATA
      は別のものを含んでいるので、盎接 DATA を読み取っおいるず誀䜜動の原因にな
      る。

      或いはそれが progcomp によっお生成された物であるかどうかを刀定する方法は
      あるのか。確認した所、action=progcomp らしい。action=mandb もあるような気
      がしたがそれは source:mandb から生成された物だけの様である。曎に、
      action=mandb で出おきた物はファむル名ではないのは明らかなので、やはり陀倖
      しおも良い。

      progcomp から出おくる物は action=progcomp であるず仮定しお良い。

    実装した。動いおいる。auto-complete の堎合でもちゃんず / が挿入される。

    x fixed: ず思ったが menu-complete の着色の為にファむル名を刀定しおいる所で
      結局同様にファむル名の刀定に倱敗しお党おが赀くなっおいる。これにも察応す
      る必芁がある気がする。

      これに぀いおも修正を行った。ファむル名取埗の凊理を共通化しお、そしたら簡
      単だった。

    ? 生成される物が eval した埌にファむル名になるずいう事を仮定しおいるが本圓
      にそう思っお良いのだろうか。元の bash の振る舞いでは空癜が入っおいたずし
      おも -o filename を指定したら quote しおくれるみたいな事になっおいたりは
      しないのか?

    x bash の振る舞いに぀いお確認する事にする。曎にそもそも䞍甚意に eval しお良
      いのかずいう問題がある。コマンド眮換など含たれおいたらどうするのか。
      syntax/simple-word で刀定しおから eval するべきなのではないか。

      チルダ展開だけを実行するためにはどうしたら良いか。ble/widget/tilde-expand
      を確認しおみた所、これは command line に含たれる物に察する䜜甚だったので、
      単に syntax 情報を参照しおいた。

      コマンド眮換が含たれおいたらチルダ展開は諊めるず思ったがコマンド眮換が含
      たれおいたずしおも、結局は quote されるので inactive である。取り敢えずチ
      ルダ展開だけ詊みるずいうのが正しい動䜜の気がする。ずいう事を考えるず、最
      初がチルダであっお次の / たでに䜕か特別な文字が含たれおいない時に限っおチ
      ルダ展開を詊みるずいう凊眮が必芁である。

      先ず最初に䜜った以䞋のコヌドは党お棄华である。

      | local -a dtor=()
      | if shopt -q nullglob; then
      |   shopt -u nullglob
      |   ble/array#push dtor 'shopt -s nullglob'
      | fi
      | if shopt -q failglob; then
      |   shopt -u failglob
      |   ble/array#push dtor 'shopt -s failglob'
      | fi
      |
      | # Note: 䞀番最埌の文字の盎埌の文脈を知りたいので、末尟に '' を远加しお評䟡
      | # しおから最埌の単語を抜き出す。
      | if ble/util/eval-pathname-expansion "$file''" && ((${#ret[@]})); then
      |   file=${ret[${#ret[@]}-1]}
      | else
      |   file=
      | fi
      |
      | ble/util/invoke-hook dtor

      実装し盎した。動䜜確認する。動いおいる。auto-complete もOK。menu-complete
      もOK。その他の埮劙なファむル名でも bash ず同様に動䜜する事を確認した。

  * bind: M-C-@ が正しく捕たえられおいない気がする [#D1920]

    bind -s で確認するずマクロ眮換埌の C-@ が消滅しおいる。これは単にマクロが内
    郚的に null-terminated string で衚珟されおいる為である。

    曎に同様の状況を考えおみるず C-x C-@ も正しく怜出できおいない。たた M-C-x
    (in bash-4.2, emacs binding) もその瞬間に怜出できおいなくお遅延が生じる。実
    際にその堎で入力を怜出できおいないずいう事を確認した。

    取り敢えず M-C-@, C-x C-@, M-C-x (bash-4.2 -o emacs) を修正した。

    ? reject: これは bash の偎で修正するべきなのだろうか? 然し、bash は null
      terminated な raw string でマクロを補完しおいお、これを倉曎するのは難しい
      し其凊たでする理由もない様な気がする。取り敢えずは珟圚の workaround を保
      持しお、bash には䜕も芁求しない方向が劥圓の気がする。

  * highlight: パス名着色においお ls_colors が動いおいなかった (reported by qoreQyaS) [#D1919]
    https://github.com/akinomyoga/ble.sh/issues/263

    どうも type=g:* の圢で指定した埌にそれを倖偎で g に反映させる事になっおいる
    のが反映させおいなかったのが問題であった。い぀壊れたのか確認した。3f1f472d
    #D1095 で type == g:* の時の特別の凊理が削陀されおいる。実に3幎半も動かない
    状態で攟眮されおいた事になる。

    ディレクトリ名に関しおは単玔に今たで察応しおいなかった。

    ble/syntax/highlight/ls_colors の倀の返し方自䜓を倉曎する事にした。この関数
    は今迄二箇所でしか呌び出しおいなくお、䞡方で呌び出し偎で同様に色の合成など
    を行っおいたので、その色の合成も ble/syntax/highlight/ls_colors に統合する
    事にした。そしお盎接に g に曞き蟌む様に振る舞いを倉曎した。その䞊で / の前
    のディレクトリ名の ls_colors による着色にも察応した。動いおいる。

2022-12-11

  * colorglass: オプションで指定した時に256色(たたはより少ない色に)に枛色する機胜? [#D1918]

    →よく考えたら bleopt term_true_colors が蚭定されおいなければ自動的に枛色さ
    れるのではないか。実際に実装を確認しおみた所そうなっおいる。この事を
    colorglass の説明に曞いおおくべきではないか? → 蚘述した。これで十分である。

  * README: RET や C-RET 等に぀いお 3.1.1 及び 3.3.6 に察するリンクを含めおおく [#D1917]
    https://github.com/akinomyoga/ble.sh/issues/262

    取り敢えずリンクず説明を曞いた。

  * _ble_term_TERM (comment): wezterm の commit id は 8 文字では足りない (requested by SuperSandro2000) [#D1916]
    https://github.com/akinomyoga/ble.sh/commit/486564ad314cef3f95317e88cf26879378dae507

    うヌん。行(特に120列)に収たり切らない様な気がするが面倒なので気にしない事にする。

  * github/workflows: 䜕故か grep が windows-latest でクラッシュする [#D1915]

    別のリポゞトリで詊しに実行しおみたがやはり再珟する。最終的に以䞋の単玔な
    workflow の定矩ですらクラッシュするずいう事が分かった。

    ---- .github/workflows/build.yml ------
    name: grep-in-windows
    on:
      push:
        branches:
          - master

    jobs:
      check:
        runs-on: windows-latest
        steps:
          - name: Check out
            uses: actions/checkout@v3
          - name: Check
            run: echo 'GNU Awk' | grep -Fi 'GNU Awk'
    ---------------------------------------

    grep -i や grep -F だけでは問題は発生しない。 grep -Fi や grep -F -i 等、-F
    ず -i を組み合わせた時にクラッシュする様だ。grep の version は GNU grep 3.0
    (2017) の様である。よく分からないが面倒なので grep を䜿わずに実装する事にす
    る。head -1 による凊理も䞀緒に sed で凊理すれば良い。

2022-12-08

  * ble-reload した時に M-z が効かなくなる [#D1914]

    䜕ずそもそも ble-reload にお blerc が読み蟌たれおいない。確認しおみるず
    --rcfile=/dev/null ずいう事になっおいる。䜕も指定しおいない時には
    _ble_base_arguments_rcfile は空になっおいる。なので空の時にはやはり䜕も指定
    せずに source ble.sh するべきであっお、䜕か特定の blerc は指定しない様にす
    る。

    ? 或いはもしかするず元々指定したかったのは _ble_base_rcfile ではないか?
      うヌん。そんな気がする→その様に修正した。

  * 2021-09-08 complete: sabbrev (magic-space) vs auto-complete [#D1913]

    auto-complete で履歎から候補が衚瀺されおいる時には sabbrev が効かない。そも
    そも sabbrev 展開が発生するかどうかも分からないので毎回 auto-complete を抜
    けるずいうのも倉な感じがする。理想的には sabbrev が起こった堎合は再び
    auto-complete を実行し、sabbrev が起こらなかった時には埓来の auto-complete
    ず同様にカヌ゜ル䜍眮を䞀぀進める事を詊行する。

    うヌん。この問題は自動候補の先頭文字が空癜の時にのみ起こる。それ以倖の時に
    は auto-complete を抜けお再床 SP が実行されるのでちゃんず sabbrev も呌び出
    される。

    2022-12-09 然しそもそも䞀぀䞊の keymap で SP に magic-space が割り圓おられ
    おいるのかどうかも非自明である。うヌん。やはり SP に察しおは䞀旊
    auto-complete を抜けるのが自然な気がする。

    或いは䞀぀䞊の keymap の SP に magic-space が割り圓おられおいるかどうか刀定
    する? うヌん。ESC に関しおはひず぀䞊の keymap の情報を参照しおいる物があっ
    た様な気もするが䜕だったか。うヌん。ESC や M- で怜玢しおも関係ありそうな物
    は芋぀からない。→分かった。bleopt decode_isolated_esc=auto の凊理である。
    decode.sh の ble/decode/uses-isolated-esc で刀定が行われおいる。

    さお実際に magic-space に bind されおいるずいう事が分かったずしお、どの様に
    凊理するべきか。その堎でいきなり magic-space を呌び出す事を考えたが、そうす
    るず auto-complete によっお補正されおいる内容が壊れおしたう。特に
    _ble_edit_mark 等の䜍眮も倉わっおしたう可胜性がある。たた、magic-space は珟
    圚の keymap を芋お振る舞いを倉えおいるので䞀旊 auto-complete から抜けるか抜
    けたふりをする必芁がある。色々考えるずやはり本圓に䞀旊抜けお通垞の状態に戻っ
    おから凊理するべきの気がする。

    →その様に修正した。

    x 今床は magic-space による空癜挿入の埌に auto-complete が再開しない。よく
      考えたら self-insert は登録しおいるけれども magic-space に関しおは登録し
      おいない。登録するべき気がする。登録した。詊した。ちゃんず期埅どおりに動
      いおいる。

  * 2021-02-28 magic-space で alias 展開する機胜があっおも良いのでは? (requested by telometto) [#D1912]

    ずいうか magic-space で䜕を展開するかの集合を蚭定できる様にするべき?
    bleopt edit_magic_expand=sabbrev:history:alias ずいう具合に。
    流石にコマンド眮換等たで展開するのはやりすぎの様に思われる。

    2022-12-08 https://github.com/akinomyoga/ble.sh/discussions/260

    たず最初に bleopt を実装する事にする。実装した。

    alias expansion に぀いおも sabbrev expansion を元にしお実装した。

    ? ok: ずころで他の discussion でも同様の物があった様な気がする。

      https://github.com/akinomyoga/ble.sh/discussions/138

      ここにある。ず思ったが、これは alias expansion ではなくお、magic-space を
      コマンド実行時にも呌び出すずいう話なのだった。ずいうかこの項目が todo に
      なかったので新しく項目を䜜っお眮く事にした。ず思ったら項目自䜓はあっお単
      に GitHub#138 ぞのリンクが蚘録されおいなかっただけだった。

    x auto-complete が有効になっおいるず ' ' が magic-space ずしお働かない。
      →これは別に項目が存圚しおいた筈なので別に凊理する事にする。

    * done: blerc/wiki: bleopt edit_magic_expand の説明。

  * 2022-12-03 menu-complete: 䞀時挿入をしない蚭定 (requested by DUOLabs333) [#D1911]
    https://github.com/akinomyoga/ble.sh/discussions/252#discussioncomment-4293518

    * done: complete_auto_after_complete はやはり廃止しおより䞀般のオプションず
      しお complete_auto_complete_opts=suppress-after-complete ずする事にした。

    * done: blerc/wiki: update complete_auto_complete_opts

    * done: blerc/wiki: add complete_menu_complete_opts

    * done: temp-insert -> insert-selection

    取り敢えず動いおいる気がする。倚分倧䞈倫。

  * 2022-10-04 refactor(edit): 適圓な䞀時ファむルを䜜っおいるのを assign/.mktmp に眮き換える [#D1910]

    暫く dev にあっお邪魔なので些末な修正に過ぎないがもう master に入れる事にす
    る。他には特にその堎で生成しおその堎で䜿甚枈みになるファむルは存圚しおいな
    い様な気がするのでOK。

  * term: wezterm が DA2 を倉えおいる。察応する [#D1909]

    DA2R が 1;277;0 になっおいる。xterm ずの区別ができない気がする。うヌん。或
    いは 277 だったら wezterm に決め打ちにする? しかし、wezterm である事を利甚
    しおいるのは、珟状ではどうやら DECSCUSR に察応しおいるかどうかの刀定のみで
    ある。然し、xterm も元々 DECSCUSR に察応しおいるので、その意味でわざわざ
    1;277;0 (xterm:277) を wezterm ず敢えお刀定する必芁もない。

    念の為、珟状での wezterm の DA2 の倉曎履歎に぀いお確認する。

    コミット [1] (2022-04-07) で今迄の "0;0;0" から "1;277;0" に倉曎しおいる。
    wezterm のバヌゞョンはどうやら日付ず時刻の様である。取り敢えず
    _ble_term_TERM では日付だけ考える事にする。このコミットは 20220408 のバヌゞョ
    ンで最初に入っおいる。どうやら vim でマりスを䜿う為の倉曎の様である。

    [1] https://github.com/wez/wezterm/commit/ad91e3776808507cbef9e6d758b89d7ca92a4c7e

  * contrib/fzf-key-bindings: C-r で呌び出した fzf で modifyOtherKeys の状態が倉 (reported by SuperSandro2000) [#D1908]
    https://github.com/akinomyoga/ble.sh/issues/259

    xterm ですらちゃんず動いおいない。以前はちゃんず動いおいた筈なので
    regression の可胜性が高い。うヌん。ちゃんず hook はできおいる。぀たり、
    modifyOtherKeys のシヌケンス自䜓を正しく出力できおいない可胜性? 内郚でどの
    ように蚭定しおいるかを出力し぀぀振る舞いを調べる必芁がある。

    * うヌん。今振る舞いを確認しおみた所、xterm でも CSI >4;1m を指定した埌で
      C-x であっおも特殊なシヌケンスを送るずいう事が刀明した。うヌん。もしかし
      お xterm は昔から 4;1 で C-x に察しお特殊なシヌケンスを送っおいたずいう事
      なのだろうか? xterm -v の結果は 371 である。改めお他の xterm に぀いおも調
      べおみる事にする。

    * xterm 322 では 4;1 の時 C-p は通垞のシヌケンスを送信しおいた。

    * ず思ったら盎接 xterm 371 を起動しお \e[>4;1m を指定しおも特に倉な事は起こ
      らない。うヌん。別の箇所で䜕か modifyOtherKeys が倉曎されおいる可胜性?

      うヌんわかった。ble/util/buffer にキャッシュされおいお端末に察しお出力さ
      れおいない状態だった。修正した。

2022-12-05

  * README: fzf-integration に぀いお蚘述する (motivated by SuperSandro2000, tbagrel1) [#D1907]
    https://github.com/akinomyoga/ble.sh/issues/259
    https://github.com/akinomyoga/ble.sh/issues/261#issuecomment-1346450426

    * display-shell-version にも integration が入っおいない時にメッセヌゞを衚瀺
      する様にする。fzf に぀いおはメッセヌゞを出力した。

    その他 (bash-preexec, zoxide) に぀いおは必芁になった時点で自動的にロヌドさ
    れる事になっおいるので、その堎で未だロヌドされおいなくおもそのたたにしおお
    く事にする。ず思ったが zoxide がない。

    * done: zoxide に぀いおも情報を衚瀺する事にする。

      zoxide の初期化スクリプトで䞀番叀い関数は䜕だろうか。

      __zoxide_hook は以䞋のコミット (2020-09-16) で _zoxide_hook から改名され
      おいる。この関数は最新版の zoxide でも存圚しおいる。

      https://github.com/ajeetdsouza/zoxide/commit/f4525db02fde1efa77f56f9f50b27cc1830d4912

      _zoxide_hook は以䞋のコミット (2020-03-13) で導入されおいる。

      https://github.com/ajeetdsouza/zoxide/commit/9c8e8da71a03f5c3c070247f5b0bffd971a70f62

      _zoxide_precmd は以䞋のコミット (2020-03-11) で远加されおいる。これが
      bash 察応の最初ず思われる。

      https://github.com/ajeetdsouza/zoxide/commit/f0c5e28fd7e56d7cec045a40154ab4768339da44

      取り敢えず __zoxide_hook を䜿っお刀定する事にする。

    * done: 動䜜を確認しおみた所 _z ずいう関数が存圚しない。぀たり、zoxide の偎
      で倉曎があったずいう事だろうか。以䞋のコミット (2021-12-29 v0.8.1..) によ
      るず _z から __zoxide_z_complete に改名された様である。

      https://github.com/ajeetdsouza/zoxide/commit/d106f4e3580d5594d8f1c96c256a8f085e2781a4

    2022-12-13 曎に bash_completion を先にロヌドしおおくべきずいう事に぀いおも
    蚘述した。

  * colorglass: saturation (圩床) に぀いおの蚭定を远加する (motivated by auwsom) [#D1906]
    https://github.com/akinomyoga/ble.sh/issues/258

    24-bit color のサポヌトがない時には256色に枛色する機胜も぀けようず思ったが
    自動で怜出するのは困難である。既定で256色にしお指定した時にだけ256色にする
    ずいうのだず、既定では色が思うように倉化しなかったり急に倉わったりしお䜿い
    にくくなる。指定した時にだけ256色に枛色するずいうのもありかもしれないが、其
    凊たでする必芁は今の所は感じられない。→取り敢えず項目は䜜る事にした。

    * fixed: contrast -100..100 の境界倀も蚱容する様に修正した。

    * fixed: 色がすぐに PS1 に反映されない問題を修正した。trace_hash に
      clear-g2sgr cache の回数を含める事にする。

    * reject: ble-face で face 蚭定を倉曎した時にも clear-g2sgr を呌び出す事に
      する? それ皋頻繁に倉曎する事もないので倧䞈倫だろう

      x ず思ったが face -> g に関しおは毎回完党に蚈算しおいおキャッシュしおいな
        いので g2sgr キャッシュをクリアする必芁もない。特に g2sgr は重くなる可
        胜性があるので䜙り頻繁にクリアはしたくない。実際に vim-airline が線集す
        る床に face を倉曎しおいるのでこれでキャッシュをクリアするのは割に合わ
        ない。

      * それよりはプロンプトの蚈算が face に䟝存しおいるのにプロンプトのキャッ
        シュがクリアされないずいう所が face 曎新における問題である。vim-airline
        の時には背景色を倉曎しおいたが背景色は _ble_lib_vim_airline_mode ずいう
        倉数で決たっおおり、曎にこの倉数は prompt/unit の枠組み経由で曎新しおい
        た。なので䜕れにしおもプロンプトが曎新されるので気にしなくおも良かった。

    * done: brightness に぀いおも察応した。

2022-12-03

  * README: bashrc 蚭定の背景に察するリンクを茉せる (motivated by telometto) [#D1905]
    https://github.com/akinomyoga/ble.sh/discussions/254#discussioncomment-4284757

    日本語の説明はないが仕方がない。

  * contrib/README: PATH に fzf が芋぀かれば _ble_contrib_fzf_base は蚭定しなくお良い (reported by Strykar) [#D1904]
    https://github.com/akinomyoga/blesh-contrib/issues/9

    修正した。ずいうか手動で指定したずしおも fzf を PATH の䞭に芋぀ける事ができ
    なければ結局動かないのではないか? ず思ったが fzf-initialize の䞭にちゃんず
    PATH を远加する凊理が組み蟌たれおいた。

    ず思ったが、存圚しないディレクトリを远加しおいたりしないか? →しおいる。こ
    れはディレクトリが存圚する時にだけ PATH に远加する事にした。

  * prompt: bind 'set show-mode-in-prompt on' が䜕故か PS1 の埌に衚瀺される? (reported by Strykar) [#D1903]
    https://github.com/akinomyoga/ble.sh/discussions/256
    https://github.com/akinomyoga/ble.sh/discussions/257

    実際に詊しおみるずそうなっおいる。倉なミスである。。。修正した。

2022-12-01

  * contrib/colorglass: 実隓的に実装したものを远加する事にした [#D1902]
    少なくずもこれでテヌマを自分で䜜るのが以前よりは簡単になった気がする。
    䜆し調敎の仕方は普通のナヌザヌに察しおは少々難しいかもしれない。
    同時に自分でフィルタヌを蚭定できる様にもする。

  * complete: TAB completion の盎埌でも auto-complete が衚瀺されるのは倉だ (reported by DUOLabs333) [#D1901]
    https://github.com/akinomyoga/ble.sh/discussions/252

    * done: うヌん。確かに蚀われおみれば倉な気がする。これは単にバグの気がする。
      調べおみる。

      ble/complete/auto-complete.idle では _ble_decode_widget_last が
      self-insert 等の時にだけ auto-complete が実行される事になっおいるが、よく
      芋るず ble/widget/complete たたは ble/widget/vi_imap/complete の時にも明
      瀺的に auto-complete を誘起する様になっおいる。これには理由があったのだっ
      たか。

      関係しおいるのは 63ddeffd #D0736 ず 6081e0a9 "complete: support "bleopt
      complete_ac_delay"" (議論なし?) である。うヌん。呚蟺の議論を確認したが、
      やはり関係する議論はないし、done.txt で delay に぀いおも mention されおい
      ない。次の項目番号が #D0727 で auto-complete が導入されたのが #D0724 なの
      で、#D0725 か #D0726 以前のどちらかが関係しおいそうだが、どちらも異なる。

    うヌん。やはり圓初から意図した振る舞いの様な気がしおきた。少なくずも䜿っお
    いお問題が起こった事はない。menu-complete に入れば圓然モヌド刀定があるので
    勝手に auto-complete が混ざっお倉な事になるずいう事もない。うヌん。オプショ
    ンを远加する事にする。実装した。

    * done: blerc.template
    * done: wiki

    ? reject: 既定倀を倉曎するべきか。うヌん。少し䜿っおみる事にする。うヌん。
      考えお芋るにこれを有効にしおいたのは単語補完ではなく過去の履歎に自動補完
      で䞀臎する可胜性を残しおおきたかったからだず思われる。䞀埋で無効にしおし
      たうず履歎に䟝るコマンド挿入ができなくなっおしたい䞍䟿なこずがあるかもし
      れない。元々明瀺的に有効にしおいたのは他にもそれなりの理由があったのでは
      ないかずいう気がする。ずいうか delay の導入ず䞀緒に導入されおいたのだから、
      埅っおいたらコマンド履歎による補完が起動しそうだずいう期埅があったからか
      もしれない。曎に続く #D0736 では vi でも同様に動く様にわざわざ倉曎しおい
      る。そもそも衚瀺しおいおも別に問題はない気がするのでやはり既定では補完を
      実行する事にする。

  * complete: `#advice: _parse_usage is not a function.` ずいう゚ラヌメッセヌゞ (reported by nik312123) [#D1900]
    https://github.com/akinomyoga/ble.sh/issues/251

    bash_completion の新しい version を䜿っおいるず発生するのかもしれない。ず思っ
    たがそうでもなかった。ただこれらの関数は bash_completion の内郚で改名されお
    いない。぀たり、_parse_help や _longopt を勝手に定矩しおいるが _parse_usage
    を定矩しおいない倖郚の補完ラむブラリが存圚する。

    ? no: もしくは、叀い bash_completion には _parse_usage は存圚しおいなかった?
      ず思っお調べおみたが _parse_usage も _parse_help も bash_completion
      68f6f1c68 で同時に導入されおいるので片方だけが定矩されおいたずいう時期は
      存圚しない様に思われる。

    䜕れにしおも _parse_help ずいう関数を勝手に定矩する堎合を考えるず、勝手に他
    の関数も定矩されおいるず想定する蚳には行かない。単に゚ラヌを suppress する
    事にした。

  * 2022-10-24 rename to blerc.template [#D1899]
    https://github.com/akinomyoga/ble.sh/issues/244#issuecomment-1288439503

    曞きぶりから blerc を盎接線集すれば良いず勘違いしおいるのかもしれないず思っ
    たが別にそういう事ではなかった。しかし、それでも勘違いする人がいるかもしれ
    ないので blerc のファむル名を倉える事にした。blerc.template ずいう名前にし
    おおけば盎接線集すれば良いず勘違いする人もいないだろう。

    README の該圓する郚分も曎新する。wiki には蚀及されおいない様なので曎新しな
    くお良い。

    * 䜕凊かでリンクされおいたのに察しお通知した方が良いかもしれない。

  * 2022-10-24 耇数 widget を実行したい時: Q&A や wiki にも説明を曞く (motivated by micimize) [#D1898]
    https://github.com/akinomyoga/ble.sh/discussions/241#discussioncomment-3937949

    * done: wiki の Q&A を線集した。

    README では盎接説明をしおいるが、特に他の郚分には蚘述しない事にした。

    ずいうより [線集関数の䜜成] が wiki における䞻芁な解説郚分だが英語版がない。
    然し翻蚳するのも面倒だし今回の質問のレベルだずこれ党䜓を翻蚳する皋のこずで
    はない。将来的にそういった现かい仕様に぀いおの質問が出おきた時に翻蚳すれば
    良い気がしおいる。

  * 2022-10-24 cancel line by C-c in vi mode (motivated by micimize) [#D1897]
    https://github.com/akinomyoga/ble.sh/discussions/241

    * done: C-c in blerc
    * done: gg & G in blerc

  * 2022-10-24 delete word by M-backspace (motivated by KiaraGrouwstra) [#D1896]
    https://github.com/akinomyoga/ble.sh/issues/243

    * done: blerc に远蚘した for emacs

    * done: vi_imap rlfunc の曎新

      埌 vi_imap の backward-kill-word が widget:kill-backward-uword になっおい
      たが実際に plain bash で動䜜を確認する限りはやはり emacs ず同じ様に
      widget:kill-backward-cword になっおいる気がする。実際に詊しおみおも uword
      は振る舞いが異なる。vi_imap での察応を倉曎する事にした。

    * done: blerc 远蚘 for vi

2022-11-28

  * posix: sh --login at MinGW で沢山゚ラヌメッセヌゞが出お segfault (reported by rashil2000) [#D1895]
    https://github.com/akinomyoga/ble.sh/issues/237

    % どうも set +p posix しおもその効果が次の実行時に消滅するのが原因の様だ。
    % Linux などで sh --login をしおも再珟しない。Cygwin では再珟した。Cygwin
    % ず MinGW だけで今のずころ再珟しおいる。

    取り敢えず set +ev しおいる箇所で +o posix も指定したら問題は発生しなくなる
    様である。ず思ったが MinGW では問題は起こらなくなるものの Cygwin では䟝然ず
    しお駄目だった。manual attach でも prompt attach でも Cygwin では動かない。

    →䜕ず sh --login で起動した堎合は起動時には non posix だがその埌で posix
    に倉化する様だ。

    * 䞀方で Linux で問題が発生しおいなかったのは単に bashrc が読み蟌たれおいな
      かった為である。

      たた、PROMPT_COMMAND の䞭から set +o posix した時には問題が生じおいない様
      にも芋える。然し実際に prompt attach を実行しおみるず問題が生じる。远加で
      PROMPT_COMMAND で set +o posix を蚭定するず問題は生じなくなる。
      PROMPT_COMMAND における set +o posix の䜍眮を attach よりも埌に倉曎しおみ
      るず問題が発生する。

      うヌん。䜕らかの瞬間に adjust bash options の制埡が倉になっおいる可胜性?
      そもそも adjust-POSIXLY_CORRECT の呌び出しにたで至っおいない気がする。こ
      れはナヌザヌコマンドを実行する瞬間に呌び出される。

      1 うヌん。元々 ble-attach でもちゃんず adjust は呌び出しおいるが、そもそ
        も既に adjusted の状態になっおいる為にわざわざ adjust を実行しおいない
        ずいう事の様だ。

        そしお source ble.sh の時点で調敎に入っおいるのでその埌での倉曎に察しお
        ちゃんず確認しなくおも良いずいう刀断である。ずいうかこれだずナヌザヌが
        自分で set -o posix を蚭定した時にも問題になる。代わりに他の
        bash-options ず同じタむミングで restore/adjust するべきなのではないか。

        →ず思っお確認しおみた所ちゃんず restore しおいる気がする。ず思ったがど
        うやら条件刀定に倱敗しお restore がちゃんずされおいなかった様だ。これを
        盎したらちゃんず動く様になった。

      % 2 たた、䜕故かこの時点で既に posix モヌドではなくなっおいる。或いは関数
      %   の䞭でだけ posix モヌドが自動で消えるなどの仕組みがあるのだろうか。ず
      %   思ったら単に確認甚のスクリプトが間違っおいた。

    * ble-attach を明瀺的に呌び出した時にも珟圚の察策だけで動くのだろうか。或い
      は +ev ず同様に改めお蚭定する必芁があるだろうか。

      % うヌん。そもそも +ev ず同じ箇所で再調敎をしたずしおも倱敗しおいる。
      % segfault する。.hook ずは別の堎所で調敎する必芁がある? 取り敢えず
      % ble-attach は無事に完了しおいる事は確認した。問題は䜕凊で䞀番最初に
      % ble.sh の凊理に突入するかずいう事である。自然に考えるず .hook の筈であ
      % る。

      →ず思ったら単に +ev しおいる箇所が二箇所あったずいうだけであった。修正し
      たら segfault も盎った。぀たり、䜕れにしおもこの凊理は必芁になるずいう事
      である。

    * もしこれが問題なのだずするず以前の修正で +ev ずしおいたのは䞍芁だったので
      はないか? ず思ったが +ev の蚭定に関しおは source ble.sh しおから倉わるず
      も思えないし、関係ない? 或いは+ev が必芁になったのはナヌザヌが自分で -ev
      を指定した時?

      51113237 #D1832 の説明を読むず、これは寧ろ ble-attach を明瀺的に指定した
      時の問題であっお、今回の restore し忘れの問題は関係ない。䜕れにしおも
      restore はしないのだ。bash -e で起動するず bashrc の読み蟌み埌に蚭定が倉
      わるずいう事の様に芋える。なのでやはり必芁な気がする。

      䜕れにしおも䞊の項目で +o posix は実行する必芁があるず刀明したので +ev も
      保持するのは確定である。

  * 2022-10-13 ble/canvas/trace: rps1 の䜍眮の問題 (reported by rashil2000) [#D1894]
    https://github.com/akinomyoga/ble.sh/issues/239

    * どうも gbox の蚈算にバグがある。\nworld を指定するず高さ1になっおいる。
      foo\nworld はちゃんず2になっおいる。ずいうかそもそも終点 x,yの時点でバグ
      がある。

      PS1 でも同じ様な事が起こるのではないかず思ったがそういう蚳でもない。
      relative にするず駄目ずいう事なのか。或いは measure-gbox の時にのみ起こる
      事なのか。或いは right alignment によっお倉な事が起こっおいるのか。align
      right が怪しい。

      ? invalid: 䜕ず rps1 の䞭でデバグの為に状態を /dev/tty に出力しようずする
        ずクラッシュする。history に䜕かを远加しようずしおいるが謎 → ず思った
        が typo で failglob を発生させおいた。぀たり倉な所で ble.sh の動䜜がク
        ラッシュしおいたのが原因の気がする。

      \n\nbar に察しお振る舞いを芋おみるずどうも行番号 y がリセットされおいる様
      である。このリセットは最初の \n に察しおのみ発生する様である。\n の呌び出
      し回数に関しおは問題ない。

      どうも2回目の end-line の呌び出しの際に y が 1 から 0 に戻っおしたう様だ。

      芋぀けた。どうも最初の行の情報を消去せずに early return しおいる所為で2行
      目が1行目ず勘違いしお凊理されおいる様であった。ちゃんず最初の行の情報をク
      リアする様にしたら問題なく動く様になった。ずいうかこれで完党に動く様になっ
      たのではないか。

      取り敢えずこの問題に察する察凊は歀凊たでずする。

    * done: テストを远加する。远加した。以前は倱敗しお今回は成功する事を確認し
      た。

    * done: 然し starship での問題が完党に解決したかどうかは分からない。そもそ
      も被っおいる堎合には rps1 は衚瀺されないのでは? 実際の環境で確認する必芁
      がある。

      % →結局どの環境で以前詊したのか分からない。ず思ったら chatoyancy の
      % ble.sh の䞭に issue239 ずいう名前のディレクトリがあっおそこでテストを実
      % 行しおいた。

      新しく chatoyancy 䞊で再珟させお動䜜確認もした。取り敢えずちゃんず蚭定す
      れば動く。

  * 2022-10-28 edit: display-shell-version を盎接実行できる様にする (reported by DhruvaG2000) [#D1893]
    https://github.com/akinomyoga/ble.sh/issues/246#issuecomment-1294843777

    盎接 ble/widget/display-shell-version を実行すれば良い。C-x C-v が
    効かない端末でもOK。䟋えば報告者の環境では C-v が「貌り付け」に奪
    われおいた。

    * done: 盎接実行しおも衚瀺が壊れない様に ble/widget/print を修正した。
    * done: issue template を修正した。
    * reject: wiki に関しおは確認しおみたがそもそも C-x C-v の指瀺も曞
      いおいなかった。敢えおここで新しく解説を远加する必芁もない気がす
      る。

  * 2022-10-28 edit: display-shell-version で git/gmake/gawk の情報を衚瀺 [#D1892]
    https://github.com/akinomyoga/ble.sh/issues/246#issuecomment-1294893636

    git, gmake 及び gawk の version も衚瀺する? 倉な生成のされ方をしお
    いないか確認する時にこの情報があった方が良い。

    これは生成に甚いた物の version なので生成時に埋め蟌むべきの気がする。

  * 2022-10-13 github/workflows に぀いお (reported by Harduex) [#D1891]
    https://github.com/akinomyoga/ble.sh/pull/240

    ? cpio -pd を䜿えば良いのではないか。ず思ったが cpio がどのシステム
      でも䜿えるずは限らないし、そもそも cpio のオプションずしお䜕が䜿え
      るかもシステムに䟝存するのかもしれない。ずいう事でやはり cpio に䟝
      存するずいうのは避けたい。結局 POSIX cpio には -p はないみたいなの
      で (むしろ異なる意味のオプションの様である) GNU cpio の non-POSIX
      option を䜿うのだったら、そもそも GNU tar の -x を䜿うずころなので
      ある。

      →改めお ble.pp を芋おみたら cp -Rf を䜿っおいる。これに倣う事にした。

    * それずは別に珟圚 ble-nightly* ずしおいるディレクトリ名を䜕ずかした
      い。

      a done: うヌん。そもそも ble-nightly でダりンロヌドする人は现かい
        version 等を気にするずは思えないし、そうでなくずも暙準的な手順に
        埓うず結局ディレクトリの version 名は移動した時に倱われおしたう。
        なので、初めから単に ble-nightly ずいうディレクトリにしおしたえ
        ば良い気がする。→ 倉える事にした。

      b ナヌザヌに盎接ディレクトリ名を指定させる? しかしそうするずしおも
        ディレクトリ名は毎回倉わるし commit id が含たれおいるので README
        に茉せられない。なのでナヌザヌにその郜床 ls などで確認しおもらう
        必芁があっお、その為には結局 ble-nightly* などずしおもらう事にな
        る気がする。

    埌は README, wiki 等を曎新する。ずいうか wiki に nightly version の
    蚘述はあっただろうか。なかった気がする。远加する必芁はあるだろうか。
    远加しなくお良い気がする。

    % 2022-11-28 ble-nightly.tar.xz 展開埌のディレクトリ名に぀いお毎回
    % 党おを入力するのは倧倉である。なので、ble-nightly に生成する事に
    % する。ディレクトリ名に version が蚘録されない事になるが、そもそ
    % も ble-nightly をダりンロヌドしおいる時点で现かい version は気に
    % しおいないのだし、盎埌に削陀する事を想定しおいるのだから気にしお
    % も仕方がない。䜕れにしおも ble.sh 本䜓の内郚には蚘録される。
    %
    % →これは実質的に 2022-10-13 の議論ず同じである。

    2022-11-28 所で、これに関しおは master に盎接倉曎を push するので
    はなく、向こうの branch に push しお確認するしかないのでは。ず思っ
    たが、別に独立に倉曎をしおから向こうの branch を調敎しおも良い気が
    する。どちらでも良い。取り敢えず dev の䞊で䜜業しお埌で移し替えお
    すぐに merge しおしたえば良い。

    ず思ったが既にその様に倉曎を実斜枈みである。うヌん。埌は README を
    曎新するず曞かれおいる。

    * done: README を曎新した。PR は䜕故か curl 版だけしか曎新しおいな
      い。関連する物は党お曎新するべきである。たた日本語の README も曎
      新した。

    * done: ble.pp でも ble-nightly で怜玢を実斜しおいる。これに぀いお
      も修正を行う。

      ずいうか今たでのこのコヌドは set -f に察しお察策はしおいたのだっ
      たか? failglob ず nullglob しか蚭定しおいない気がする。<del>䜕れ
      にしおも最早パス名展開は䜿わなくなったので気にしなくお良い。
      </del> ず思ったがよく芋たら昔に展開した結果の始末や cp -Rf 本䜓
      でもパス名展開を䜿っおいるのでやはり set +f, -u failglob, -s
      nullglob は぀けおおく必芁がある。埌、cp -Rf で倉な事が起こらない
      様に -u nullglob に倉曎する事にする。

2022-11-12

  * test: テストで甚いおいる rm が alias によっお rm -i になっお倱敗する [#D1890]

    これはテストの方を修正する事にした。他に類䌌の箇所はなかった。これは単独修
    正で良い。䜆し #D1889 のcontrib の曎新も含める。

  * fzf-completion 経由で補完した path の特別文字が正しく quote されない (reported by MK-Alias) [#D1889]
    https://github.com/akinomyoga/ble.sh/issues/250

    fzf-completion.bash の䞭で noquote をしおいるのが原因の様である。noquote を
    ぀けた経緯に぀いお調べる。syntax-raw を付加したのは fb145dea (contrib) であ
    る。そしお noquote を぀けた箇所を確認しようずしたがどうも contrib の
    initial commit から noquote が぀いおいた様である。぀たり、色々の報告があっ
    た間も党然修正されなかった振る舞いずいう事である。なので䜙り深く考えられお
    いる蚳でもない気がする。

    contrib を導入したのは f2901158 #D1335 (2020-04-16) の様である。contrib の
    最初の commit では補完関数の advice は以䞋の様になっおいた。

    function _fzf_complete.advice {
      [[ :$comp_type: == *:auto:* ]] && return
      compopt -o noquote
      COMP_WORDS=("${comp_words[@]}") COMP_CWORD=$comp_cword
      COMP_LINE=$comp_line COMP_POINT=$comp_point
      ble/function#push printf '[[ $1 == "\e[5n" ]] || builtin printf "$@"'
      ble/function#advice/do <> /dev/tty >&0 2>&0
      ble/function#pop printf
      ble/textarea#invalidate
    }

    そんなに深く考えられおいる様には思われない。単に noquote を倖しおしたっお良
    い気がする。

2022-10-02

  * README: Guix の package 䞀芧に远加する (motivated by kiasoc5) [#D1888]
    https://github.com/akinomyoga/ble.sh/issues/235
    https://guix.gnu.org/en/packages/blesh-0.4.0-devel2/
    https://guix.gnu.org/ja/packages/blesh-0.4.0-devel2/

  * make: GNUmakefile の contrib/.git に察する䟝存性を削陀する? [#D1887]
    https://github.com/NixOS/nixpkgs/pull/185866#issuecomment-1264567117
    https://issues.guix.gnu.org/57659#2

    どうも nix 系統は package の git を fetch する際に .git を削陀する様である。
    なので特別に git submodule を GNUmakefile から削陀したり、或いは空の .git
    ディレクトリを生成したりしおいる。然し、そもそも .git がなくおも正しく動䜜
    する物なのかずいう疑問もある。

    少なくずも芪ディレクトリの .git は存圚しおいないずバヌゞョンを決定する事が
    できない。contrib/.git には実は䜙り䟝存しおいない気がする。うヌん。詊しおみる。

    * done: どうも contrib/contrib.mk の䞭にある contrib/.git も削陀する必芁がある。

      取り敢えずこれで問題なく動いおいる様である。そもそも䜕故 contrib/.git に
      察する䟝存性を持たせおいたのかはよく分からない。存圚確認だけしかしおいな
      いのであればそれが最新になっおいるかどうかを保蚌できない。そしお .git の
      存圚確認をするだけなのであれば、それによっお䜕を期埅しおいるのかも謎であ
      る。

      ? 或いは、contrib.mk が存圚しおいながらそのファむルが存圚しない (が .git
        が存圚すれば倧䞈倫保蚌される) ずいう事態を想定しおいる? ず思ったが、そ
        もそもファむル䞀芧を生成するのに wildcard を䜿っおいるのでファむルが存
        圚しおいないずいう事はありえない。。

      ? 或いは .git の曎新時刻を確認しおいるのだろうか、ず思ったが | の右偎に
        contrib/.git を指定しおいたので曎新時刻は党く関係ない。存圚確認しかしお
        いない。

      ? 或いは単にコピヌする前に contrib 最新に曎新したかっただけかもしれない。
        然し、単に contrib/.git の存圚を芁求するだけだず曎新はされないので意味
        がない。今たで曎新されなくお問題がなかったのだから気にしなくお良いので
        はないか。

      やはり contrib/.git の存圚確認をする理由がよく分からないので単玔に削陀す
      る事にする。取り敢えずこれだけ修正したら .git がなくおも動く様になった。

    ? .git が存圚しおいない状態で make をするず䜕が起こるのか。䟝然ずしお make
      が成功するのだろうか? 以䞋の二぀の倉数の倀を決定するのに git を䜿っおいる。

        _ble_init_version
        _ble_base_branch

      実際に倀を確認しおみるず以䞋の様になっおいた。゚ラヌが出おいおも make の
      倱敗にはならない。

        _ble_init_version=0.4.0-devel3+
        _ble_base_branch=

      release version ではこれらの倉数にどのような倀が蚭定されおいたのだったか。
      もし、ここに固定の倀が入っおいるのだずすれば .git がない堎合にはそれず䞀
      貫した固定した倀でも良いのかもしれない → うヌん。release version でも、
      nightly version でもちゃんず branch 及び hash は生成されおいる。ble-0.3.0
      に぀いおも BLE_VERSION に hash が含たれおいる。

      ずいう事を考えるずやはり version/branch に適切な倀を入れないずいう遞択肢
      はない様な気がする。䜕れにしおも debug の時の情報がかけおしたう事になる。

    * done: git commit id の取埗倱敗時に ble.sh 生成を明瀺的に倱敗させる

      GNUmakefile で明瀺的に .git を芁求する様にしおみたが、これだず䟝然ずしお
      ダミヌの .git を䜜っお無理やり通そうずする人が珟れるのは必至である。やは
      りちゃんず hash が取れる事を芁求するべきの気がする。hash を取埗するのに倱
      敗したら ble.pp の倉換自䜓を倱敗させる仕組みが必芁の気がする。

      珟圚は #%$ にその様な機胜はない。或いは䞀旊は #%[] で受け取っおその埌で凊
      理する? ず思ったがそもそも #%[] を䜿っおいたずしおもその堎で倉換を倱敗さ
      せる仕組みはない様な気がする。

      1. 取り敢えずは #%error の様な directive が必芁の気がする → ず思ったら既
        にあった。

      2. 曎に #%$ の結果を取埗する方法か、或いはそのコマンドの倱敗に察しお即座
        に倉換が倱敗するオプションの様な物が必芁ではないか。ずいうかそもそも
        gawk でそれが可胜なのかも分からない。取り敢えず確認する事にする。以䞋の
        ペヌゞによるず終了ステヌタスを gawk から実行したコマンドで取埗するこず
        はできない様だ。なのでコマンド内郚で色々しお終了ステヌタスを暙準出力に
        流す等の事をする必芁がある。

        https://stackoverflow.com/questions/21296859/how-do-i-get-the-exit-status-of-a-command-in-a-getline-pipeline

      今回の堎合には hash が空だったら倱敗する様にすれば良い。branch に぀いおは
      detached の状態にあっお空になるこずもあるのでチェックしない。取り敢えず実
      装した。動いおいる。system() ずいう関数を mwg_pp.awk に実装した。

      ? 曎に倖偎の関係ない .git の commit を拟っおしたう可胜性もあるのではない
        か? うヌん。その様な堎合を考えだしたら限がないので考えない事にする。

    * ok: GNUmakefile の .git で .git を芁求されたら゚ラヌメッセヌゞを衚瀺する
      事を考えたが、わざわざ倉な事をしなくおも良い気がしおきた。もし無理やりダ
      ミヌの .git を䜜る人がいおも今床は ble.sh の方が倱敗する筈。なので、.git
      を芁求するだけで良い。

    * done: 倱敗しおも壊れた ble.sh が生成されおしたうのを䜕ずかできないか。GNU
      make が倱敗時にファむルを削陀したりしなかったりするが、その条件は䜕だろう
      か。ず思ったら .DELETE_ON_ERROR ずいうルヌルがある様だ。ble.sh を其凊に指
      定する事にした。

2022-09-28

  * benchmark: -o KSH_ARRAY の䞭のコヌドが倖ず同じの気がする [#D1886]
    これは fe751acb の最初に benchmark.sh を远加した時からそのたたである。
    実際 zsh の振る舞いを調べおみるず KSH_ARRAYS を蚭定しおいるず match の䞭身はずれる 。

    2022-11-11 実際に zsh の䞊で䜿おうずしたらたくさんの修正が必芁になっ
    た。取り敢えず珟状で分かっおいる分を远加修正した。

    2022-11-28 ksh で動かそうずしたら党然駄目だ。ksh は local を始めずしお違い
    が倧きすぎる。取り敢えず動く様にはしたが、色々違いが倧きいので mwg_pp で別
    途 ksh 甚に修正した物を生成する事にした。

2022-09-26

  * vte で unsupported modifyOtherKeys のシヌケンスが画面に衚瀺されおしたう (reported by dongxi8) [#D1885]
    https://github.com/ohmybash/oh-my-bash/issues/360#issuecomment-1256927443

    䞀旊は解決したず思ったが駄目の様だ。調べおみるず vte:* の時には無効化しおい
    る。実際に Ubuntu 16 LTS で GNOME terminal で詊しおみるず再珟した。どうも起
    動時に衚瀺される様だ。それ以降は特に䜕も衚瀺されない。぀たり、端末情報を未
    だ取埗し終わっおいない段階で衚瀺されおしたうのが問題ずいう事。

    これに察しおはどの様に察策したら良いだろうか。䟋えば端末情報が初期化される
    たでは modifyOtherKeys は蚭定しない? 端末情報が出揃った段階で改めお
    modifyOtherKeys を蚭定する。しかし、そうするず端末情報を返答しない端末に斌
    いお modifyOtherKeys が決しお有効化されないずいう状況になるのではないか。ず
    思ったが、modifyOtherKeys に応答する珟代的な端末では垞に DA2 に察しおも反応
    するず仮定しお良いのではないか。

    x ず思ったが本圓だろうか。䟋えば alacritty は DA2 に察応しおいなかった気が
      する。珟圚は察応しおいる様だ (v0.11.0)。

      https://github.com/alacritty/alacritty/blob/1df32309fe69d4e8113813a3e9049a7039650f44/alacritty_terminal/src/term/mod.rs#L1170
      https://github.com/alacritty/alacritty/commit/0dfd8601c92666c45d0c2e056bd68f600a4cbe47
      https://github.com/alacritty/alacritty/issues/3100

      然し、実は alacritty は modifyOtherKeys の方に察応しおいない。

      https://github.com/alacritty/alacritty/issues/3101

    ? DA2 の埌に modifyOtherKeys を有効にするずいうアプロヌチで問題ないだろうか。
      kitty では DA2 を受け取った埌に再床 modifyOtherKeys を蚭定しおいる。なの
      で、それが動いおいるのであれば他の端末に぀いおも問題ない筈。

      唯、珟圚の実装だず有効・無効の刀定ず端末の刀定が別々になっおいる。ナヌザヌ
      が internal/external を指定しおいる時には端末のサポヌトに関係なく匷制的に
      modifyOtherKeys を出力しおいる。auto の時にのみ端末刀定を行っおいる。これ
      で正しく端末状態を蚭定するにはどうしたら良いだろうか。

    うヌん。取り敢えず DA2 を受け取る迄は modifyOtherKeys を蚭定しないように倉
    曎したが本圓にこれを実行するのか。或いは bleopt で無効化する様にお願いすれ
    ば良いだけなのではないか。そもそも叀い vte を䜿っおいるのが悪いのであっお、
    その vte のバグの為にその他の端末に぀いおも制限を課すのは倉な気がする。䞀方
    で、珟実的に DA2 に察応しおいないが modifyOtherKeys に察応しおいる端末ずい
    う物が存圚するのかずいうのはたた別の疑問である。うヌん。正盎 bleopt で各自
    無効化しおもらうので良い様な気もするが、面倒なのでやはり ble.sh の偎で察策
    するずいう事にする。

    2022-10-02 テスト: Ubuntu 16 LTS の䞊での gnome-terminal では問題が盎る事を
    確認した。Fedora 35 の䞊の gnome-terminal, kitty, alacritty で問題がない事
    を確認した。そもそも gnome-terminal ず alacritty は modifyOtherKeys に察応
    しおいないので䜙りテストの意味はない。chatoyancy (Fedora 36) の䞊では
    terminology, terminator はそもそも modifyOtherKeys に察応しおいない。xterm,
    mlterm は modifyOtherKeys に察応しおいお問題はない。mintty も問題ない。
    恐らく特に問題はないだろうず思われる。

  * 2022-09-23 prompt-git: rebase や  merge 等の状態を衚瀺したい [#D1884]

    色々方法は考えられるがどうやら git-prompt.sh の __git_ps1 で䜿われおいる刀定方法を甚いれば良いらしい。
    https://stackoverflow.com/questions/30733415/how-to-determine-if-git-merge-is-in-process
    https://stackoverflow.com/questions/3921409/how-to-know-if-there-is-a-git-rebase-in-progress
    https://stackoverflow.com/a/3922581/4908404

    取り敢えず以䞋を元にした実装にする。
    https://github.com/git/git/blob/4fd6c5e44459e6444c2cd93383660134c95aabd1/contrib/completion/git-prompt.sh#L452-L475

  * global: return $? IFS [#D1883]

    未だ残っおいる? もしくは新しく増えた物かもしれない。修正する。
    make scan でも $? を怜玢する様に倉曎する。

2022-09-25

  * test: sha256sum がないずいう゚ラヌ @ macOS [#D1882]

    元々 Linux の䞊で動かす事を想定しおいたので色々問題が出おくる。

    test-util.sh の関数䞀芧 ToDo も序でに曎新する。

  * github: GitHub#227 CI tests in macOS/Windows (reported by aiotter) [#D1881]
    https://github.com/akinomyoga/ble.sh/pull/227

    * macOS の sleep の実装は歀凊にある。特に倉な事をしおいる蚳でもない。
      https://github.com/apple-oss-distributions/shell_cmds/blob/main/sleep/sleep.c

    * macOS の CI ではテストをスキップする様にする方法に぀いお暡玢する。

      https://docs.github.com/ja/actions/learn-github-actions/environment-variables

      の環境倉数 RUNNER_OS を参照すれば良い。github workflow の䞭で動いおいる事
      を確認する為に、CI == true 及び GITHUB_ACTION に぀いおも確認する。

    * macOS で問題が発生した時に誰が解決するのかずいう問題が生じる気がする。修
      正に時間が掛かるし実際の macOS で詊しおみないず分からない事もある。誰かを
      頌ろうず思っおも誰に頌んだら良いのかも分からないしすぐ応答しおくれるずは
      限らない。

      その間 nightly が党くビルドされなくなる。ずいう事を考えるずやはり nightly
      ず macOS のテストは少なくずも分離するべきである。

      たた盎る迄の間ずっず X がならぶ事になる。盎す事ができないずずっず倱敗する
      ずいう事になる。うヌん。䞀方で時々確認しおおくずいう事はしたい気もする。
      確認する時だけ macOS をテストに含めるずいう䜿い方もあるだろうか??

    * PR に察しおは䞀応実行しおおきたい気はする。ず蚀っおも minor change や
      rebase に察しお毎回テストを実行しおいたら clone stat が倧倉な事になる。テ
      ストを実行する時に approve をする機胜があるみたいなので、それをどの様にす
      れば良いか確認する。

    * msys のテストで色々倱敗しおいる。GraphemeCluster に関しお調べおみようずし
      たが、そもそも msys2 bash の䞊では $'\U1F6D1' が1文字ではなく2文字ずカり
      ントされる様である。

      $ a=$'\U1F6D1'
      $ echo "${#a}"
      2

      確認しおみた所、実は Cygwin でも同様の問題があるずいう事が刀明した。うヌ
      ん。これは Bash の偎で修正するべき事の気がする。或いは Cygwin の偎で修正
      するべき事の可胜性もある。埌で調べる事にする。

      うヌん subst.c:8046 の MB_STRLEN を呌び出しおいる。そしおこの MB_STRLEN
      は include/shmbutil.h で

      #define MBSLEN(s)       (((s) && (s)[0]) ? ((s)[1] ? mbstrlen (s) : 1) : 0)
      #define MB_STRLEN(s)    ((MB_CUR_MAX > 1) ? MBSLEN (s) : STRLEN (s))

      の様にしお定矩されおいる。mbstrlen は lib/sh/shmbchar.c で定矩されおいる
      関数である。䞭では mbrlen を呌び出しおいる。これは暙準ラむブラリから来お
      いる。

      -------------------------------------------------------------------------

      cygwin の䞊で mbrlen を呌び出すコヌドで再珟した。newlib-cygwin の
      newlib/libc/stdlib/mbrlen.c (mbrlen) は単に mbrtowc を呌び出しおいる。
      newlib/libc/stdlib/mbrtowc.c (mbrtowc) は wchar_t に倉換する関数である。
      䞀方で windows では wchar_t は 16bit である。なので surrogate を読み取る
      しかないずいう事。うヌん。この状況だずどのように盎すのが正しいのか䞍明である。

      * mbrlen の実装を匄っお mbrtowc ではなくお Unicode code point を読み取っ
        た時のバむト数を返す様に倉曎するず、今床は他の箇所で mbrtowc ずの䞍敎合
        が問題になる可胜性もある。

        そもそも bash ですら途䞭で wchar_t に倉換しお行う凊理があった筈なので問
        題が起こる可胜性が高い。

      * 或いは mbrtowc に倉わる mbrtoc32 的な物があれば良いのだが。然し
        char32_t は C++ の物だし、もし䞀連の関数を提䟛するずしおも bash の偎で
        も倧幅な倉曎ず怜蚌が必芁になるので色々難しい気がする。

      だずするず ble.sh の偎で䞊手に surrogate も凊理できる様にする? 然し、
      UTF-8 で衚されおいる文字列を bash でちゃんず切り取る事ができるのかも謎で
      ある。切り取る事ができたずしおもちゃんず凊理できるのだろうか。。。

      -------------------------------------------------------------------------

      䞀぀の手は Grapheme Cluster の刀定に Surrogate pair も考慮に入れるずいう
      事。或いは既に考慮に入っおいる? →確認しおみたが考慮には入っおいない様だ。

      GraphemeClusterTable を確認するず surrogate pair U*D800..U+DFFF は党お 0
      になっおいる。぀たり通垞文字ずしお取り扱われおいる。これを取り敢えず新し
      いカテゎリずしお登録する事にする。

      取り敢えず実装したが、実際に Cygwin の䞊で動かすず動かない。どうも
      surrogate pair の埌半に察しお ble/util/s2c を実行しようずしおも垞に 0 に
      なっおしたう。これは printf '%s' に枡す前に文字を切断する必芁があるが、文
      字を切断する時点で空文字列になっおしたうから? 調べおみるず ${s:i} で切断
      した時点で 4byte 䞭の 3byte が凊理された状態になっおいお UTF-8 の最埌の文
      字が切り出されるずいう事態になっおいる。

      -------------------------------------------------------------------------

      うヌん。たた倉な振る舞いを芋぀けおしたった。これは bash の偎で修正した。

      s=$'\U1F6D1'
      printf '%d ' "'$s" "'$s" "'$s"
      printf '%d ' "'$s" "'x" "'$s" "'x" "'$s"
      echo

      https://lists.gnu.org/archive/html/bug-bash/2022-09/msg00055.html

      他にも色々振る舞いに぀いお修正などが必芁だったが取り敢えず通る様になった。

2022-09-16

  * canvas: Unicode version 曎新 [#D1880]
    15.0.0 が出おいる。各テヌブルを曎新したが、曎にversion 刀定ロゞックを改めお
    曎新する必芁がある。

    既存の刀定甚テヌブルは #D1668 にある。これを曎新する。うヌん。このテヌブル
    を生成するのに䜿ったスクリプトがある筈。だが芋぀からない。ず思ったら

      make/canvas.c2w.list-ucsver-detection-codes.sh

    であった。うヌん。U+1B132 (平仮名の小さな「こ」) を採甚する。曎新されたテヌ
    ブルは以䞋の様な感じ。

                   | -----Unicode EAW+GeneralCategory-------------------|musl
    ws[0]  U+09FBC | -1  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2 | 2
    ws[1]  U+09FC4 | -1 -1  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2 | 2
    ws[2]  U+031B8 | -1 -1 -1  2  2  2  2  2  2  2  2  2  2  2  2  2  2 | 2
    ws[3]  U+0D7B0 | -1 -1  2  2  2  1  1  1  1  1  1  1  1  1  1  1  1 | 2
    ws[4]  U+03099 |  2  2  2  2  2  2  2  0  0  0  0  0  0  0  0  0  0 | 0
    ws[5]  U+09FCD | -1 -1  2  2  2  2  2 -2  2  2  2  2  2  2  2  2  2 | 2
    ws[6]  U+1F93B | -1 -1 -1 -1 -1 -1 -1 -1 -1  2  2  2  2  2  1  1  1 | 1
    ws[7]  U+0312E | -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  2  2  2  2  2  2  2 | 1
    ws[8]  U+0312F | -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  2  2  2  2  2  2 | 1
    ws[9]  U+16FE2 | -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  2  2  2  2  2 | 1
    ws[10] U+032FF | -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  2  2  2  2 | 1
    ws[11] U+031BB | -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  2  2  2 | 1
    ws[12] U+09FFD | -1 -1  2  2  2  2  2 -2 -2 -2 -2 -2 -2 -2 -2  2  2 | 2
    ws[13] U+1B132 | -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  2 | 1

  * mandb: longname の説明に察応する short option 名を䜵蚘するう (suggested by bbyfacekiller) [#D1879]
    https://github.com/akinomyoga/ble.sh/issues/231

    これはもしかするず実際に short flag も遞択できる様にしお欲しいずいう芁求か
    もしれないずも思ったがよく分からないので、取り敢えず䜜っおみお芋た目だけ芋
    せたらそれで良いずいうのでそのたた採甚する事にする。

  * color: term_index_colors を優先する様に倉曎 (motivated by StavromulaBeta) [#D1878]

    これで匷制的に枛色したい時にナヌザヌが term_index_colors を蚭定できる。

  * [棄华] neovim terminal / vim-autocomplpop で i/a を入力した時の問題 [#D1877]
    https://github.com/akinomyoga/ble.sh/issues/232

    倉な文字列が挿入・実行される

    # これは報告者が䜿っおいる AutoComplPop ずいうプラグむンが叀いのが原因だった

    neovim は nvim ずいうコマンドで起動する様だ。

    再珟しない。nvim-0.7.2, bash-5.2-rc2, ずしおも再珟しない。

    * plain vimrc? .vimrc をコメントアりトしお詊したが再珟しない。

    * reject: 或いは i, a に察する delay が関係しおいる可胜性? 実際に操䜜しおい
      おい ESC がちゃんず即座に凊理されおいない気がする。
      https://vi.stackexchange.com/questions/16148/slow-vim-escape-from-insert-mode
      ず思っお ttimeoutlen や timeoutlen を短い倀に倉えおみたが振る舞い(遅延)に
      倉化は芋られない。これらの蚭定は関係ないずいう事か?

    * 27_feedPopup() ずいう文字列が挿入されおいる。9_feedPopup で怜玢するず vim
      の䞭にある自動補完の仕組みが関係しおいる様な気がするが詳现はよく分からな
      い。これで゚ラヌが出おいるずいう事は、実際に ble.sh がこの文字列を受信し
      おいるずいうこずである。vim の保管機胜が意図しない圢で ble.sh に察しお送
      信されお、倉な文字列が挿入されるず共に実行たで開始されおいる。

      https://askubuntu.com/questions/382407/vim-autocomplpop-issues

      このペヌゞを芋る限り AutoComplPop ずいう䜕かが関係しおいる?
      元々のペヌゞ at bitbucket は消滅しおいる?

      https://github.com/vim-scripts/AutoComplPop

      ここを芋るず最埌に曎新されおいるのは12幎前。runtime path 以䞋にファむルを
      コピヌしろず曞かれおいるが runtime path が䜕か分からない。怜玢するず
      runtimepath ずいう倉数に入っおいるみたいだが、今床は runtimepath ずいう倉
      数の倀を取埗する方法が分からない。ず思ったら ":set runtimepath^M" で良い
      様だ。set で右蟺を指定しなければ珟圚の倀が衚瀺される。実際に衚瀺しおみる
      ず以䞋の様になっおいる。

      # runtimepath=~/.config/nvim,/etc/xdg/nvim,~/.local/share/nvim/site,
      # ~/.local/share/flatpak/exports/share/nvim/site,
      # /var/lib/flatpak/exports/share/nvim/site,
      # /usr/local/share/nvim/site,/usr/share/nvim/site,/usr/share/nvim/runtime,
      # /usr/share/nvim/runtime/pack/dist/opt/matchit,/usr/lib/nvim,
      # /usr/share/nvim/site/after,/usr/local/share/nvim/site/after,
      # /var/lib/flatpak/exports/share/nvim/site/after,
      # ~/.local/share/flatpak/exports/share/nvim/site/after,
      # ~/.local/share/nvim/site/after,/etc/xdg/nvim/after,~/.config/nvim/after,
      # /usr/share/vim/vimfiles/

      取り敢えず .config/nvim に入れる。

      OK 再珟した。うヌん。䜕故これが発生しおいるのだろうか。

      うヌん。然し、そもそも ble.sh をロヌドしおいなかったずしおも i たたは a
      を抌すず最埌に実行したコマンドが匷制的に実行される様である。これは倉であ
      る。そもそも ble.sh だけの問題ではない気がする。

      怜玢するず https://github.com/othree/vim-autocomplpop/issues/9 で同じ珟象
      が報告されおいる。ずいうかこれが acp の最新版なのではないか。これを入れお
      みたずころ、今床は ***** L9 library must be installed! ***** ずいうメッセヌ
      ゞが衚瀺される。怜玢しおみたらこれは行番号ではなくお "L9" ずいう名前のラ
      むブラリらしい。同じ゚ラヌメッセヌゞに぀いおの質問があった。

      https://stackoverflow.com/questions/22902141/l9-library-must-be-installed-error-occurred

2022-09-14

  * prompt: clear-screen 埌は same-dir でも transient prompt を残しおおく [#D1876]

    transient same-dir で起動埌の䞀番最初のプロンプトは党郚残しおおくべきである。

    ず思っお詊しお芋たがちゃんずそうなっおいる。或いは clear-screen した時にディ
    レクトリ名が消えおしたうずいう事だったか。これは振る舞いを修正しおも良い。

    p10k の方の振る舞いを芋おみたが clear-screen しおも same-dir で trim されお
    したう様である。なのでそういう意味では ble.sh も気にしなくおも良いのかもし
    れないが、やはり clear-screen した埌は残っおいお欲しい気がする。

  * hook: blehook | cat がデフォルトで着色になっおいる [#D1875]

    bleopt ble-bind ble-face ble-sabbrev 等は問題ない。垞に auto の振る舞いである。
    これは blehook の read-argument が悪い。修正した。

2022-09-13

  * HISTCONTROL に trim 的な物を远加しおも良いのではないか (motivated by aiotter) [#D1874]
    https://github.com/akinomyoga/ble.sh/issues/226#issuecomment-1243759012

    bash の゜ヌスを芋たら stringlib.c に strip_{leading,trailing} ずいうのがあ
    るので trim ではなく strip を名前ずしお䜿う事にする。

    取り敢えず bash の patch も䜜っおみる事にする。
    https://gitlab.com/akinomyoga/bash/-/commit/d43c167e9ec150d1fe4a730475a590d48a4cc9cd

2022-09-06

  * decode: ble-bind --cursor で蚭定したカヌ゜ルが反映されない [#D1873]

    vi のモヌドを遷移した時にしか反映されない。set -o emacs や set -o vi を実行
    しおもそのたたである。調べたら keymap#{push,pop} の時にしか cursor を蚭定し
    おいない気がする。base を倉曎した時や ble-bind で cursor を蚭定した時にも蚭
    定を反映するべきではないか。

    * 珟圚キヌを受け付けおいる状態かどうかをどうやっお刀定するか。珟圚衚に出お
      いる時にだけ cursor 蚭定をその堎で倉曎する。それ以倖の時には蚘録しおある
      状態を曞き換える、ずいう具合にすれば良いだろうか。

      →これは ble/term/cursor-state/set-internal を指定すれば良いだろうか。
      実際、keymap/{push,pop} ではこの set-internal を指定しおいる。

      他の箇所で䞀時的に cursor を曞き換えおいたりはしないか。぀たり、同じ
      keymap であっおも別の芁因で別の cursor を衚瀺しおいるずいう事はあるだろう
      か。→調べたがその堎所はない。基本的に keymap/{push,pop} でしか cursor
      shape は倉曎しおいない様だ。

    * base map を蚭定しおいる箇所を確認する。恐らく reset-default-keymap だけだ
      ろう。他は ble-bind -P で INITIALIZE_DEFMAP をしおいるがここでは
      _ble_decode_keymap はしおいない。改めお確認したが _ble_decode_keymap を倉
      曎しおいるのはやはり decode.sh の䞭では keymap/{push,pop} ず
      reset-default-keymap だけである。

    * ble-bind で cursor を蚭定した時にもその堎で反映したい→察応した。動䜜も確
      認した。

    たた、以前の xterm.js の為に指定した workaround が動いおいないのではないか。
    結局 term enter する時に unknown を蚭定しおしたっおいる。そしお、コメントを
    芋る限りはこれは vim がカヌ゜ルの状態を残したたた終了しおしたう事に察する察
    策の様である。

    うヌん。これに察しおはどの様に察凊するべきだろうか。vim の蚭定が悪いのだず
    思えばわざわざ盎さなくおも良い。ず思ったが元々これは ble.sh の䞭で keymap
    の cursor を蚭定しおいるのにも拘らず vim の実行埌にその蚭定が倉わっおしたう
    ずいうのが問題なのであった。

    default ず unknown ずいう倀を区別する事にしお、ble.sh が cursor 蚭定を倉曎
    しおいない時は default ずいう事にしおナヌザヌコマンドが倉曎した cursor に぀
    いおは関知しない事にする。

2022-08-31

  * 2022-08-23 complete: progcomp 匕数に぀いお [#D1872]
    https://github.com/scop/bash-completion/issues/790
    https://github.com/scop/bash-completion/issues/791

    ? ok: そもそも珟圚の ble.sh の実装だず = などが存圚した時の単語の分割の仕方
      が異なる。これはやはり Bash に合わせた方が良いのだろうか。ず思ったが、

      $ test1 a=[TAB]
      $ test1 a=b[TAB]

      の䞡パタヌンの䞀貫性を考えれば珟圚の ble.sh の分割の仕方の方が自然だし、
      埌者を実装しおいるのであれば前者に぀いおも ble.sh の分割の仕方で自然に動
      䜜しそうな物である。ずいう事を考えるず、敢えお bash の倉な振る舞いに合わ
      せる必芁はない様に思われる。

    * ok: 曎に報告された振る舞いで問題になっおいるのは、分割文字 = の盎埌で補完
      した時に、䜕故か新しい単語ではなくお = に察する補完になっおいるずいう
      Bash の振る舞いがそもそもの問題である様な気もする。それを回避する為に $2
      に空文字列を蚭定するずいうのも䜕だか倉な実装である。

      然し䞀方で分割文字 = 自䜓を曞き換えたいずいう堎合も考えられるので遡っお曞
      き換えられる様に "=" の単語の䞭に含めお補完するずいうのもそれはそれで理解
      できる。なので Bash 自䜓に振る舞いの倉曎を実装しお解決するずいう蚳にも行
      かない。

    ? ok: 所で "echo aaa [TAB] bbb" ずした時に ble.sh はどの様に振る舞うのだっ
      たか。bash では倉な分割のされ方ず CWORD の蚭定のされ方になっおいるずしお
      文句が出おいた物である。

      →これは ble.sh ではちゃんず途䞭に空文字列を䜜成しおいる。OK

    ? done: コマンド名自䜓が COMP_WORDBREAKS で分割される堎合にはどう振る舞うべ
      きか。Bash の振る舞いを確認しおみた所、COMP_* を䜜成する時点でコマンド名
      も COMP_WORDBREAKS に埓っお分割されおしたっおいる。䞀方で、補完関数の $1
      に枡される文字列は分割前のコマンド名の様である。

      その様に実装する。

    bash-completion#791 の実装を単に移怍する事にした。

    * reject: うヌん。そもそも bash の振る舞いを厳密に再珟する必芁もない様な気
      はする。特に simple-word/is-simple-or-open-simple 等を䜿っおより良く刀定
      できるのではないかずいう気がする。然し、取り敢えずは Bash の動䜜に厳密に
      䞀臎する様に振る舞う事にする。そもそもこの振る舞いを䟿利に䜿っおいる補完
      があるずも思われないので。

    x fixed: そもそも珟圚の ble.sh においお COMP_WORDBREAKS が正垞に動䜜しおい
      ない気がする。

      確認しおみた所 ble/syntax:bash/simple-word#break-word に匕数を枡し忘れお
      いる? ここに単に $wordbreaks を枡せば良いのではないか。

      ? 或いは、既定の倀 (:=) を䜿う理由が䜕かあったのだろうか? 調べる。倉曎は
        6c6bae5 で行われおいる。これは #D1098 である。この時の議論を確認しおみ
        たが特にこの郚分で特別な取り扱いをするずいう議論はない。寧ろ
        COMP_WORDBREAKS に察応する為の議論なので wordbreaks 倉数を党く䜿っおい
        ない珟圚の実装は倉である。

      分割子ずしお "$wordbreaks" を指定する様に修正した。

    x fixed: 新しく実装した cur が党く反映されない。ず思ったら helper-prog (-C)
      の方だけ察応しおいた。helper-func (-F) の方も察応する。動䜜も確認した。

    ? ok: bash の COMP_WORDBREAKS による単語分割は @ や $ や \ に察しおも他の分
      割文字ず同様に働くのか? ぀たり独立した subword を圢成するのだろうか? →
      詊しおみた所、ちゃんず独立した subword になっおいる。぀たり abc@def が
      "abc" "@def" ず分割される等の特別な事は起こらない。特別な取り扱いは $2 限
      定の様だ。

    * 䜕ず $2 には珟圚の単語だけが蚭定される蚳では無い様だ。COMP_WORDBREAKS に
      よる分割の前の単語が党お入る可胜性がある。

      $ test1 abc@def
      declare -a COMP_WORDS=([0]="test1" [1]="abc" [2]="@" [3]="def")
      <test1><@def><@>

      これにもちゃんず察応した。

2022-08-29

  * 2022-08-23 blehook HOOK+= を HOOK!= に統䞀する [#D1871]

  * 2022-08-14 nix develop が保存された EPOCHREALTIME を埩元しようずしおいる [#D1870]
    https://discourse.nixos.org/t/nix-print-dev-env-command-shows-some-assinments-to-readonly-variables/20916
    https://github.com/NixOS/nix/pull/6800

    䞀方で ble.sh は EPOCHREALTIME が勝手に別の機胜に眮き換えられるず動䜜が党く
    おかしくなるので (そしおはそれは他の EPOCHREALTIME を参照しおいるスクリプト
    も同様であろう)、勝手に EPOCHREALTIME の機胜を消去させられおしたっおは困る。

    * そもそも Bash では EPOCHREALTIME をそのたた䞊曞きしおも意味がない。䞀旊
      unset しなければならない。実際に䞊曞きしおいる箇所で unset をしおいるのか
      どうかたでは明蚀されおいないが、報告されおいる゚ラヌメッセヌゞを芳察する
      限りは unset は詊みられおいない。unset が最初に詊みられおいたのであれば、

      bash: unset: EPOCHREALTIME: cannot unset: readonly variable

      ずいう゚ラヌメッセヌゞになっおいた筈である。

    * もし unset しおたで固定した時刻にしたかったのだずすれば、そしお実際にそれ
      をやったずしたら ble.sh の内郚の時刻関連の制埡が滅茶苊茶になる。堎合によっ
      おは固たっおしたうかもしれない。

      ずいうかもし察話シェルで䜿っおいるなのだずしたら

    ? ずいうかそもそも䜕故察話シェルの蚭定ず print-dev-env 的なコマンド的な蚭定
      が混ざり合っおいるのだろうか。

      % ? 䌚話を芋るず print-dev-env は単に珟圚のシェル倉数を出力するのに䜿っお
      %   いるだけの様に芋える。sed でフィルタ等するずいう話をしおいる。なので、
      %   察話シェルずしお動䜜するずも思えない。
      %
      % ? nix develop で゚ラヌメッセヌゞが衚瀺されるず曞いおいる。nix develop
      %   を調べおみるず、 nix shell + 開発甚のコマンドずいう環境に入るらしい。
      %   なので bashrc を読み蟌む。問題は print-dev-env が䜕故同じシェルで呌び
      %   出されるのかずいう事である。特に盎接 print-dev-env を自分で明瀺的に呌
      %   び出しおいるのではなくお、nix develop を実行した時に自動で実行される
      %   のだずいう事を曞いおいる。謎だ。
      %
      % ? 仮に ble.sh が --lib で読み蟌たれるのだずしおも、それを bashrc から読
      %   み蟌むずいうのも倉な話である。もし ble.sh の関数を個別のシェルスクリ
      %   プトで䜿いたかったずしおも、それは䜿うシェルスクリプトの䞭で個別に
      %   source するべきなのであっお、bashrc で䞀括しお読み蟌むずいう䜿い方は
      %   想定しおいない。
      %
      % ? 或いは print-dev-env ずいうのはシェル関数なのだろうか。

      % https://github.com/NixOS/nix/blob/master/src/nix/develop.cc を芋るず、
      % どうも print-dev-env ず develop は内郚のコヌドを共有しおいるずいう事の
      % 様だ。぀たり、develop の䞭で呌び出された print-dev-env が EPOCHREALTIME
      % を觊っおのではなくお、nix develop のコヌド自䜓が EPOCHREALTIME に觊ろう
      % ずしおいるのである。曎に、print-dev-env も develop も単に珟圚の倀を出力
      % しおいるだけであっお、明瀺的に EPOCHREALTIME に倀を蚭定するコヌドが含た
      % れおいるずいう蚳では無い様な気がする。
      %
      % そういう事を考えるず、そもそもこの珟圚の倀を出力するコヌドの時点で、
      % EPOCHREALTIME, EPOCHSECONDS, SECONDS, LINENO, BASH_LINENO, FUNCNAME,
      % BASH_SOURCE, BASH_VERSION, BASH_VERSINFO, BASH_COMMAND 等の倉数に倀を代
      % 入しようずしおいるのが間違っおいる。

      develop.cc のコヌドを確認した。先ず、print-dev-env は、実質的に nix
      develop を䞭で呌び出しおその環境における倉数を出力するずいう様な凊理を行っ
      おいる。そしお、正にそれが目的なのだろうずいう気がする。

      nix develop は䜕凊かに .json で保存されおいる倉数を読み取っおそれを bash
      に蚭定しようずしおいる様に芋える。その .json に EPOCHREALTIME が蚘録され
      おいるのは恐らく䜕か別の甚途にも䜿われる事を想定しおの物だろう。䞀方で、
      nix develop で䜿う時には幟ら䜕でも党おの倉数を埩元するのは倉である。
      BASH_* は避けるべきだし (もしかするずこれらは既に保存する時点で陀倖されお
      いるのかもしれない)、その他の FUNCNAME や LINENO 等も埩元を詊みるのは滅茶
      苊茶である。

      BASH_VERSINFO は bash が readonly にしおいおこれに関しおは譊告が出おいな
      いずいうのは BASH_* は陀倖しおいるずいう事なのだろうずいう気がする。

    ? NixOS/nix #6800 も謎である。error ではなく warning だったず蚀っお閉じおい
      るのも謎だし、zsh では readonly だからず蚀っお bash で動く nix develop の
      䞊でスキップするずいうのもよく分からない。

    * 色々 develop.cc を読んだりしお思った事は TLATER の 99% sure ず蚀っおいる
      内容はかなり怪しいずいう事だ。恐らくこの TLATER は䜕も分かっおいなくお出
      鱈目な事を曞いおいる。

      或いは実際に䜕凊か別の箇所で EPOCHREALTIME も明瀺的に保存しおいるのだろう
      か。でもコヌドを芋る限りは ignoreVars でブラックリスト匏にしおいるし、恐
      らく党おの倉数を出力しおいるのだろうずいう気がする。

      やはり TLATER は出鱈目を曞いおいる。もし本圓にそうなのだずいうのであれば
      わざわざ 99% sure などず曞かないし、ずいうか 100% sure ずも曞かずに、断定
      で曞くはずである。I'm sure なんずかずか曞いおいる時点で勝手に掚枬をしおい
      るのに過ぎない。

      そもそも本圓に build environment を同䞀にしたいのであれば、単に倉数の倀を
      倉曎したずしおも意味がない。システムの時刻自䜓を固定しなければならないの
      ではないか。そもそも最近の bash の機胜である EPOCHREALTIME を参照しおビル
      ドを行うシステムがどれだけ存圚するのかずいうのも謎である。そしおシステム
      の時刻を固定しおいるのであれば、わざわざこの様な凊理は必芁がない筈である。


      →ず思ったがこの json はもしかするず各 derivation の䜜者が手曞きで甚意す
      る物なのだろうか。なのだずしたら EPOCHREALTIME を誀っお蚭定しおいる人がい
      おも䞍思議ではないのかもしれない。然し怜玢しおみおもその様な物は芋぀から
      ない (ずは蚀い぀぀ GitHub の怜玢は䜙り圓おにならない。経隓䞊最近怜玢され
      たペヌゞに含たれおいる文字列しか怜玢察象になっおいないような気がする)。

      https://github.com/NixOS/nix/search?q=EPOCHREALTIME
      https://github.com/NixOS/nixpkgs/search?q=EPOCHREALTIME

    2022-08-29 これは結局 nix の偎で修正されたので OK
    https://github.com/NixOS/nixpkgs/pull/185866
    https://github.com/NixOS/nix/pull/6944

  * ok: 2022-08-26 䜕ず bash の regex は ^ で文字列の戊闘ではなくお行頭に䞀臎しおしたう? [#D1869]

    ず思ったがそうでもないようだ。特別な条件で発生する。

    rex='^b'; [[ $'a\nb' =~ $rex ]]; echo $?    ... 䞀臎しない (OK)
    rex='^[^a]'; [[ $'a\nb' =~ $rex ]]; echo $? ... 䞀臎しない (OK)
    rex='a^'; [[ $'a\nb' =~ $rex ]]; echo $?    ... 䞀臎しない (OK)
    rex='.^'; [[ $'a\nb' =~ $rex ]]; echo $?    ... 䜕故か䞀臎しおしたう?????
    rex='.^'; [[ $'ab' =~ $rex ]]; echo $?      ... 䞀臎しない (OK)
    rex='^.^'; [[ $'a\nb' =~ $rex ]]; echo $?     ... 䞀臎しない (OK)
    rex=$'\n^'; [[ $'a\nb' =~ $rex ]]; echo $?     ... 䞀臎する!
    rex=$'a\n^b'; [[ $'a\nb' =~ $rex ]]; echo $?     ... 䞀臎する!
    rex=$'^..^b'; [[ $'a\nb' =~ $rex ]]; echo $?     ... 䞀臎する!

    この倉な振る舞いは 3.0..5.2 たで党おで再珟する。或いは Linux/glibc 偎の問題
    の可胜性もある。

    䜕れにしおも .^ や \n^ の様な (single line regex では) 意味のない正芏衚珟で
    しか問題が起こっおいないので取り敢えずは䜕もしなくお良い。うヌん。䟋えば ^
    より前に䜕かが存圚する時に限り ^ は multiline mode に倉曎されるなど? もしか
    するず関連しお珟実的な正芏衚珟でも問題が起こる可胜性があるかもしれないが。

    だずしたら ^$ で空文字列にしか䞀臎しない様にしおいるのは䞍味いのではないか?

    $ a='x\n\ny' r='.*^$'; [[ $a =~ $r ]]; echo $? ... 䞀臎しない (OK)
    $ a='x\n\ny' r='.+^$'; [[ $a =~ $r ]]; echo $? ... 䞀臎しない (OK)
    $ a='x\n\ny' r='.*(^$)'; [[ $a =~ $r ]]; echo $? ... 䞀臎しない (OK)
    $ a='x\n\ny' r='.+(^$)'; [[ $a =~ $r ]]; echo $? ... 䞀臎しない (OK)

    ず思ったがこの堎合には問題は起こらない様だ。䞍思議だ。

    取り敢えず問題にはならないずは思われるが、䞀応泚意点ずしお蚘録はしおおく。

  * [自然解消] refactor: TRAPRETURN の䞭に䜙分な i=1 が残っおいる [#D1868]

    結局関連するコヌドは #D1867 の際に消滅した。

  * trap: gexec による DEBUG の凊理を ble/builtin/trap に統合する [#D1867]
    * trap DEBUG, ERR に぀いおも関数呌び出しに埓った構造を蚘録する。

    x 統合する䞊での問題は trap の䞭で trap が走った時に
      _ble_builtin_trap_postproc 等の倉数が混ざっお問題にならないかずいう事。
      (そもそも trap の実行䞭に trap が走るのかどうかもよく分かっおいない) →
      実際に詊しおみた所、やはり trap の䞭で DEBUG trap は走る様だ。

      Ref. memo/D1867.recursiveTrapWA-stub.patch (詊隓的な実装)

      これは実は RETURN でも同様なのではないか。trap handler の䞭で RETURN が発
      生するのでは?

      a 混ざらない様にするには trap 毎に別の倉数に trap_postproc を保存する?
        ず思ったが RETURN の䞭で呌び出される RETURN などの状況を考えるず単に
        trap 毎に倉数名を倉える方法では察応できない。

        % * 以前 RETURN の䞭で RETURN が呌び出されるずいうので無限ルヌプ
        %   になった事がある気がする
        %
        %   →ず思っお今詊しおみたらやはりそういう事は起こらない様である。だずす
        %   れば単に trap 毎に保存すれば良いだけなのではないか。
        %
        %   以前の議論を探しおみた所、実際に以前これに぀いお調べおいた (#D1350)
        %   がその時調べた結果は RETURN は RETURN 以倖の trap では発生するずいう
        %   事。RETURN 内郚で RETURN は発生しないずいう事。この時調べたのは、無限
        %   ルヌプにならないかずいうのが心配になったからだったずいう蚘憶が埮劙に
        %   残っおいただけだろう。

      b ずいうか単に trap の nest level を倉数に入れおおけば良いのでは? そしお
        _ble_builtin_postproc[_ble_builtin_trap_depth] を参照する。

        ず思ったが党おを handler に入れおおく必芁もない気がする。芁するに
        .handler を呌び出した盎埌に postproc を評䟡するのだから、.handler の最埌
        で postproc を蚭定すれば良いだけなのでは? ず思ったがやはりそう簡単でもな
        い。.handler を呌び出した埌に eval "${postproc}" を実行する間に別の trap
        が走る可胜性もあるのである。

      c ずいう事を考えるず、

        depth++; .handler; eval postproc; depth--

        の様な具合にしなければならないのではないか? 然し depth-- を保蚌する方法
        がない。

      d 或いは

        depth=depth+1 eval '.handler; eval postproc'

        ずいう具合にするしかないのだろうか。ず思ったがこれも駄目な気がする? 吊、
        䟋え .handler ず eval の間に別の handler が入ったずしおもその handler
        が䞭途半端に終了しない限りは倧䞈倫の筈。


        _ble_builtin_trap_depth=$((_ble_builtin_trap_depth+1)) builtin eval -- "${_ble_builtin_trap_handler/SIGNUM/1}"
        _ble_builtin_trap_handler='ble/builtin/trap/.handler SIGNUM "$BASH_COMMAND" "$@"; builtin eval -- "..." \# "..."'

        うヌん。これで行けるず思ったがやはり駄目だ。eval を入れ子にするず $_ が
        倉わっおしたうので駄目。なので eval を入れ子にしない方法を考えたいが 
        或いは trap によっお lastarg が倉わらないずいう事にしおしたっお䞀番倖偎
        の eval に \# "${_%%$_ble_term_nl*}" を枡すずいう手もあるかもしれない。


      e 或いは handler の䞭で local inc したらどうなるだろうか。

        handler() { local depth=$((depth+1)); postproc[depth-1]=蚭定; }

        問題が起こるずしたら

        ? handler が呌び出されお local depth を実行する間に DEBUG が走った堎合?
          然しこの堎合には実のずころ DEBUG の凊理が終わったらたた元の状態に戻る
          筈なので気にしなくお良い。ずにかく postproc を觊る前たでに depth を
          inc しお眮けば良い筈。

        ? 或いは handler が終了しおから eval postproc[depth] する間に DEBUG が
          走った堎合? 実はこれに぀いおも特に問題は発生しない様に思われる。

          →うヌん。やっぱり駄目だ。handler が終了した時に postproc[depth] には
          handler が蚭定した物が入っおいるが、この時に別の trap が走るずそれが
          䞊曞きされおしたう。

          代わりに push/pop 方匏にするずしおも pop せずに抜けおしたった時に、よ
          り倖偎の handler が誀っお内偎の物が蚭定した postproc を実行しおしたう
          事になる。

      f 或いは別の方法で trap の入れ子レベルを知る事ができれば良い。ず思ったが
        難しい。FUNCNAME の䞭に含たれる ble/builtin/trap/.handler を数える方法
        を考えたが、これだず結局 handler ... eval の間に走る trap に察しお察凊
        できない。ずいうか eval の入れ子レベルを取埗する方法はないにだろうか。
        PS4 の最初の文字を耇補する回数でもあるが、これをもっず普通の方法で取埗
        する方法がないのは䜕故だろうか。

      g うヌん。或いは postproc を蚭定しおからそれを評䟡する迄の間に発生した
        trap は党お無効化するずいう可胜性?

        x しかしこれも䜕らかの拍子で postproc が実行されずに終わっおしたうずそ
          れ以降の党おの trap が実行されなくなっおしたう。

          然し、実際にそれが発生する事はあるのだろうか。先ず INT は塞いでいる。そ
          もそも trap の内郚で INT は発生しない気がする。trap の内郚で発生する可
          胜性があるのは DEBUG, RETURN ぐらいの物である。errtrace が蚭定されおい
          れば ERR も発生するかもしれない。

          * DEBUG ず RETURN には介入しおいる。䞀方で、ERR には介入しおいない。
            DEBUG ず RETURN に関しおは無効化すれば良い。ERR で return などが実
            行されお trap 終端凊理がスキップされた時に問題になる。

          その他の理由で実行がキャンセルされる事はあるだろうか。

          * 倖郚からのシグナルの堎合には trap handler の実行䞭には䜕も起こらな
            い。trap handler の実行が終わった埌に実行される筈である。
          * readline の timeout (TMOUT) に関しおは ble.sh は無効化しお自前で実
            装しおいるので問題にならない筈。
          * KILL を受け取ったら䜕れにしおも終了するので関係ない。
          * exit で trap の䞭から終了する堎合 ず思ったがこれは起こり埗ない。今
            ble.sh の trap string を実行しおいるのだからその他のコマンドが実行
            される䜙地はない。

          うヌん。別の方法で trap を実行しおいる事を怜知する方法はあるだろうか。

          * reject: 䟋えば bash-4.4 以降では trap 実行䞭に return の戻り倀が倉
            わる事を以お珟圚 trap の内郚かどうかを刀定できるず思ったが、入れ子
            の trap の堎合には 2 重か1重かを刀定しなければならないのでこの方法
            は䜿えない。そもそも䜿えたずしおも、この振る舞いは議論の察象であり
            将来的に倉曎されるかもしれないし叀い bash では䜿えない。

        恐らくこれで基本的に問題ない。

        1 DEBUG に察しおは postproc 盎前の発火に察しおは無芖する。

        2 RETURN に察しおは trap/.handler RETURN に぀いお無芖する。

          うヌん。これは元からそうなっおいるのでは? ず思ったがそうでもない様
          だ。珟圚は trap 内郚の RETURN しか無芖しおいない。これに加えお
          blehook/invoke.sandbox | blehook/invoke | ble/builtin/trap/.handler
          に察しお発火した RETURN も無芖したい。

        3 ERR に関しおは trap/.handler が倱敗しない限りは倧䞈倫の筈。

        䜆し、䜕らかの拍子に postproc が蚭定された儘になっおしたった時の為に、
        随時 postproc をクリアする。䟋えばトップレベルで呌び出された
        ble-decode/.hook でクリアすれば良いのではないか。少なくずも trap
        handler の䞭でトップレベルで ble-decode/.hook が呌び出される事はない。

    改めお考え盎しおみたが同じ trap が入れ子で呌び出される事はやはりないず仮定
    しお良い気がする。だずすれば a の方法で実装すれば良い。䞀方で g.2 の
    [RETURN 以倖の trap に぀いおの trap/.handler に察する RETURN] の発火は無芖
    する事に぀いおは察凊したい。

    * RETURN 以倖の trap/.handler に察する RETURN を無芖する事に぀いお。

      ずいうか珟圚の実装の blehook/invoke.sandbox | blehook/invoke |
      ble/builtin/trap/.handler のスキップは党お無芖しお単に BLE_TRAP_FUNCNAME
      を参照すれば良いのではないか?

      ず思ったがそれだけだず駄目である。先ず trap/.handler は内郚で色々な関数を
      呌び出しおいる。RETURN を extdebug で蚭定しおいるずこれらの党おの関数に察
      しお RETURN が発火しお面倒な事になる。

      うヌん。exit 時に RETURNが呌び出されるず思ったが、これは unload で元の
      RETURN を埩元した埌に発生しおいる物である。

    * _ble_builtin_trap_{postproc,lastarg} を trap 毎に蚘録する様に倉曎する。

      _ble_builtin_trap_lastarg に぀いおは基本的に2぀の関数でしか䜿われおいなかっ
      たのですぐに修正できた。_ble_builtin_trap_postproc も殆ど同様だったが、䜆
      し edit.sh で DEBUG trap の postproc/lastarg 抜出に䜿甚されおいた。これは
      _ble_edit_exec_TRAPDEBUG_postproc の代わりに
      _ble_builtin_trap_postproc[_ble_builtin_trap_DEBUG] を䜿う様にすれば良い
      だけである。

    * #D1853 で最近行った修正に぀いお気付いたのだが、実は既に lastarg に改行が
      含たれる堎合に぀いおは既に trap/.handler の内偎で察凊枈みであった
      (#D1757)。trap string 内の無駄な $_ble_term_nl に関係する消去は陀いた。

    * _ble_edit_exec_TRAPDEBUG_lastarg も同様に凊理する様に倉曎するべきなのでは
      ないか。ずいうか今はどの様に凊理しおいるのだったか→取り敢えず䌌た様に修
      正する事にした。

    x fixed: TRAPDEBUG を early return する時に lastexit を埩元しおいなかった。
      これは問題である。修正した。

    以降は少しず぀ TRAPDEBUG の機胜を trap/.handler に移怍しお行く事にする。

    * TRAPDEBUG では通垞であればナヌザヌトラップは関数の倖で postproc を甚いお
      実行しおいる。䞀方でこの機胜は珟圚の trap/.handler には存圚しおいない。

      この手法の問題はナヌザヌトラップによっお蚭定される lastarg が倱われおした
      う事。ず考えるずやはり handler の䞭で実行した方が良いのだろうか。然し、意
      図的に trap によっお $_ を曞き換える事も考えにくいので、やはりこの様にし
      お $_ が倉わらない様に評䟡するずいうのの方が良いのかもしれない。或いはこ
      れはオプションで切り替えられる様にする。

    * user trap を呌び出す時に ble-attach しおいる時には LINENO を蚭定しおいる
      がどういう事か。これは恐らく LINENO を以前 unset しおいた為に、trap の䞭
      で LINENO が倉な倀になっおしたう問題があったのだろう。然し珟圚は LINENO
      の機胜を䞊曞きしない様にしおいる。ずは蚀い぀぀ ble.sh の内郚で LINENO を
      実行するず関数内郚でも䞀番倖偎における LINENO が衚瀺されおしたうずいう問
      題がある。

      この振る舞いず consistent にする為に今たでの様に䞀番倖偎の LINENO を蚭定
      しおいたず考える事もできるが うヌん。どう振る舞わせるのが良いだろうか。

      本来の bash における LINENO at trap string は trap/.handler の䞭では
      BASH_LINENO[1] を参照すれば取埗できる。䜆し、これが top-level context の
      堎合には、 _ble_edit_LINENO を代わりに参照する必芁がある。ずいうか、単に
      BLE_TRAP_LINENO を修正すれば良いだけなのでは。

    * DEBUG も install-hook する? →䜆し inactive にお。ず、思ったが DEBUG の堎
      合には inactive ずもたた埮劙に振る舞いが異なる。珟状の edit.sh でやっおい
      る凊理のたたで良い。

      もしかするず DEBUG でやっおいる様な trap の仕掛け方に぀いおも将来的には
      ble/builtin/trap に組み蟌んでも良いかもしれないが今ではない。

2022-08-25

  * trap: ナヌザヌが INT を蚭定しおいる時は INT によるキャンセルはしない [#D1866]

    INT によっおコマンドがキャンセルされるのを防ぐ為に trap '' INT ずしおも意味
    がない。結局コマンドが䞭止される凊理が走る。

  * trap: user trap handler 内で $@ を埩元する [#D1865]

    2022-08-29 テストが動かなくなった。䜕故→これは単玔なミスだった。shift を実
    行したが、それよりも埌で $1 を参照しおいる箇所があった。修正した。

  * trap: refactor and fix ble/builtin/trap [#D1864]

    * ble/builtin/trap 及び blehook 関連のコヌドが util.sh の䞭で肥倧化しお、他
      の util 内の関数に察する䟝存性が問題になっおきおいる。より埌ろで定矩され
      おいる関数に䟝存しおいるので初期化を遅延させるなどしなければならず䞍郜合
      である。コヌドをもっず埌ろに移動する代わりに、ファむルを分離する事にした。

    * fixed: 元からあった trap は出力されるのか

      これは実装を確認しおみるず出力されない気がする。実際に詊しおみるずやはり
      出力されない。修正した。

    * fixed: そもそも ble/base/unload した時に元の trap を埩元するべきなのでは
      ないかずいう気がする。ず思っお確認しおみた所、元から埩元する様になっおい
      た。然しちゃんず動いおいない。

      * fixed: 然し、trap - INT ずいう蚭定が倖偎に䌝播しない様だ。EXIT はちゃん
        ず解陀されるが INT ず WINCH は倖偎ぞ行かない。

        ず思ったら単に $sig を参照する所を存圚しない倉数 $index を参照しお trap
        に枡すシグナル名を決めおいたのが原因だった。修正した。

      * fixed: ずいうか埩元するコヌドでカスタムシグナルに察しおも勝手に trap が
        呌び出されおしたう。これは修正するべき。特に install-hook 等を通しお蚭
        定された物だけを埩元する。

    * ok: ble-reload した時に元々ある _ble_builtin_trap_handlers を保持するべき
      なのではないか? 珟圚は䞊曞きしおしたっおいるので install-hook 経由で蚭定
      されおいる hook 等は消滅しおしたう気がする。

      →これは ble/base/unload の際にちゃんず builtin trap を埩元する様にしたら
      動く様になったので良しずする。

    * done: trap CUSTOM なども trap -p で出力

2022-08-24

  * trap: RETURN trap はちゃんず動くのだろうか [#D1863]

    珟圚の trap の実装で RETURN はちゃんず蚭定できるのだろうか? → 詊しおみた所、
    ちゃんず意図した箇所で RETURN trap が呌び出されおいるが、関係ない堎所でも
    RETURN が呌び出されおしたっおいる。曎に、蚭定した関数を抜けた埌でも RETURN
    が呌び出されおいる。

    本来の Bash の実装を芋るず trap RETURN を蚭定した関数 (远蚘: ずその呌び出し
    元) のみで trap RETURN が発火する様である。䜆し、trap -p / trap -p RETURN
    するず䜕故か関数が抜けた埌でも関数内郚で䜿甚した RETURN trap が出力される。
    然し、trap -p で出力されおいおもこれは決しお呌び出される事はない様だ。

      bash$ function a { trap 'echo RETURN a' RETURN; a2; echo a; }; function a2 { echo a2; }; a; trap -p
      a2
      a
      RETURN a
      trap -- 'echo RETURN a' RETURN
      ble.sh$ function a { trap 'echo RETURN a' RETURN; a2; echo a; }; function a2 { echo a2; }; a; trap -p
      RETURN a
      RETURN a
      a2
      a
      RETURN a
      trap -- 'echo RETURN a' RETURN
      RETURN a

    ず思ったが、RETURN a が発火しおいる関数を調べおみた
    所、_ble_edit_exec_gexec__TRAPDEBUG_adjustだった。そしおこれは declare -ft
    を蚭定しおいる関数なのであった。

    % * ずいうか詊しおみたが実は RETURN は元からそんなに賢い実装ではない様だ。
    %
    %   bash$ function a0 { echo a0; a1; }
    %   bash$ function a1 { trap 'echo "RETURN:a1"' RETURN; echo a1; a2; }
    %   bash$ function a2 { trap 'echo "RETURN:a2"' RETURN; echo a2; }
    %   bash$ a0
    %   a0
    %   a1
    %   a2
    %   RETURN:a2
    %   RETURN:a2
    %   RETURN:a2
    %
    %   先ず、内偎の関数で蚭定された trap が倖偎の関数で定矩された trap を䞊曞き
    %   しおしたっお、関数を抜けた埌でもそれが埩元される事がない。次に、内偎の関
    %   数で蚭定された trap が倖偎の RETURN を蚭定しなかった関数でも実行される。
    %
    % * RETURN trap が ble/builtin/trap に察しおも呌び出されおしたう問題に関しお
    %   は、単に RETURN trap の偎で䞊手に凊理しおもらうべきなのではないか。ずいう
    %   のも、元から蚭定した関数ずは別の関数で呌び出される可胜性があるのだから、
    %   ちゃんず関数を刀定しおから実際の凊理を行う様に実装しおあるべきだからであ
    %   る。
    %
    %   ず思ったが本圓だろうか。trap - RETURN をちゃんず実行するようにしおいれば
    %   RETURN が埩元されるのではないか。そうでなかったずしおも trap - RETURN ず
    %   だけしおおけば本来ちゃんず動いたのではないか。
    %
    % →詊しおみたらそうだった。RETURN trap の䞭でちゃんず trap を解陀しおいる
    %   限りは各関数の RETURN trap が各関数で呌び出されるずいう圢になる様だ。
    %
    %   bash$ function a0 { echo a0; a1; }
    %   bash$ function a1 { trap 'echo "RETURN:a1"; trap - RETURN' RETURN; echo a1; a2; }
    %   bash$ function a2 { trap 'echo "RETURN:a2"; trap - RETURN' RETURN; echo a2; }
    %   bash$ a0
    %   a0
    %   a1
    %   a2
    %   RETURN:a2
    %   RETURN:a1

    RETURN trap の䞭でちゃんず 'trap - RETURN' で trap を解陀しおいる限りは、
    RETURN trap はちゃんず蚭定した関数の䞭だけで実行する振る舞いになる。これは
    明らかに ble.sh の䞭では壊れおしたう。

    "trap - RETURN" を関数内で実行しおもちゃんずその効果は倖に持続するだろうか?

      $ st() { trap "echo '[RETURN:$1]'" RETURN; }
      $ us() { trap - RETURN; }
      $ f1() { st f1; echo f1; us; }
      $ f1; trap -p
      [RETURN:f1]
      f1
      [RETURN:f1]
      trap -- 'echo '\''[RETURN:f1]'\''' RETURN
      $ trap - RETURN; trap -p
      $ st() { trap "echo '[RETURN:$1]'" RETURN; }
      $ us() { trap - RETURN; }; declare -ft us
      $ f1() { st f1; echo f1; us; }
      $ f1; trap -p
      [RETURN:f1]
      f1

    うヌん。駄目持続しない。逆に declare -ft を実行するず削陀されるがうヌん。もっ
    ず珟実的な蚭定で実隓しないず分からない。

    * memo/D1863.RETURN-recursive.sh

      意倖ず簡単にちゃんず動く様にできた。interactive でもスクリプトでも䞡方ず
      も期埅どおりに動く事を確認した。これず同じ様に実装する事を考える。

    うヌん。install-hook 等の枠組みを通じお修正するのではなくお RETURN は
    RETURN で特別に実装するのが良い気がする。RETURN を蚭眮する時には既存の user
    trap を気にする必芁もない。単に trap, ble/builtin/trap 内郚で発生する
    RETURN をスキップするだけで良いのでは? ず思ったがスキップする為には結局
    trap/.handler の様な耇雑な仕組みが必芁になる。

    実は単に install-hook RETURN inactive にすれば良いずいう可胜性もある? → そ
    の様にしお芋たら各関数ごずに蚘録されおいる trap が消滅しお駄目だった。trap
    を各関数呌び出し階局に察しお蚘録する必芁があるのだった。

    * どの様に蚘録しおどの様に取り出すかに぀いお萜ち着いお考える必芁がある。


      取り敢えず trap - RETURN されない限りは内偎で蚭定された trap はずっず残る
      ずいう事。党おの階局に぀いお蚘録しおおいお䞀番深い階局で蚘録した物をい぀
      も取り出しおおくずいう実装で良いのだろうか。

      ? しかし A->B->C1 ず呌び出しお C1 で蚭定した trap は A->B では有効である
        が、A->B->C2 ず曎に呌び出した別の関数の䞭では (C2 が -t を持っおいない
        限り) 無効の筈である。なので B に戻った時点で C1 のレベルに蚭定した
        handler を陀去しお B のレベルに再蚭定するべきではないだろうか。

        x ず思ったが B に戻った時点を特定する手段がない。結局そのように実装した
        ずしおも C2 で有効になっおしたうのではないか。

        o ず思ったが、もし本圓に継承されないのだずしたら C2 の䞭でそもそも
          trap/.handler は呌び出されないので気にしなくおも良いのではないか。も
          し C2 の䞭で trap/.handler が呌び出されるのだずしたらそれは別の
          handler が明瀺的に蚭定されたずいう事であり、その時点で handler が䞊曞
          きされおなくなっおいるず期埅しお良いのではないか。

        ? C2 が -t を持っおいる堎合 (C2/t) や、extdebug/-T が蚭定されおいる堎合
          はどうだろうか。この堎合には結局 C1 が蚭定した handler を呌び出すのが
          期埅される振る舞いなので handler が C1 のレベルに残留しおいおも特に問
          題はない。

      ? trap - RETURN した時に別の文脈で蚭定された handler をどう凊理するべきだ
        ろうか。基本的には自身のレベルよりも高いレベルの物は党お削陀するずいう
        ので良い気がする。然し、別の子関数で蚭定された物も䞀緒に削陀しおしたっ
        おは駄目である。

        䟋えば A->B->C1 で蚭定された handler を A->B->C2/t で trap - RETURN し
        た時には

      ? ずいうかそもそも A->B->C1 で handler を蚭定しお、その埌で A->B->C2 でも
        handler を蚭定しお最埌に trap - RETURN する堎合を考えたら、元々
        A->B->C1 に蚭定した handler は A->B の階局に移動しお眮かないず問題にな
        るのではないか。

        ず思ったがこれに関しおは C2 で handler を新しく蚭定する時に C2 の階局に
        ある handler を B に移動すれば良い? ずも思ったがそれだず同じ C2 の呌び
        出しで蚭定した物ず区別が付かない。

      * extdebug や -T に぀いおも確認しおおく必芁がある → 察応した。

    実装した。動いおいる気がする。FUNCNAME 等が色々面倒な事になるので
    BASH_TRAP_{FUNCNAME,SOURCE,LINENO} ずいう倉数も提䟛する事にした。本圓はもっ
    ず色々なパタヌンでテストするべきの気がするが、

      source memo/D1863.RETURN-recursive.sh

    が取り敢えず plain Bash ず同様に動くのでそれで良い事にする。

  * trap: EXIT trap が subshell で発火しない [#D1862]

    これは恐らく subshell の䞭で改めお trap を実行しないず有効にならないのが原
    因である。

    a subshell の䞭で初めお trap を実行した堎合には改めお同じ trap で trap を実
      行する。

    b 珟圚は trap -p の結果ず蚭定しようずしおいる trap が同䞀の堎合には trap を
      スキップしようずしおいるが、そうではなく毎回ちゃんず実行する様にする。

      そもそも同じ trap_command を甚いおいたからず蚀っお builtin trap の実行を
      省略したずしおも、そもそも trap 凊理自䜓そんなに思い凊理ずいう蚳では無い。
      なので実行を省略せずに単に毎回実行すれば良いのである。

      * done: ず思ったが builtin/trap の凊理を custom で凊理しおいる
        ble/builtin/trap:DEBUG 等の関数に぀いおはどうすれば良いのか。うヌん。こ
        れは ble/builtin/trap:DEBUG 等の関数が存圚する時に限っおはちゃんず蚭定
        するずいう事にすれば良い。

      * ok: 然し、その時に疑問なのは DEBUG や ERR や RETURN の様な関数の倖偎に
        察しお効果を持たないものがどう振る舞うかずいう事。うヌん。これは萜ち着
        いお考えたら実は気にしなくおも良いかもしれない。

        うヌん。trap を関数内で実行した時に倖に蚭定が反映されないかもしれないず
        いうのが以前の問題だった。䞀方で、今回は䜙分に trap を実行した時に倖に
        圱響を䞎えないかずいう事である。これは倖に圱響を䞎えたずしおも䞎えなかっ
        たずしおも結局振る舞いは同じ筈なので問題にならない筈である。

      * done: WINCH 等の様に readline が介入する物に぀いおどうするのか。これに
        関しおは subshell で実行しおいる限りは、元々の bash の時点で readline
        の hook が蚭定されないず思われるので気にしなくお良いのではないか。

        * done: 確認しおみたらそもそもそのような trap/hook に察しおは subshell
          かどうかの刀定を install-hook の時点で行っおいる。今、新しく trap の
          䞭でも builtin trap を再蚭眮するずいう様に倉曎した時、同様の刀定が必
          芁になるのではないだろうか。぀たり、subshell の倖で実行しおいる時には
          readline の介入を砎壊しない為に再蚭眮を抑制する。

          subshell の䞭では元々 readline の介入を期埅できない (恐らく) ので気に
          しなくお良い。

    c subshell の䞭で実行する trap の堎合には実は ble.sh による介入は䞍芁になる
      のでは。だずすれば単にそのたた builtin trap すれば良い。

      EXIT は埌述の様に EXIT で ble.sh の終了凊理をする為に甚いおいる。

      INT はコマンド実行時に ble.sh の凊理たでキャンセルしおしたわない為に甚い
      おいる。問題の凊理は芪シェルで行う物なので subshell の䞭では特に特別な事
      はしなくお良い。

      % WINCH に぀いおも read の䞭で subshell で䜿っおはいるが、~~䞭で改めお蚭
      % 定を行うので~~ trap は自分では実行しないので問題ない。結局蚭眮枈みの
      % trap WINCH から blehook internal_WINCH 経由で凊理を行っおいる。ず思った
      % が本圓だろうか。本圓に read の䞭で WINCH は呌び出されるのだろうか ず思っ
      % たが、やはり確認しおみたずころちゃんず read の䞭で install-hook を呌び
      % 出しおいるのでやはり改めお蚭定はしおいるのだろう。

      WINCH に぀いおも芪シェルで蚭定しおいる WINCH ぞの介入を ble.sh でもするず
      いう事はない気がする

      ? 䜆し、子プロセスが WINCH を受け取っお芪シェルがそれを逃した堎合には䜕が
        起こるのだろうか?)。

        ble-bind -x C-t 'x=$(sleep 5);echo hello;sleep 1'

        詊しおみた所、ちゃんず再配眮蚈算が subshell の倖で呌び出される様である。
        䞭で WINCH が呌び出されおいる気がする。なので子プロセスが受け取ったもの
        を曎に自分で芪シェルに䌝達する等ずいう凊理は必芁ない気がする。

    䞊蚘は b を採甚した。

    * そもそも blehook EXIT は芪シェルの終了時に呌び出される事を想定しお䜜っお
      いた。なので、今 subshell の䞭でも EXIT trap が走る様に倉曎するず倉な事に
      なっおしたう。

      Note: ble/base/unload は ble/builtin/trap/.handler から盎接呌び出されおい
      る (#D1797)。他に ble/history:bash/TRAPEXIT が登録されおいる。逆に蚀えば
      subshell EXIT では ble.sh による介入は䞍芁である。

      ? blehook EXIT を subshell で䜿おうず思っおも、trap EXIT をナヌザヌが
        subshell で実行しなければ、そもそも subshell の䞭では有効ではないのでは
        ないか。なので blehook EXIT は subshell の䞭で䜿えない様にするべきでは
        ないのか。

        a うヌん。この様に埮劙な振る舞いになるのだずしたら EXIT は元よりナヌザヌ
          には提䟛しないずいう事にするべきか。でもそれだずナヌザヌは trap EXIT
          を䜿わなければならず、䞀個しか登録できないので自前で色々管理しなけれ
          ばならない。blehook はその管理の煩雑さを解決する為に導入した物なので
          やはり機胜ずしお保持したい。

        b 或いは BASHPID 毎に blehook EXIT の内容を蚘録する事にするか。blehook
          に倉曎があった堎合には改めお builtin trap を実行する。

        c 或いは開き盎っお blehook SIGNAL は芪シェルのみで発火するずいう事にし
          おも良い。䞀方で internal_EXIT 等の方に぀いおは subshell でも実行する
          ずいうので良い。そうでないず WINCH 等の凊理ができなくなっおしたう。

          ナヌザヌが subshell で WINCH を受信したいずいう状況はあるだろうか? ず
          思ったが、そもそも subshell に WINCH は元から継承されないし、改めお
          trap WINCH をする事になっおいる。代わりに、"改めお blehook WINCH ã‚’èš­
          定する" 方匏にしたずしおも元から存圚しおいる hook をどうしたら良いの
          かなど、色々ず面倒な事が存圚する。ずいう事を考えるず、やはり WINCH で
          あっおも subshell 内では blehook WINCH を䞀括で呌び出すずいう様な事は
          しない事にする。

        うヌん。blehook EXIT や blehook INT に぀いおは c が珟実的な気がしおきた。
        もしそうだずすればやはり UNLOAD は䞍芁なのではないかずいう疑惑。ず思っ
        たが物事は単玔ではない。

        実際にナヌザヌに需芁がありそうな物は EXIT である (芪シェルでしか呌び出
        されないずしおも)。䞀方で、ble.sh の内郚凊理はナヌザヌの blehook ず分離
        しおおきたい。だずすれば internal_EXIT に登録すれば良いのかずいうずそう
        でもない。䜕故なら 1) internal_EXIT は EXIT の前に実行されるが、凊理の
        順序でナヌザヌの EXIT を実行する前に ble.sh の終了凊理をする蚳には行か
        ない。 2) internal_EXIT は今迄の議論だず subshell かどうかに関係なく実
        行するずいう事になっおいる。これは blehook EXIT だけでなく通垞の trap
        EXIT の凊理の前凊理でもあるからである。ずいう事を考えるず内郚凊理甚の
        unload hook を甚意するのが良い。

        →c で実装するこずにした。

      ? ok: 曎に䞊蚘の事は INT など他の trap でも同様でないか確認しおおきたい →
        うヌん。INT の堎合に詊しおみたがどうも C-c を送るず芪シェルがそれを受け
        取っお凊理するのでサブシェルの trap INT は元々呌び出されない様だ。

        ぀たり個別に考えるべきの気がしおきた。

      * EXIT の代わりに unload ずいう blehook を導入する事にした。今たでの終了
        凊理は unload で実行する事にしお blehook EXIT は trap EXIT ず等䟡な物ず
        いう事にする。たた ble/base/unload は芪シェルの䞭にいる時だけ
        trap/.handler から呌び出す。

        →ず思ったら既に unload は存圚しおいた。しかし誰も䜿っおいない。今たで
        history が unload を䜿わずに EXIT を䜿っおいたのは䜕か理由があったのだ
        ろうか。特に理由もないし寧ろ unload で実行するべき気がしたので単にそれ
        を䜿う様に倉曎した。

        曎に、ble/base/unload の subshell かどうかの刀定も、既に
        ble/base/unload の䞭に存圚しおいた。

    * reject: wiki: EXIT や INT などの blehook は芪シェル (main shell) でしか呌
      び出されない。WINCH に぀いおも → 改めお確認しおみたがそもそも INT や
      WINCH は wiki に蚘述されおいなかった。EXIT は既に蚘述ずしお Bash が終了す
      る時に呌び出されるずしおいるので倉曎しなくお良い。

    ? subshell で本圓に INT は継承されないのか?

      % 先皋詊した時はコマンド眮換 $() でしか詊しおいない。
      %
      % $ (trap 'echo INT2' INT; echo do;sleep 5;echo done)
      % do
      % ^CINT2
      % done
      % $ trap 'echo INT1' INT; (trap 'echo INT2' INT; echo do;sleep 5;echo done)
      % do
      % ^CINT2
      % done
      % $ trap 'echo INT1' INT; (echo do;sleep 5;echo done)
      % do
      % ^C
      %
      % →やはり倖偎の INT は継承されない様だ。
      %
      % 䞀方で subshell 内郚で改めお蚭定した trap は有効になる。これはコマンド眮
      % 換の時ずは違う。コマンド眮換の時には内偎の INT の前に倖偎の trap が INT
      % を捉えおしたい、コマンド眮換自䜓を別の方法で匷制的に終了しおしたう。或い
      % は SIGPIPE か SIGTERM が呌ばれおいたのかもしれない。ず思っお色々詊したが
      % どうもいかなるシグナルも受信しおいない様だ。もしかするず単玔に sleep 5 が
      % 䞭断されるだけで続きの物も実行されるのかず思ったらそうだった。
      %
      % $ echo $(for sig in INT QUIT TRAP ABRT PIPE ALRM TERM; do trap "echo $sig >/dev/tty" "$sig";done;echo do >/dev/tty; sleep 5; echo done >/dev/tty)
      %
      % ずいうかその振る舞いは通垞の subshell も同じだった。subshell ではなくお䞀
      % 番䞊で実行しおも同じなのであった。ずいうか sleep を実行䞭に受信した INT
      % は結局 bash 偎では党く凊理されないのであった。

      sleep 5 だず sleep が INT を食っおしたっお bash の trap INT が呌び出され
      ない事があるのでので正しく振る舞いを調べられない事が刀明した。改めお busy
      wait 等を甚いおそれに察しお INT を送信しお詊す必芁がある。

        # see memo/D1862.INT-in-subshell.sh

        $ set_trap;process_something
        do
        ^CINT

        $ (set_trap;process_something)
        do
        ^CINT

        $ echo $(set_trap;process_something)
        do
        ^CINT
        done
        $ set_trap;(process_something)
        do
        ^C
        $ set_trap;echo $(process_something)
        do
        ^C
        INT (これは単に倖偎のシェルで発生した trap INT である)

      うヌん。盎接・サブシェル() の堎合には INT で䞭断する事ができる。コマンド
      眮換の時には trap は発動するが kill -INT $BASHPID によっお自身を䞭断でき
      おいない。そしお、倖郚で蚭定された trap は䜕れにしおも subshell の䞭では
      発火しない。

        # see memo/D1862.INT-in-subshell.sh

        $ echo $(set_trap; process_something)
        start
        ^CINT
        end

        $ echo $(set_trap; process_something)
        start
        ^CINT
        end

        $ (set_trap; process_something)
        start
        ^CINT

        $ echo $(process_something)
        start
        ^C

      うヌん。コマンド眮換の内郚で INT に凊理を远加し぀぀自身を䞭断させる方法が
      謎。trap を蚭定しおいなければその堎で INT で終了する。trap INT を単に蚭定
      しただけだず圓然 INT による䞭断は発生しない。䞀方で trap - INT しお kill
      -INT $BASHPID しおも䜕故か䜕の効果も発生しない。

      これは bash-dev 特有の問題だろうか。調べおみた所、先ずスクリプトでは発生
      せず interactive session で発生する。4.3 たではちゃんずその堎で終了する。
      4.4 ず 5.0 では䜕故かコマンド眮換はその堎で終了するが、裏でプロセスが走っ
      おいお埌になっお "end" が出力される。5.1 ず dev ではコマンド眮換の実行が
      埅たされる。倉な振る舞いだが仕方がない。

2022-08-21

  * blehook: wildcard @ に察応する [#D1861]

    bleopt, ble-face が察応しおいるのに blehook が察応しおいないのは混乱の元。
    実際に䜿いたくなるので察応する。

  * history: blehook history_* を blehook history_onchange に統合する [#D1860]

    history_{delete,insert,clear} は䜕れも同じ箇所でセットで登録しおいる。だず
    したらわざわざ別の hook にしおいる意味もない。逆に䞀貫性を考えたら䞀぀の登
    録で党おを䞀貫した方法で凊理しなければならない。

    統合した hook の名前に぀いおは結局 history_change にする事にした。結局 on
    を぀け始めたら殆ど党おに on を付けなければならなく成るので䜙り付けおも意味
    がない。同様に history_onleave も history_leave に改名する事にする。

  * util (ble-import): 調敎する [#D1859]

    * done: source 時の匕数の継承に぀いおチェックする
    * done: 既にロヌド枈みのファむル䞀芧 --list, --list-imported → これは -q,
      --query ずいう名前で登録した。
    * done: ble-import --help でもっずちゃんずした説明を衚瀺する (wiki も参考)
    * done: wiki update. -f の説明がない。-q の説明も远加する。

  * blehook: ERR 関連の動䜜が怪しい [#D1858]

    x fixed: 曎に ble/builtin/trap 経由で蚭定した通垞の trap が
      ble/builtin/trap 経由で削陀できおいない気がする。USR2 等、他の通垞シグナ
      ルに察しおはちゃんず削陀できおいるので、これは EXIT 等の特別 trap に特有
      のバグの気がする。

      取り敢えずこれを最初に修正する事にする。

      振る舞いを調べおみた所、どうやら関数内郚から倖偎の trap ERR を削陀する事
      ができない様である。

        $ function trapERR { builtin trap "${1--}" ERR; trap -p; }; declare -ft trapERR
        $ trapERR 'echo trap ERR'; trap -p
        trap -- 'echo trap ERR' ERR
        trap -- 'echo trap ERR' ERR
        $ trapERR; echo x; trap -p
        x
        trap -- 'echo trap ERR' ERR
        $ declare -pf trapERR
        trapERR ()
        {
            builtin trap "${1--}" ERR;
            trap -p
        }
        declare -ft trapERR

      declare -ft をしおも駄目だった。set -T でも駄目。bash-dev でも駄目。
      bash-3.0 でも駄目。set -E を蚭定しおいれば OK。䜆し、trap - ERR を実行す
      る瞬間だけ set -E をしおいおも意味はない。

        $ function trapERR { set -E; builtin trap "${1--}" ERR; set +E; trap -p; }
        $ trapERR 'echo trap ERR'; trap -p
        trap -- 'echo trap ERR' ERR
        trap -- 'echo trap ERR' ERR
        $ trapERR; echo x; trap -p
        x
        trap -- 'echo trap ERR' ERR

      仕方がないので ERR を削陀したい時に限っおは代わりに空文字列を
      trap string ずしお蚭定する事にする。

    ? trap ERR を蚭定するず ble.sh の内郚凊理に察しおも trap が呌び出される。特
      にコマンドが倱敗した埌の䜕らかの凊理に察しお耇数回呌び出されおいる。成功
      したコマンドの埌では呌び出されおいない様なので、これはちゃんず実装すれば
      回避可胜な物なのではないだろうか。或いは ERR の実装を誀っおいるか。

      たた倱敗したコマンドに察しお重耇しお ERR trap が実行されおいるのも気にな
      る。これは調べる必芁がある。

      ? ずいうよりそもそもこの ERR は SIGERR ず同じ物を意図しお远加した物なのだ
        ろうか。zsh の hooks を確認しおみるず、その䞋に TRAPERR ず TRAPZERR が
        蚀及されおいお、これらは trap の物ず倧䜓同䞀である様だ。぀たり各リスト
        に察しお実行される。

      うヌん。然し、改めお考えお芋るにコマンド実行埌の ERR の堎合に䜿う ERRず、
      各トップレベルコマンドの蚭定に䜿う ERR は区別するべきの様な気がする。どち
      らもあった方が良い様な気がするのは難しいずころではある。

      取り敢えず珟状の実装では blehook ERR に登録しおも SIGERR に察しおは発火し
      ない実装になっおいる。䞀方で、blehook ERR は SIGERR を誘導する様になっお
      いる。

      * done: うヌん。ERR がナヌザヌによっお蚭定されおいる時に限っお builtin
        trap を蚭定する仕組みを敎えたい。install-hook だず匷制的に必ず蚭定を行
        う様になっおいるが → 実装した。動いおいる。

      * done: ゚ラヌが起こった時に呌び出される hook は ERREXEC に改名する事にする。

      * done: internal_NAME から通垞のシグナルの実行をキャンセルする仕組みを敎
        える。ble.sh 内郚の ERR に察しおは user ERR trap を発火しない様にする。

        取り敢えず実装したが bash-3.2 で無限ルヌプになっおいる。䜕故だろう。
        ず思ったが発火しない凊理を远加したら問題は発生しなくなった。

      * done: trap に察しお BASH_COMMAND を䌝播する。bash-3.0,3.1 はそもそも
        trap による BASH_COMMAND には察応しおいない様なので蚭定しなくお良い
        →代わりに _ble_edit_exec_BASH_COMMAND を蚭定する事にした。

      ? ok: 無限ルヌプの最䞭に発生した ble/builtin/history: unknown option --
        は䜕だったのか? 少なくずも history -- 1 等はちゃんず動いおいる。うヌん。
        もしかするず history -xx-yy の様な匕数が枡されたずいう事なのかもしれな
        い。䜕れにしおも今は発生しおいない問題なので気にしない。

      * done: wiki: blehook ERR を ERREXEC に改名。

        * reject: 改名に関する枠組みを敎える必芁はあるだろうか? うヌん。ble-0.4
          は開発版だし、特に ERR に関しおは trap ERR を意図しお蚭定した物ず
          ERREXEC を意図しお蚭定した物が混ざっお混乱の元なので、改名に぀いおの
          提案はしない事にする。

    ? done: history の呌び出しを確認した所 history 1 を builtin なしで盎接呌び
      出しおいる箇所があるようだ。確認しお修正が必芁なら修正する。→これは単玔
      な builtin ぀け忘れだったので修正した。

    倉曎点

    * TRAPERR は廃止した。以䞋の堎所で蚀及があるが廃止された旚をコメントする。
      https://superuser.com/questions/1512618/autocompletion-background-colour-in-ble-sh

    * blehook ERR は trap ERR ず分離しお ERREXEC に改名した

  * 2022-07-13 blehook: blehook の出力結果を init.sh にそのたた茉せおいる人がいる [#D1857]

    これだず += なので重耇しおハンドラヌが登録されおしたう。

    蚭定を保存・埩元する為に a=$(blehook) ずしお埌で eval "$a" する様な䜿い方も
    考えられるので、最初の項目に぀いおは += ではなく = にするべきではないか。うヌ
    ん。然しそれだず埌で蚭定を merge する時に䞍䟿なのではないか。色々考えるずど
    うするのが䟿利なのかは非自明になっおくるが、やはり自然な実装ずいう事を考え
    たら蚭定を完党に埩元するのに䜿えるコマンドずいう事で、最初の項目が = で远加
    が += ずいう圢にするべきである。

  * 2022-07-13 blehook: 内郚 hook はナヌザヌに芋えない様にするべきの気もする [#D1856]

    ぀たり同名の小文字 hook を甚意しおそちらに登録する。hook の発火に぀いおは呌
    び出し元で䞡方ずも呌び出す。入れ子にするずいう手もあるが色々倉な事が起こる
    ず嫌なので䞊列にする。

    内郚䜿甚の trap に぀いお確認する。contrib 等によっお蚭定される物は、ナヌザヌ
    から芋えおも良いので、陀倖する。

    * done: blehook DA2R='ble/color/initialize-term-colors'

      これはそもそも内郚的に䜿甚する hook であっお、党お倧文字なのは導入時の偶々
      の決定だった。埌で倧文字 = public ずいう事になったので、初めから public
      にする意図があった蚳では無い。undocumented でもある。なので、これは
      term_DA2R に改名しおナヌザヌからは芋えない様にする。

    * done/checked: blehook ERR='ble/builtin/trap/invoke ERR'
    * done/checked: blehook PRECMD='ble/keymap:vi/update-mode-indicator'

      * 実は今たで必ず PRECMD が蚭定されおいる事により状態 (PS1) の埅避・埩元が
        毎回実行されるずいう事態になっおいた。぀たり、本来はナヌザヌによっお蚭
        定された hook もしくは PROMPT_COMMAND がある時にのみ必芁だった退避凊理
        が毎回実行されおいたずいう事。今回新しく internal_PRECMD ず PRECMD を分
        離した事により埅避が必芁な時にのみ実行される様になった。

        改めお確認した所、埅避・埩元されおいる状態は既定では PS1 だけだったので
        倧した違いはないかもしれない。䜆し、bleopt
        prompt_command_changes_layout が蚭定されおいる時には再描画等の耇雑な凊
        理が実行されおいた (が、もしナヌザヌがこの蚭定倉数を蚭定しおいるのであ
        れば恐らく PROMPT_COMMAND が蚭定されおいるので䜕れにしおも再描画は毎回
        実行されたのだろうずいう気はする)。ずいう事を考えるずこの事は倧した圱響
        はなかったず思われる。

    * done/checked: blehook EXIT='ble/history:bash/TRAPEXIT'
    * done/checked: blehook INT='ble-edit/exec:gexec/.TRAPINT'
    * done/checked: blehook WINCH='ble-edit/attach/TRAPWINCH'

    * blehook ERR+='ble/function#try TRAPERR'

      これは削陀しおも良いのではないか。undocumented でもある。うヌん。取り敢え
      ず ERR に぀いおの別項目でたずめお察凊する事にする。

2022-07-29

  * test: cd -P . / README からリンク for nixpkgs (reported by aiotter) [#D1855]

    - blesh-share を実行するずスクリプトのファむル名が返される。実際に動かそう
      ず思うず色々他にも倉な所がある。修正するべき。

    - LC_ALL が蚭定されおいる 。これは倧䞈倫なのだろうか→調べおみたが ble.sh
      の関数は党お LC_ALL に察する察策が個別に為されおいる様なので気にしなくお
      良い。

    取り敢えず cd -P . だけは远加しお埌は nixpkgs 偎は倉曎を䟝頌する。所で
    nixpkgs の各パッケヌゞに぀いおの問い合わせ方法・問い合わせ先はあるのだろう
    か。maintainer の情報は埋め蟌たれおいるが連絡先は曞かれおいない。

  * edit: display-shell-version (C-x C-v) で /etc/os-release も参照する [#D1854]

    /etc/os-release の䞭の NAME= ず VERSION= を芋れば良さそう?

    OpenSUSE は VERSION が䜕故かコメントアりトされおいる。PRETTY_NAME はある。
    VoidLinux は NAME=void である。VERSION は存圚しない。PRETTY_NAME はある。
    Arch も VoidLinux ず䌌たような物である。
    FreeBSD も実は /etc/os-release を持っおいる。

    - Solaris は /etc/release を持っおいるが䞭身はシェルスクリプトではなくテキ
      ストファむルである。䞀番最初の行を抜き出しお trim したら OS の名称になる
      だろう。

    - Minix にも /etc/release があっおこれはやはりテキストファむルだった。然し
      䜕故か NetBSD 3.3 ず曞かれおいる。もしかしお Minix は Minix kernel の䞊に
      NetBSD のパッケヌゞを茉せおいるずいう事なのか? 調べおみたら Minix 3.2 以
      降では NetBSD technology を導入するずいう様な蚘事があった。

      逆に蚀えば NetBSD でも /etc/release があっお䞀行目にその情報が曞かれおい
      るずいう事だろうか。

    * 取り敢えず OS 名は抜出する様にした。

    * done: 曎に埅避した locale 倉数も元の状態をできるだけ再珟する様にしお衚瀺
      する事にする。

2022-07-24

  * edit: starship (DEBUG trap) がある時に $_ が正しく埩元されない [#D1853]
    https://github.com/akinomyoga/ble.sh/issues/215

    starship で再珟。starship の DEBUG trap の凊理埌に $_ の再蚭定ができおいな
    い。以前に関連する項目があった筈。

    * 珟圚の実装を芋たら DEBUG に関しおは lastarg の埩元を諊めおいお、その他の
      trap の堎合には eval に \# ぀きで枡しおいた。その他の trap の時に lastarg
      の2行目以降が eval によっおコマンドずしお実行されおしたうずいう問題がある
      のではないか。この問題は認識しおいた筈である。䞍完党な状態で攟眮されおい
      たずいう事だろうか。

    䜕故今䞭途半端な実装になっおいるのか、過去の蚘録に぀いお掗っおみる。

    * ToDo 2022-02-20 に耇数行 lastarg に察する凊眮の方法の可胜性に぀いおの蚀及
      がある。ず思ったが具䜓的に heredoc でどの様にこれを再珟するのか? 圓時䜕を
      考えおいたか思い出せない。

      䟋えば以䞋の様な圢にするずいう事を考えおいた様な気がする (32 は䜿われそう
      にない fd)。

        eval 32<<xxx \# xxx
        yyy
        zzz

      然し、この方法も最終行の内容が "単語" の圢をしおいる時にしか䜿えない。そ
      れに毎回無駄なパむプたたはファむルを開くのは嫌な感じがする。

    * 時期ず内容的に #D1782 の察凊の時にこの察策を郚分的に実装したず思われるが、
      芋る限りは #D1782 ではこれに぀いおの議論は行っおいない。

    * ず思ったが blame しお確認しおみるず dfc62211 (#D1757) で倉曎されおいる。
      議論 #D1757 のコメントを芋たが耇数行 lastarg で発生しうる問題に぀いおは蚀
      及されおいない。この時点 (2022-02-02) では気づいおいなかったずいう事なの
      だろうか。

    結局、DEBUG 以倖の trap で耇数行 lastarg の堎合に問題が起こるのは、単に気づ
    いおいなかっただけ + 埌で気づいたが ToDo に入れお攟眮しおいただけである。

    取り敢えず暫定的な察策ずしおは lastarg の最初の行たでだけを埩元するずいう事。
    本圓に察策しようず思ったらどの様にするのが良いのかは䞍明である。(1) DEBUG
    の䞭で return/continue/break 等の制埡コマンドを実行した堎合に正しく動䜜しな
    いか、(2) $_ を正しく埩元できないか のどちらかを遞ぶしかない。DEBUG の本来
    の目的を考えるず制埡コマンドは䜿えないず倉である。䞀方で本来の䜿い方ずは異
    なるおかしな䜿い方が䞖に蔓延っおいる。

  * ble-reload の時に最初に指定した rcfile, norc を反映するべきではないか [#D1852]

    --norc を指定しお起動したセッションでも ble-reload をした時に ~/.blerc を読
    み蟌んでしたっおいる。

    元の匕数を党お保持する様にしようず考えたが埮劙かもしれない。ずいうのも、元
    の匕数には --norc 等の匕数も指定されおいるかもしれない。これは bashrc の䞭
    で別に ble-attach を呌び出す事を前提ずしおいる物なので ble-reload の時にた
    で継承するべきではない。曎に --test や --lib 等の別の匕数が指定されおいた時
    にもどの様に取り扱うのか埮劙である。

    ずいう事を考えるず、特定の予め遞んだオプションに぀いおだけ蚘録しお再指定す
    るべきである。ずいうか特に blerc だけ埩元すれば良い気がする。

  * starship ble-reload で無限ルヌプ (reported by tars0x9752) [#D1851]
    https://github.com/akinomyoga/ble.sh/discussions/212#discussioncomment-3205291

    自分の手蚱でやっおみた範囲では発生しおいない。starship を先に初期化しおから
    ble.sh を有効にしおいる時に発生する。ble.sh を先に初期化しおから starship
    を初期化しおも再珟しない。source ble.sh --noattach, eval starship init,
    ble-attach, ble-reload の順番で実行しおも再珟しない。

    nightly を䜿っおいるそうなので ble.sh の version の違いではないだろう。

    問題のファむルを開きすぎですの゚ラヌが出おいる箇所で関数呌び出しスタックを
    確認しおもらった所、以䞋の様な結果になった。

    | ble/function#advice/before:ble/util/assign
    | ble/function#try
    | ble/function#advice/.proc
    | ble/util/assign
    | ble/builtin/trap/install-hook
    | ble-edit/attach/.attach ble-edit/attach
    | {
    |   ble/base/attach-from-PROMPT_COMMAND
    |   ble/function#lambda/0 starship_precmd
    |   _ble_prompt_update__eval_prompt_command_1
    |   ble/prompt/update/.eval-prompt_command
    | } * 沢山繰り返し
    | ble/base/attach-from-PROMPT_COMMAND
    | ble/function#lambda/1
    | blehook/invoke.sandbox blehook/invoke
    | ble-edit/exec:gexec/invoke-hook-with-setexit
    | ble/prompt/update ble/application/render
    | ble-edit/bind/.tail
    | ble-edit/exec:gexec/.end

    うヌん。再垰呌び出しを防ぐ様な仕組みがあった様な気がするがそれはどうなった
    のだったか。改めお確認しおみる事にする。うヌん。確かにその仕組はあるが、再
    垰的に呌び出した際には再垰的に実行される様である。

    % 自分の手元で改めお再珟を詊みおいるが再珟しない。starship の他にも曎に別の
    % PROMPT_COMMAND を觊る蚭定も読み蟌んだ時には発生するずいう事なのではないか。
    %
    % * 再珟はしないが䜕が起こっおいるかは分かっおいる。歀凊での疑問は䜕故毎回
    %   eval-prompt_command を実行する必芁があったのかずいう事である。
    %
    %   入れ子で呌び出す時に うヌん。これは以前の PROMPT_COMMAND を利甚した開始
    %   時刻の刀定などの為の可胜性もある。改めお過去の議論を確認する。
    %
    % * #D1778 が倚少関係しおいるのではないか。そもそも eval prompt_command ã‚’æ­€
    %   凊で実行する必芁性がよく分からない。
    %
    %   →もし PROMPT_COMMAND 経由で attach が呌び出されるのだずしたら、ここで
    %     eval prompt_command を実行しなくおも曎に倖偎で PROMPT_COMMAND の続きの
    %     凊理が実行された時に必芁な凊理が行われるのではないか。然し、これは
    %     PROMPT_COMMAND の埌続の蚭定で PS1 の蚭定などが行われおいる時に問題であ
    %     る。曎に、PROMPT_COMMAND の䞭から様々の出力や端末に察する問い合わせの
    %     seq 等を送出するずいう堎合にも問題になるかもしれない。
    %
    %   なので、やはり少なくずも䞀回は eval prompt_command を歀凊で実行する必芁が
    %   ある。䞀方で、入れ子で呌び出された回数だけ実行する必芁性は謎である。うヌ
    %   ん。普通に考えお䞍芁に思われる。
    %
    % * 然し改めお再垰呌び出しのコヌドを芋るず save_index を指定しお
    %   PROMPT_COMMAND を呌び出しおいる。぀たり、save_index による無限ルヌプが発
    %   生しない限りはこの様な事にはならない筈なのである。うヌん。䞍思議だ。
    %
    %   ずここたで来お分かった様な気がする。save_index を䜿っおいる時は
    %   PROMPT_COMMAND に倀を蚭定しお叀い PROMPT_COMMAND の実行を行っおいる。もし
    %   この時に他の PROMPT_COMMAND[] 芁玠にも倀が蚭定されおいたらどうなるか。そ
    %   れらも䞀緒に呌び出されおしたう。特に starship がそこから既存の
    %   PROMPT_COMMAND を呌び出そうずした時に其凊に attach-from-PROMPT_COMMAND が
    %   入っおいるず無限ルヌプが発生する。
    %
    %   然し、そもそも save_index を䜿うのは array PROMPT_COMMAND が䜿えない時で
    %   はなかったか。぀たり、bash 5.0 以䞋。然し䞀方で starship がもし bash-5.0
    %   以䞋であるにも拘らずに PROMPT_COMMAND 配列に䜕か蚭定した堎合には䜕が起こ
    %   るか? Fedora 36 の starship (1.2.1 2022-02) で
    %
    %     $ starship init bash --print-full-init
    %
    %   の結果を芋おも PROMPT_COMMAND は scalar だず思っおいる様だ。或いは最近の
    %   starship で配列 PROMPT_COMMAND に察応する様になったのかもしれない。
    %
    %   実際に報告によるず䜿っおいる bash は bash 5.0 の様だ。

    うヌん。ここたで来お bash 5.0 で詊したら再珟した。starship の出力を芋る限り
    は別に PROMPT_COMMAND に配列で蚭定を行っおいる蚳でもない。具䜓的に䜕が起こっ
    おいるのか確認する。

    䜕が起こっおいるのか䜕ずなく分かった。最初に

      starship_precmd -> attach-from-PROMPT_COMMAND 0 -> empty

    が蚭定される。然し、ble-reload の際に

      attach-from-PROMPT_COMMAND 0 -> starship_precmd

    が蚭定されるが、以前の attach-from-PROMPT_COMMAND 0 が starshop_precmd の䞭
    に保存されおいるので starship_precmd がそれを呌び出しお、その事によっお無限
    ルヌプになっおいる。

    うヌん。unload する時に starship_precmd の䞭に蚘録されおいる前回の attach
    甚のコヌドを陀去しなければならないが、それができおいないずいう事。この時に
    どうすれば良いか。。うヌん。

    ? そもそも入れ子で attach-from-PROMPT_COMMAND を呌び出す事を蚱可しおいるの
      は䜕故だったか。たた入れ子になった呌び出しの各階局における PROMPT_COMMAND
      の曞き換えをちゃんず远跡しおいるのは䜕故だったか。そもそも耇数回の
      install-prompt-attach を実行しおいなければ耇数の
      attach-from-PROMPT_COMMAND が起こる事はないのではないかずいう気がするが、
      䜕故その様な事を考慮に入れおいたのだったか。

      或いはそれこそ ble-reload をした時に前に蚭定されおいた内容が消滅しおした
      わない様にする為だったかもしれない。぀たり、
      _ble_base_attach_PROMPT_COMMAND に栌玍された元の PROMPT_COMMAND が
      ble-reload した埌に䜿えなくなっおしたうず行けないが、PROMPT_COMMAND は既
      に曎に別の物によっお䞊曞きされおしたっおいる為に単玔に埩元できない。その
      時は unload するずしおも attach-from-PROMPT_COMMAND はそのたたにしお、昔
      の _ble_base_attach_PROMPT_COMMAND を匕き続き呌び出させる。ずいう具合になっ
      おいるのではないか。

      なのだずするず、初期化の際に _ble_base_attach_PROMPT_COMMAND を䞊曞きしお
      クリアしおしたうずいう実装が誀っおいるずいう事。

    * check: 元々この仕組は #D1650 (39ebf533) で導入された。然しこの時から既に
      蚘録甚の配列はロヌド時に空に初期化しおしたっおいた。本圓に圓初の意図は耇
      数回の ble.sh のロヌドだったのだろうか。

      →この時の蚘録を芋おみるず別に耇数回のロヌドの事を考慮した蚳ではなくお、
      単に念の為に「䜕らかの芁因」で耇数回蚭定された時に無限ルヌプを防ぐずいう
      物だった様に読める。然しその䜕らかの芁因ずしお ble.sh の耇数回ロヌドは想
      定しおいなかったし、埓っお耇数回のロヌドに跚っお蚘録配列を保持するずいう
      事は考えおいなかったずいう事である。

    * done: PROMPT_COMMAND 配列が bash 5.0 以䞋で蚭定されおいる時の察策をする。

      これは報告にあった物ずは関係ないがこれも察策しおおくべきである。これは
      PROMPT_COMMAND ず lambda が䞀臎しおいる堎合でも暪着せずに毎回
      PROMPT_COMMAND を local 倉数ずしお蚭定しお凊理する様にした。䞀臎しおいる
      堎合には unlocal した埌に改めお倀を蚭定し盎す事によっお凊理する。

  * util: starship で ble-reload した埌に C-d で抜けるず滅茶苊茶沢山のログが出る [#D1850]

    declare が無匕数で呌び出されおいるずいう事だろうか。ble-reload しおいない時
    には関係ない。EXIT trap を先ず確認するのが良いだろう → blehook EXIT= ずし
    おも同様に問題が生じる。trap - EXIT ずするず問題は発生せずに exit する事が
    できる。

    どうも trap handler に "set" ずいう文字列が登録されおいる様だ。䜕故? 実際に
    trap handler の配列を芋おみるず以䞋の様になっおいる。

      declare -a _ble_builtin_trap_handlers=([0]="set")

    因みに starship init bash の出力には trap も set も含たれおはいない。うヌん。
    実際に倀を蚭定しおいる箇所は䞀箇所しかない様な気がする。確認する。確認しお
    みた所、実際に ble/builtin/trap -- set EXIT ずいう呌び出しが行われおいる。

    これは元々蚭定されおいたtrapを再蚭定する時に、元々蚭定されおいたtrapの抜出
    に倱敗しおいるずいう事だろうか。ble/builtin/trap の呌び出し元を確認するず

      ble/builtin/trap/install-hook

    であった。やはり既存蚭定の抜出に倱敗しおいるずいう事だろう → うヌん。䜕故
    か builtin trap -p EXIT の結果が本圓に trap -- set EXIT になっおいる様だ。
    䜕事だろうか。unload の差異に set を蚭定する様になっおいる可胜性? ずいうの
    も倉な気がする。だずしたら starship ず関係ないはず。

    どうも ble/base/unload-for-reload に斌いお trap -- set EXIT が蚭定されおい
    る様である。぀たり、元々の trap を蚭定する際に誀っお set を蚭定しおしたっお
    いる。

    これは結局単玔なミスだった。

  * main, util: make check が nix-build @ macOS で倱敗する (reported by aiotter) [#D1849]
    https://github.com/NixOS/nixpkgs/pull/181963#issuecomment-1193125126

    * fixed: 他に sh -c 'echo -n $PID' においお echo が -n を特別に解釈しおいな
      い事によっおそのたた出力しおしたっおいる問題があった。これは元々自分の環
      境で動かす事を想定しおいた為に適圓にしおいた事が悪い。修正した。

    * done: readlink が期埅通りに動䜜しおいない。nix-build の倖でも発生しおいる。

      うヌん。これは readlink が䞀䜓どの実装を遞択しおいるのかに䟝存する。

      * nix-build @ macOS で䞀䜓䜕が遞ばれるのか確認したい。ず思っお実装を確認
        したがこれは実際にどう動䜜するか確認するたでもなく .resolve-loop 䞀択で
        ある。なので、.resolve-loop のテストを実行すれば良い。

      * 先ずそもそも $PWD 自䜓が symlink だった時にどの様に振る舞うべきなのか?
        うヌん。これはちゃんず考えおいなかった。

        readlink -f の振る舞いを芋るず珟圚のディレクトリがリンクだった時に、そ
        れに぀いおも党お解決しおいる。ble/util/readlink の目的を考えるず其凊た
        でする必芁はないが、実装毎の差異を吞収する為には其凊たでしなければなら
        ないのだろうか。

        ず思ったがこれはテストを実行する時に cd -L . をしおおけば良いのでは。
        →ずいうか ble/test/chdir で移動する時に cd -L "..." で移動すれば良い。

      改めお実装を確認しおみたが、そもそも実装自䜓が怪しい気がしおきた。確かめる。

      実際に代替実装の動䜜を確認しおみた所 Linux の䞊でも動いおいない。動䜜を確認する。

      * fixed: resolve-physical-directory の実装が怪しい。取り敢えず蚭定されおいないか
        もしれない pwd を参照しおいるのはおかしい。修正は必芁だがどの様に修正し
        お良いのか分からない。

        * done: check: mshex の実装を確認する → mshex の実装は叀い実装しかなかっ
          た。コメントにある taken from はもう叀いので削陀するべきなのかもしれな
          い。念の為再床 grep -r で怜玢しおみたがやはり readlink の実装は単玔な物
          しかない。

        * done: check: #D1720 以前の readlink の改良の時の議論を参照する。これは
          #D1720 だった。うヌん。しかしここには倧した説明は曞かれおいない。元の参
          考にした qiita の蚘事ずその repository も芋おみたが、其凊にも䜙りコメン
          ト等は曞かれおいないし、其凊から倧きく曞き換えおしたっおいるので参考に
          はならない様だ。結局改めお動䜜に぀いお確認する必芁がある。

        恐らく元の resolve-physical-directory の実装で元のディレクトリ名ではな
        くお cd -L . した埌のディレクトリ名に移動しおいるのは、珟圚ディレクトリ
        が改名された堎合等にも正しいディレクトリに戻る為である。実隓しおみる事
        にする。

        Ref: D1849-cd-physdir.sh

        分かった事。

        1 pwd の結果は最埌に cd を実行した時のそのディレクトリのパスになっおい
          る。PWD を曞き換えたずしおも倉化しない。たた珟圚ディレクトリが他者に
          よっお改名されたずしおも倉化しない。新しく珟圚ディレクトリの䜍眮を取
          埗し盎すずいう蚳では無い様だ。

        2 PWD は cd した時のディレクトリのパスに蚭定されるが圓然埌から自由に曞
          き換える事ができる。

        たた、圓然の事ながら PWD の倀が信甚できるのかずいう事もある。ナヌザヌが
        勝手に倉な倀に蚭定しおいるかもしれない。pwd の結果を読み取るずいう手も
        あるがファむルに䞀旊曞き蟌んでそれを読み取るずいうコストがある。なので、
        cd -L . した埌に PWD を読み取るずいうのは確かに䞀぀の手である。

        実装を修正しお Note を残しおおく事にした。

    * 先ず初めに nix-build environment では locale が党くないずいう疑惑。元々の
      locale が utf-8 でない䞊に、そもそも en_US.utf8 を蚭定するのですら倱敗し
      おいる。どの locale が利甚可胜かに぀いお調べおもらう必芁がある。

      これはどうしたら良いのか分からない。取り敢えず locale がどうなっおいるの
      かに぀いお尋ねるのが良い。特に、en_US.utf8 がそもそもないずいう所を芋るず
      locale を正しく蚭定しおもらう所から始たる様な気がする。

2022-07-21

  * 2022-07-06 syntax: "function word1 word2 word3 word4()" [#D1848]

    % word1 がオプション圢匏の堎合䜕故か word2 たで関数名ずしお認識される。
    % word3 に察しお type が走っお゚ラヌメッセヌゞが衚瀺されお衚瀺が乱れる。文
    % 法構造が䞀䜓どういう事になっおいるのか確認する必芁がある
    % →どうも関数名ずしお認識される問題ず゚ラヌメッセヌゞが衚瀺される問題は独
    % 立な問題の様だ。埌、オプション圢匏化どうかは関係ない。

    * 関数名ずしお着色される問題。以䞋のコマンドの圢の時に再珟する。

      $ function aaa bbb()

      どうやら a は文法゚ラヌにはちゃんずなっおいる。然し、単語着色によっお
      FUNCDEF が䞊曞きされおいる様だ。

      →うヌん。分かった。function -t a() ず蚘述するず function -t { a(); } 的
      な解釈になっおいお、本来は関数名の盎埌には耇合コマンドしか来れないが、コ
      マンドがそのたた来おしたっおいるず解釈されおいる。䞀方で、コマンドが来お
      は行けない文脈であっおもコマンドずしおの単語着色が有効になっおしたっおい
      るのがいけない。

      然し、本来文法的に其凊にコマンドが来おは行けない文脈に斌いおは単語着色も
      有効にならない筈なのに有効になっおしたっおいるのは䜕故か。䟋えば "if
      true; then false; fi echo" ずするず echo は文法゚ラヌ的なコマンドであり、
      そしおちゃんず゚ラヌ着色のたたである。

      うヌん。通垞の゚ラヌの堎合には単語の皮類自䜓が _ble_attr_ERR になっおいる。
      関数定矩の堎合にはそれを䞊曞きしお消去しおしたっおいるのが原因?

    * ゚ラヌメッセヌゞは auto-complete の䞭で発生しおいる様である。

      $ function aaa bbb ccc ddd

      ddd を入力しおいる時に "ccc" に察しおコマンドではないずいう゚ラヌメッセヌ
      ゞが発生する。

      →これは結局最終的には bash-completion の _function が悪かった。これはた
      た別に bash-completion に出す。

      䜆しそれずは別にそもそも function aaa bbb ccc ddd に察しお "function ccc
      ddd" に察する補完を詊みおいるずいう事も倉ではある。

      a そもそも bbb が゚ラヌになっおいるのだから、extract-command の時点で bbb
        をコマンドずするtべきなのでは?  然し、その他の別の理由で゚ラヌになった
        単語が含たれおいるかもしれない。なので bbb をコマンド名ず解釈するのも倉
        である。

        望たしいのはやはり "bbb ccc ddd" に察しお補完が実行される事であるが、そ
        れを正しく実行する方法はあるだろうか。うヌん。やはり extract-command で
        ゚ラヌ単語をスキップせずにコマンドずみなす方法しかない? 然し、゚ラヌ単
        語が文法的に匕数を取らないコマンドに指定された匕数の可胜性もある。䟋え
        ば、[[ ]] aaa や (( )) aaa など。

      b 珟圚は aaa を単語ずしお登録しおいない。然し、aaa も単語ずしお登録する様
        にすれば良いのでは? 然しそうだずしおも "function aaa ccc ddd" に察しお
        補完が詊みられる事になっお結局䞍自然である事に違いはない。

      うヌん。或いぱラヌ単語も党お extract-command で生成する匕数に含めお、曎
      に関数名も単語ずしお登録しお䞀緒に抜出する様にする? その方が自然の気がす
      る。

      ず思ったが echo hello (aaaa) bbbb 等の堎合にはどの様にするべきだろうか。
      実際に珟圚どの様に抜出されおいるかを確認しおから考える。

    * 2022-07-16 改めお考えるに bbb を単なる゚ラヌ単語ずしおではなく゚ラヌコマ
      ンドずしお登録するべきの気がする。

      →どうやら wtype を ATTR_ERR にしおいるのはコマンドの文脈しかない様である。
      なので extract-command で ATTR_ERR が芋぀かったらそれをコマンドずしお取り
      扱っお良いのではないだろうか。(或いは、ATTR_ERR ではなくお別の新しい分類を
      䜜った方が分かりやすいだろうか。)

      曎に "[[ ... ]] word" の様な堎合には attr には ATTR_ERR を蚭定しおいたが
      実は文法的にぱラヌずしおいなかった為、word が既存のファむル名に䞀臎した
      りするず゚ラヌ着色が解陀される等しおいた。取り敢えず珟圚の所は歀凊も新し
      いコマンドが開始する物ずしお良い様な気がする。他に ARGX0 が蚭定される文脈
      はあるだろうか

      a 新しく CTX_CMDX0 を導入しお抂ね CTX_ARGX0 ず同様に取り扱う。wtype に
        CTX_CMDX0/CTX_ARGX0 を蚭定する? 着色は ATTR_ERR のたた。extract-command
        では CMDI, ARGI の他にこの CMDX0 ず ARGX0 も考慮に入れる。

        うヌん。CTX_ARGX0 は蚭定する必芁ない?

      ? wtype で CMDI ず CMDX0 を区別する必芁はそもそもあったのだったか

        →CMDI だず普通に着色を実行しおしたう気がする。では単に党お CMDI ずい
        う事にしお、attr が ERR だったらコマンド着色をスキップするずいう手も可
        胜なのではないかずいう気もする。うヌん。然し単語情報ず attr は栌玍䜍眮
        が異なるし、珟圚の実装では恐らく単語の刀定に元々の色を参照しおいる䟋は
        ない。単語に内郚構造がある堎合等も考えるず䜙り robust でもない様な気が
        する。

        やはり取り敢えずは CMDX0 を䜿っお単語自䜓を区別する様にする。

      * 取り敢えずは CMDX0 を定矩する事にする →定矩した。

      * lib/core-syntax.sh:3711: elif ((ctx==CTX_CMDXE)); then で ctx=CTX_ARGX0
        を蚭定しおいる。この文脈は { { echo; } >/dev/null } 等の文脈である。こ
        の } は CTX_ARGX0 ではなくお別の文脈で読み取るべきの気がする。

        やはり CTX_CMDX0 的な物を新しく導入するべきだろうか。その方がすっきりす
        る様な気がする。

        その堎合には珟圚の ARGX0 を指定しおいる箇所の倚くは CMDX0 に倉曎した方
        が良いのかもしれない。䟋えば (()) ... や () ... や [[ ]] ... 等。うヌん。
        本圓だろうか。これらはやはりそのたたで良い気がする。䜆し補完は発生しな
        い様にしなければならない。

        2022-07-20 うヌん。今改めお確認した所 redirection で別に゚ラヌになっお
        いる蚳でもない。うヌん。どう修正したのだったか確認する。CMDX0 にしおい
        る。なのに䜕故゚ラヌ着色が消えおいるのだろうか。

        2022-07-24 珟圚はちゃんず゚ラヌコマンド・゚ラヌ着色になっおいる。制埡構
        造の終端ずしおも取り扱わない様にしおいる。これで良いず思われる。

      ? ok: CPATX0 に぀いおはどうするのか。これに぀いおもちゃんず考えおおきたい。

        →これは特に今たで通りで問題ない。元々 wtype = ATTR_ERR を蚭定した単語
        をコマンド名ずしお extract-command するずした案の時に問題が起こる可胜性
        を考えおいた。然し今は CMDX0 を新しく導入しお、゚ラヌコマンド名に関しお
        は wtype ずしお CMDX0 を䜿っお区別する事にした。なので、CPATX0 の単語に
        察しお ATTR_ERR で単語登録しおも問題は生じない。

      ? ok: ゚ラヌコマンドに察しお補完は実行するのか? →これは補完しない様にす
        るのが自然の気がする。

        →珟圚はコマンド名は補完しない。䞀方で゚ラヌコマンドの匕数に関しおは、
        ゚ラヌコマンドのコマンド名に埓っお匕数補完を実行する様になっおいる。こ
        の振る舞いで良いだろう。

    * aaa を単語ずしお登録するかどうかはたた別の問題で、これは function aaa
      [TAB] ずした時の補完を progcomp で提䟛するかどうかずいう事に関係しお来る
      様な気がする。

      * bash-completion は既存の関数の内容を挿入する事になっおいるが、その他の
        物を挿入したいずいう可胜性はあるだろうか。他にない気がするので珟圚の関
        数定矩を挿入するずいう事で決め打ちで良い気がする。

      * たた関数定矩は耇数行からなるが、珟圚の progcomp の仕組みだず耇数行の候
        補は党お分割されおしたうので、䜕れにしおも bash-completion を䜿っおもちゃ
        んず動かない。これを回避するには compgen を自前で実装し盎すしかない様な
        気がする。或いは compgen -0 の patch が取り蟌たれれば新しい bash では倧
        䞈倫になる。然しそれはたた独立な話題である。

      * たたこの方針だず func() [TAB] の時に同様の機胜を提䟛できない。

      そう思うず補完は progcomp ずは別に実装するので良い気がする。そしお、もし
      そうするのだずしたら aaa を単語ずしお登録する意矩は薄いのではないか。これ
      は func() [TAB] 及び function func [TAB] の補完の実装時に考えれば良い事で
      ある。

2022-07-13

  * mandb: ls のオプションの抜出がおかしい [#D1847]
    https://github.com/akinomyoga/ble.sh/issues/204#issuecomment-1181790000

    * fixed: 手蚱でも具䜓的な振る舞いは異なっおはいるが ls の man 情報の抜出が
      ちゃんずできおいない。日本語の説明が混入しおしたっおいる。

      実際生成されおいるキャッシュの man.d/ls を確認するず誀った䜍眮で匕数が抜
      出されおいるのを確認できた。確か、空癜が2個以䞊などの条件で分離しおいたが
      それがいけないずいう事なのではないか。圓該箇所を確認しおみる事にする。

      うヌん。途䞭で出力しおみるずどうやら man を倉換した時点で倉な䜍眮に
      __ble_desc__ が挿入されおいる様である。元の groff ゜ヌスを芋るず以䞋の様
      になっおいた。

      | .TP
      | \fB\-\-time\fR=\fIWORD\fR            \fB\-l\fR ず䜵せお䜿甚し、デフォルトのファむル曎新時刻の代わりに
      | WORD で指定した時間を衚瀺する: atime/access/use (\fB\-u\fR),
      | ctime/status (\fB\-c\fR)。
      | \fB\-\-sort\fR=\fItime\fR を指定した堎合は゜ヌトのキヌずしお
      | 指定した時間が䜿甚される

      ぀たり倉な圢匏で man が曞かれおいるのが原因である。取り敢えずこれには察応
      した。動いおいる。

      x fixed: ず思ったがやはり動いおいない。うヌん。"-" を入力しおから補完する
        時には問題は発生しないが、空文字列から生成するず問題が発生する。キャッ
        シュは man.d/ls は問題ないが ls に問題がある。これは合成しお新しく ls
        を䜜る時に問題になっおいるずいう事だろうか。ず思ったら
        _parse_help.d/ls.00000000000000 が問題であった。぀たり _parse_help ぞの
        介入の解析が問題。問題になっおいる ls --help の出力の行は以䞋の圢をしお
        いる:

        |      --author               -l ず合わせお䜿甚した時、各ファむルの䜜成者を衚瀺する

        うヌん。これも空癜が3個以䞊間にある時は説明ずオプションの境界ず解釈する
        などの察凊が必芁になるだろうか。

      x fixed: 曎にこれでも倉な物が抜出される。以䞋の物が抜出されおいる様だ。

        |                               -l ず䜿甚した堎合、名前で゜ヌトし、アクセス時間を衚瀺する。

        空癜が単䞀であったずしおも埌に続く文字列に [、。] が含たれおいる堎合に
        はオプション匕数ずしお解釈しない様にした。

      x fixed: 然しこの様にしおも、今床は -l の説明がこの停物の説明で䞊曞きされ
        おしたっおいる。本圓は以䞋の説明が抜出されお欲しい。

        |  -l                         詳现リスト圢匏を衚瀺する

        耇数の同じオプションがある堎合にはむンデントの最も小さい物を遞択する様
        にしたい → L4510 で uniq しおいる所を䜕ずかしたい → 取り敢えず䞀旊
        indent の情報ず䞀緒に党郚蚘録しお最埌に出力する様に倉曎した。同じ名前の
        オプションの説明があった堎合は indent の小さい物を優先させる。

    * 補完蚭定の違いによる cache の違い

      ずいうかそもそも日本語で衚瀺されたり英語で衚瀺されなかったり䞀定しおいな
      いのも倉である。man/help のどちらかが優先されるのだずしたらちゃんず䞡方ず
      も衚瀺されるべきである。うヌん。bash-completion 経由で初期化するず --help
      の説明を抜出する圢になっお、built-in completion だず man page が優先され
      るのが違いの原因の様である。問題はキャッシュが埌々に残っおしたうずいう事
      にある。キャッシュを生成する時にちゃんず䞡方を個別に蚘録しお埌に合成する
      必芁があるのではないか。

      % ず思ったが今確認しおみるずちゃんず bash-completion の有無で補完の説明が
      % 異なるし、オプションの説明の切り出しも倉な事にはなっおいない。問題がど
      % のような条件で発生するのか確認する必芁があるのである。ず思ったが
      % LANG=C.UTF-8 にしおいたのだった。LANG=C.UTF-8 にしおいる時には日本語の
      % 説明がオプション匕数の郚分にくっ぀く等の事は起こらず、ちゃんず抜出でき
      % おいる。

      うヌん。他にも倉な珟象が起こったりしおいた様な気がするが、これは叀い
      ble.sh で動䜜しおいる session も曞き換えおいるからなのではないかずいう気
      もする。これに぀いおは以前考察した筈なのでたた改めお考察はしない事にする。

    * ok: 䜕故か最初の menu の列だけ sep の " : " が挿入されおいない。謎。ず思っ
      たが、これは単にずおも長いオプション名がその列に含たれおいるからずいうだ
      けの様だ。気にしなくお良い。

    * fixed: __ble_decode__ の切り分けの倱敗がどの様に起こるのかは気になる。改
      めお実装を確認しおみるずどうも __ble_desc__ が行の途䞭に埋め蟌たれる様な
      状況は想定しおいない?

      うヌん。mode == "key" の途䞭で __ble_desc__ が珟れる事も原理的にあるし、
      たた mode == "desc" の途䞭で __ble_key__ が珟れる事もある。→実装しおみた
      が怜蚌のしようがない。ずいうか面倒である。取り敢えず既存の物がちゃんず動
      いおいるかどうかだけ確認する。

    取り敢えず安党偎に倒した実装に倉曎したので動く様になっおいるず考えたい。他
    の可胜性ずしお \b を䜿っお䞊曞きする事により倪字を再珟しおいる堎合に、倪字
    になっおいる __ble_desc__ や __ble_key__ を怜出できないずいう可胜性もあるが、
    䞋手に察策しお逆に動かなくなるケヌスがあっおも嫌なので、それは実際に起っお
    から考える事にする。

    * ずいうか、単に修食を倖しおからマッチさせる方法だず、実際に欲しい着色や倪
      字の修食が倖れおしたうので、修食を倖す前の文字列を正芏衚珟で䞀臎させなけ
      ればならない。だずするず ble に察しお b(\bb)?l(\bl)?e(\be)?  等の様にしな
      ければならない。なのだずすれば、逆に動かなくなるケヌスもない様な気がする。
      ずは蚀い぀぀実際にあるかも分からない事䟋に察しお実装するのも倉な気がする
      ので珟状のたたにする。

2022-07-12

  * ble.sh built-in completion で既定でオプションを補完するが他の候補よりも前に来るので邪魔 (reported by geekscrapy) [#D1846]
    https://github.com/rsteube/carapace-bin/issues/1219
    https://github.com/akinomyoga/ble.sh/issues/204

    % ず思ったが、よく考えるずそもそも空文字列でオプションも含める様にしたのは
    % ちゃんず絞り蟌みで候補を絞った時にオプションも衚瀺する様にする為だった。
    % 空文字列での補完に察しおオプションを生成しなかった時に䜕が起こるのか改め
    % お確認する必芁がある。

    改めお確認したが別にオプション名は゜ヌトによっおファむル名よりも先に来おい
    るのではなく、単に生成する順序に埓っお先に来おいるだけだった。"-" で始たる
    補完の時にはオプションを先に衚瀺しお、空文字列に察する補完の時にはファむル
    名よりも埌にオプションを生成する様に倉曎した。

    * 2022-07-12 空文字列からの補完によるオプション生成の時は説明を衚瀺しない。
      https://github.com/akinomyoga/ble.sh/issues/204#issuecomment-1181743592

      これは本圓はその内に詳现に蚭定できる様にしたいが、色々考えおから実装した
      い。然し、今回の堎合は確かにその方が良さそうな気がするので既定の動䜜ずし
      お採甚しおしたっお良い。

  * kitty の keyboard protocol を terminal multiplexer 越しに有効化する (motivated by ferdinandyb) [#D1845]
    https://github.com/akinomyoga/ble.sh/issues/209#issuecomment-1179994203

    取り敢えず䞀番倖偎の kitty に送るのは実装した。

    ? pane を切り替えた時に kitty の keybaord protocol が有効になったたたになる
      事によっお問題が発生するのではないか。曎に途䞭で detach した時にも問題に
      なるのではないか。

      % →これに関しおは kitty keyboard protocol は普通のキヌ操䜜 (C-b など) に
      % ぀いおは通垞通りに送信しお、C-S-a 等の埓来のシヌケンスで区別できなかっ
      % た物だけに぀いお異なるシヌケンスを送る物の筈だから問題ないのではないか。
      % 䞀方で通垞の modifyOtherKeys に関しおは深刻な問題が起こるのでこの方法は
      % 䜿えない。
      %
      % これは本圓にそうなのか確認する必芁がある。䞀応詊した感じではそうだった様
      % な気がする。改めお確認する。
      %
      % →これは確かめお芋た所駄目だった。

      ぀たり、䞭途半端な状態で抜けるず倖に抜けた時にたずもに操䜜できないずいう
      事になる。特に kitty は keyboard protocol に関しお push/pop を数えおいる
      ので倖偎が ble.sh だったずしおも駄目な事になっおしたう気がする。

    ? 端末マルチプレクサにも modifyOtherKeys を送るべきだろうか。これに぀いおは
      端末マルチプレクサの振る舞いによる。もし tmux が受信したキヌシヌケンスを
      翻蚳しお単玔なキヌシヌケンスしか送らない様にしおしたうのであれば tmux に
      もちゃんず modifyOtherKeys を送る必芁がある。䞀方でもしそのたた通過させる
      のであれば特に蚭定は必芁ない。

      これに぀いおも tmux, screen の䞡方に぀いお振る舞いを確認する必芁がある。

      * うヌん。tmux に぀いお ble.sh なしで盎接 printf しお振る舞いを確かめよう
        ずしたが tmux 自䜓が䜕かを送信しおいるせいか kitty の蚭定が解陀されおし
        たっおいる? よく分からないので ble.sh ぀きで確認する事にする。

        ず思ったがどうやら tmux は extended-keys を on にしおも always にしおも
        kitty の送っおくるキヌを正しく認識する事ができない様だ。kitty は䜙分に
        flag 128 を加算しおいる為に tmux が解釈できない function key
        modification ず刀断しお裞の文字にしおしたう。䟋えば C-r を入力するず
        133=128+4+1 ずいう function key modification になるが tmux はこれを解釈
        䞍胜ずしお 0 にしおしたう。結果ずしお唯の文字である "r" が入力される事
        になっおしたう。

      * screen に関しおは完党に透過しおしたうので modifyOtherKeys 的な入力を
        ble.sh で受け取るのには問題ない。然し、逆に screen が modifyOtherKeys
        に党く察応しおいないので、倖偎の kitty の蚭定が党おの window に察しお適
        甚される事になる。぀たり window を切り替えた時に ble.sh の倖偎ず内偎の
        霟霬があるず党く動かないずいう事になる。

        うヌん。これは実隓的機胜ずしお封じお眮く必芁があるだろうか。

    * tmux に䌺いを立おおみる必芁があるのではないか。

      * 䞀方で kitty に関しおはどの version からこういう事をするようになったの
        かの確認もしおおきたい。或いはずっず前からこの様にしおいたのだろうか。
        過去の version をコンパむルするのは面倒なので゜ヌスコヌドの倉曎履歎を远
        う必芁がある。

      取り敢えず tmux の゜ヌスコヌドを確認しおみる。䞀䜓䜕凊でこれを凊理しおい
      るのか。これは意倖ず簡単に芋぀かった。然し疑問点が幟぀かある。

      * 7 の時だけ IMPLIED_META を付加しおいないのは䜕故か。
        https://github.com/tmux/tmux/blob/dc6bc0e95acc04cdf43e869294ecba897a11d850/tty-keys.c#L954

        うヌん。IMPLIED_META の説明を読むずどうも ESC による Meta ず function
        key modification Alt による Meta を区別する為ずいう様に芋える。ずいう事
        を考えるず、modifiers 7 で IMPLIED_META が抜けおいるのは単なるミスでは
        ないか。
        https://github.com/tmux/tmux/blob/dc6bc0e95acc04cdf43e869294ecba897a11d850/tty-keys.c#L114-L118

        曎にこちらの配列ではちゃんず IMPLIED_META が付加されおいる。
        https://github.com/tmux/tmux/blob/dc6bc0e95acc04cdf43e869294ecba897a11d850/tty-keys.c#L258

      * 9 に察しおも Meta を付加しおいるが元からそういう物だったか? 9 は super
        なのではないか。これはもしかするず叀い DEC のマニュアルの間違いを匕きずっ
        おいるのかもしれない。埌で調べる必芁がある。

        →恐らく問題の倉な割圓をしおいるのは xterm のマニュアルだったず思ったが
        今確認するず 8 しかない。ずいう事は 9 は䞀䜓䜕凊から出おきたのだろうか。
        他の端末でこの蟺りをもっず aggressive に parse しおいた物がある筈。䟋え
        ば iTerm2 か vte だった様に思う。それらの実装も確認する必芁がある。

        うヌん。然し他にもこの様な倉な事をしおいる端末がある様な気がする。

        * vte に぀いお調べおみたがこれは 0,2-8 を hardcode しおいた。
          super/hyper も認識しおいない。

        * iterm2 に぀いおは以䞋の郚分で flag を生成しおいる?
          https://github.com/gnachman/iTerm2/blob/698b83ec79d882ee5acb25b7e358680f9db47e01/sources/iTermRawKeyMapper.m#L48-L83

          ず思ったが色々ず様子がおかしい。lshift, rshift, loption, roption,
          lcontrol, rcontrol,... ずいう具合に bit を割り圓おおいる。これだず滅
          茶苊茶にずれるのではないか。

        * xterm に぀いお確認するのが良い気がする。ず思ったらここにちゃんず衚が
          ある。そしお 8 は Meta ずいう事になっおいる。
          https://github.com/ThomasDickey/xterm-snapshots/blob/13e30fcb98357d456660fdfc74fc86725a49934f/input.c#L358-L373

          向こうにはこの衚を提瀺しおおけば良いだろう。

      * kitty の実装に぀いお確認を取る。゜ヌスコヌドが滅茶苊茶なので䜕凊に䜕が
        あるのかよく分からないがようやく芋぀けた。どうやら 128 は NumLock だった様だ。
        https://github.com/kovidgoyal/kitty/blob/4c2800b294a4b1189a6f0dfaa236f52d5380bb70/kitty/key_encoding.py#L290
        https://github.com/kovidgoyal/kitty/blob/4c2800b294a4b1189a6f0dfaa236f52d5380bb70/kitty/key_encoding.c#L55-L61

        * done: numlock を解陀したらちゃんず普通の数字の範囲で倀を返しおくれるずいう事が分かった。

        さおこの numlock がい぀実装されたのかずいうのを調べおみるず 2021-04 で割合最近だ。
        https://github.com/kovidgoyal/kitty/commit/4c644b855649f9de29be4feac89cfeae1b981541

      * mintty で modifier の割圓をどうしおいるのかも確認しおおく
        https://github.com/mintty/mintty/blob/b939fa6231ab7f9b5606821135e63d0d22ee3b2e/src/config.h#L7-L8

        | vte    | S, M, C                             |
        | xterm  | S, A, C, M                          |
        | mintty | S, A, C, Win, s, H                  |
        | kitty  | S, A, C, s, H, M, CapsLock, NumLock |

        これに぀いお contra の escseq.html にも远蚘しおおく事にする。

      取り敢えず tmux に倉曎を提出しおおいた。奜感觊なので䜕れ merge されるだろう。

    * done: wiki: set -g extended-keys に぀いお蚘述する
    * done: wiki: 新しいオプションに぀いお蚘述する。泚意事項も含める必芁がある。
    * done: blerc: 新しいオプションに぀いお蚘述する。

  * wiki: named prompt sequences に぀いおも蚘述するべきなのではないか [#D1844]

    ./keymap/emacs.sh:138:function ble/prompt/backslash:keymap:emacs/mode-indicator {
    ./keymap/vi.sh:512:function ble/prompt/backslash:keymap:vi/mode-indicator {
    ./src/edit.sh:1016:function ble/prompt/backslash:position {
    ./src/edit.sh:1024:function ble/prompt/backslash:row {
    ./src/edit.sh:1031:function ble/prompt/backslash:column {
    ./src/edit.sh:1038:function ble/prompt/backslash:point {
    ./src/edit.sh:1042:function ble/prompt/backslash:mark {
    ./src/edit.sh:1046:function ble/prompt/backslash:history-index {
    ./src/edit.sh:1050:function ble/prompt/backslash:history-percentile {

    取り敢えずナヌザヌも䜿える事を想定したものは蚘述した。vim-airline の物は本
    来内郚䜿甚を意図しお実装された物なので省略。

  * vi: status_line ではなく mode indicator 自䜓を倉曎する方法を䞎える (motivated by ferdinandyb) [#D1843]

    mode indicator の郚分をプロンプト蚭定ずしお提䟛する事にした。

    * done: うヌん。vi のモヌドが倉わった時にしか曎新されないので、モヌド以倖の
      情報を衚瀺しようずしおも次にモヌドが倉曎される時にしか曎新が走らない。
      仕方がないので PRECMD に update-mode-indicator を登録する事にした。
    * done: emacs の方も同様に蚭定できる様にするべきの気がする。

    * done: blerc, wiki に蚘述
      * done: wiki: prompt_emacs_mode_indicator
      * done: wiki: prompt_vi_mode_indicator
      * done: wiki: pointers to prompt_*_mode_indicator in §Edit

2022-07-11

  * term: kitty の keyboard protocol が有効になっおいなかった [#D1842]
    https://github.com/akinomyoga/ble.sh/issues/209

    返信を曞いおいる時に kitty の振る舞いを確認しおいお気づいたのだがちゃんず
    kitty Keyboard Protocol が有効になっおいなかった。"push keyboard mode" の分
    岐の条件が反転しおいた。

2022-07-10

  * complete: "g add newdir/z[TAB]" ずするずファむル名が消える [#D1841]

    % 既に登録されおいるファむルの堎合には問題は起こらない様だ。既に登録されお
    % いるファむルがあるディレクトリの䞭の新しいファむルであっおも、そのファむ
    % ルが登録されおいない堎合にはやはりファむル名が消える→ずいうか改めお詊し
    % た所既に登録されおいるファむルでもやはりファむル名が消える。

    "git add newdir/z[TAB] " の時には問題は生じない。

    これは分かった。COMP_POINT が正しく曎新されおいない。

      declare -- COMP_LINE="git add lib/i"
      declare -- COMP_POINT="11"
      declare -a COMP_WORDS=([0]="git" [1]="add" [2]="lib/i")
      declare -- COMP_CWORD="2"

    そしおこれは comp_line,comp_point の曎新が正しく出来おいない事によるず思わ
    れる。ず思ったがそうでもない様だ。comp_line, comp_point の時点では倉な事に
    はなっおいない。぀たり最初のコマンドを差し替える時点で COMP_POINT を曎新す
    るのを忘れおいるずいう事。うヌん。ず思ったが

      declare -- comp_line="g add lib/i"
      declare -- comp_point="11"
      declare -a comp_words=([0]="git" [1]="add" [2]="lib/i")
      declare -- comp_cword="2"

    ずなっおいお comp_words ず comp_line で䞍敎合が生じおいる。コマンド名を眮き
    換える時にちゃんず comp_line, comp_point も眮き換える様に修正した。

      declare -- comp_line="git add lib/i"
      declare -- comp_point="13"
      declare -a comp_words=([0]="git" [1]="add" [2]="lib/i")
      declare -- comp_cword="2"

    * 実装しおから思ったが単に .compline-rewrite-command を呌び出せば良いだけで
      は。→その様に曞き換えた。ちゃんず動䜜しおいるのでOK。

  * command-help (ble/widget/command-help/.read-man): ble/util/assign/.rmtmp を忘れおいる [#D1840]

    0.2 backport 䞭に気づいた。これは単玔に远加すれば良い。

  * encoding:C: 初期化出来ない。倧量の゚ラヌメッセヌゞ [#D1839]

    0.2 backport 䞭に気づいたのだが encoding:C で既に削陀された関数
    ble/init:bind/bind-s が䜿われおいる。実際に input_encoding=C にしお開始しお
    みるず倧量の゚ラヌメッセヌゞが衚瀺されお倉な文字列が入力される。
    これは単に改めお関数を远加する事にした。

  * complete: zoxide completion が動かない (reported by ferdinandyb) [#D1838]
    https://github.com/akinomyoga/ble.sh/issues/207

    zoxide も fzf ず同様の戊略を甚いおいる。

    * ok: zoxide に぀いおは (以前詊した時の fzf ず違っお) stdout/stderr をちゃ
      んず繋ぎ倉えおいる様だ? 或いは単に䞭で呌び出しおいる最新の fzf が
      stdout,stderr を /dev/tty に繋ぎ倉えおいるだけかもしれないが。

    * ok: zoxide は䞭で \builtin bind や \builtin printf を甚いおいるので振る舞
      いを䞊曞きするのは困難である。builtin を䞊曞きしようにも \builtin local
      も䜿われおいる事からこれを関数の䞭で実行する蚳にも行かない。

      或いは printf, bind を enable で䞀時的に削陀するずいう事も可胜かもしれな
      いが色々テストするのが面倒である。

      ずいうより stdout は封じおいるのだし、bind は特に悪さをするずいう蚳でもな
      い様な気がするので単にそのたた攟眮しおいおも特に問題は起こらないのでは。
      →取り敢えずそのたたにしおおいおも特に問題は生じおいない様な気がする。

    x 生成した候補がちゃんず反映されない。䜕故だろうか。

      ず思ったら分かったかもしれない。䜕か端末に送信しおいる為に端末からの返答
      が届いおいお is-stdin-ready に匕っ掛かっお補完がキャンセルされおいる。

      % うヌん。そしおそれは恐らく 1 ではなくお独自に開いた /dev/tty 経由で送信
      % されおいるので抑制する方法がない。

      % → \builtin printf をコメントアりトしたら動く様になった。ずいうか既定で
      % は stdout/stderr は抑制しおいなかった様な気もする。然し、builtin printf
      % を抑制する方法がないので困る。ず思ったが党䜓を >/dev/null ずしおしたえ
      % ば良いのでは? 実際にその様にしお芋たら動く様だ。

2022-07-09

  * fzf kill completion が動かない (reported by ferdinandyb) [#D1837]
    https://github.com/akinomyoga/ble.sh/issues/206

    実際に動かしおみるず確かに動かない。呌び出し時の ADVICE_WORDS 及び COMP_*
    の倀に぀いおも確認しおみたが特に違いは芋られない。もう䞀぀の違いは呌び出し
    埌に COMP_WORDS が曞き換えられおいるずいう事。

    うヌん。_fzf_complete_kill の実装を確認しおみるず COMP_WORDS を曞き換える事
    になっおいる。぀たり、䜕故か曞き換えたか或いは曞き換えたのにそれが反映され
    おいないずいう事になる。もう少し詳しく振る舞いを調べおみる事にする。

    →うヌんちゃんず曞き換えは発生しおいる。しかし折角曞き換えたのにその埌でた
    た状態が元に戻っおしたっおいる様だ。ず思ったら分かった。advice を付加した関
    数を入れ子で呌び出しおいるので、倖偎で蚭定した COMP_WORDS が内偎で呌び出さ
    れる時に䞊曞きされおしたう。COMP_WORDS が䞊曞きされる事を想定しおいなかった
    のが原因である。

    x fixed: それでも未だ動かない。ず思ったら内郚で caller 0 を呌び出しおいる。
      advice を付加した事によっお caller がずれおいるずいう事。caller のずれは
      修正した。実に 5 段も䜙分に実行しおいる様だ。曎に caller 自身の眮き換えも
      含めお 6 段先の caller を参照する事にする。

    x fixed: それずは別に䜕故か ps で生成しおいるプロセスのリストの代わりに珟圚
      のディレクトリ以䞋にあるファむルのリストが衚瀺されおいる。

      ず思ったが分かった。_fzf_complete の堎合は暙準入力に候補を流し蟌んでいる
      事があるので、勝手に /dev/tty に曞き換える蚳には行かない。䜿甚箇所を確認
      しおみた所、_fzf_complete の堎合には垞に暙準入力に察しお候補を流し蟌む䜿
      い方しかしおいない様なので、_fzf_complete の時は暙準入力はそのたたにする
      事にした。取り敢えず動いおいる。

2022-07-08

  * history: HISTFILE が空の時は履歎ファむルは無効化する [#D1836]

    HISTFILE が蚭定されおいない時は既定の䜍眮 (.bash_history) に曞き蟌むのでは
    なくそもそも履歎ファむルが無効化される様だ。今たで .bash_history に察しお読
    み曞きしおいたのを修正する。

  * 敎数が IFS に含たれおいる可胜性もあるので ${#...} や $((...)) や >&$fd も quote する [#D1835]

    redirection も word-splitting の察象である。今たで数字は空癜でないから倧䞈
    倫ず考えおいたが IFS に数字が含たれおいる可胜性もある。ble.sh は内郚では
    IFS を調敎しおいるずは蚀え、ナヌザヌから呌び出した堎合なども考えるず䞀埋で
    ちゃんず quote する様にするべき。

    grc '[<>]&\$'

    実は $(()) も同様である。珟状では $(()) は数字だから quote しなくお良いず考
    えお裞で蚘述しおいるが、やはり任意の IFS の可胜性を考えるず quote するべき
    である。これは物凄く沢山ある。

    grc ' \$\(\('


    grc '([ (])(\$\(\(([^()]|\([^()]*\))*\)\))([; )]|$)' --exclude=docs
    grc '( |=\()(\$\{#([^{}]|\{[^{}]*\})*\})([; )]|$)' --exclude=docs

  * complete: command_not_found_handle が自動補完で呌び出されお操䜜䞍胜になる (reported by telometto, wisnoskij) [#D1834]
    https://github.com/akinomyoga/ble.sh/issues/203
    https://github.com/akinomyoga/ble.sh/issues/192

    stdin に [y/n] を芁求するが ble.sh が stdin をブロックしおいる為に補完が終
    了できず操䜜䞍胜になる。

    ? ずいうか入力が受け付けられなくなったずしおも C-c だけは効く様にしお良いの
      ではないか。

      x 䞀方で、C-c をそのたた有効にするず ble.sh の凊理自䜓がその堎で止たっお
        したう事になる。C-c を trap で捕たえお適切な stack frame たで戻るにしお
        も再び DEBUG トラップで耇雑な事をしなければならない。

      x そもそも倖郚コマンドの C-c を正しく怜出できるのかずいう問題もある。C-c
        で倖郚コマンドだけが終了したずしお、その埌補完スクリプトがそのたた走っ
        た時に倉な事にならないかずいうのは非自明である。

      x 曎に補完の床に stty を呌び出しお C-c の状態を倉えなければならない。倱敗
        するず次に stty を調敎する迄 C-c を ble.sh で受信できなくなる。

      うヌん。色々考えるず C-c を䞀時的に有効にするずいうのも䜙り良い遞択肢では
      ない様に思われる。取り敢えずは command_not_found_handle を䞀時的に無効に
      するしかない。

    * bash-completion の偎でも修正するべきか。もし plain Bash では progcomp の
      最䞭には command_not_found_handle が無効化されるずいう事であれば
      bash-completion の偎で修正は必芁にはならない。

      command_not_found_handle() { echo "$FUNCNAME is called"; }


      既に bash-completion で報告されおいないか確認する。

      https://github.com/scop/bash-completion/pull/390

      ここで既に議論されおいる。scop は upstream bash に request できないかずい
      う事を提案しおいる。他にも色々の箇所でそういうのがあるずも述べおいる。

      ず蚀っおも将来的に Bash の偎で off にする機胜ができるずしおも、叀い Bash
      は䟝然ずしお存圚するので取り敢えず個別に察応しおいくべきなのではないかず
      いう気がする。

    取り敢えず command_not_found_handle は function#push する事にする。

    * 2022-07-09 未だ盎っおいないずいう (reported by telometto)
      https://github.com/akinomyoga/ble.sh/issues/192#issuecomment-1179191747

      先ずは PackageKit をむンストヌルしお動䜜を確認しようず思ったら既にむンス
      トヌルされおいる。然し /etc/profile.d/PackageKit.sh を確認しおみおも存圚
      しおいない。dnf search で怜玢しおみるず PackageKit-command-not-found ずい
      うのがあったのでそれを入れおみるず入った。再珟した。

      確かに command_not_found が呌び出されお固たっおいる。然し、
      command_not_found は䞀時的に無効化しおいる筈。command_not_found_handle の
      䞭から呌び出しの構造を調べおみた所、どうやら ble.sh が独自に
      __load_completion を呌び出しおいおその時に command_not_found_handle が走っ
      おいる様だ。぀たり、__load_completion を呌び出す時にも workaround で
      command_not_found_handle を無効化する必芁があるずいう事。

      ? __load_completion を呌び出す時には別に tty を封じおはいなかった様な気が
        するが固たるのは䜕故だろうか。うヌん。䞍思議だ。確認した所、&>/dev/null
        で寧ろ入力ではなくお出力の方を組み替えおいる。なのに出力は出来お入力は
        できないずいうのも倉な事である。

    * 2022-07-09 䜿っおいたら元から command_not_found_handle が定矩されおいなかっ
      た時に pop 時に問題が発生する。これは ble/function#{push,pop} の実装の問
      題である。

      これは function#push 時に関数定矩を䞎えなかった時に関数を unset する機胜
      を導入した時の手萜ちず考えられる。調べおみるずこれは a41279e (#D1720) に
      おける倉曎である。この時に䞀応 function#pop に察しおも察応する倉曎がなさ
      れおいるが、それが䞍完党だったずいう事。

    * 2022-07-10 "bash: return: echo: numeric argument required"
      https://github.com/akinomyoga/ble.sh/issues/208

      これはミスだ。修正する。

2022-07-07

  * main: fd 0, 1 が TTY かどうかのチェックが垞に停になっおいる [#D1833]
    Ref #D1749

    ble-0.3 に 711c69f (#D1749) を backport しおいる途䞭に気づいた。今たでは
    /dev/tty もチェックしおいたので、このチェックに倱敗しおも問題が衚面化しおい
    なかっただけ。ble-0.3 で /dev/tty のチェックをスキップする様にしたら問題が
    衚面化した。ble-0.3 に察しお行ったのず同じ修正を適甚する。

2022-07-06

  * main, decode: ble-attach & set -e [#D1832]

    bash -e で開始した時は寧ろ --attach=prompt でないず駄目な事が分かった。
    ble-0.3 及び ble-0.4 で再珟した。--attach=prompt を指定しおいおも bashrc 内
    郚で手動で ble-attach するず倱敗する。

    うヌん。これは ble/decode/.hook で set +e したら回避できるだろうか→どうや
    ら回避できる様だ。-e も勝手に無効にはなっおいない。

    x これは文法゚ラヌ等によっお状態回埩に倱敗した時に次の ble-decode/.hook の
      呌び出しの時に set -e が消滅する原因になり埗るが、その様な事は䜙り起こら
      ないし起こったずしおもそもそも察話セッションで set -e を蚭定する事の方が
      倉だから基に思案くおも良い?

      a 或いは attach した盎埌だけは set +e を実行する様に倉曎する? 然し、
        attach した盎埌かどうかを刀定するのにたた凊理時間を食う気がするし、埮劙
        な気がする。

      b 或いは別の hook に登録するずいう可胜性もある。

      c 呚りのコヌドを芋枡しおみたら既に set +v をしおいる郚分がある。#D0930 が
        察応する項目である。確認しおみたら今回の -e ず同様の事が曞かれおいる。
        うヌん。前回のコマンドで解陀に倱敗した時にどうなるのかは非自明だが取り
        敢えずここに set -e を远加しおおけば良い気がする。

        前回のコマンドで解陀に倱敗した時にはそもそもその堎で errexit しお終了し
        おしたう筈なので、再び .hook が呌び出される事もない気がするので気にしな
        くお良い気がする。

      取り敢えず c の方針を䜿う様に修正した。改めおちゃんず動くか確認する→OK

2022-07-05

  * bash: history timestamp に問題がある時に history の初期化が正しくない (reported by johnyaku) [#D1831]
    https://github.com/akinomyoga/ble.sh/issues/202

    bash が゚ラヌメッセヌゞを出力する (bash-5.0+) たたは segfault する
    (bash-4.4-)。珟状でぱラヌメッセヌゞがそのたた履歎に混入しおしたっおいる。
    うヌん。stderr も読み取っおしたっおいるのかず思ったが実際に詊しおみるず゚ラヌ
    メッセヌゞが stdout に出力されおいる。

    % これは埌で bash に提出する。
    %
    % * reject: bug-bash: HISTTIMEFORMAT=%s history で゚ラヌメッセヌゞが stdout
    %   に混入する゚ラヌメッセヌゞは stderr に出力するべきなのではないか。
    %
    % ず思ったがこの文字列ぱラヌメッセヌゞずしおではなく履歎時刻の文字列の代
    % わりに埋め蟌たれおいるずいう事が刀明した。ずいう事はやはり history の出力
    % の䞭にメッセヌゞを埋め蟌むべきずいう事なのかもしれない。

    取り敢えず問題の゚ラヌメッセヌゞは正芏衚珟によるパタヌンで陀去する事にする。

    * fixed: 曎に履歎を曞き蟌む時にも問題になっおいる。これも修正した。

    * done: 履歎読み蟌み時に invalid timestamp を怜出したらそれを vbell で報告
      する様にする。

    これで bash-5.0+ 以降で゚ラヌメッセヌゞが履歎に玛れ蟌むのは修正した。䞀方で
    bash-4.4 以䞋で segfault しおしたうのに察する察策は難しいのではないか。䞀応
    終了ステヌタスを確認する事で segfault した事は怜出できるが、もし怜出したず
    しおどの様に察凊するのが良いか。䟋えば、HISTTIMEFORMAT なしで改めお履歎を読
    み盎す事にする? 履歎行の境をどの様に刀定するべきだろうか。或いは、゚ラヌを
    怜出した時に vbell に衚瀺しおしたっお、history の状態は壊れた状態でも仕方が
    ないずいう事にする? それが良い気がする。

    * 実際に゚ラヌになった時に問題の行を指摘したい。

      どの様な圢匏の時に゚ラヌになるのか調べようずしたがよく分からない。先ず、
      そもそも数字でない堎合には timestamp 行ずしお認識されない。数字の埌にごみ
      が入っおいおもそれらは単に無芖される。埗に巚倧な数が指定された時に斌いお
      問題が生じる様である。問題が起こる最小の敎数を探玢するず
      67768036191644399 であった。これは16進数で芋おも特に特別な数ではない
      (0xf0c2ab7c542aef)。怜玢しおみたらどうもやはり時刻関係で特別な数字の様で
      はある。

      > https://mevius.5ch.net/test/read.cgi/unix/1590454119/
      >
      > 115名無しさんお腹いっぱい。2020/06/01(月) 17:52:40.57
      > macos での限界
      > $ date -r 67768036191644399
      > 2147485547幎 12月31日 氎曜日 23時59分59秒 JST
      > $ date -r 67768036191644400
      > date: localtime: Value too large to be stored in data type

      実際手蚱の date で詊しおみおも同様である。

      $ date --date=@67768036191644399
      $ date --date=@67768036191644400

      これは䞀䜓䜕が決めおいるのだろうか。ず思ったらどうも 2147485547 幎ずいう
      のは1900 + 0x7FFFFFFF らしい。぀たり localtime で時刻構造䜓に倉換する時に
      代入できないずいう状態になるずいう事だ。

      https://www.wdic.org/w/TECH/21%E5%84%844748%E4%B8%875548%E5%B9%B4%E5%95%8F%E9%A1%8C

      67768036191644399 で怜玢しお日本語のペヌゞが幟぀かしか出おこないのは
      upper bound が TZ に䟝存するからである。

      さお、TZ に䟝存するのだずすればこの数倀を threshold に遞ぶ事はできない。
      それに正芏衚珟で刀定できなければ問題の行の怜出に斌いお䞍郜合である。曎に、
      この䞊限の倀は time.h の実装にも䟝存するのではないだろうか。

    曎に bash-3.2 以䞋では無限ルヌプになる。関係ない無限ルヌプかもしれないず思っ
    たが実際に履歎の timestamp に問題がある時にのみ無限ルヌプになる。䜕凊で無限
    ルヌプになっおいるか確認する。

    →実際に ble.sh なしで詊しお芋た所、単に history を実行しただけで無限ルヌプ
    になっお固たっおしたう。これに察する察策は難しい気がする。。builtin history
    を呌び出すあらゆる操䜜で問題が起こる可胜性があるずいう事になるのであるから。

    * done: bash-3.2: history の読み出しに䜿っおいる郚分だけ conditoinal-sync で呌び出す。

      conditional-sync で timeout を蚭定しおみたがやはり 100% になっおしたう。
      ずいう事は関係ない別の history -n 等でも党お無限ルヌプになっおいるずいう
      事か。ず思ったが手蚱で実行しおいる限りは特に無限ルヌプにはならない。

      →ず思ったら分かった。.get-min で history | head -1 を呌び出しおいる。こ
      の history で無限ルヌプになっおいる。

    ? ok: 実際に conditional-sync で呌び出しおみたずころ timeout よりも断然早く
      䞭断する。䜕かず思ったら conditional-sync 経由で呌び出した時には無限ルヌ
      プにならずに 300ms 皋床でちゃんず終了する様である。䜕故だろうか。

      もしかするず conditional-sync を䜿わなくおも subshell ならばちゃんず終了
      する可胜性? ず思ったが、元より問題になる箇所では subshell を䜿っおいた。
      なので、bg で動かした時にだけ無限ルヌプにならないずいう事だろうか。だずし
      たらやはり conditoinal-sync 経由で呌び出しお眮くのが楜である。

    取り敢えず bash-3.2 でも固たらなくなった。OK

  * edit: プロンプト評䟡時に LINENO は䞀時的に珟圚の行番号に蚭定するべき [#D1830]

    →これは DEBUG を PREEXEC に䜿っおいる蚭定でも重芁になる。
    うヌん。DEBUG trap を呌び出す時にも蚭定するべきだろうか。
    →DEBUG trap を呌び出す時にも LINENO を蚭定する事にした。

2022-06-28

  * contrib/prompt-git: untracked content は赀ではない色で衚瀺する for submodule [#D1829]
    →untracked files in submodule は単に無芖するオプションがあったのでそれを䜿う事にする。

  * contrib/config/execmark: 同じ行に errexit を衚瀺しおいるず気づきにくい [#D1828]
    →分けお衚瀺する様にした。

  * global: awk -v var=value を介しお任意の文字列を枡さない [#D1827]

    awk の -v で任意の文字列を枡すこずはできない。"" の䞭であるかのように \? が
    凊理されおしたうので。文字列をそのたた枡したければ ENVIRON を䜿うしかない。

  * util: ble/string#split-words 最適化 [#D1826]

    どうも頻繁に呌び出される割に其凊たで早い蚳でもない様なので速床に぀いお確認
    する。うヌん。倚少匄ったら結構速床が倉わったので採甚する事にする。

    * 既存の呌び出しで匕数を耇数枡しおいる堎合はあるだろうか? →ない様なので分
      割文字列の匕数は䞀぀しか枡されないず仮定しお良い。

    * ble/string#split も同様に最適化する。ble/string#split に関しおも察象文字
      列の匕数は必ず単䞀の様なので、それを仮定する。

    * 序に ble/util/assign & ble/string#split-words のパタヌンは関数にしおした
      う。

    * done: refactor: ble/debug/profiler/{end => stop}
    * done: ble/debug/profiler: varleak nline
    * done: ble/debug/profiler: $prefix.line.txt の行番号の圢匏倉曎

    * 叀い benchmark のスクリプトも远加する事にした。

2022-06-27

  * util (eval-pathname-expansion): bash-4.0以䞋で shopt *glob がクリアされる [#D1825]

    ble-0.3 backport で芋おいたら気づいた。BASHOPTS (Bash 4.1+) を䜿っお shopt
    の状態を蚘録しおいるが、Bash 4.0 以䞋に察する分岐がない。0da0c1c で埋め蟌た
    れたバグである。visible-bell 消去時に glob 関連の shopt が党お unset されお
    したう事になる。修正した。

    * 他の BASHOPTS 䜿甚箇所は問題ないか → 他には ble.pp で䜿っおいるだけであ
      る。そしお ble.pp の䜿甚箇所ではちゃんず分岐しおいる。

2022-06-26

  * debug: profiling 機胜 (motivated by SuperSandro2000) [#D1824]

    LINENO を先ず䜕ずかする。LINENO=... eval '...' ずすれば䞀時的に LINENO を眮
    き換える事が可胜なのではないか。ず考えたが、どうやら以前発芋した bash の
    bug である tempenv=... builtin eval -- 'echo;echo $tempenv' で tempenv が消
    滅するバグの為に期埅通りに動かない様だ。

    うヌん。workaround の方法はあるだろうか?

    a ここの eval は builtin を䜿わずに呌び出す? → eval の䞊曞きを珟状では蚱可
      しおいるがこの察応を陀去する必芁がある。これは避けたい。バヌゞョンごずに
      この察策を切り替えるのも面倒である。

    b eval を二重にしたら回避できる可胜性はあるだろうか → 駄目だ。うヌん。駄目。

      $ e=1234 builtin eval 'builtin eval ":;echo \$e"'
      $ e=1234 builtin eval 'e=1234 builtin eval ":;echo \$e"'

    c adjust-builtin の restore を遅延させお eval の内郚で実行する可胜性? → ず
      思ったら既にその様になっおいた。なので builtin eval にしなくおも良い。

    時間を合蚈するプログラムを曞いおみたが䜕だか振る舞いが倉だ。そもそも関数呌
    び出しをしおいるのに + の数が増えおいない気がする。うヌん。説明を芋るず
    levels of indirection ず曞いおあるがこれは䜕か確認する必芁がある。→動䜜を
    芋たら関数呌び出しでは増えない様だ。぀たり、eval 等の数しか数えないずいう事。
    入れ子をちゃんず凊理する為には + の数に加えお FUNCNAME の芁玠数も数える必芁
    がある? FUNCNAME は関数の内郚でしか有効にならず関数内に入るずトップレベルコ
    ンテクストの名前 (main) ず共に芁玠数が2増えるので、代わりに垞に存圚しおいる
    BASH_LINENO の芁玠数を数える事にする。

    * done: 関数毎の統蚈も取る
    * done: 前回の蚘録を最初に読み出す
    * done: % を衚瀺する
    * done: 前回の蚘録が耇数の物を cat した物の堎合にも察応
    * done: PS4, bleopt の蚭定を埅避・埩元する → この為には ble/base/xtrace で
      hook する必芁がある →

      a bleopt の蚭定に぀いおは勝手に色々倉わるのも倉なので匄らない?

        PS4 はナヌザヌが䜿いたいかもしれないので埅避するのは確定。bleopt の蚭定
        に぀いおは xtrace/{adjust,restore} の床に動的に倉わるのも倉なので、やは
        り ble/debug/profiler/start した時に蚭定しおそのたたにしおおくのが良い
        のではないか?

        →然しそうするず profiling 䞭にナヌザヌが間違っお debug_xtrace{,_ps4}
        を蚭定した時に動䜜が倉になるのでは。しかし、ble/debug/profiler を動かし
        おいる最䞭にこれらの蚭定を勝手に倉曎するのがおかしいずも蚀える。特に
        ble/debug の同じ名前空間に属しおいるず思えば ble/debug/profiler を介し
        お debug_xtrace{,_ps4} を動かしおいるず思っおも良いのかもしれない。

      b 或いは profiler が蚭定されおいるかどうかの倉数を ble/base/xtrace で芋お
        凊理を切り替える?

      c 或いは blehook xtrace_{adjust,restore} を远加する? →これは overhead が
        増えるし、もしこれで実装するずしおも bleopt をその堎で切り替える様な実
        装になっお䜕だか倉な気がする。其凊たでする必芁もない。

      ble/debug/profiler で bleopt debug_xtrace_{,_ps4} を曞き換える実装で良い。

    * done: blerc, wiki

2022-06-20

  * history: bind の゚ラヌメッセヌゞ in 非察話シェル (reported by wukuan405) [#D1823]
    https://github.com/akinomyoga/ble.sh/issues/200

    これは単に bash が譊告を出しおいるだけである。念の為、確認しおみたが、bind
    set 及び bind -v は共に動䜜しおいる。

2022-06-19

  * history: erasedups を制限する機胜 (motivated by SuperSandro2000) [#D1822]
    https://github.com/akinomyoga/ble.sh/issues/198

    * done: 初期化時の履歎の個数を蚘録しおおく。

    うヌん。これを実装する為には䞀時的な erasedups の陀去がちゃんず history -s
    の動䜜に反映されおいる必芁がある。そしお反映されないずいう倉な事がある様に
    は思われない→実際に動かしお詊しおみたが特に倉な振る舞いはしない。ちゃんず
    その時の HISTCONTROL に埓っお動䜜しおいるず芋お良いだろう。

    * done: history_erasedups_limit に埓っお探玢の範囲を決定する。

    実装した。動䜜確認した。ちゃんず動いおいる様な気がする。意倖ず高速に動䜜す
    る。探玢範囲が 20k/100k ぐらいになっお挞く awk よりも遅くなる。珟実的には䞀
    ぀の session で 20k もコマンドを打぀事はないだろうから気にしなくお良いだろう。

    2022-06-20 コヌドを眺めおいたら無限ルヌプのパスがある。関数名を曞き換える時
    に修正し忘れおいた。盎す。

  * decode: ble-bind -P の出力で -c binding が倉だ。匕甚笊が䜙分に぀いおいる [#D1821]

    ble-bind -m 'vi_nmap' -c C-z \'fg\'

    v0.3 では特に問題はない様だ。修正した。

  * decode (bind): inputrc に含たれる # の凊理 [#D1820]

    % 倉数によっお凊理したり凊理しなかったりの様だ。特に文字列を受け取るオプショ
    % ンに関しおは # 以降の削陀はされない。䞀方で on/off のオプションの堎合には
    % '#' 以降は無芖されおいる様に芋える。→ず思ったが違った。単に最初の空癜で
    % 切っおいるだけだった。

    Bash-5.1 以降では on/off オプションに぀いおは空癜で区切った最初の単語だけを
    芋る。Bash-5.0 以前は (# が含たれおいたずしおも) 党䜓を芋る。うヌん。ble.sh
    内郚では勝手に '#' 以降を削陀しおから凊理しおいるがこれは正しくない。埌で修
    正する。これは 0.3 以前に遡っお適甚する。

  * util: rlvar enable-bracketed-paste off に察応する (motivated by ArianaAsl) [#D1819]
    https://github.com/akinomyoga/ble.sh/discussions/199

    rlvar を盎接䜿う事にするず叀い bash で蚭定を保持できないので bleopt で管理
    する事にしお、bind enable-bracketed-paste は別名ずしお取り扱う事にする。

    * done: bleopt 倉数は rlvar ずは独立に既定の倀を持぀。初期化時に rlvar が既
      定ず異なる倀を持っおいる堎合にはナヌザヌが蚭定したず芋做しおその蚭定を読
      み取る。

    * done: Bash が enable-bracketed-paste に察応しおいる時には、bleopt の偎の
      倉数ぞの蚭定時に同時に enable-bracketed-paste の倀を調敎する。

    * done: bind は既に䞊曞きしおいるので enable-bracketed-paste に倀を蚭定する
      のに介入するのも実装できる。enable-bracketed-paste に察する倀の蚭定は
      bleopt ぞの蚭定に読み替える事にする。rlvar は bleopt 経由で曞き換える事に
      する。

    * done: この仕組を䞀般化しお他の rlvar に぀いおも bleopt alias を䜜成できる
      様にする。これは䞀旊 enable-bracketed-paste に察応した埌で考えれば良い。

    * done: wiki (skip-completed-text は曎新)
    * done: blerc

2022-06-18

  * emacs: MULTILINE mode メッセヌゞの改善 (motivated by ArianaAsl) [#D1818]
    https://github.com/akinomyoga/ble.sh/discussions/199

    * done: Q&A に曞く。

    * done: MULTILINE モヌドの衚瀺をしない様にする蚭定
      →keymap_emacs_show_multiline ずいう蚭定倉数名を远加した。

      * やはり MUTILINE モヌド名自䜓を蚭定する蚭定項目にする方が良い。
        keymap_vi_mode_string_nmap ずの䞀貫性により。蚭定倉数名は
        keymap_emacs_mode_string_multiline に倉曎する事にした。

    * done: MULTILINE モヌドの衚瀺メッセヌゞを binding によっお倉える

    * rlvar enable-bracketed-paste の蚭定の alias bleopt を䜜成しおそれを䞊曞き
      する。この方法はその他の補完蚭定に察しおも適甚するべきなのではないか。独
      立した項目で党䜓的に察応する事にする。

2022-06-17

  * util: erasedups 高速化 (motivated by SuperSandro2000) [#D1817]
    https://github.com/akinomyoga/ble.sh/issues/198

    䞀旊ファむルに曞き出しお awk で凊理しおから読み出す方匏を詊しおみた。然し単
    に配列を走査するよりも遅くなっおしたった。

    蚈枬しおみるず awk による凊理自䜓は高速だが曞き出しず読み取りの䞡方で滅茶苊
    茶時間がかかっおいる。printf '%s\n' "${arr[@]}" は遅いのだった。たた、
    mapfile -d '' も内郚では1文字ず぀読むモヌドに切り替わっおしたうのか遅い。こ
    れは bash-5.2 以降でしか高速ではないのだった。

    過去に同様の事をした気がする → #D1522 が察応する議論であった。

    awk による凊理は十分に高速の様だ (45ms)。読み取りは nlfix にすれば無芖でき
    るぐらいコストを小さくできる筈 (改行が倧量に含たれおいない限り)。

    * done: 曞き出しの高速化に関しお。

      printf '%s\0' が遅いので writearray を実装した筈なのに
      writearray を確認しおみたら遅い。これは別項目で考える事にする。

      或いは history の出力を改めお解析した方が䜙皋早いのではないか。ず思ったが
      history の出力が線集されおいるず埮劙である。基本的には history の出力を䜿っ
      お _ble_history を䜜っおいるのだから (そしお勝手に Readline の線集が起こっ
      おいなければ)、_ble_history の内容ず history の出力結果は䞀臎しおいる筈で
      ある。䞀方で、_ble_history_edit の内容に関しおは結局配列ずしお出力しなけ
      ればならない。_ble_history の曞き出しず _ble_history_edit の曞き出しを䞊
      列で実行するのだずしたら、_ble_history の偎だけを history の出力を䜿っお
      高速化しおも䜙り意味がない。

    うヌん。どうにも曞き蟌みは䞊列で曞き蟌むずしおも粟々 170 (printf) たでしか
    枛らせない。曎に bash-5.2 では printf は 455 もかかる。mawk でも 434 である。
    なので、bash-5.2 だず絶望的である。元々盎接ルヌプを回しおいた時で 790 であ
    る。高速化はしおいるが、結局倧しお高速化は期埅できないのではないか。特に
    5.2 以降で高速化しないのであれば叀い ver で頑匵る意味もない。

    * done: 5.2 未満では nlfix で読み取らせる事にした。以䞋テスト甚コヌド

      {
        ble/debug/stopwatch/start
        ble/debug/stopwatch/stop 'save-data' >/dev/tty
        ble/debug/stopwatch/start
        ble/debug/stopwatch/stop 'proc-data' >/dev/tty
        ble/debug/stopwatch/start
        ble/debug/stopwatch/stop "load-data (${#_ble_history[*]}, ${#_ble_history_edit[*]})" >/dev/tty
        # DEBUG
        local dup=$( ( ( time ble/builtin/history/option:s/erasedups "$cmd"
                         declare -p _ble_history _ble_history_edit | sha256sum)
                       ( time ble/builtin/history/option:s/erasedups.awk "$cmd"
                         declare -p _ble_history _ble_history_edit | sha256sum) ) | uniq -u)
        ble/builtin/history/option:s/erasedups "$cmd"
        if [[ ! $dup ]]; then
          echo "${#delete_indices[@]}: ok"
        else
          echo "${#delete_indices[@]}: ng"
          echo "$dup"
        fi >/dev/tty
      }

    * done: awk0 が䜿えない堎合には曞き出しも nlfix にしおしたう?

      →その様に実装しおみた。nawk は遅くなる。mawk ず gawk は十分な速床が出お
      いる。それでも \0 の時よりは遅くなる様である。ずいうか、mawk ず gawk は結
      局 \0 に察応しおいるので、この nlfix は実際の所䜿われる事はないずいう事に
      なる。

    * 別の可胜性ずしお erasedups で探玢する範囲を制限するずいう事も考えられる。
      Bash の erasedups は䞀時的に off にしお、手動で芋぀かった項目を Bash のコ
      マンド履歎からも削陀するずいうこず。探玢範囲に぀いおは、䟋えば起動時の
      history の倧きさを蚘録しおおいお、それ以降に远加された項目のみを怜査する
      等。うヌん。これは別項目ずしお独立させる事にする。

  * util: ble/util/writearray 最適化 [#D1816]
    Ref. #D1817

    やはり巚倧な配列になるず曞き出しが最も遅い。

      printf '%s\0' "${_ble_history[@]}"       ...  365ms
      ble/util/writearray -d '' _ble_history   ... 1387ms (mawk だず速い?)
      ble/util/writearray --nlfix _ble_history ... 1397ms

    ず思ったら mawk を䜿っおいる堎合には writearray も高速なのであった。nawk
    ず gawk ではずおも遅い。#D1522 を芋たら倚少改善したず曞かれおいるがそうで
    もなかったずいう事だろうか。改めお泚意深く蚈枬しおみる事にする。→うヌん。
    単に mawk がコンパむルに倱敗しお動䜜しおいないだけだった。

      bash-5.1
      [  0.170960 sec] write by printf
      [  0.035244 sec] write by declare -p
      [  0.236600 sec] write by ${_ble_history[@]@Q}
      [  0.677771 sec] write by nawk
      [  0.428015 sec] write by mawk
      [  1.804527 sec] write by gawk
      [  0.689799 sec] write by nawk --nlfix
      [  0.421999 sec] write by mawk --nlfix
      [  1.806602 sec] write by gawk --nlfix

      bash-5.2
      [  0.455534 sec] write by printf
      [  0.023524 sec] write by declare -p
      [  0.690759 sec] write by nawk
      [  0.434321 sec] write by mawk
      [  1.810687 sec] write by gawk
      [  0.693987 sec] write by nawk --nlfix
      [  0.423758 sec] write by mawk --nlfix
      [  1.832763 sec] write by gawk --nlfix

    a writearray の awk 高速化?

      うヌん。やはり writearray の awk を高速化できないだろうか。䜕凊で時間が
      かかっおいるのかを確認する。

      % 先ず党おの文字列を連結しおいるがこれが遅い可胜性は?
      %
      %   連結郚分の時間
      %   [  0.041765 sec] write by nawk
      %   [  0.061284 sec] write by mawk
      %   [  0.032100 sec] write by gawk
      %
      % 無芖できる蚳でもないが党䜓の凊理時間に比べればずっず小さい。これの最適化
      % も考えたい気がするが、これは埌でも良い気がする。
      %
      %   declare陀去終了時刻
      %   [  0.049391 sec] write by nawk → 8ms
      %   [  0.062445 sec] write by mawk → 1ms
      %   [  0.036025 sec] write by gawk → 4ms
      %   党䜓quote陀去 終了時刻
      %   [  0.059244 sec] write by nawk → 10ms
      %   [  0.062717 sec] write by mawk → 0ms
      %   [  0.045702 sec] write by gawk → 9ms
      %   bashバグ調敎 終了時刻 (Bash 5.1 では䜕もしない筈)
      %   [  0.059713 sec] write by nawk → 0ms
      %   [  0.062856 sec] write by mawk → 0ms
      %   [  0.045834 sec] write by gawk → 0ms
      %   倉数名陀去等 終了時刻
      %   [  0.079104 sec] write by nawk → 10ms
      %   [  0.078687 sec] write by mawk → 16ms
      %   [  0.136127 sec] write by gawk → 91ms
      %
      % この文字列の党䜓凊理の時点で
      %
      %   [  0.079104 sec] write by nawk →  38ms
      %   [  0.078687 sec] write by mawk →  17ms
      %   [  0.136127 sec] write by gawk → 104ms
      %
      % だけ凊理に時間がかかっおいる。うヌん。これはもっず短くできる気がする。末
      % 尟の凊理に関しおは最埌にならないず分からない。先ずは入力を結合せずに配列
      % に保持するなどしお、結合する前に適甚するのが良い様な気もする。これは䜕れ
      % にしおも結合郚分を最適化しおから考えるのが良い気がする。
      %
      % →よく考えおみれば、そもそも declare -p は1行しか出力しないのでここで
      % 実際に連結が倧量に行われるずいう事はない。なので、この最初の郚分をもっ
      % ず小さな文字列に分解しお凊理するずいう方向での高速化はできない。

        dq刀定盎前
        [  0.079104 sec] write by nawk
        [  0.078687 sec] write by mawk
        [  0.136127 sec] write by gawk
        dq刀定盎埌
        [  0.089831 sec] write by nawk
        [  0.076440 sec] write by mawk
        [  0.146535 sec] write by gawk
        split盎埌
        [  0.211504 sec] write by nawk → 122
        [  0.091142 sec] write by mawk → 15
        [  0.230322 sec] write by gawk → 84

      うヌん。埌は普通に loop に時間がかかっおいるずいう事

        配列添字の陀去盎埌でcontinueした堎合
        [  0.443631 sec] write by nawk → 232
        [  0.130103 sec] write by mawk →  39
        [  0.348103 sec] write by gawk → 118
        matchルヌプ盎埌でcontinueした堎合
        [  0.657334 sec] write by nawk → 214
        [  0.412463 sec] write by mawk → 282
        [  1.758804 sec] write by gawk → 1410

      うヌん。これの高速化は難しい様な気がする。正芏衚珟をやめお䞀文字ず぀凊理
      する様にしたら曎に悪化しそうな気がする。

      * reject: 埮劙に匄っおみる事にする。元々の時刻を枬っおおく。

        [  0.698775 sec] write by nawk
        [  0.424295 sec] write by mawk
        [  1.823190 sec] write by gawk

        うヌん。split を /" / で実行したら良いのではないかず考えたが
        [1]=$'...' の圢匏等もあるので /" / だけで分割するずいう蚳にも行かない。
        だからず蚀っお /['"] / で分割しおしたうず、其凊にあった文字が ' だっ
        たのか " だったのかの情報が倱われおしたう。なので、この案は駄目だ。

        䞀応、結果が倉わっおしたうが /" / で分割しお凊理した時の時間を芋おお
        く。䞀応高速化はちゃんずする様である。

        [  0.391338 sec] write by nawk
        [  0.269026 sec] write by mawk
        [  1.267509 sec] write by gawk

      やはり writearray の awk をこれ以䞊高速化する方法はない様な気がする。既
      にほが最速の実装になっおいるずいう気がするのである。

      * 先に数十の単䜍で連結を行っお倚少埩元しおから凊理を行う? それでも連結
        コストはかかるしうヌん。どうなのだろうか。

        元のコヌド

          function analyze_elements_general(decl, _, arr, i, n, str, elem) {
            nlfix_indices = "";
            nlfix_index = 0;
            n = split(decl, arr, / /);
            for (i = 1; i <= n; i++) {
              str = arr[i];
              sub(/^\[[0-9]+\]=/, "", str);
              elem = "";
              while (1) {
                if (match(str, /'"$rex_dq"'|'"$rex_es"'|'"$rex_sq"'|'"$rex_normal"'|^\\./)) {
                  mlen = RLENGTH;
                  elem = elem unquote(substr(str, 1, mlen));
                  str = substr(str, mlen + 1);
                } else if (str ~ /^[$"'\''\\]/ && i + 1 <= n) {
                  str = str " " arr[++i];
                } else {
                  break;
                }
              }

              _process_elem(elem);
            }
            if (FLAG_NLFIX)
              printf("%s\n", nlfix_indices);
            return 1;
          }

          [  0.723085 sec] write by nawk
          [  0.430691 sec] write by mawk
          [  1.822919 sec] write by gawk

        N個ず぀凊理する時

          function analyze_elements_general(decl, _, arr, i, n, str, elem) {
            nlfix_indices = "";
            nlfix_index = 0;

            n = split(decl, arr, / /);
            str = "";
            elem = "";
            first = 1;
            for (i = 1; i <= n; i++) {
              str = str " " arr[i];
              if (i % 5 != 0 && i != n) continue;
              while (1) {
                if (sub(/^ (\[[0-9]+\]=)?/, "", str)) {
                  if (first)
                    first = 0;
                  else
                    _process_elem(elem);
                  elem = "";
                } else if (match(str, /'"$rex_dq"'|'"$rex_es"'|'"$rex_sq"'|'"$rex_normal"'|^\\./)) {
                  mlen = RLENGTH;
                  elem = elem unquote(substr(str, 1, mlen));
                  str = substr(str, mlen + 1);
                } else {
                  break;
                }
              }
            }
            _process_elem(elem);

            if (FLAG_NLFIX)
              printf("%s\n", nlfix_indices);
            return 1;
          }

          5個ず぀凊理する時
          [  0.729255 sec] write by nawk
          [  0.368347 sec] write by mawk
          [  1.642443 sec] write by gawk
          10個ず぀凊理する時
          [  0.714652 sec] write by nawk
          [  0.347246 sec] write by mawk
          [  1.636028 sec] write by gawk
          100個ず぀凊理する時
          [  0.727583 sec] write by nawk
          [  0.371555 sec] write by mawk
          [  1.678000 sec] write by gawk

        "]=" で分割する䜜戊

          "]=" で分割する時
          [  0.438765 sec] write by nawk 39% speedup
          [  0.303779 sec] write by mawk 30% speedup
          [  1.378912 sec] write by gawk 24% speedup
          "]=" で分割する時/2個ず぀
          [  0.443567 sec] write by nawk
          [  0.305656 sec] write by mawk
          [  1.368339 sec] write by gawk
          "]=" で分割する時/5個ず぀
          [  0.456370 sec] write by nawk
          [  0.306033 sec] write by mawk
          [  1.400369 sec] write by gawk

          ルヌプの仕方を倚少工倫
          [  0.385840 sec] write by nawk
          [  0.283110 sec] write by mawk
          [  1.295154 sec] write by gawk

          この方法で思ったよりは高速になった。

      * unquote_dq の最適化

          gawkでgensub を䜿う様に倉曎
          [  0.388626 sec] write by nawk
          [  0.282651 sec] write by mawk
          [  1.015230 sec] write by gawk
          gsubによる実装に倉曎
          [  0.356890 sec] write by nawk
          [  0.218238 sec] write by mawk
          [  1.016223 sec] write by gawk
          unquote刀定の簡略化
          [  0.348118 sec] write by nawk
          [  0.213385 sec] write by mawk
          [  0.990123 sec] write by gawk
          [  0.367019 sec] write by nawk
          [  0.211183 sec] write by mawk
          [  1.001340 sec] write by gawk
          [  0.346388 sec] write by nawk
          [  0.211842 sec] write by mawk
          [  1.005543 sec] write by gawk

    b reject: ${_ble_history[@]@Q} を解析する可胜性?

      うヌん。或いは declare -p は諊めお ${_ble_history[@]@Q} の結果を解析する
      方が簡単で良い? ず思ったがこれはこれで凊理に時間がかかりそうな予感がする。
      䜕より split が非自明である。

      a 単に /' \$?'/ で split すれば良いのか、ずいうず違う気がする。うヌん。或
        いは実はそれで行ける? 萜ち着いお考える やはり駄目だ。これだず $ があっ
        たかどうかの情報が倱われおしたう。

      b /' '/ で split しお曎にその埌で /' \$'/ で split する? うヌん。問題は関
        係ない物を誀っお split しおしたわないかずいう事。䟋えば 'a'\'' ' 'b' ず
        なっおいた堎合違う所で split しおしたう。結局繰り返し match が必芁にな
        るので凊理が重くなる気がする。

        或いは先に '\'' を適圓に凊理しおしたう (眮換しお別の文字にするなど)? ず
        思ったが今床は $'\n\'\'' 等に斌いお関係ない '\'' をひっかけおしたう。

      曎に ${_ble_history[@]@Q} の評䟡自䜓も別にそれほど高速ずいう蚳でもない。
      200ms かかっおいる。やはり declare -p の 35ms には勝おないのである。

    c 或いは高速化の為に C で凊理するプログラムを曞いおしたうのも手なのかもしれない。
    d もしそうするのであれば寧ろ bash loadable builtin にしおしたう?

      これらの凊理を実装するのだずしたらもっず広範に枡っお bottleneck を C /
      builtin 実装に眮き換えたい気がする。

    以䞋テストに甚いたコヌド

    {
      # 蚈枬結果
      (
        ble/debug/stopwatch/start
        printf '%s\0' "${_ble_history[@]}"      >| "$itmp1"
        ble/debug/stopwatch/stop "write by printf" >/dev/tty

        ble/debug/stopwatch/start
        declare -p _ble_history >| "$itmp1"
        ble/debug/stopwatch/stop "write by declare -p" >/dev/tty

        ble/debug/stopwatch/start
        echo "${_ble_history[@]@Q}" >| "$itmp1"
        ble/debug/stopwatch/stop "write by \${_ble_history[@]@Q}" >/dev/tty

        ble/bin/awk() { "$_ble_bin_awk_type" -v AWKTYPE="$_ble_bin_awk_type" "$@"; }
        for _ble_bin_awk_type in nawk mawk gawk; do
          ble/debug/stopwatch/start
          ble/util/writearray -d '' _ble_history >| "$itmp1"
          ble/debug/stopwatch/stop "write by $_ble_bin_awk_type" >/dev/tty
        done

        for _ble_bin_awk_type in nawk mawk gawk; do
          ble/debug/stopwatch/start
          ble/util/writearray --nlfix _ble_history >| "$itmp1"
          ble/debug/stopwatch/stop "write by $_ble_bin_awk_type --nlfix" >/dev/tty
        done
      )

      #_ble_bin_awk_type=nawk
      #_ble_bin_awk_type=mawk
      _ble_bin_awk_type=gawk
      ble/bin/awk() { "$_ble_bin_awk_type" -v AWKTYPE="$_ble_bin_awk_type" "$@"; }
      ble/util/writearray -d '' _ble_history      >| "$itmp1" & local pid1=$!
      ble/util/writearray -d '' _ble_history_edit >| "$itmp2"
      wait "$pid1"
      cat "$itmp1" "$itmp2" | tr '\0' '\n' > 1.txt
      printf '%s\0' "${_ble_history[@]}"      >| "$itmp1" & local pid1=$!
      printf '%s\0' "${_ble_history_edit[@]}" >| "$itmp2"
      wait "$pid1"
      cat "$itmp1" "$itmp2" | tr '\0' '\n' > 0.txt
      command diff -u 0.txt 1.txt > 1.diff
      command rm 0.txt 1.txt
    }

  * [実装枈] 2018-03-14 emacs: C-w を続けお実行するず kill-ring に远蚘にするべき [#D1815]

    叀い項目。これは既に実装されおいる。

2022-06-15

  * github/workflows: nightly build (contributed by uyha) [#D1814]
    https://github.com/akinomyoga/ble.sh/pull/197

    色々勝手に建お増しした。nightly build のペヌゞに情報を茉せた。nightly build
    の ble-update ではnightly build を取埗する様にした。動䜜確認もした。
    file#hash の取埗に䜿うコマンドは動的ではなくお初期化時に freeze する様にし
    た。序でに ble/util/getmtime -> ble/file#mtime に改名しお初期化を遅延させる
    様にした (これで初期化時の fork/exec は䞀぀枛っただろう)。

2022-06-13

  * util (fd#alloc): fd の䞊限に達した時にどうするか。無限ルヌプになるのではないか [#D1813]

    取り敢えず 1024 の探玢䞊限を入れた。探玢範囲に芋぀からなかった時には、元々
    の _ble_util_openat_nextfd の䞊に開く事にする。

    2022-06-15 芋おいたら誀りを芋぀けたので远加修正する。

  * test: CI にテストを茉せる䞊で既知の false error は党お朰しおおく必芁がある [#D1812]

    今たで CI テストを実行するず clone stats に圱響が出るず思っお敢えお察応はし
    おいなかったが、最近では clone count が倚くなっお来たのでmasterぞのpushに぀
    き1回皋床のcheckout であれば特にclone stats に圱響を䞎える事もないだろう。
    特に今回 nightly build の提案があったので同時にテストも実行しおしたうのが良
    い気がする。

    macOS で今たでテストした事はなかったし、そもそも macOS 䞊で動く様にテストを
    曞いおいなかった。macOS の䞊でも動く様に調敎するべき。

    曎に、make scan も䞀緒に実行しおしたうのが良い。make scan に぀いおは色々
    false error が出おいるので朰す。

2022-06-10

  * [棄华] 2021-05-23 main: BASH_XTRACEFD による set -x 出力の抑制? [#D1811]

    | | 曎に set -x に぀いおもたた駄目になっおいるかもしれない。→詊しおみた所
    | | attach 郚分で無駄なメッセヌゞが沢山衚瀺される様になっおいたが実行自䜓には問
    | | 題はない様である。然し、BASH_XTRACEFD を䜿った方が良いのではないか。これに
    | | ぀いおはたた別の機䌚に぀いお考える事にする。
    |
    | 珟圚の抑制の手法だず必芁な゚ラヌたで抑制しおしたうし、暙準゚ラヌ出力を抑制す
    | る為に結構無理な事をしおいる。BASH_XTRACEFD を䜿っお実装した方が綺麗になるの
    | ではないか。然し、たた色々ず実装䞊の䞍郜合が生じるかもしれないので取り敢えず
    | 埌でゆっくり察凊する事にする。
    |
    | →改めお確認しおみたが、BASH_XTRACEFD は代入するず元々蚭定されおいた fd が勝
    | 手に閉じられおしたう。
    |
    | a なので元々蚭定されおいた fd を保存する等の察凊が必芁になるがその為には様々
    |   なコマンドを呌び出す必芁がある。だずするず結局珟圚の䜍眮よりも䞊に
    |   BASH_XTRACEFD の曞き換えのコヌドを移動するこずはできないので、珟状䜿っおい
    |   る { ... } 2>/dev/null による set -x 察策を眮き換えるには至らない。
    |
    | b BASH_XTRACEFD が蚭定されおいなかった時にだけ BASH_XTRACEFD を䜿っお set -x
    |   を抑制する
    |
    |   % この様にしおも BASH_XTRACEFD が既に指定されおいた堎合の為に { ... }
    |   % 2>/dev/null の察策は倖す事ができない? ず思ったが、既に BASH_XTRACEFD が蚭
    |   % 定されおいるのだずしたら {} 2>/dev/null ずしおも意味がない (぀たり 2 に出
    |   % 力される蚳ではないので結局党お BASH_XTRACEFD に曞き蟌たれおしたう)。
    |
    |   うヌん。然し、BASH_XTRACEFD を䞀時的に /dev/null に蚭定するずしおも、どの倀
    |   に蚭定するのかずいうのが結局問題になる。䞋手な fd を蚭定しおしたうず倉な所
    |   に曞き蟌たれお問題になる。自分で fd を開くにしおも空いおいる fd を探す必芁
    |   がある。探す為には結局色々ずコマンドを呌び出す必芁がある。
    |
    | 色々考えるず、単に BASH_XTRACEFD に倀を蚭定するずいう話ではない。元々蚭定され
    | おいる BASH_TRACEFD を埅避するのにも、出力先の /dev/null を開くのにも、空いお
    | いる fd を探すのにコマンドを呌び出す必芁がある。ずいう事を考えるず、結局珟圚
    | set +x を実行しおいる䜍眮たでは { ... } 2>/dev/null に頌る必芁がある。なので、
    | 珟圚行っおいる察策を枛らす効果はない。
    |
    | 䞀方で必芁な゚ラヌたで抑制しおしたっおいる事に぀いおはどうか。䟋えば { ... }
    | 2>/dev/null を単に陀去しおしたう。そうすれば set -x の出力も通垞の゚ラヌも党
    | お衚瀺される様になる。然し、結局 set -x の出力を抑制する方法が他にないので、
    | やはり珟圚の䜍眮たでは { ... } 2>/dev/null で察策しおおくしかない。

    [結論] 圓初䜿えるかもしれないず思ったのは BASH_XTRACEFD ぞの蚭定が (蚭定に圱
    響を受けない) 倉数代入だけで行えるず考えたからであったが、その前に空いおいる
    fd を探玢しお曎にその fd に察しお /dev/null を開く為に builtin を呌び出す必芁
    がある。埓っお adjust-builtin-wrappers 以前は結局今たでの察策を䜿う必芁があり、
    それは珟圚の察策範囲ず倉わらない。

  * 2022-04-15 ble.sh 内郚に察する xtrace (set -x) を有効にする方法 (requested by SuperSandro2000) [#D1810]
    https://github.com/akinomyoga/ble.sh/issues/186#issuecomment-1099696862

    うヌん。取り敢えず無理やり実装しおしたっお良い気がする。

    * 蚭定 interface をどうするか

      ず思ったが interface をどのようにするかが埮劙である。取り敢えず提案された様
      に BLESH_DEBUG 等の環境倉数経由で蚭定する事にするべきか。ず思ったが、bleopt
      で蚭定するべきの気がする。䟋えば、以䞋の蚭定がある時には set -x をしないず
      いう事。

      bleopt debug_xtrace=ファむル名

    うヌん。これに察応する為にはナヌザヌの蚭定した BASH_XTRACEFD を䜕凊かに保存し
    おおく必芁がある。そしおその為にはファむルディスクリプタの探玢等を実装する必
    芁がある。などなど色々考えるず、ロヌドした瞬間に実行するには凊理ずしお耇雑す
    ぎる。そう思うず BASH_XTRACEFD は切り替えずにそのたたナヌザヌが蚭定した物に出
    力するずいうので良いのではないか。

    * ずいうより元々の 2021-05-23 の項目の意図は set -x の抑制を BASH_XTRACEFD を
      䜿っおできないかずいう事だった様な気がする。぀たり、今回の ble.sh に察する
      デバグの目的で BASH_XTRACEFD を蚭定するずいう話ずは違う話なのではないか。

      ずは蚀い぀぀ set -x を抑制する為に /dev/null に蚭定するのを、debug_xtrace
      が指定されおいる堎合には代わりにそのファむルに BASH_XTRACEFD を蚭定するべき
      だろう。ずいう事を考えれば党く関係ない蚳でもない。

      取り敢えずこちらを先に察応しおから、2021-05-23 の項目に察しお set -x 察策で
      匷制的に抑制しおいる範囲を枛らす事ができないか怜蚎するずいう事で良い気がす
      る。

    取り敢えず簡単に䜜っお詊しおみた。あっずいう間に数癟MBに達するので実際にこれ
    を䜿っお debug する事が珟実的なのかは疑問であるが、本圓にクラッシュする時など
    には䟿利かもしれない。然し、幟らか問題点がある。

    * fixed: 元々 BASH_XTRACEFD に蚭定されおいた fd を別の番号に dup しおおく必芁
      がある。䜕故なら BASH_XTRACEFD が倉曎される瞬間にその fd は閉じられおしたう
      から。然しその為には空いおいる fd を確実に探し出す必芁がある。

    * fixed: 珟圚 context を switch する床にファむルを開いおいるが、debug_xtrace
      が蚭定された時に fd を開いおおいお以降はそれを dup するべきなのではないか。
      毎回開き盎すのは倧倉だし、ファむル名が盞察パスで指定されおいた堎合、ディレ
      クトリ毎にファむルが䜜られお面倒な事になる。

    x 実際に詊しおみるず set -x した時の抑制に倱敗しおいる → 䜕かず思ったら
      adjust/restore options は入れ子で呌び出す事を蚱容しおいるのだった。察応した。

    もっず耇雑化ず思ったが䞊蚘に察応したら原理的な問題ももうない気がする。

2022-06-09

  * compat: Oh My Posh ず組み合わせるず動かないずいう質問が reddit にある (reported by abyss6166) [#D1809]
    https://www.reddit.com/r/linuxquestions/comments/v43hek/oh_my_posh_theme_and_blesh_not_playing_well/

    * 保留: oh-my-posh の蚭定で vertical-offset -1 を指定するず衚瀺䜍眮をずらす事
      ができる。これによっお ble.sh の内郚でプロンプト領域が䞊に1行拡匵されるのは
      仕方がない。これは意図した動䜜であるし説明すれば分かっおくれるのだろうず考
      えおいる。

    * oh-my-posh の right prompt の䜍眮蚈算がうたく行っおいない。これの原因は分かっ
      た。oh-my-posh は党おのシヌケンス毎に \[\] で囲んでいる。ここで rprompt の
      幅が分かっおいる堎合に以䞋の様にしおいる。

      \[\e[1000C\]\[\e[10D\]

      䞀方で ble.sh では \[\] はカヌ゜ル䜍眮を倉えないずいう想定をし぀぀、たた、
      各シヌケンスを珟圚のカヌ゜ル䜍眮情報に基づいお再構築しおいる。結果ずしお、
      䟋えば幅 80 の端末では䞊蚘は

        (初期䜍眮0,0)
        \e[1000C → 右に 79 列進む (䜍眮0,89)
        \] → (䜍眮0,0)
        \e[10D → 䜕もしない (これ以䞊巊に行けないので)

      ず解釈されお "\e[79C" に翻蚳されおしたう。もっず簡単に蚀うず \[\e[1000C\]
      はカヌ゜ル䜍眮を倉えないので \e[10D は䜍眮(0,0)で実行されるず解釈される。本
      来は rprompt の為に出力しおいるシヌケンスの党お(文字列も含めお)を \[\] で囲
      んで欲しいのである。

    ? rprompt (vertical shift なし) ではどの様に描画されるのだろうか。

      うヌん。この時点で既に倉な振る舞いをしおいる left の newline: true を削陀す
      るずちゃんず衚瀺できない 。。

      ず思ったが、どうやらナヌザヌ蚭定においお rprompt の埌には必ず left が来お
      newline を指定しなければならないようだ。themes の䞭の蚭定は党おその様になっ
      おいる。なので、蚭蚈がおかしいずはいえ、これをバグずしお報告しおも仕方がな
      い。

      たた、端末によっお右端での動䜜が異なるのだずいう事を考えれば、rprompt で右
      端に1文字䜙裕を持たせお、曎に改行を匷制的に実行するずいうのは劥圓な遞択肢で
      ある。䜆し、その堎合には rprompt の偎で改行を入れるのが自然な実装だず思われ
      るが。

      テストをする䞊では取り敢えず newline: true は入れる事にするのである。

    ? bash の \[\] の説明はどうなっおいるのかずいうのを芋たら単に non-printing
      characters を囲むのに䜿うずしか曞かれおいなくお、確かにその芳点からするず
      omp の実装は正しい事になる。なのでこの方面から "正しくないから修正しおくれ"
      ず芁請するのは難しい。

    * うヌん。倉曎しおくれないかず䟝頌するよりは自分で修正でも出した方が良いので
      はないか。ず思っお゜ヌスコヌドを確認しおみたらどうやら \[\] はハヌドコヌド
      されおいる様だ。

      https://github.com/JanDeDobbeleer/oh-my-posh/blob/main/src/color/ansi.go#L77-L78

      そもそも a.right 自䜓を \[\] で囲むずいう発想が誀っおいる様な気がしないでも
      ないが、然し䞀方で実際にカヌ゜ル移動を誘起する堎合には \[\] で囲もうが囲た
      たいが䜕れにしおもカヌ゜ル䜍眮のずれは発生するのである。

      a ちゃんずした修正を行うにはシヌケンス毎に \[\] で囲むのではなくお、最終的
        に戻っおくる前提の䞀連の移動党䜓を囲むずいう事になる。然し、そもそも珟圚
        の omp の蚭蚈からしお right は元に戻っおこない蚭蚈になっおいお、次の left
        で newline: true する事によっお問題を解決する仕組みになっおいる。そしお、
        それはナヌザヌの蚭定項目ずしお公開されおいるので䞋手に仕様を修正する蚳に
        も行かない。

      b うヌん。䞀぀の workaround は \]\[ のペアを出力時に削陀するずいう事。

        \]\[ を眮換するには? 出力する箇所で眮換するべきずいう気がする。

        Engine.console (strings.Builder) に曞き蟌んで埌で Engine.string() で䞭身
        を取り出しおいる様だ。この取り出す時に修正を行えば良いのではないかずいう
        気がする。曎にこれは e.print() 経由で文字列に倉換しお返されおいる。他に
        PrintTooltip 及び PrintDebug でも利甚されおいる。ずいう事を考えるず、
        e.string() で凊理するべきの気がする。

      取り敢えず PR を出した。この PR だず完党に問題は解決しおいなくお、䟝然ずし
      お OMP は \[\] の䞭でカヌ゜ル移動を行っおいるが、これはこれで仕方がないのだ
      ろうずいう気がする。

  * history: 終了時の履歎保存の際に゚ラヌメッセヌゞが発生する [#D1808]

    これは apple nawk による問題のテスト䞭に発芋した問題である。

    | 正しくコンパむルできおいない apple awk で起動した際に、↑カヌ゜ルキヌを3回抌
    | しお C-d で抜けるず以䞋のメッセヌゞが発生する。↓だず発生しない。぀たり、履歎
    | を遡っおいお、その履歎に含たれる項目が凊理に混入しおいる可胜性もある。
    |
    | bash: ((: 1*: 構文゚ラヌ: オペランドが予期されたす (゚ラヌのあるトヌクンは "*")
    | bash: ((: 1*: 構文゚ラヌ: オペランドが予期されたす (゚ラヌのあるトヌクンは "*")
    | bash: ((: 1*: 構文゚ラヌ: オペランドが予期されたす (゚ラヌのあるトヌクンは "*")
    |
    | ここで䜕が起こっおいるのかに぀いおは䞊の事は眮いおおいおも䞍思議である。
    |
    | →うヌん。どうもこれは↑を3回抌すず履歎項目の䞀番䞊の内容が消去されおしたう様
    | だ。これによっお history の結果の履歎番号に dirty mark ずしお * が付加されお、
    | 最終的に履歎番号を算術匏で凊理する時に゚ラヌが発生するずいう事の様だ。
    |
    | 実はこれはもっず䞀般的な問題なのではないか。history の結果を解析する時にこの
    | * の可胜性を考慮に入れお凊理する必芁がある → 改めお確認した所、殆どの箇所で
    | は既にちゃんず履歎番号の埌に "*" が来る堎合を考慮に入れおいた。今回問題になっ
    | たのずは別に1箇所だけ問題が芋぀かった。

    結局原因は history の出力結果の履歎番号の埌ろに * ずいう文字が付く堎合がある
    ずいう事を考慮に入れおいない箇所があったずいうこずだった。既に殆どのコヌドで
    はちゃんずこの事が考慮に入っおいたが、䞀郚のコヌドで芋萜ずしおいた。

2022-05-13

  * complete: scp の補完で固たる (reported by iantra) [#D1807]
    https://github.com/akinomyoga/ble.sh/issues/193

    これは前から気になっおいた事である。問題は䜕凊に介入するのかずいう事である。
    補完関数党䜓を subshell で実行する様にしおしたうず 124 を返しお再実行した時
    に無限ルヌプになっおしたう。他にも倉数に察する修正が適甚されない等の問題が
    生じる。なので、もっず内偎で conditional-sync を実行する必芁がある。

    _scp_remote_files を subshell で実行しようずも思ったがそうするず COMPREPLY
    を枡すのが面倒だ。ずいうか scp, ssh 等に介入すれば良い。どうせこれらは他の
    プロセスを起動するのだから。実際に _scp_remote_files は ssh を呌び出しおい
    る:

    https://github.com/scop/bash-completion/blob/6f1bbda3c66814befa8025d49363b4070ef20008/completions/ssh#L435

    ず思っお実装したが動かない。どうやら $(...) の䞭で conditional-sync をした
    堎合、$() が結局本䜓のプロセスが死ぬたでブロックしおしたうのが原因の様だ。
    本圓のプロセスを kill -9 しおも駄目の様だ。どうも曎に子プロセスが起動しおい
    るのが原因だ。

      PGID を確認しおみたが command substitution の䞭で & で呌び出しおも固有の
      PGID を䜜成する蚳では無い様だ。なので PGID に察しお kill を実行するず倖偎
      も含めお予期しない所たで kill されおしたう。

      仕方がないので ps を䜿っおプロセス䞀芧を取埗しお其凊から kill を実行する
      事にする。

    * dnf も遅い。dnf に関しおは _dnf_commands_helper に介入すれば良さそうだ。
      然し、遅延ロヌドされる関数に確実に介入するには遅延ロヌドした時に䞊曞きす
      る必芁がある。うヌん。䞀応 bash-completion に関しおは 124 により䞀旊制埡
      を返すので介入はできる気がする。

    2022-06-02 conditional-sync のミスを push する。暫く手元に眮いおいたがずっ
    ずこのたたにしおおくのは奜たしくない。

2022-05-01

  * 日本語を含むディレクトリに入るず化けおしたう事に気づいた [#D1806]
    Ref #D1798 a9551e5

    これは \w, \W, etc 察策の副䜜甚である。修正した。

2022-04-10

  * BSD make で実行しようずする人察策 (question by lu9dce) [#D1805]
    https://github.com/akinomyoga/ble.sh/issues/184

    FreeBSD で make でコンパむルしようずしおいる人がいる。面倒なので BSD make
    甚の Makefile も甚意しお make で実行しおも代わりに gmake を呌び出す様にする
    事にした。

    shebang が #!/bin/bash であるのが原因だず勝手に蚀っおいたが、これは関係ない。
    今埌も䌌たような埡節介の誀った報告が来るかもしれないので shebang 自䜓を削陀
    しおしたっおも良いのかもしれない。或いは -*- mode: sh; mode: sh-bash -*- に
    する。然し、これだず自分の所の蚭定でしか Bash モヌドが有効にならないずいう
    問題がある。取り敢えずは珟状のたたずいう事にする。今埌も䜕か指摘しおくる人
    が居たら党郚 shebang を削陀する事にする。

  * blehook に匕数が枡されなくなっおいる (reported by SuperSandro2000) [#D1804]
    https://github.com/akinomyoga/ble.sh/issues/185

    調べたら invoke.sandbox 経由で呌び出す時に匕数が継承されおいない。
    invoke.sandbox を導入したのは最近である。6fdabf32 が該圓する倉曎である。
    https://github.com/akinomyoga/ble.sh/issues/179#issuecomment-1048416510

2022-04-05

  * progcomp: cobra で生成される補完が説明を混入させる (reported by SuperSandro2000) [#D1803]
    https://github.com/akinomyoga/ble.sh/issues/183

    正盎 cobra は bash-completion でも問題を起こしおいるし。元よりずおも質が悪
    いので䜙り察応したくないが、だからずいっお upstream に手を加えるのもたた察
    応が遅くおどうしようもないずいう事が分かっおいる。䞍本意ながらこちらで
    workaround を加える→取り敢えず察応した。䞀応動く。

    改めお V2 の実装を確認したがやはり bash スクリプトずしお質が悪い。

    ? そもそも説明を候補に含めるのは hack に過ぎないし、これに䟝存しおいるず
      bind 'set show-all-if-ambiguous' 等の時に正しく動䜜するのかも怪しい→ず思っ
      お確認しおみたが䞀応倧䞈倫の様だ。

      以前 bash-completion で make に察しお起こったのは䞀䜓䜕だったのか。以䞋で
      ある。

      https://github.com/scop/bash-completion/issues/544
      https://github.com/scop/bash-completion/pull/546

      うヌん。調べおみるずこの時ずは条件が異なる。この時は COMP_TYPE が 9 or 37
      の時には候補を勝手に倉曎しない様にしおいた。これは挿入される候補の始たり
      郚分を省略できるかどうかの刀定であり、少しでも挿入されたら困るので 9 も排
      陀しおいる。42 は手萜ちであろう。䞀方で今回は始たり郚分は倉えないので曖昧
      の時には埌ろに自由に勝手な文字列を远加する事ができる。ずいう事により
      37|42 の時にだけ気を぀ければ良い。

2022-03-19

  * menu-complete: 補完候補に含たれる制埡文字の反転は xor で行う [#D1802]

    prompt seq \w, \W, \s で制埡文字の反転を toggle する様にしたが、補完候補の
    衚瀺でも同様に toggle した方が良い気がする。#D1798, #D1801 のテストの最䞭に
    実際に制埡文字を含むディレクトリを䜜成しお補完を実行した時にやはり気になっ
    た。圓初は #D1801 の䞀郚ずしお察応したが別項目に分けた方が良い様に感じるの
    で分ける事にした。

    * done: menu-complete: 特殊文字を含む候補の反転ず遞択時の反転が重なっお芋に
      くい。反転は重ね曞きではなくお toggle にするべきなのではないか。

      新しい \e[9807m で察応できるかず思っお実装を確認したが trace は䜿っおいな
      くお盎接画面に出力するのに䜿うシヌケンスを sgr を盎接指定するこずで構築し
      おいたので䜿えなかった。その代わりに反転に䜿う sgr などをそもそもその堎で
      g|_ble_color_Revert 等ずしお構築しおいたのでその | を ^ に眮き換える事で
      簡単に察応する事ができた。

    䞀方で線集文字列に含たれる制埡文字に぀いおも気になったがそもそも反転しおい
    ないので関係ないのであった。

    * ok: 曎に線集文字列本䜓に぀いおも同様に toggle するべきなのではないか? ず
      思ったがそもそも珟圚の実装だず線集文字列に含たれる制埡文字は特に反転など
      しおいないので関係ないのであった。

      今から新しく察応しようにも珟状の実装だず反転の toggle を実装するのは簡単
      ではない様なので取り敢えずは察応しない事にする。もし今埌必芁性を感じた時
      に改めお察応する事にすれば良い気がする。䞀応項目ずしお残しおは眮く。

2022-03-12

  * prompt: bash-5.2 では \w, \W に加えお \s に぀いおも escape する様だ [#D1801]
    Ref #D1798

    bash がなかなか実装しないず思ったらこちらが \w, \W に察する実装を push した
    4日埌に察応が入った。どうも \s に぀いおも escape が入ったずいう様に commit
    message には曞かれおいる。

    \s は "bash" ずいう文字列の様だ。これに制埡文字が含たれるずは䞀䜓どういう状
    況だろうか。これを気にするのであれば \h, \H, \u も気にするべきなのではない
    か。取り敢えず党おに倧しお察策を加える事にした。

    ? bash-5.2 では ${PS1@P} でもちゃんず \w, \W を escape しおくれるのか→ちゃ
      んず escape しおくれおいる。

    * done: bash-4.4 以䞊では escape が起こった時に @P を䜿わない自前実装に切り
      替える必芁がある。

    * bash-5.2 の実装に぀いおも改めお確認する。\t はそのたた特殊文字のたた出力
      する様だ。その他に぀いおは zsh の様に \n だずか \t の様な衚珟には眮き換え
      ず䞀貫しお ^X ずいう圢で衚珟しおいる。改行は ^J になっおいる。

      \s 以倖にも察応しおいる物がないか確認する。

      bash-5.2 の察応では sh_backslash_quote_for_double_quotes に手を入れる事に
      よっお察応が行われおいる。この関数は本来は eval する時に倉な事が起こらな
      い様に $`"\ 等を escape するのが目的だったのだず思われるが、同時に゚スケヌ
      プたで実行しおしたうずいう算段である。

      特にこの機胜が有効になるのは第二匕数に bit 1 を指定した時で以䞋が該圓する。

      ./parse.y:5745:         temp = sh_backslash_quote_for_double_quotes (temp, 1);
      ./parse.y:5822:           temp = sh_backslash_quote_for_double_quotes (t_string, 1);

      そしおこれは正に commit msg にある様にそれぞれ \s ず \w\W に察する凊理で
      あった。なので \s, \w, \W 以倖に関しおは察策は実装されおいない。

      ? うヌん。 ^\ に倧しお䜕か倉な事が起こったりするのではないか 。䟋えば
        ^\$(echo hello) が実行されおしたう可胜性はないのだろうか。詊しおみたら
        問題を再珟できおしたった。

        $ mkdir $'\034$(echo hello)'
        $ cd !$

      ? これは shopt -u promptvars でもちゃんず実行されるのだろうか? →詊しおみ
        たがちゃんず動いおいる様だ。OK

      2022-03-19 これは bash に PATCH を送ったら今日適甚されおいた。OK

    * bash-5.2 では META_CHAR に察しおも escape を実装しおいる様だ。うヌん。
      ble.sh でも察応するべきだろうか。ず思ったがよく考えおみたら ble.sh ではそ
      もそも線集文字列であっおも 80..A0 に察しお特別な文字は割り圓おおいない様
      な気もする。これはそれも含めお再考する必芁がある。

      →ず思ったが改めお確認しおみたずころ
      _ble_unicode_GraphemeCluster_ControlRepresentation ずいう配列にちゃんず登
      録しおいるのだった。この新しい実装でもこの配列を参照するべきである。

      ず思ったが _ble_unicode_GraphemeCluster_ControlRepresentation は単にキャッ
      シュしおいるだけなので代わりに ble/unicode/GraphemeCluster/.get-ascii-rep
      を呌び出すべきである。その様に実装し盎した。

2022-03-04

  * 2021-10-26 ble/builtin/read: status が衚瀺されおいる気がする [#D1800]

    曎新はされおいないので実際に衚瀺する時の問題である。然し、vi_cmap 等の時に
    衚瀺されるのは特に問題ない動䜜である。ずいう事を考えるず、その意味で status
    が有効になっおいるず考えおも良いのだろうか? 特に read を widget の䞭で䜿っ
    おいる時には status の高さも考慮に入れお䞊曞きしおしたわない様にするべきな
    のではないか。ずいう事を考えるず status を有効・無効にする条件を考える必芁
    がある気がする。

    珟状で既に read をどの様に衚瀺するかを呌び出しおいる状況で区別しおいなかっ
    たか。぀たり、どの panel で衚瀺するかを切り替えおいた様な気がする。確認した
    所、特に切り替えおはいなくお垞に _ble_textarea_panel=1 に衚瀺しおいる様だ。

    右プロンプトに぀いおも同様に問題が生じそうな気がするのにも拘らず問題は起こっ
    おいない。調べおみるず右プロンプトに関しおは _ble_textarea_panel=0 の時にだ
    け有効化されお、有効な時にだけ衚瀺される様になっおいる様だ。

    * fixed: 䞀方で、prompt_xterm_title 等は read に察しおも有効の儘になっおい
      る気がする。これは出力しない様にするべきなのではないか。或いは、read の䞭
      で䞀時的に別の倀に蚭定するべきだろうか。

      ble/textarea を read 以倖の textbox 等に䜿う堎合も考えるず、xterm_title
      等に぀いおもやはり _ble_textarea_panel=0 の時にだけ衚瀺する様にするべきの
      気がする。

    * fixed: _ble_prompt_rps1_data[12]=$rps1_enabled ずいう行があるが珟圚は
      [12] は䜿っおいないのではないか。

      f6af802c で rps1_enabled を甚いお update-textmap の蚈算を曎新する様に倉曎
      したが、これは [12] ずは関係ない様だ。

      元々 [12] に倀を代入する様になったのは cf8d9493 である。歀凊では
      update-textmap で rps1 が有効になっおいるかどうかを参照する為に [12] に情
      報を栌玍しおいる。然し、先述の f6af802c に斌いお最早 rps1_data[12] は参照
      されなくなった。

      ずいう事を考えるず rps1_data[12] に今珟圚代入しおいるのは削陀しお良い。
      (或いは珟圚 rps1_enabled にしおいるのを rps1_data[12] に代入しおも良い気
      はするが、䞀応決定しおいる箇所が異なる様に思われるので珟状の儘にする)

    うヌん。実は status_line は ble/propmt/update ずはたた別の管蜄の様である。
    ble/canvas/panel/render から呌び出された時に衚瀺しおいる気がする。特に
    ble/prompt/status#panel::render が呌び出された時に、正しく衚瀺されるべき時
    は衚瀺し衚瀺されない時は衚瀺されない様に実装されおいるのか。特に getHeight
    で倉な倀を返しおいないかだずかが気になる。

    どうやら _ble_edit_layout が normal に戻っおしたっおいる様だ。本来
    _ble_edit_layout はずっず command のたたであるべきであるのにも拘らず。䜕凊
    で _ble_edit_layout が蚭定されるのは、特に command 以倖の倀に蚭定されるのは
    leave-command-layout だけである。確認しおみるずどうやら
    ble/application/render で leave-command-layout が呌び出されおいる様子である。

    * できるだけ明瀺的に enter-command-layout ず leave-command-layout を察にし
      お実行する事にした。

    * .insert-newline で enter-command-layout をしおいるが、それに察応する
      leave-command-layout を正しく蚘述する必芁がある。

      .insert-newline の呌び出し元。確認しおみたがずおも沢山ある。

      ./src/edit.sh:1491:    _ble_edit_line_disabled=1 ble/widget/.insert-newline
      ./src/edit.sh:6687:  _ble_complete_menu_active= ble/widget/.insert-newline "$opts"

        ./src/edit.sh:6701:  _ble_edit_line_disabled=1 ble/widget/.newline keep-info
        ./src/edit.sh:6750:    ble/widget/.newline keep-info
          keep-info を指定しおいる時には問題ない。

        ./src/edit.sh:6782:  ble/widget/.newline
          これはコマンド実行
        ./src/edit.sh:6865:    _ble_edit_line_disabled=1 ble/widget/.newline
          ble/widget/edit-and-execute-command.edit
          これは最終的に ble-edit/exec/register に至る。

      ./src/edit.sh:6760:    _ble_edit_line_disabled=1 ble/widget/.insert-newline
      ./src/edit.sh:6770:      _ble_edit_line_disabled=1 ble/widget/.insert-newline
      ./src/edit.sh:9219:      ble/widget/.insert-newline
      ./src/edit.sh:9221:      _ble_edit_line_disabled=1 ble/widget/.insert-newline
      ./src/edit.sh:9871:  _ble_edit_line_disabled=1 ble/widget/.insert-newline
      ./src/edit.sh:9880:  _ble_edit_line_disabled=1 ble/widget/.insert-newline
      ./src/edit.sh:9905:  _ble_edit_line_disabled=1 ble/widget/.insert-newline
      ./keymap/vi_test.sh:424:  _ble_edit_line_disabled=1 ble/widget/.insert-newline

      うヌん。䞀旊 disable しお出力しお再び描画するずいうパタヌンが倚い気がする
      のでこれは関数にするべきなのではないかずいう気がする。ず思ったが、出力に
      甚いるコマンドが色々なので、eval の様な圢になるだろうか。少々面倒の気がする。

    * done: ble/edit/info refactor

      aplication/render で leave-command-layout を実行しおいるのは info をこの
      時点で衚瀺させるのが目的だった可胜性? 恐らく高さの蚈算は info/render を呌
      び出さないず分からないので先に蚈算させおいるのだろうずいう気がする。

      これは本来 getHeight の段階で正しく蚈算しお返すべきである。珟圚の蚭蚈では
      info 自䜓は自身が有効化されおいるかどうかを把握しおいなくお倖郚から衚瀺・
      非衚瀺を制埡する構造になっおいるのがいけないのではないか。

      ずいうよりそれを蚀い出すず textarea も同様なのではないか。textarea の衚瀺
      非衚瀺はどの様に制埡されおいるのだったか → _ble_textarea_panel が䞀臎し
      おいれば曎新する。もし䞀臎しおいなければそのたたにする。もしくは "0:珟圚
      の高さ" を返しおいるので朰れおしたう事は蚱容しおいる (_ble_textarea_panel
      が埩元した時に改めお再描画するずいう事なのだろう)。そういう意味で
      _ble_textarea_panel=-1 等にする事によっお textarea を完党に off にする事
      も可胜である。或る意味、自身で衚瀺・非衚瀺・(珟圚の状態を保持) の状態を保
      持しおいるず蚀える。info に぀いおもその様な状態を保持させお管理するべきの
      気がする。それは getHeight の段階でちゃんず参照する様にする。

      改めお確認したが問題はそんなに簡単ではない様な気がする。そもそも render
      の段階では info の内容は決定されない。そういう意味に斌いお別に問題は起こ
      らない筈。問題が起こるのは、ble/edit/info/reveal を実行する事によっお内容
      を改めお構築し盎す必芁があるずいう事の気がする。䜕故そうなっおいたのかず
      いうず enter-command-layout に入る時に info の内容を消去しおいるから。

      * 珟状では既に leave-command-layout が䜕凊かで呌び出されおいる前提なんで
        改めお info/reveal を呌び出す必芁はない。leave-command-layout が呌び出
        された時点で info の内容も再構築されおいる筈だから。

      x ず思ったら起動時に info が衚瀺されなくなっおしたった。うヌん。改めおど
        ういう条件で再描画が必芁になるのか敎理しお、再描画が必芁になった箇所で
        必ず invalidated を蚭定する様に修正する必芁がある。

        うヌん。䜕だか分かった様な気がする。高さが 0 だずそもそも invalidated
        のチェックすら来ないずいう事なのではないか? ず思ったがそれも倉である。
        䟋え invaldiated であっおも panel::getHeight は呌び出される筈だから。

      改めお info が䞀䜓どの様にしお状態を管理しおいるのか確認するべきである。
      或いは再蚭蚈する。_ble_edit_info はもし info が衚瀺されおいたずしたら衚瀺
      されおいる内容である。_ble_edit_info_default は既定の内容であっおこれは
      scene が default になる時に衚瀺される内容である。珟圚はどうも info が衚瀺
      されおいないずいう状態も _ble_edit_info で取り扱おうずしおいるのが混乱の
      原因になっおいる気がする。

      * ok: ble/edit/info/hide を䜿っおいる箇所はあるか → 䞀箇所しかない。これ
        は info#collapse に眮き換えたず思っお良い。

    * うヌん。構造的にもっず別の方法にした方が良いのかもしれないずも思われる。

      ! ぀たり、render の偎でコマンド実行䞭かそうでないかで動䜜を切り替える。コ
      ! マンド実行䞭でない時には䜕れにしおも leave-command-layout はコマンド実
      ! 行終了埌に有効にする。

      コマンド実行䞭にだけ command-layout にするずいうのの方が正しいのではない
      か。ずも思ったが、enter-command-layout の時点で実はプロンプトや status,
      info 等を削陀しお command-layout に入っおいる。ずいう事を考えるず、やはり
      珟状の実装の方が正しい様な気もする。

      䟋えば、仮にその堎でだけ command-layout になっお、䞀旊はたた通垞 layout
      に戻っお、それからその埌でたた command-layout になっおコマンドを実行する
      ずどうなるのだろうか。

    x 空のコマンドしか実行しない状態になっおいるず leave-command-layout の実行
      が抜けおしたうのではないか。

      a 空のコマンドがあるかどうかは呌び出し元でちゃんずチェックする前提ずしお、
        gexec の偎ではスキップは行わない。

      b 空のコマンドしかない堎合でも leave-command-layout は必ず実行する様にす
        る。

        然し、そうするずこれは .end の埌で実行するしかなくなるが、.end の䞭で
        .tail たで呌び出しおいるので、.end の埌で leave-command-layout を実行し
        おも意味がない。改めお .tail 及び再描画を呌び出す必芁があっお無駄である。

        或いは、空のコマンドしか無い堎合は特別扱いで leave-command-layout ず
        .tail を䞡方呌び出す様にする?

      うヌん。a の方法の方が良い気がする。

      結局 ble-edit/exec/register の偎でもチェックを入れる事にした。䞀郚でチェッ
      クが重耇する事になるが、その方が安党であるし、論理的にすっきりしおいる。

    x fixed: ず思ったが耇数のコマンドを実行しお䞀郚は leave-command-layout を実
      行しお䞀郚は実行しないずいう状態になったら䞀䜓䜕が起こるのだろうか。。䞀
      番最埌に実行した物が leave-command-layout を実行しおいるず䜕だか倉な事に
      なる気がする。

      或いは、_ble_app_render_mode ずしお panel の他に command も甚意しお、
      command の時には reveal を実行せずに ble/canvas/panel/render を実行する?
      panel の時には leave-command-layout を匷制的に呌び出す様にする。コマンド
      を実行しおいる間は _ble_app_render_mode=command ずする。その方が今迄の実
      装に近いしすっきりしおいる様な気もする。

      然し、論理的に正しい事をしおいるのかどうかずいうのは良く分からない。

      うヌん。これに関しおは enter/leave で単に既に command かどうかを刀定する
      のではなくお、enter/leave の深さを数える様に倉曎する事にした。

2022-03-03

  * [解消] 2021-11-21 bash-3.2 で syntax highlighting がロヌドされるのが遅い [#D1799]
    もしかしお遅延しおいる?

    Ref #D1731 重耇

  * 2022-01-19 PS1 のディレクトリ名に特殊文字が含たれおいる堎合の取り扱い [#D1798]
    https://lists.gnu.org/archive/html/bug-bash/2022-01/msg00051.html

    これは䞍芁な互換性の問題を防ぐために Chet がどの様に察凊するのかを芋おから
    それず同じ様に実装するのが良い。

    たたその他の文字列に぀いおも同様に泚意が必芁なのではないかず思われる。
    ず思ったが他に任意の文字列を出力する様な状況もない様な気はする。

    2022-03-03 これは結局䜕の修正も入らない様だ。うヌん。勝手に ble.sh の偎で察
    応しおしたっおも良い。

    zsh は ^J や ^I に察しおも特別な衚瀺にするのだろうか。それずもこれらはその
    たた衚瀺するのだろうか。ず思っお詊しお芋た所、単に \n や \t に眮換しお衚瀺
    する様だ。\001 に察しおは ^A ず衚瀺する。ESC は ^[ ず衚瀺する。

    やはり反転する等しお匷調した方が良い様な気がする。本圓にそういう名前を持っ
    たディレクトリ名ず区別が付かない。新しく trace に SGR(9807) ずいう反転状態
    を toggle する番号を远加する事にした。

  * main: ble/base/unload 埌に ble/util/assign 䞀時ファむルが残留する [#D1797]

    ble/base/clean-up-runtime-directory で毎回 rm が実行されおいる。どうやら前
    回の session が最埌に assign に実行をしおそれで䞀時ファむルが䜜成されおいる
    様だ。

    ble/base/unload を実行した埌に trap/.handler で joblist.check を呌び出しお
    いるのが原因である。或いは、joblist.check は unload 状態にある堎合には実行
    しなくおも良いのではないか。然し、改めお確認するず unload の状態にあるかど
    うかを蚘録しおいる倉数はない様だ。そう思うず EXIT の時だけの特別扱いずしお
    joblist.check をスキップするずいう可胜性? 或いは、unload を実行した時点で
    ble/util/assign を䜿わない実装に切り替える?

    a ble/util/unload は trap/.handler 以䞋で盎接実行する。結局勝手に削陀されお
      は困る物だし、最も重芁な物の䞀郚でありモゞュヌルを疎結合にする必芁性も薄
      い。ずいう事を考えるず、unload は特別扱いしおも良いのかもしれない。

      然し、そもそもの問題ずしお trap handler を jobs で囲んでいた理由を考える
      ず、やはり unload であっおも囲んで実行した方が良い可胜性はあるのだろうか。

      ? ずいうよりそもそも䜕故 jobs で囲んでいたのだったか。

        思うに、trap handler の䞭等で倖郚コマンド等を実行するずその分だけ job
        項目が环積しおしたう問題を防ぐのが目的だった気がする。今正に終了しよう
        ずしおいる段階で jobs を衚瀺する機䌚はない気がするので気にしなくおも良
        いのではないだろうか → 2回目の joblist の呌び出しは正に
        ignore-volatile-jobs で呌び出しおいるので無芖するのが目的である。

        問題が起こるずすれば user trap の䞭で jobs を呌び出した時にごみが沢山衚瀺
        される可胜性があるずいう事だが、其凊で倉な物が衚瀺されおも倧した問題では
        ない様な気がする。ずいうより、そもそも ble.sh がゞョブ䞀芧を管理しおいる
        時点で user が実行した jobs からは特定の項目が受け萜ちおいる筈だから、な
        い筈の物があるぐらいならそれに比べれば倧した問題ではないのでは? ずいう考
        え方もできるかもしれない。

      ? user trap を jobs で囲む必芁性はないのだろうか。

        これは本来は user trap の䞭で発生した䜙分な jobs entry も削陀しおしたっ
        お良い気がするが、もしかするず本圓に job を投げるずいう事があるかもしれ
        ないので、その項目が意図せず消滅しない様に囲むのはやめたのだろうずいう
        様に思われる。䜕れにしおも今回は関係ない。

      ? そもそも EXIT の䞭から終了をキャンセルする事は可胜なのだろうか。或いは、
        他の芁因によっお終了がキャンセルされる可胜性はあるのだろうか。考えお芋
        るにその様な方法は存圚しない気がする。ずいう事を考えるず、jobs の情報を
        収集しおも仕方がないのではないかずいう気がする。

      o ナヌザヌが登録した䜕かが ble.sh に䟝存しおいるずいう可胜性もあるのでは
        ないか。ずいう事を思うず、やはり unload は倖偎で䞀番最埌に実行するべき
        の気がする。

    b 或いは、EXIT の時だけは joblist.check はスキップする。或いは unload しお
      いる事を䜕凊かに蚘録するなどしお、それに応じお joblist.check をスキップす
      る。

    c 或いは unload の際に ble/util/asign を曞き換えおコマンド眮換を䜿う様にす
      る → 然し、そうするず環境に圱響を䞎える事を前提ずしおいる
      ble/util/assign の呌び出しに察しお正しく察凊できなくなる。特に今回問題に
      なっおいる joblist.check の呌び出しは環境に察する圱響を前提ずしおいるので、
      この方法では正しい解決方法にはならない気がする。

      たた、この方法だず結局 fork の回数が終了時に䜙分に増える事になるので合蚈
      では実行時間は枛らない。寧ろ、耇数回の ble/util/assign がある様なので、そ
      れによっお合蚈時間は増えおしたっおいる。(䜆し、終了時なのでナヌザヌ䜓隓を
      損ねる事はない様に思われる。)

      珟圚の文脈を倉える為に >/dev/null に繋いで珟圚の環境でも実行するずいう事
      もできるかもしれないが、もしそのコマンドがファむルシステム等に副䜜甚を霎
      す物だった堎合、二回実行する事によっお結果が倉わっおしたうし、たた実行時
      間も二倍になるし良い事は䜕もない。

    d 或いは unload しおいる時には䜕か別のファむルを䞀時ファむルずしお
      ble/util/assign を利甚する? 然しもしその様なファむルを簡単に安党に䜜れる
      のであれば始めから ble/util/assign は必芁ないのでは。

      或いは unload しおいる時は ble/util/assign/.rmtmp に斌いお rm を明瀺的に
      実行する様にする。然し、これだず結局 fork の数は増えるので意味がない。然
      し、少なくずも動䜜が倉わっおしたう c よりは珟実的な方法である。

    # ? 所で here document 等を䞀時ファむルの代わりに䜿う事はできるのだろうか。
    #   ず思ったが、最近の bash では here documents は䞀時ファむルではなく pipe
    #   になっおしたっおいるので䜿えない。
    #
    #   詊しに以䞋を詊しおみたらファむルの読み曞きが出来おしたった。
    #
    #   $ bash-4.4 -c '{ echo check world > /proc/self/fd/0; cat /proc/self/fd/0; } <<< hello'
    #
    #   然し、bash-5.0 以䞊では倱敗する。bash-5.0 以䞊でファむルにする為には倧
    #   量のデヌタで初期化しなければならないので非珟実的な気がする。その他に
    #   bash が䞀時ファむルを生成しそうな堎合はない気がする。プロセス眮換は
    #   pipe である。
    #
    #   曎に本圓にどのシステムで動くのかも定かではない。どうやら bash は䞀時ファ
    #   むルを早々に unlink しおからコマンドを実行する様である為。

    結局 a の方法で、ble/base/unload は別枠で trap handler の最埌で実行する事に
    した。

2022-03-02

  * 2022-02-03 edit: もしかしたら stty sane の頭に空癜を眮くず良いのでは [#D1796]

    先頭に空癜を眮いたコマンドの履歎登録をなしにする蚭定にしおいる人がいる。

    或いは勝手に stty sane を HISTIGNORE に蚭定するずいう手もある? ず思ったが、
    それだずナヌザヌが本圓に自分で stty sane を実行した時に履歎に残らないし、或
    いは HISTIGNORE を䞀旊保存しお埩元する仕組みを䜜ったずしおも䜕かの拍子に実
    行できなかった時にやはり困るし、䜙り信頌性が高いずは蚀えない。

    これた簡単だが採甚する。

  * history: detach 状態で終了するず履歎に蚘録されない [#D1795]

    detach 状態で終了した時、たた detach しおいる間の履歎が蚘録されなくなっおい
    る気がする。EXIT が呌び出されおいないのだろうか。たた埌で確認する。

    どうも ble/builtin/history/option:a 迄はちゃんず呌び出しお実行しおいるが、
    rskip, wskip の曎新が思う様に振る舞っおいない様だ。rskip は珟圚のファむル内
    の読み取り䜍眮で、wskip は珟圚の Bash プロセス内の履歎の曞き蟌み開始䜍眮
    (次にファむルに曞き蟌むべき項目の䜍眮) を管理しおいる。history/option:a の
    䞭で呌び出した check-uncontrolled-changes で wskip が先端䜍眮に移動しお、そ
    の為に䜕も曞き蟌たれないずいう状態になっおいる様に思われる。

    そもそも detach 状態で終了した堎合、detach 前に実行しおいたコマンドですら曞
    き蟌たれずに終了しおしたっおいる。

    * そもそも prevmax!=max だからず蚀っお wskip..prevmax 迄はちゃんず履歎に残
      すべきなのではないか。ず思ったがそれを蚘録する手段がない様な気がする。吊、
      subshell で適圓に -r しおそれから曞き蟌めば良いのだろうか。

    取り敢えず察応した。

    * 履歎が倍加する問題が新しく発生しおいないか確認する。
      䞀応 "history -a;history -c;history -r" に察しおは問題は起こっおいない。
      bashrc で history -r をしおも倉な事は起こっおいない。恐らく倧䞈倫。

  * complete: BUG cygwin$ pdflatex [TAB] で /usr/bin/cat: '': No such file or directory ずいう゚ラヌ [#D1794]
    Ref #D1637

    chat では再珟しない。bash-completion はロヌドされおいない。

    うヌん。これは 2365e09c によるバグである。今迄5ヶ月間ずっず mandb を正しく
    抜出する事ができおいなかったずいう事になる。今迄䜕故気付かなかったのだろう。
    䞍思議である。或いは、たた別の方法によっお抜出できおいたずいう事か? → そう
    いう事だ。぀たり、Linux 等では man -w 等を䜿っおファむルを決定できおいたの
    で問題がなかったのである。

  * edit (exec_elapsed_mark): やはり既定で時・日などの分解胜の衚瀺にも察応する [#D1793]

    長時間ログむンしおいた埌等にはやはり長い時間経過しおいる事がある。
    その時に垞に分で衚瀺されるず分かりにくい。

  * canvas: BUG 䜕故か2回目の char_width_@=auto がちゃんず動いおいない気がする [#D1792]
    Ref #D1669

    䜕故だろうか。埌で確認する。

    改めお詊しおみたがゆっくりやれば䜕床やっおも問題はない。auto を代入しおから
    急激に RET 等を実行するずそれ以降は垞に west, 7.0 にしかならなくなる。CPR
    応答の順序がずれおしたっおいる可胜性? 䜕凊かのタむミングでずれを修正したら
    治るのだろうか。

    * _ble_term_CPR_hook に䜕か倉な物が残存しおいる可胜性を確認。

      →分かった。逆だった。timeout のコヌドが悪さをしおいた。timeout 時刻の曎
      新を行っおいなかったので垞に timeout する状態になっおいおたずもに CPR が
      受信できなくなっおいた。 west, 7.0 ずいうのは CPR 応答がなかった時の既定
      の倀ずいう事だろう。

    ! ? そもそもどの様にしおずれが起こるのか。初めのずれが起こらない様に調敎でき
    !   るのではないか。

    結局 #D1669 の単玔なバグだった。修正した。

  * blehook -+= は入力しにくいし芋にくいので != を䞀意远加ずしお察応する [#D1791]

    * done: !=  ... 未だ登録されおいない時に远加する
    * done: -+= ... 埌ろに持っおくるずいう意味に倉える。
    * done: +-= ... 前に持っおくるずいう意味で远加する。

    * update wiki

  * complete: sabbrev を削陀する機胜がない [#D1790]

    削陀の仕方ずしおは以䞋の2皮類が考えられる。

    ble-sabbrev -r a # bind, complete ず同様
    ble-sabbrev a=-  # trap ず同様

    埌者は本圓に "-" に展開させたい時 (実際そういう堎合が存圚するのかは謎だが)
    ず衝突するので前者の方が良い気がする。

    たた、前者を採甚するずしたら -r に察しお optarg を芁求するのか、或いは -r
    に察しお optarg を芁求するのかで振る舞いが倉わっおくる。

  * progcomp: ble.sh 既定の候補を生成しない機胜 (motivated by rsteube) [#D1789]
    https://github.com/rsteube/carapace/issues/431

    > prevent default file completion when no values returned

    このオプションを提䟛する事にする。

    珟圚 "候補が生成されおいたら" ずいう意味で生成候補数を参照しおいる箇所を党
    お曞き換える必芁がある気がする。

    埌 core-complete の䞭から公開 interface を決めおそれを説明する必芁がある気
    がする。

    * 拡匵 comp_opts をたずめる。prog-trim, syntax-raw, filter_by_prefix,
      no-mark-directories

      珟圚参照しおいる comp_opts は以䞋の通り。

      $ grc '(comp_opts|DATA):? =='

      元から bash に存圚しおいるオプションは以䞋の通り:
      bashdefault default dirnames filenames noquote nosort nospace plusdirs

    * done: 拡匵オプション名は分かる様にした方が良いのでは。䟋えば ble- で始め
      る。或いは、- で始める。もしくは -ble- で始める。

      " a -prog-trim, -syntax-raw, -filter-by-prefix, -no-default
      "
      "   うヌん。- だけだず結局ナヌザヌ的には混乱の元であるずいうより、すぐにそ
      "   れが "ble.sh" 特有の機胜であるず理解しにくいのではないかずいう気がする。
      "   然し䞀方で "-" で始たっおいる時点で非暙準の機胜であるずいう事は明らかで
      "   ある。
      "
      " b ble-prog-trim, ble-syntax-raw, ble-filter-by-prefix, ble-no-default
      "
      "   ble- だけでも十分の気がするが、これだず名前空間的になっおいお、もっず现
      "   かく分類したくなっおしたう。
      "
      " c -ble-prog-trim, -ble-syntax-raw, -ble-filter-by-prefix, -ble-no-defualt
      "
      "   CSS の vendor prefix の様に -ms- だずか -moz-, -webkit-, -o- の様にしお
      "   いる物を真䌌お -ble- だずか -mwg- だずかで良いのではないかずいう気がす
      "   る。-mwg- は今迄䜿った事がないので ble.sh には組み蟌たない様にしおおき
      "   たい。
      "
      "   然し、䞀方で、他の compopt の枠組みが今埌出おくる様にも思われないし、察
      "   応しおいない物を bash に枡したら䜕れにしおも゚ラヌになるので、結局汎甚
      "   の補完を䜜成するずしおも呌び出し元で堎合分けする事になる。なので vendor
      "   prefix の様な物を蚭定しお堎合分けに䜿える様にする必芁があるのかも分から
      "   ない。この様に名前を分けるのは䞻にナヌザヌの偎でこれが非暙準であるずい
      "   う事が分かる様にする為の物である。
      "
      " どれにすれば良いか分からないが、長いものを採甚する䞊で憚りになるのは、単
      " に無駄な prefix が぀いおいるず読みにくいずいう事、冗長になるずいう事であ
      " る。䞀方で、ナヌザヌや他の人の意芋も聞いお最終的に決定するずなるず、䜕れ
      " にしおも "ble" は入れた方が良いずいう様に芁請されるのは明らかである。
      "
      " 然し、既に様々の ble.sh の独自機胜に䜿われおいる opts では ble- 等の
      " prefix は䜿っおいないし、今埌䜿う必芁も党く無い。その様な物ずの敎合性を考
      " えるず、やはり特別な prefix は特に぀けなくおも良いのではないかずいう気も
      " しおきおしたう。䞀方で compopt はやはり本来は Bash の機胜なので名前空間を
      " 乱すのも倉である。
      "
      " うヌん。面倒なのでやはり䜕も新しい prefix は付けずに manual で説明・泚意
      " 喚起するだけで十分なのではないかずいう気がしおきた。うヌん。本圓だろうか。
      "
      " うヌん。- で始たる prefix はそれ単䜓でオプションの様でもあるからやはり混
      " 乱の元の気がする。ず思えば prefix を蚭定するずしおも "ble-" 䞀択の気がし
      " おきた。
      "
      " d 或いは compopt -o prog-trim ではなくお compopt --bleopt prog-trim だず
      "   か、compopt -O prog-trim だずか、compopt -s prog-trim の様な圢の別の指
      "   定の仕方をさせるずいう手もある。内郚的には -prog-trim 等で良いのだろう
      "   ずいう気がする。compopt は実質的に -o, +o だけしかオプションがない (侀
      "   応 -DEI もある)。或いは prog-trim=on 等でも良いかもしれないず考えたが、
      "   これは compopt を適甚する察象のコマンド名ず区別が぀かなくなるので駄目。
      "   飜くたでオプションの圢をしおいなければならない。オプションの圢をしおい
      "   る物に぀いおは仮にそのオプションが存圚しおいなかったずしおもちゃんず知
      "   らないオプションずしお゚ラヌになる様である。
      "
      "   compopt -s prog-trim; compopt -u prog-trim
      "   compopt -O prog-trim; compopt +O prog-trim
      "   compopt -o prog-trim; compopt +o prog-trim
      "   compopt -o ble-prog-trim; compopt +o ble-prog-trim
      "   compopt -o -prog-trim; compopt +o -prog-trim
      "
      "   うヌん。やはり奇を衒った様な事をするのではなくお単に -o/+o を流甚するの
      "   が自然の気がする。"-" で始たるのも混乱の元である様に思われる。
      "
      "   compopt -prog-trim; compopt +prog-trim
      "
      "   これは短オプションの集合ず区別が付かないので华䞋。
      "
      " e もう少し異なる名前付けで区別する可胜性
      "
      "   compopt -o _prog_trim
      "   compopt -o progTrim
      "   compopt -o ProgTrim
      "
      "   これらは Bash のオプションずは違うずいう雰囲気は出るかもしれないがやは
      "   り ble に関連するずいう事が明癜ではないし、䞭途半端に違いを出しおも仕方
      "   がない。
      "
      "   いっその事、関数名に倣っお / で分けるずいうのも手である。
      "
      "   compopt -o ble/prog-trim
      "   compopt -o ble/filter-by-prefix
      "   compopt -o ble/syntax-raw
      "
      "   よくある蚭定の様に "." で名前空間を分けるずいうのも有効である。
      "
      "   compopt -o ble.prog-trim
      "   compopt -o ble.filter-by-prefix
      "   compopt -o ble.syntax-raw
      "
      "   うヌん。contrib 等ずの敎合性も考えるず / で分けるのが良い気がしおきた。
      "   ぀たり、既に "名前 + /" を vendor prefix の様に䜿っお来たのだからそれを
      "   螏襲するのが良い。新しい option は ble/no-default ずいう事にする。

      結局 "ble/*" で統䞀する事にした。

    [実装]

    取り敢えず実装した。

    * ok: うヌん。然し、もし source:argument をキャンセルしたずしおも、結局たた
      別の source が候補を生成するのではないかずいう気がする。党おの source を
      キャンセルする必芁があるだろうか。或いは、たた別の source は別の皮類の補
      完に盞圓するので気にしない? うヌん。気にしないで良い気がしおきた。

      それに、候補が耇雑な堎合には䜕れにしおも source:argument は䜕も候補を生成
      しなくなるが、その時に意図しない別の皮類の補完が起動したずいう蚘憶はない。
      埓っお、実際の所 source:argument をキャンセルするだけで倧䜓補完は終わるの
      ではないか。぀たり、argument を跚ぐ様な補完 source は珟圚はないので
      source:argument が䞀番最埌の source であり、だずするず source:argument を
      キャンセルするだけで良い。

      もし argument を跚ぐ様な補完の可胜性があれば、それはたた完党に独立した補
      完なので progcomp によっお補完がキャンセルされる蚀われもない様な気がする。
      これは今埌実際にそういう芁望が (仮に) 出た時に考えれば良い。

2022-03-01

  * complete (action:command): function の description の quote が邪魔 [#D1788]

    最初の2行ず末尟の } は削陀しお良い。たた、quote ではなくお trace-text ず同
    様の衚瀺の仕方にしたい気がする。

    trace-text ず同様の文字列に倉換する関数は既になかったか?

    うヌん。ble/unicode/GraphemeCluster/.get-ascii-rep ずいう関数があるがこれは
    内郚的にしか䜿甚されおいない。䞀方で、うヌん。ずいうか
    ble/canvas/trace-text をそのたた呌び出すべきの気がしおきた。そもそもその為
    の関数の筈である。

    或いはファむル名ず行番号を衚瀺した方が有益の気もする。取り敢えず䞡方衚瀺す
    る事にした。ファむルパスは長くなるので最埌の名前だけ衚瀺する事にした。

  * complete: --optarg= に察しお progcomp が走らない (motivated by rsteube) [#D1787]

    これは "--optarg=" 党䜓に察する匕数補完よりも = の右蟺 "" に察する優先順䜍
    が高いから。

    [導入経緯確認]

    然し、この様に匕数の途䞭に = が含たれる時に rhs 補完も実行する様にしたのは
    䜕か別の理由があった様な気もする。その時の蚘録を確認する必芁がある。遡る。

    da384044 #D1701 で倉曎されおいるがこれで導入された蚳ではない。ず思ったが
    #D1701 よりも前は以䞋の様になっおいお argument でない時にのみ rhs を蚭眮し
    おいた。

    local word=${text:istat:index-istat}
    if ble/syntax:bash/simple-word/is-simple-or-open-simple "$word"; then
      # 単語が istat から開始しおいる堎合
      local src
      for src in "${source[@]}"; do
        ble/syntax/completion-context/.add "$src" "$istat"
        if [[ $src != argument ]]; then
          local rex="^([^'\"\$\\]|\\.)*="
          if [[ $word =~ $rex ]]; then
            word=${word:${#BASH_REMATCH}}
            ble/syntax/completion-context/.add "$src" $((index-${#word}))
          fi
        fi
      done

    ぀たり、やはり #D1701 によっおこの取扱が導入された事になる。

    * reject: ず、思ったが䞊蚘のコヌドはそもそもおかしい。source には倧䜓耇数の
      文脈が登録されおいるので結局 rhs は argument の有無に関係なく倧䜓耇数生成
      される事になる。ず思ったが、そうではない。 add rhs ではなくお add "$src"
      ずしおいるので、 argument 以倖に぀いおは = 以降からでも同様に生成するずい
      う取り扱いになっおいる。

    * #D1701 の議論を確認したが倧した事は曞かれおいない。特にこの取扱の倉曎に関
      しおは党く觊れられおいない。然し、実際に source 配列の䞭身を芋るず option
      ずいう物が远加されおいる。これが理由なのではないだろうか。぀たり、option
      ずいう項目を远加したが、option が = の続きから挿入されるのは倉である。な
      ので、option も argument ず同じく途䞭から文脈蚭定する必芁性がない。他に
      variable:= ずいう物もあるが、これも途䞭から挿入するのは倉である。command
      も sabbrev も同様である。結局、途䞭からの挿入を蚱すのは source:file だけ
      である。ずいう事を考えれば最初から file を固定しお = の埌の䜍眮に補完開始
      点を蚭眮するのは自然である。

    然し、そもそも unquoted な = の䜍眮から補完を開始する遞択肢を加えたのはどの
    時点だろうか。

    先ず 2f2f0eb6 (#D0941 eval の匕数・倉数代入の察応) の時点で既にあった。どう
    やら e9ba343f (#D0744 a=[TAB] が a=a=b になる問題に察する察凊) で最初に導入
    された様だ。この時点でのコヌドは以䞋の圢をしおいる。

      if [[ $source != argument ]]; then
        local sub=${text:wbeg:index-wbeg}
        if [[ $sub == *[=:]* ]]; then
          sub=${sub##*[=:]}
          ble-syntax/completion-context/.add "$source" $((index-${#sub}))
        fi
      fi

    この時は source は配列ではなかった。぀たり、$source != argument は実際に
    source に argument が含たれおいないずいう事の確認になっおいたのだった。埌の
    倉曎で source が配列になった時にこの条件がそのたた攟眮されたのは恐らくバグ
    である。

    [修正方法]

    a "virtual starting point" 的な物を導入しおそれに基づいお補完文脈の優先順䜍
      を決定する。

    b rhs の補完開始点は飜くたで単語の先頭にしお、しかし補完を実際に行う時に =
      以降に぀いお候補を生成する様に調敎する。この時、source:file 等を内郚から
      呌び出しおいるが、この source:file に䞭途半端な䜍眮から補完を開始する仕組
      みを取り付ける? ず思ったが、COMPV, COMPS 等既に蚈算枈みの物をちゃんず正確
      に切り出せる事を保蚌しなければならないなど、暗黙の仮定を色々持ち蟌む事に
      なり䜙りすっきりしない。

    c 或いはこう蚀った物は argument の偎で党お凊理するべきなのではないか?

      実際に rhs をなくしおもちゃんず動いおいる様に芋える。うヌん。だずしたら完
      党に削陀しおしたっおも良い? これに぀いおはやはり導入経緯を確認する必芁が
      ある→うヌん。どうも珟圚 argument ず rhs の䞡方が生成されおいるのはバグの
      気がする。バグず刀断しお良い。そもそも argument の偎でもちゃんず同様の =
      生成を実行しおいる。

    どうも rhs ず argument の䞡方が生成されおいるのは歎史的に芋お元々意図した物
    ではなかった様に思われる。埓っお、"c" の様に argument を生成しおいる時には
    rhs は生成しない様に修正しおしたっお良い。

  * complete (requote): --prefix='a b c d e' の様に prefix 郚分は requote から陀倖 [#D1786]
    Ref #D1787

    党䜓を quote し盎す時にオプション的な郚分・もしくは倉数代入的な郚分は陀倖す
    る様にする。䟋えば --option=hello\ 1\ 2\ 3 が '--option=hello 1 2 3' になる
    のではなく、--option='hello 1 2 3' になっお欲しいずいう事。

  * edit: 叀い terminator で衚瀺が乱れる (reported by dongxi8) [#D1785]
    https://github.com/ohmybash/oh-my-bash/issues/314

    芁するに Terminal 0.98 が䜿っおいる vte では DECSCUSR に察応しおいない。そ
    れにも拘らず TERM=xterm にしおいるので _ble_term_Ss に倀が蚭定されおいる。

    https://bugzilla.gnome.org/show_bug.cgi?id=720821#c33
    歀凊によるず DECSCUSR は vte 0.40 で導入された様だ。

    叀い version の vte で DECSCUSR を無効化するコヌドを远加する事にする。所で、
    vte version ず倀の関係がどうなっおいるのか調べる必芁がある。うヌん。vte
    0.28.2 ずいう事なのだろうか。。。そういう気がする。実際に䞀番最近の
    Terminator で vte:66xx になっおいお、GitLab 䞊の最新版は 0.67.x なので、や
    はり vte 0.28.2 ずいう事なのだろうずいう気がする。vte の番号を䜿っお刀定す
    る事にする。

2022-02-23

  * edit: bash-it から detach するずプロンプトが壊れた状態になる [#D1784]
    Ref #D1772

    # #D1772 に関係はしおいるが盎接の原因ではない。元々 PS1 が退避された状態で
    # ble-detach になっおしたうのだったが、(1) PROMPT_COMMAND は埅避しおいなかっ
    # た (2) PS1 を "埅避" した埌も通垞の堎合は PS1 の元の倀をそのたたにしおい
    # たずいう二重の理由で問題が起こらなかったのである。#D1772 によっお䞡方の振
    # る舞いを壊した為に問題ずしお発珟した。

    oh-my-bash から抜けおも同じ状態になる。nix-shell の堎合には倧䞈倫。

    どうやら PROMPT_COMMAND に䜕か蚭定されおいるずこうなる様だ。䜕故
    PROMPT_COMMAND があるかどうかで倉わるのだろうか。因みに
    PROMPT_COMMAND も退避されたたたになっおいる。

    うヌん。䜕故か ble-detach/message の䞭から ble/textarea#render が呌び出され
    おいる。この時に PS1 adjust が走っおそのたたになっおいる。そもそも䜕故
    ble-detach/message の䞭で render が呌び出されおいるのか? うヌん。恐らく
    stty の蚭定の為に Bash に制埡を戻しおも Bash が prompt を衚瀺しおくれないの
    が問題。その為に ble-detach/mesasge を介しお態々プロンプトを描画しおいるの
    である。

    a eval-PROMPT_COMMAND の前埌の PS1 adjust/restore は attached の時にだけ実
      行する? ず思っおこれで実装したが 。

      そもそも textarea#render を detached 状態で呌び出しお問題は発生しないのか。
      特に、既に様々の bash option 等を蚭定した状態で正しく ble-detach/message
      を呌び出す事ができるのかすら非自明である。

      ず思ったが ble-detach/impl は実は restore option たでは未だ実行しおいない
      状態の様だ。単に detached state に移行するだけである。

    b 或いは ble-detach/message を衚瀺しおから ble-detach/impl を実行するべきな
      のではないか。

      うヌん。ble-detach/impl の䞭で䜕か出力されたりする可胜性はあるのだろうか。
      ゚ラヌメッセヌゞなど。確認するず、呌び出されおいるのは以䞋の 3 項目である。

      blehook/invoke DETACH
      ble-edit/detach
      ble/decode/detach

      埌ろの2぀はずもかくずしお最初の1぀でナヌザヌが䜕かメッセヌゞを出力したい
      ずいう事があるかもしれない。うヌん。ずいう事を考えるずやはり埌で
      ble-detach/message を実行するべきなのだろうか。

    やはり a の方針で修正する事にした。restore-PS1 は本来 ble-edit/detach から
    呌び出される物であっお、其凊で管理しおいる状態は _ble_edit_attached 倉数に
    栌玍されおいるので、この倉数の倀に基づいお PROMPT_ATTACH の呚りで
    adjust/restore を行う事にした。

    修正した。PROMPT_ATTACH を蚭定した状態でも問題が生じない事を確認した。たた
    bash-it, oh-my-bash による動䜜確認もした。

  * [棄华] bashrc: .bashrc.bash-it-minimal から実行するず゚ラヌメッセヌゞが出る [#D1783]

    PROMPT_COMMAND に ';:' ずいう文字列が蚭定されお PROMPT_COMMAND を実行する床
    に゚ラヌが発生する。或いは、ble.sh 自䜓の prompt-attach に倱敗しおいる?

    →ず思ったらこれは単に .bashrc.bash-it-minimal の問題だった。このファむルを
    䜜成した圓時は --attach=prompt の時、必ず PROMPT_COMMAND に文字列が蚭定され
    るずいう事を想定しおよかった。珟圚は bash-5.1 以䞊では配列を甚いお第2芁玠以
    降に蚭定するので、単に ';:' ずいう文字列を付加するず゚ラヌが発生するのだっ
    た。

2022-02-20

  * edit: work around exit called from EXIT trap (reported by SuperSandro2000) [#D1782]
    https://github.com/akinomyoga/ble.sh/issues/179#issuecomment-1046122787

    nix-shell の内郚で exit を実行するず2回 [ble: exit] が衚瀺される。これは
    nix-shell が蚭定する EXIT trap の䞭で再床 exit が呌び出される為である。
    ble.sh は独自に trap を凊理しおいるし、たた blehook EXIT も実行したいので、
    勝手に EXIT の䞭から本圓に exit されるず困る。なので、trap handler 実行䞭に
    ble/builtin/exit が呌び出された時には DEBUG trap を蚭定しお、trap の呌び出
    し元たで制埡を戻しお続きの凊理を実行するこずにする。呌び出し元たで戻った時
    に exit が trap handler の䞭で呌び出されたずいう事を蚘録しおおいお、trap
    handler の凊理の終わりに元々呌ばれた exit を呌び出し盎す。

    * exit を trap handler の䞭で実行した時にはそのたた終了するのではなくお、
      trap の凊理が完了するたで埅っおから終了するべきなのではないか → その様に
      実装した。既存の TRAPDEBUG の枠組みにコヌドを远加しお実珟した。

    x fixed: exit 1 2 の様に䜙分な匕数を指定した時、exit の準備をしお [ble:
      exit] たで衚瀺した埌に exit: too many arguments の゚ラヌが発生しお exit
      がキャンセルされる。事前に匕数の問題はチェックするべきである。

    取り敢えず実装しお 3.0, 3.2, 5.0 で動䜜確認した。期埅通りに動いおいる。以䞋
    のコマンドなどを䜿っおちゃんず党おの EXIT handler が実行される事を確認した。

    $ trap 'exit 5' EXIT; exit
    $ trap 'echo trap EXIT' EXIT; f1() { echo "$FUNCNAME $*"; exit "$1"; }; blehook EXIT+='f1 2 hello' EXIT+='f1 3 world';exit

    ? 関係ないが jobs がある時にナヌザヌが exit をキャンセルした時、埌続の凊理
      が実行されるのは問題ではないか? これに察しおも䜕らかの察凊が必芁になるの
      ではないか?

    ? もし珟圚の TRAPDEBUG の枠組みが信甚できるのであれば try/catch の枠組みを
      敎備しおも良いのかもしれないずいう気がする。その方が芋通しも良いのでは。
      然し同じ commit でやるのは倧げさな気がする。

      䞊蚘の exit キャンセルの際の振る舞いに関しおはその枠組が敎っおから察応す
      るのが良い気がする。

    →䞊の2぀は別項目で凊理する事にした。

    x bash-5.2 以降で EXIT trap の stdout が /dev/null になっおいる。これはどう
      したら良いのだろうか。うヌん。EXIT trap の時だけ stdout/stdin を繋ぎ盎す
      のが良いだろうか。

      調べおみた所 bash-5.2 以降では exit も EXIT handler も珟圚の関数の内郚で
      行われる様だ。これは bash-5.1 たでの top-level で実行されおいたずきず振る
      舞いが異なる。ず思ったが、bash-4.4..5.1 の振る舞いが倉だっただけの様だ。

      うヌん。builtin exit を呌び出す時の redirection を削陀するか? ず思ったが、
      それだずやはり䜙分な゚ラヌメッセヌゞが出るのが心配である。ずいう事を考え
      るず、元々の stdout/stdin を䜕凊かに蚘録しおおくべきなのだろうずいう気が
      する。

    2022-02-20 exit を DEBUG return で再珟しようずしおも DEBUG trap の察象であ
    る "珟圚のコマンド" は必ず実行されおその埌で return/continue 等の効果が珟れ
    る。なので blehook 内での exit は意図した動䜜をしない。

    % blehook の䞭で exit をしおも trap の実行が其凊で終了しない。continue が実
    % 行されおいる筈なのに効いおいないのは䜕故だろうか。うヌん。eval の䞭から
    % continue を実行しおも効かないのだろうか。
    % →それずも bash の特定の version を䜿っおいる事によるバグだろうかず思っお
    % 振る舞いを確認したが、4.0..dev たで党お同じ振る舞いである

    →うヌん。振る舞いを調べお分かったのは、DEBUG trap が呌び出された察象のコマ
    ンドは結局䜕れにしおも実行される様だずいう事。䟋えば continue を trap 内郚
    で実行するず、確かにその堎で continue によっお制埡が倉曎され、trap 内の続き
    の凊理も実行されない。そしおtrap の倖偎にあるルヌプを抜ける。然し、その前に
    DEBUG trap の察象であるコマンドはちゃんず実行される様だずいう事。

    ? このコマンド実行をキャンセルする方法はないのだろうか。extdebug が蚭定され
      おいれば trap の戻り倀によっお振る舞いが倉わるらしい。特に 2 を返せばその
      堎で return を実行する事ができる。然し、continue をその堎で実行する方法は
      䞍明である。continue が成功すれば戻り倀は 0 になるので DEBUG 察象のコマン
      ドは結局実行される。逆にそれを阻止する為に戻り倀を 0 以倖にしようずするず
      continue を倱敗させるしかなく、それだず次のルヌプに移る事ができない。或い
      は BASH_COMMAND を曞き換えたら実行するコマンドを曞き換える事ができるず蚀っ
      た事はないのだろうか。

      実際に extdebug を蚭定しお詊しおも芋たが、マニュアルから予想される通り、
      continue が成功すればコマンドも実行するし、コマンドの実行をキャンセルする
      には continue を実行する蚳には行かない。continue 盎前の終了ステヌタスを倉
      曎しおも䜕の効果もなかった。぀たり、continue 自䜓の戻り倀が䜿われる。

      他に次のコマンドを無効にする手法はないのか? ずいうか次のコマンドを無効に
      したずしおも曎にたた次のコマンドが実行されるずいうのだず際限がない。なの
      で、やはり extdebug を䞀時的に蚭定しお 2 を返す事によっお実行を䞭断させる
      しかないのだろうか。

    * extdebug を䞀瞬有効にしお return (終了ステヌタス 2) でトップレベルたで戻
      るしかない気がする。

      ? extdebug は trap の䞭で無効化した堎合でもその trap に察しお倱効するのだ
        ろうか。これに぀いおは振る舞いを確認する必芁がある。→やはり trap の䞭
        で shopt -u extdebug するず即座に extdebug の動䜜はしなくなる様だ。ちゃ
        んずどの bash の version でも同様である事を確認した。

        だずするずどの時点で extdebug を off にするのかに぀いお確認が必芁になる。
        然し取り敢えずは sandbox の䞭で実行しおいるのであればその呌出元で解陀す
        る様にすれば良い。※ずいう事は、sandbox の䞭では未だ DEBUG trap は
        clear はしないずいう事になる。

      うヌん。取り敢えず実装した。動いおいる。ずいうかそもそも元々 continue を
      hook の䞭で実行する事を蚱しおいたのが倉な気もする。或いは、continue 及び
      return を䜿っお他の hook の凊理に干枉したりできるずいうのも䞀぀の機胜だっ
      たかもしれないが、それならそれで別の枠組みを提䟛するべきの気もする。或い
      は、もし return continue を䜿うずしおも trap sandbox の様に終了の仕方を怜
      出しお制埡を決めるのが良いのだろうずいう気がする。

      珟圚は珟状のたたで良い気がしおいる。

2022-02-19

  * 2022-01-20 \C-x\C-v で bash-completion や terminal ID 等の情報も出力する [#D1781]

    bash-completion や oh-my-bash の version ず terminal ID に぀いお C-xC-v で
    出力したい。

    * それを issue 報告に貌り付ける様にお願いする。

    * terminal ID / version をちゃんず怜出する様にする。DA2R も䞀緒に出力するべ
      き。

    * bash-it には version 等は存圚しないのだろうか。うヌん。だからずいっおいき
      なり芁求するのも違う気がする。

    2022-02-19 取り敢えず実装した。基本的には過去に ble.sh に察しお問題を起こし
    た物を怜出しお衚瀺する事にするのが良い。

    他の候補ずしお oh-my-bash, bash-it, sbp, bash-preexec, starship 等がある。
    党おを怜出しお衚瀺するのは倉な気もする。oh-my-bash, bash-it に぀いおは珟圚
    の theme (及び有効化しおいるモゞュヌル) も衚瀺するず良いのだろうずいう気が
    する。oh-my-bash に぀いおは叀い物だず version が存圚しおいない。

    * done: bash-preexec は是非怜出するべきである。

    * done: oh-my-bash の怜出は upgrade_oh_my_bash 等を䜿うのが良い様に思われる。

    うヌん。個別の蚭定を ble.sh 本䜓に入れるのも倉なので contrib に含めようず思っ
    たが、然し、それはそれでどういうファむル名にしたら良いのかが分からない。こ
    れはナヌザヌが新しく蚭定を远加するずいう圢の物ではなくお、逆に ble.sh から
    blesh-contrib に䟝存するずいう圢になるので取り扱いが難しい。やはり取り敢え
    ずは ble.sh 本䜓に含めおおくのが良いのだろうか。或いは init-*.sh の様に補助
    スクリプトずしお保持するのが良いのかもしれない。うヌん。

    →取り敢えずは ble.sh 本䜓に埋め蟌む事にする。肥倧化しおきたら
    blesh-contrib に新しくこう蚀った振る舞いの制埡の為のディレクトリでも䜜っお
    其凊に登録する事にする。

    * done: starship
    * done: bash-it
    * done: sbp
    * git: gitstatus

    取り敢えず思い぀く物は党お登録したのでOK。

2022-02-19

  * trap: 初期化時に既存の trap がある時に゚ラヌメッセヌゞが出る (reported by SuperSandro2000) [#D1780]
    https://github.com/akinomyoga/ble.sh/issues/179

    初期化時に以䞋のメッセヌゞが出る。

    $ nix-shell -p hello
    bash: ble-edit/exec/save-BASH_REMATCH: No such file or directory
    bash: ble-edit/exec/restore-BASH_REMATCH: No such file or directory

    これは䞀番最近の commit で起こった事だった。新しく既存の trap を保持する様
    に修正したが、その時に既存の trap は

    * そもそも trap の内郚で䜿うのだから {save,restore}-BASH_REMATCH は移動するべきでは。

      →ble.pp に移動した。たた同時に source ble.sh 盎前の BASH_REMATCH を保持する様に修正した。

    * reject: ble/builtin/trap を実際に呌び出す必芁はなくお単に倀を代入すれば良
      いのではないか? その他にしなければならない操䜜などがあるだろうか。確認す
      る。ず、思ったが解析するのも面倒である。ずいう事を考えれば、やはりそのた
      た実行する方が良いのではないか。䞀応 eval しお配列に代入すればその3番目の
      単語ずしお trap_string を取埗する事はできる。

      うヌん。やはり {save,restore}-BASH_REMATCH さえ移動すれば今の実装で良い気
      がする。䞋手に自前で実装するよりも既にある実装を䜿った方が (効率は悪いか
      もしれないが) コヌドの管理ずいう点では良い。たた、この郚分は到底ボトルネッ
      クではないので速床を重芖する必芁も党く無い。

    * ble.pp でも BASH_REMATCH を保持する様に修正するべきでは。

    [動䜜確認]

    x fixed: source ble.sh の前埌で BASH_REMATCH が保持される事を確認する。

      ず思ったら保持されおいない。どうやら restore-BASH_REMATCH の数がバランス
      しおいない様だ。元々 BASH_REMATCH の埩元にはチェックが入っおいなかった。
      ずいう事は、これは意図的に重耇しお retore-BASH_REMATCH を呌び出す様になっ
      おいたずいうこずではないのか。gexec での䜿い方に぀いお改めお確認する。

      うヌん。別に䜙分に実行しおいるずいう事もない。単に ble-attach で adjust
      し忘れおいるのが原因に思われる。

      →ble-attach に远加した。曎に {adjust,restore}-bash-options ず同じ箇所で
      ちゃんず呌び出す様に党䜓をチェックしお远加した。

      →たた _ble_bash_BASH_REMATCH_level が負になっおいたので、負にならない様
      にチェックを远加する。

2022-02-18

  * command-help: 関数の help ずしお関数が定矩されたファむルを衚瀺する [#D1779]

    関数の定矩䜍眮を DEBUG trap 等を䜿っお抜出する事が可胜なのではないか?

    これは bash_completion の debug の時にも䟿利である。ずいうか、
    bash_completion の version を衚瀺するのにも䜿える。

    ず思ったら shopt -s extdebug; declare -F 関数名 で普通に取埗できるのだずい
    う事が刀明した。
    https://www.cyberciti.biz/faq/how-to-find-bash-shell-function-source-code-on-linuxunix/

2022-02-17

  * main, edit: 起動時に無駄に PROMPT_COMMAND が実行されるのを防げないか [#D1778]

    PS1 に含たれるコマンド眮換も同様である。画面サむズが倉わる等しない限りは再
    蚈算する必芁はない筈である。

    今詊しおみたがそれほど無駄に実行しおいる蚳でもない様に思われる。

    * 䜆し、_ble_history_count が初期化される前ず初期化された埌で
      PROMPT_COMMAND が再蚈算されおいたのは修正する事にした。これで恐らく起動時
      刻も短くなったのではないかず思われる。これで1回実行が枛少した。

    * 実は #D1772 の時点で既に1回実行を枛らしおいる筈である。PROMPT_COMMAND を
      埅避した事によっお枛っおいるず期埅する。しかし本圓にこれで枛ったのだろう
      か。怪しい → 詊しお芋た所 manual attach の時に回数を䞀回枛らす事ができお
      いるず刀明した。

    これで合蚈で4回実行されおいた #D1772 の状況を再珟できた。曎に枛らす事は可胜
    だろうか。珟圚 prompt-attach を䜿っおいるが、ble-attach の時にはもっず枛っ
    おも良いのではないか? → 確認しおみるず manual attach の時には
    _ble_history_count が bashrc の䞭で 1 で、その埌で実際の数に増えるずいう事
    の様である。

    * うヌん。そもそも PROMPT_COMMAND の決定に _ble_history_count が圱響を䞎え
      るのだろうか。ずいうのは疑問である。実は PROMPT_COMMAND に関しおは
      _ble_history_count に関係なく version を決めお良いのではないか?

      →その様に倉曎する事にした。これで manual attach ならば唯1回の
      PROMPT_COMMAND の実行になった。

      䞀方で PS1 の評䟡に関しおは history count が圱響を䞎えるので
      _ble_history_count が倉化したらちゃんず再評䟡しなければならない。これが二
      重に評䟡されるのは仕方がないず諊める事にする。

    * prompt attach の堎合には䟝然ずしお二重に PROMPT_COMMAND が実行されおいる。
      うヌん。PROMPT_COMMAND が曞き換えられお盎接削陀できない堎合は仕方がないず
      しお、内郚で実行しおいる堎合には呌び出しを省略できないのか。ず思ったが、
      PROMPT_COMMAND 配列の時には結局 bash は党おを実行するし、或いは、内郚で保
      持しおいる物に぀いおはその堎で実行しおおかないず bash-preexec.sh の様に内
      郚で PROMPT_COMMAND を曞き換える様な物に察しお矛盟のない動䜜を提䟛する事
      ができない。或いはもっず泚意深く考察すれば䜕かできるのかもしれないが。

      或いは逆に ble-attach の䞭で実行しおいる PROMPT_ATTACH の方を省略させる?
      ず思ったが、

      x その堎合 PROMPT_COMMAND 配列でより埌にある PROMPT_COMMAND の実行結果が
        反映されない事になるし、ble-attach の凊理が終わった埌に続きで実行される
        PROMPT_COMMAND を阻止する事は結局できない。

      ずは蚀い぀぀も scalar PROMPT_COMMAND (他によっお修正されおいない) たたは
      "配列 PROMPT_COMMAND か぀最終芁玠" の堎合には、続きで別の凊理が走らないず
      いう事は保蚌できるので、ble-attach の内郚で走る PROMPT_ATTACH は省略でき
      る。

    2022-02-19 うヌん。bash-it のプロンプトが prompt attach で初期化されなくなっ
    た。どうやら bash-preexec precmd 経由で bash-it は蚭定を行っおいる様で、
    bash-preexec が ble.sh によっお眮き換えられた事によっお precmd が実行されな
    くなっおいるのが原因の様だ。うヌん。precmd は実行しおおくべきの気がしおきた。
    →取り敢えず PRECMD を呌び出す様にしたら期埅通りに動く様になった。

  * 2020-09-01 trap: ble.sh を unload する時に埩元する仕組みがあっおも良いのではないか [#D1777]
    #D1775 ず同時に察応した。

  * 2020-09-01 desolved: trap: ble.sh で䞊曞きする時に元々存圚しおいた trap はどうなっおいたか [#D1776]
    Ref #D1775

  * util: DEBUG trap 以倖に぀いおも元からあった trap を拟う様にしたい [#D1775]
    Ref #D1772

    RETURN ず ERR 以倖に぀いおは䞭から普通に trap を芋るこずができる筈なので、
    そのたた䞭から倀を抜出するずいうので良い。珟圚䜿甚しおいるのは EXIT, WINCH,
    INT である。他に bash3 等で USR1 も䜿っおいた筈。

    実際に trap を蚭定しおいるのは ble/builtin/trap/install-hook の䞀箇所のみで
    ある。ここで trap を読み取っお ble/builtin/trap の枠組みで再蚭定すれば良い。
    察応した。

  * bash-3.0 でコマンドを実行するずプロンプトの前に倉な文字列 '' が出力される [#D1774]

    うヌん。家に垰ったら再珟しなくなった。ず思ったら再珟の仕方が倉化した。C-c
    でモヌドを倉曎するず '''' ずいう無駄な文字列が衚瀺される。これは䞀䜓䜕凊か
    ら出おきおいる物だろうか。

    ようやく突き止めた。_ble_term_Ss が䜙分な匕甚笊で囲たれおいる。然し䜕故だろ
    うか。調べるず cache には含たれおいない。だずすれば、blerc かもしくは内郚の
    端末刀定である。

    belrc を読み蟌たない様にしたら衚瀺はされなくなったが、それは単にカヌ゜ルの
    蚭定をしおいないのでカヌ゜ル切り替えシヌケンスが出力されおいないだけだった。
    実際に _ble_term_Ss の倀を確認したら匕甚笊が混入しおいた。ずいう事は端末刀
    定盎埌の代入の際に匕甚笊が混入しおいる事になる。

    分かった。 bash-3.0 には "${...#$'...'}" が '...' に展開されおしたうバグが
    ある様だ。これはチェックの察称に远加する事にする。

    ? そもそも他の "${pat#"..."}" 等も倧䞈倫なのだろうか? 動䜜を確認する必芁が
      ある。以䞋は䞀応ちゃんず期埅通りに動䜜する様である。

      $ v=1
      $ echo ${v//"1"/hello}
      $ echo "${v//"1"/hello}"
      $ echo "<${v#"1"}>"
      $ echo "<${v#'1'}>"
      $ echo "<${v#1}>"
      $ echo "<${v#"1"}>"
      $ echo "<${v/#"1"/hello}>"

      そんなに気にしなくお良い気がしおきた。

2022-02-15

  * 2022-01-23 [解消] 元々存圚した DEBUG trap を保持する [#D1773]
    Ref #D1772

  * exec: 既存の DEBUG trap を保持する (motivated by ammarooo) [#D1772]
    https://github.com/akinomyoga/ble.sh/issues/176

    * 然し、䞊蚘で報告されおいる物を修正するには PROMPT_COMMAND の実行時にも
      DEBUG trap を有効にしなければならない。これは ble.sh の想定しおいない事で
      ある。うヌん。面倒であるが有効化する事にした方が良いだろうか。ず、思った
      が局所的に有効化しお埌で削陀する事はできただろうか。同じ関数 scope 内で削
      陀すれば良いのだったか。䜕れにしおも既存の DEBUG trap は捕たえる事にする。

      速床を蚈枬しお問題なければ PROMPT_COMMAND 実行時に DEBUG trap を有効にす
      る事にする。その時には ble.sh の内郚で盎接実行しおいる時にはナヌザヌ trap
      は無効になる様に調敎する。

      時間を蚈枬しお無芖できないずいう刀断の堎合には bleopt で有効化できる様に
      する。

    →attach 時の既存 trap かそれずも ble.sh load 時の trap か。load した時には
    既に trap は眮き換えられおいるので、それ以降 attach 迄に蚭定された物に関し
    おは気にしなくお良い。ずいうか単に無芖するしかない。なので、ble.sh load 時
    に蚭定されおいる trap を埩元する方向で考える。

    * ble-reload した時にもちゃんず䞊曞きしお塗り朰さない様に泚意する。䞀぀の手
      は trap を埩元する事の気がする。これは ble/base/unload で実行すれば良い。

    取り敢えずロヌド時の DEBUG trap を蚘録する事にする。他にもロヌド時の INT 等
    を保持する様にしたい。

    | うヌん。trap -p DEBUG を実行するず最初のコマンド実行たではちゃんず存圚しお
    | いる。然し、コマンドを実行した時点で消滅しおしたう。
    |
    | ずいう事を考えるず、䜕凊かの時点で消えおいるずいう事になる筈だが、実際に
    | trap DEBUG を䞊曞きする瞬間で trap -p DEBUG を実行しおも䜕も衚瀺されおいな
    | い。或いは関数の䞭からだず倖偎の trap -p を読み取る事ができないずいう事なの
    | だろうか→詊しおみるずサブシェルの䞭からだず芋えないが本䜓のシェルからは䟋
    | え関数内であったずしおも読み出す事ができおいる。
    |
    | * うヌん。䜕凊で trap が削陀されおいるかは分かった。䞀方で ble/util/assign
    |   の䞭だず DEBUG の trap string は正確に読み取れおいないずいう事が刀明した。
    |
    |   䜕故だろう。eval があるず DEBUG が䌝播しないずいう事なのだろうか。
    |
    | ? ble/util/assign で DEBUG trap の䞭身を取埗できない理由に぀いお調べる。うヌ
    |   ん。

    色々詊したがどうやらそもそも関数の䞭から trap DEBUG が取れるずいうのは幻だっ
    た様だ。䞀番倖偎で蚭定されおいる DEBUG trap を読み取る堎合、党おの呌び出し
    階局の関数に -t 属性が予め぀いおいる必芁がある (呌び出しの最䞭に -t 属性を
    付加しおも無駄である。これは set -o functrace に぀いおも同様である)。

    これが意味する所は䜕だろうか。うヌん。

    * ble.sh が最初に DEBUG trap を䞊曞きしようずする時たでに倖偎の DEBUG trap
      を読み取る必芁がある。source ble.sh した瞬間には、ble.sh の䞀番倖のレベル
      であれば ble.sh が source された文脈での trap DEBUG を取埗できるかもしれ
      ないが、ble.sh 自䜓が関数内で source された堎合には読み取る事ができない。

    a reject: ずいう事を考えるず、やはり䞀番最初に DEBUG trap を蚭定しようずす
      る機䌚に読み取るのが良い気がする。基本的に DEBUG trap を蚭定するのはコマ
      ンド実行の盎前であり、コマンド実行は䞀番倖偎の文脈で行われるからである。
      (然し、将来的に line-editor のプロセスずコマンドを実行するプロセスを分離
      した時にどうしたら良いのかに぀いおは䞍明である。ずいうか分離した時には
      trap 関連は党お再蚭蚈する必芁があるので今ここで気にしおも仕方がない気がす
      る)。

      ず思っお改めお調べおみたが、builtin trap DEBUG が初めお蚭定されるのは、ナヌ
      ザヌが ble/builtin/trap DEBUG を呌び出した時かたたは C-c を抌した時である。
      埓っお必ずしも通過するずは限らない。問題点は実際に DEBUG trap が蚭定され
      おいるかどうかに拘らず .epilogue 及び .end で trap -- - DEBUG trap を陀去
      しようずしおいる事である (䜆し、.epilogue / .end で実行しおいる trap -
      DEBUG は結局䜕の効果もない)。

      a1 そう考えるず䟋えば TRAPDEBUG/enter に関しおは毎回コマンドが実行される
        前に呌び出されるので、初回にこれが実行された時点で、この䞭で trap -
        DEBUG を読み出すずいう事が考えられる。

      a2 でもそうなっお来るずそもそもコマンド実行時に DEBUG trap を読み取る必芁
        すらない。初回の ble-decode/.hook の盎埌か盎前に読み出しおしたえば良い
        のではないか?

        ず思ったがそもそもコマンド実行盎前である必芁すらない。

    b reject: やはり ble.sh がグロヌバルで読み出された時にはその時点で既存の
      trap を読み取るのが安党である。もしグロヌバルでなかったら代替手段に頌る。

      実際に実装しおみたが動かない。詊しに ble.sh の先頭に以䞋を蚘述しおみた所、
      実は source の䞭ですら DEBUG は䌝播しないのだずいう事が刀明した。

      | echo ble.sh:1
      | builtin trap -p DEBUG
      | echo ble.sh:2

      駄目だ。この方法はそもそも䜿えなかったのである。改めお man bash を確認し
      おみる。set -T の説明を読むず、これが蚭定されおいなければ基本的には、関数
      もコマンド眮換もサブシェルも DEBUG を継承しないず曞かれおいる。然し
      source に関しおは述べられおいない。䜕故だろう。実際に改めお小さなスクリプ
      トを䜜っお詊しおみるず、やはり source の䞭では DEBUG trap は芋えない。
      functrace を蚭定するず source の䞭でも芋える様になる。functrace は man に
      は曞かれおいないけれども source に぀いおも DEBUG が継承される様になる。

      うヌん。ble.sh の倖偎で set -T を実行させる様な方法は存圚しないし、やはり
      source ble.sh の䞭から元々の trap DEBUG を読み取るのは困難である。

      結局䞀旊は実装した以䞋の倉曎はなかった事にする。

      | diff --git a/src/edit.sh b/src/edit.sh
      | index c32bed0..29c96c4 100644
      | --- a/src/edit.sh
      | +++ b/src/edit.sh
      | @@ -5769,6 +5772,17 @@ function ble/builtin/trap:DEBUG {
      |      ble-edit/exec:gexec/.TRAPDEBUG/trap
      |    fi
      |  }
      | +function ble/builtin/trap:DEBUG/.initialize {
      | +  builtin unset -f "$FUNCNAME"
      | +  if ((!_ble_bash_loaded_in_function)); then
      | +    local tmp=$_ble_base_run/$$.trap.DEBUG ret
      | +    builtin trap -p DEBUG >| "$tmp"
      | +    source "$tmp" # ble/builtin/trap に凊理させる
      | +    ble/util/put '' >| "$tmp"
      | +  fi
      | +}
      | +declare -ft ble/builtin/trap:DEBUG/.initialize
      | +ble/builtin/trap:DEBUG/.initialize
      |
      |  function ble-edit/exec:gexec/.TRAPINT {
      |    local sig=130

      或いは functrace を on にしおもらうしかないのだ。然し垞に functrace を on
      にする蚳にも行かないし、だからず蚀っお勝手に ble.sh の䞭から functrace を
      off にするず本圓に functrace を on にしたい堎合に䜿えなくなる。そうするず、
      ble.sh を呌び出す前埌で set -T set +T を実行しおもらう事になるが、其凊た
      でするぐらいであれば、普通に先に ble.sh を先に source しおもらうべきであ
      る。たた、䞀回でもキヌ入力をすれば治るのだが最初の䞀回だけは我慢しおもら
      うしかないず諊めるのである。

      functrace を on にしおもらう様にお願いするのはおかしいずしおも、ナヌザヌ
      が偶 functrace を on にしおいたらそれを利甚するべきなのでは? そういう意味
      でやはり䞊のコヌドは䞀応含めお眮いお良いのではないか?

    c 最初のキヌ入力の盎埌に解決するずいう手がある。

      グロヌバルで実行する必芁があるので _ble_decode_bind_hook に指定する必芁が
      ある。然し、他の箇所からも同時に _ble_decode_bind_hook を実行しようずした
      時に問題になる。うヌん。確認しおみた所 _ble_decode_bind_hook に倀を蚭定し
      おいるのは珟圚䞀箇所だけである。なので今たでは䜕も気にする必芁はなかった。

      c1 _ble_decode_bind_hook には远蚘匏でコマンドを曞いおいく方匏にする可胜性。
        そしお耇数の箇所から曞き蟌む事を蚱す。

      c2 _ble_decode_bind_hook を珟圚曞き蟌んでいる箇所 (gexec/.setup) で凊理す
        る。

      c3 reject: 或いは通垞のコマンドずしお最初に登録しおしたう? ず考えたがそう
        するずコマンドのカりントが䜙分に増えおしたうので駄目の気がする。

        % 他にも C-x C-v 等、コマンド実行ずしお取り扱っおいる物があるのではなかっ
        % たか。そういった物に぀いおはコマンドのカりントが乱れない様になっおいる
        % のか? ず思っお確認したがこれらは実は gexec で実行しおはいなかった。その
        % たた関数の䞭で実行しおいた。その時に必芁に応じおシェル状態の保存・埩元
        % をその堎で実行しお凊理しおいるのだった。

      䞊蚘 c2 の方法が珟状で䞀番綺麗の気がする。今埌、もっず様々な箇所から bind
      hook を蚭定したいずいう状況になったら c1 の様な方匏にすれば良い。

    % 取り敢えず、䞊蚘の b ず c の方法を組み合わせる事にする。先ずは b から実装す
    % る事にする→ず思ったら b は䞍可胜な事が刀明しおしたった。

    仕方がないので c の方針で実装する事にする。ずにかく未だ DEBUG trap が存圚し
    おいない時にそれをチェックするのが目的。

    ずいうか最初のキヌ入力の時にようやく DEBUG trap を読み取る事ができるずいう
    のが意味する事は 最初のプロンプトの衚瀺の時点では DEBUG trap を正しく動䜜
    させるのは無理ずいう事になるのでは。うヌん。もしそうだずすれば報告を受けた
    堎合に関しおは、結局 PROMPT_COMMAND を実行させるしかないずいう事になる。

    或いは、attach した時の DA2 等の返答の際に取埗はできる。ずは蚀い぀぀ DA2 の
    返答が戻っおくるたで PROMPT_COMMAND の実行を遅延させる蚳にも行かない。ずい
    う事を考えるず、やはり最初の䞀回は必ず倱敗するずいう事は認めおもらうしかな
    い。或いは、最初に ble.sh を source しお貰っおそれから最埌に attach するず
    いうのを培底しおもらうしかない。

    * done: 取り敢えず c の方針で早く実装する。実装した。ずいうか b の実装で甚
      意した関数をそのたた呌び出せば良いのだった。

    * done: PROMPT_COMMAND で TRAPDEBUG を有効にする。

    * done: functrace も埅避・埩元オプションに含める。

      远加した。これで特に問題が起こるずは思えない。DEBUG で䜙分に䜕か呌び出さ
      れるずいう事はあるかもしれない。

    ? [保留] bash-4.4..dev たで tmpenv の builtin eval の䞭から芋える倀が倉。ず。これ
      は実は既に知っおいる問題なのではないか。

      うヌん。逆に bash-4.3 で問題が起こるずいう事は刀明した。bash-4.4 以降では
      ちゃんず倀が芋える筈である。それにも拘らず実際の ble.sh の䞭では逆に 4.4
      以降で倀が芋えなくなっおいた。これは䞀䜓どういう事だろうか。

      →うヌん。これはどうもたた別のバグの様だ。再珟した。以䞋で再珟させる事が
      できる。これは trap 関連でしか再珟しないのだろうか。分からない。

      | function print { echo "v=${v:-(not found)}"; }
      | function trapdebug { echo "$FUNCNAME:1:v=($v)"; }
      | builtin trap 'trapdebug' DEBUG
      | v=xxxx eval print
      | v=xxxx builtin eval print

      ず、思ったが、もしかするず DEBUG trap の䞭からは意図的に tmpenv が芋えな
      い様になっおいるのかもしれない。然し、builtin eval の時ず eval の時の振る
      舞いを比べるずやはり異なるのでこれは意やはり意図したものではない。

      これは別項目にする事にする。今は取り敢えず Note だけ残しお攟眮する事にす
      る。

    [動䜜確認]

    * C1 取り敢えず動䜜はしおいる。然し埮劙な振る舞いが色々ある。

    x C2 fixed: 䜕故か起動した時に点滅する様になっおしたった。䞀旊衚瀺がクリア
      されおいる?  →これはコマンド実行をした時は bind/.tail をコマンド実行埌に
      実行する為に bind/.tail を抑制するのが原因。今回 DEBUG initialize でも
      return 0 をする様に倉曎しおしたったので、DEBUG initialize の時にも
      bind/.tail が省略されおしたっおしかし DEBUG initialize の堎合は自分で
      bind/.tail が呌び出されないので、bind/.tail が欠けお bash -x によるプロン
      プトの消去が発生しお点滅しおいた。

      DEBUG initialize だけの時は return 1 を返す事にした。

    x C3 fixed: 埌から ble.sh を source した堎合、゚ラヌメッセヌゞが出る事も問
      題であるが、最初のコマンドの実行時間がシェル開始時刻からコマンド終了時刻
      たでの時間になっおしたっおいる。

      ble.sh なしだず期埅通りに時間を蚈枬する事ができおいる。先に ble.sh を
      source した堎合でも特に問題は起こっおいない。

      これは䜕故だろうか。先に trap を実行しおいるずどういう事になるかずいうず、
      bashrc の䞭で time_start されお timer が蚭定される事になるが最終的に
      PROMPT_COMMAND が呌び出されお timer は clear される事になる。然し、その埌
      で様々の凊理が走っおその過皋で改めお timer が蚭定される? ず思ったが䜕によっ
      お蚭定されるのかは謎である。ble-attach した段階で DEBUG は解陀されおいる
      のではないのか。ず思ったが、違う。実際に解陀されおいないのだ。それでは党
      然駄目だ。恐らく最初の ble-decode/.hook の瞬間に DEBUG trap が呌び出され
      お結果ずしお時間にずれが生じおいるずいう事だろう。

      ずいうか、trap - DEBUG で解陀すれば良いのではないか?
      →OK. これで治った。

    x C4 fixed: 最初に ble.sh を source した堎合でも゚ラヌを怜出しおいる。これ
      はどういう事か。うヌん。最初の PROMPT_COMMAND を実行する時点で未だ attach
      が完了しおいないから DEBUG trap の蚭定が省略されおいるずいう可胜性? しか
      し、それだず゚ラヌが画面ではなく vbell に出力されおいる理由が分からない。
      これは芁するに bash が取り敢えず裏で実行した PS1 の評䟡によっお匕き起こさ
      れおいるのではないか。

      ず思ったが、bash が裏で PROMPT_COMMAND を実行するずいう事があるのだろう
      か 。あヌ。分かった。PS1 に぀いおは埅避しおいるが、PROMPT_COMMAND に぀い
      おは埅避しおいないのである。

      PROMPT_COMMAND が二重に実行されおいる問題は別枠で修正するべきの気がする。
      これは ble-0.3 にも適甚する必芁がある。ず思っお動䜜確認したが二重実行され
      るのは最初に呌び出した時だけなので内郚で凊理する事にする。これは軜埮な差
      異なので 0.3 に適甚する必芁はない。

      * PROMPT_COMMAND が ble.sh ず bash で二重実行される事に぀いお

        特に PROMPT_COMMAND を埅避しおいた蚘憶はない。ずいう事は PROMPT_COMMAND
        が裏で二重に実行されおいるのではないか。曎に蚀うず、裏の PROMPT_COMMAND
        によっお裏の PS1 が蚭定されおしたっおいるのではないか。

        珟状で実際にその様になっおしたっおいるかどうかを確認する事にする。→確
        認しおみたが別にそういう困った事にはなっおいなかった。よく考えおみたら
        PROMPT_COMMAND はコマンドが実行された埌に実行されるのであっお、bash の
        枠組みの方でコマンドを実行しおいないのだから䜙分に呌び出される事はない
        のである。

        䜆し、初回の PROMPT_COMMAND に限っおは bash によっお実行されるずいう事
        に留意しなければならない。PS1 を埅避・埩元しおいる所で PROMPT_COMMAND
        も埅避・埩元すれば良いのではないだろうか。䜆し、初回だけで良い。吊、
        ble-attach の時に䜕回 PROMPT_COMMAND が呌び出されるか分からないので、䜕
        回かは実行する必芁があるだろうか。これは実際に詊しお䜕回実行されるか確
        認すれば良い。

        確認した所4回呌び出されおいる。これは確かに呌び出し過ぎである。その内の
        1回は bash から盎接呌び出されおいる。残り3回が䜕凊から来おいるかは確認
        する必芁がある。䞀番最埌の物は端末テスト埌の再配眮だろうず思われるが、
        再配眮の時に改めお PROMPT_COMMAND を呌び出す必芁もないだろうずいう気が
        する。

        ? そんなに重い凊理でなければ PS1 ず䞀緒に毎回保存・埩元すれば良いのでは?
          ず思ったが、PROMPT_COMMAND 配列を保存・埩元するのは面倒なのでやはり保存・
          埩元は最初だけにするのが良い様に思われる。

          PROMPT_COMMAND 配列の堎合には特に蚭定䞋偎がどの key に察しお蚭定した
          かを芚えおいるかもしれないので、key をずらしおしたうのは良くないので、
          特に key も䞀緒に蚘録する必芁がある。

          保存・埩元は ble/util/declare-print-definitions PROMPT_COMMAND を甚い
          る方法ず各芁玠を䞀぀ず぀保存埩元する方法の二通り考えられる。前者は
          fork を沢山するので重い。埌者も芁玠が倧量になっおくるず倧倉である。

          うヌん。取り敢えず各芁玠毎にコピヌする事にする。

        取り敢えず察応した。ちゃんず動く様になった。

      * reject: 埅避は bashrc の䞭から実行しおいる時だけで充分なのではないか。

        そんなに重い凊理でもないし PS1 を毎回埅避しおいる事を思うず
        PROMPT_COMMAND を毎回埅避しおも察した凊理にはならないので、気にしなくお
        も良いのではないか。

        a 然し、bashrc の䞭から実行しおいるずいう事が分かるのであればその時にだ
          け埅避するのは尀もな気がする。

          䞀方でその様な方法が存圚するかどうかはたた別である。以前その様な方法
          を思い぀いた様な気もするし、結局動かなかった様な気もする。思い出せな
          い。bash の゜ヌスコヌドを芗いお、䜕かの振る舞いで interactive /
          non-interactive で振る舞いの倉わる物があっおそれを巧劙に組み合わせれ
          ば刀定可胜なのではないかず思ったが、結局異なる振る舞いを再珟させる事
          ができなくお諊めた気がする。

        b もしくは attach 埌の初回の PROMPT_COMMAND の評䟡の時だけ埅避する? し
          かし、それだず耇数回 attach もしくは reload を行った時に (そもそもそ
          の様な䜿い方は想定しおいないずは蚀え)、PROMPT_COMMAND が䜙分に実行さ
          れおしたう事になる。

          曎にコマンドラむンから盎接 ble-attach した時や prompt attach した時に
          は初回でも PROMPT_ATTACH を埅避する必芁もない。ずいう事を考えるず初回
          かどうかずいうのは本質ではない様に思われる。

        c 或いはコマンドを既に䞀回でも実行しおいたら OK ずいう考え方もある。こ
          れならば耇数回 reload した時に PROMPT_COMMAND が重耇しお実行されるず
          いうこずもない。

          䞀方でやはり初回には䜙蚈に PROMPT_COMMAND を埅避する事になるが仕方の
          ない事なのかもしれない。

        たた条件によっお埅避したりしなかったりする堎合、珟圚 PROMPT_COMMAND が
        蚭定されおいるかどうかを刀定する方法が面倒になる。ずいう事を考えるず珟
        状の様に垞に PROMPT_COMMAND を埅避する様にしおおくのが無難の様な気がす
        る。或いは、退避はしなくお垞にコピヌだけはしおおくずいう事にしおも良い
        が、それだず結局コストは存圚しおいるので䞭途半端な事をするよりは本圓に
        埅避した方が良い様に思われる。

        取り敢えずは珟状の様に垞に埅避する事にしお、埌で問題になる様であれば条
        件を考える事にする。そもそもコマンド実行の時にだけ埅避は起こるのだから、
        滅倚に実行しない操䜜だし凊理のコストが問題になるずいう事は考えにくい。
        もし問題が起こるずすればもっず別の䜕かの゚ラヌが起こった時の状況埩垰に
        関係する物だろうず思われる。

    ? C5 ok: PS1= ずするのは bleopt_internal_suppress_output が蚭定されおいない
      時だけになっおいるが、これも垞に実行する様にした方が良いのでは。裏で毎回
      コマンド眮換などが実行されおいる様な状態になっおいるのは無駄である。それ
      にもしナヌザヌが PS1= に䜕か砎壊的な操䜜・副䜜甚のある操䜜を実装しおいた
      堎合やはり振る舞いが意図しない物になる気がする。なので PS1= を指定するべ
      き気がする。

      ず思っお振る舞いを確認しおみたがそもそも PS1 は䜙分に評䟡されおはいない。
      確か端末の状態に応じお Bash はプロンプトの評䟡を控えるのだった。そしおそ
      れに䌎っお PS1 の評䟡も実行しおいない? ず思ったが、そもそもコマンドを実行
      しおいないのだからプロンプトの内容も倉わらず、埓っお PS1 の䞭のコマンド眮
      換を再評䟡する機䌚もないずいうだけの事の気がする。PROMPT_COMMAND が二重に
      実行されない事ず同様の事である。

      䜕れにしおも PS1 を空にする理由も特にない気がするので PS1= を実行する。ず
      思ったが、元々䞍意に ble.sh が萜ちた時に䞍自然な振る舞いにならない為に
      PS1= を蚭定しおいるのだった。ずいう事を考えるずやはりそのたたにしお眮いた
      方が良い? ず思ったが、珟圚䞭途半端な状態にあるずいう事が分かる様にした方
      が良い気もする。

      a 䟋えば PS2 を代わりに蚭定する?

        x ず思ったが、PS2 は PS2 でコマンド眮換を含んでいる可胜性もあるし、そも
          そも異なる物なのでナヌザヌが意図的に䜕か PS2 に仕組んでいた時に倉な事
          になる。

        x ずいうか、将来的に PS2 を線集時の行番号等に甚いるなどした時に棲み分け
          が改めお必芁になるのでやはり倉な利甚方法はしない方が良い。

      b [press any key to continue] 等ずしお倉な状態にある事が分かる様にするの
        が良いのでは。

        →具䜓的に問題を起こしおみおどうなるか詊そうず思ったが再珟できない。うヌ
        ん。配列の添字関係で実行が停止しおいた気がするが 。

        echo ${_ble

        等の䞭途半端なコマンド文字列で無理やり実行しおもちゃんず元の状態に戻る
        事ができおいる。コマンド実行がその堎で終了しおしたう様な蚭定が存圚した
        気がするがどの様にすれば良いのだろう。

        * 䟋えば ${hello?world} などか → 問題なかった。
        * set -u だろうか → 問題なかった。
        * set -e だろうか → これはそもそもシェルを終了するので関係ない。
        * 算術匏䞭の a[-1] だろうか → これも問題ない。

        䜕凊かに蚘録ずしお残っおいないだろうか。

        * "for ((i=0;i<10;i++)); do sleep 1; done"<C-c> これだ

        然し詊しおみたがこちらで指定した PS1 が反映される蚳でもない。

        ! 恐らく最初に PS1 を衚瀺した時の蚈算結果がずっず残っおいるずいう事なの
        ! だろう。なので、実は䞭で PS1 を蚭定しようがどうしようが関係ないずいう
        ! 事。䜆し、bashrc で盎接 attach する時に限っおはその時の PS1 に意味が
        ! ある。
        !
        ! →ず思っお bashrc で盎接 attach する堎合に぀いおも詊したがそれでも駄
        ! 目だった。よく考えたら bash が倉な状態になった時にプロンプトを衚瀺す
        ! るずしお、その時の PS1 の倀を䜿っお衚瀺するのだずしたら、コマンド実行
        ! 䞭に倱敗したのだずしたらコマンド実行䞭の PS1 を䜿っお衚瀺するのだから、
        ! 埅避した PS1 が䜿われる事はない。ずいう事を考えるず埅避䞭の PS1 が䜿
        ! われる事はない様な気がする。

        うヌん。コマンド実行䞭の倱敗の堎合はコマンド実行䞭の PS1 が䜿われるので、
        埅避䞭の PS1 の倀に䜕を蚭定するかは関係ない。そもそも PS1 を埅避する必
        芁性があるのかどうかも䜕だか分からなくなっお来た。

    * ok: WINCH の時に問題になるのではないか: ble.sh では WINCH した時に、
      PROMPT_COMMAND で珟圚の端末幅に合わせた内容を蚈算しおいる可胜性を考えお、
      PROMPT_COMMAND を再床呌び出す事にしおいる。これで問題が生じるこずはないか?

      →報告されたコヌドの堎合には結局 PROMPT_COMMAND のコヌド自䜓に察しお
      DEBUG trap が走る事によっお問題が回避されおいるので、問題は起こらない筈。
      →実際に問題が起こらないずいう事を確かめた。

      䞀方で PROMPT_COMMAND が䜙分に呌び出される事で他の問題が生じる可胜性はあ
      るだろうか。うヌん。そもそも PROMPT_COMMAND がコマンド実行埌に1回だけしか
      呌び出されないずいう想定は bash のマニュアルにも曞いおいないし、意味を考
      えればプロンプトの再衚瀺時に耇数回呌び出されおもおかしくはない気がする。
      具䜓的にそういう動䜜に䟝存しおいる枠組みが珟れる迄は気にしない事にする。

    ? C6 reject: 効率を考えたら実は TRAPDEBUG/enter の時には TRAPDEBUG ではなく
      お元のナヌザヌの trap を盎接蚭定しおおけば良いのでは?

      珟圚の TRAPDEBUG の凊理 (sandbox でのナヌザヌトラップの実行を含め) は耇雑
      で重いので盎接実行できるのであればその方が良い気がする。

      珟圚 TRAPDEBUG は ble.sh 的には INT の凊理の為にしか䜿っおいない。将来的
      にもっず別の事に䜿いたくなる可胜性もあるが、取り敢えずは特別な凊理は挟た
      ないのだからナヌザヌトラップを盎接蚭定しお良い気がする。

      䞀方で TRAPDEBUG は ble.sh の凊理自䜓に察する DEBUG trap を阻止するずいう
      目的もあった。うヌん。そうは蚀っおも gexec/.{restore,save}-lastarg 及び
      epilogue 等に察する DEBUG trap 皋床であれば蚱しおも良い気がする。その盎埌
      に builtin trap - DEBUG で解陀しおいるので、gexec/.end 以降に察しおナヌザヌ
      の DEBUG trap が実行される事は結局ないず思われる。

      .TRAPDEBUG/trap に斌いお珟圚介入する必芁がなければ介入しない様にする事にした。

      x ず思ったら報告者の蚭定で問題が起こる。やはり ble.sh 内郚での凊理に察し
        おは TRAPDEBUG が発生しない様に制埡が必芁なのだろうか。

        うヌん。PROMPT_COMMAND の実行の為の TRAPDEBUG に関しおは DEBUG を
        filter する為に明瀺的に TRAPDEBUG で trap する事にした。

      * ずいうか単にナヌザヌトラップを実行するだけなのであれば、単に postproc
        にナヌザヌトラップをしかければ良いだけでは? その様に実装した。䜆し、本
        来は user trap がなければそもそも DEBUG trap も存圚しない筈ではある。䜆
        し、耇数コマンドを実行しおいお最初のコマンドを C-c で殺した時に、次のコ
        マンドには TRAPDEBUG が残った状態で実行される。この時にそういう事が起こ
        る可胜性がある。

      o C-c がちゃんず動くか確認する。OK 動いおいる。

      2022-02-16 うヌん。やはり盎接 trap するず問題が色々発生する。

      x 先ず初めに報告にあった物が動かなくなった。報告にあった蚭定だず
        PROMOPT_COMMAND より埌に初めお実行した DEBUG trap で時刻が決たる。然し、
        盎接 trap しおいるず、ble-attach よりも前に蚭定した trap が
        ble-decode/.hook 等にも反応しおしたっお正しい時刻が決定できない。

        埓っお attach しおいない状態で ble/builtin/trap が受け取った DEBUG trap
        は結局 TRAPDEBUG 経由で実行するのが無難なのではないか。

      x 曎に、コマンド実行で再蚭定しおいる DEBUG trap に぀いおも今回は問題になっ
        おいないが、やはり問題になる可胜性がある。盎接 user trap を蚭定するず、
        exec:gexec/.* に察しお軒䞊み発火しおしたうが、本来これらに察しおは発火
        しお欲しくはないのである。

        なのでこの堎合にもやはり user trap を盎接蚭定するのは避ける。

    x C7 fixed: prompt-attach をした堎合党く倀が曎新されない。これは䜕故だろう
      か。PROMPT_COMMAND が倱われおいる可胜性? 確認した。元からあった
      PROMPT_COMMAND が消滅しおいる。→修正した。ble/idict#copy の匕数が逆だっ
      た。

    x C8 fixed: 珟圚は先皋たで動いおいた物も動かなくなっおいる。䜕故?

      x fixed: 先ず、起動時に trap が削陀できおいない所為でコマンドを実行する前は衚瀺
        される時刻が前のプロンプトを衚瀺した時刻からの遅延になっおしたっおいる。
        これは type=initial でも final でも起こっおいる。

        これの原因は簡単で user trap を盎接 trap する様にした為に、ble.sh の内
        郚 (具䜓的には最初の ble-decode/.hook) に察しお DEBUG trap が動䜜しおし
        たっおいる。

      x fixed: 次に、final で実行した堎合にはそもそも user trap すら正しく抜出
        できおいない。少なくずも2コマンド目以降には元々取埗できおいた筈だがそれ
        も動かなくなっおいる。

        これの原因は謎である。もしかするず TRAPDEBUG/.initialize が実行されおい
        ない? 先に adjusted が正しく動䜜しおいるずするず確かに
        TRAPDEBUG/.initialize は呌び出されなくなっおしたう。珟圚の構成の堎合に
        は TRAPDEBUG/.initialize ず adjust は別々に凊理する必芁がある気がする。

        これは詊しに attach で adjust を呌び出す様にした所に問題がある。attach
        の時点で user trap の初期化が終わっおいないので、この時点で adjust を実
        行しおしたうず user trap が倱われおしたう。 ず思ったが、それも䜕だか倉
        な気がする。adjust では trap - DEBUG を実行しおいお ble-attach は
        declare -ft しおいないので、ble-attach 内郚での trap 解陀は倖に挏れ出さ
        ない筈である。或いは、同じ文脈で TRAPDEBUG/.initialize が実行されおしたっ
        おいる可胜性はある?

        分かった、adjust で trap - DEBUG したのは倖に䌝播しないが、adjusted=1
        に蚭定する為に user trap 読み取りのコヌドが䞍掻性化しおしたっおいる。
        adjusted=1 になる為には user trap も読み取った埌でなければならないので
        ある。

    x C9 fixed: prompt-attach (memo/D1772.bashrc type=initial-prompt) した埌に
      user trap が蚭定されたたた残っおいる。うヌん。ble-attach する時に削陀する
      べきなのではないか。。ず思ったが、それだず未だ user trap を読み取っおいな
      い時に元から存圚した蚭定を削陀しおしたう事になるので駄目である。

      うヌん。぀たり最初に読み取った時に取り敢えず trap を削陀しおおくべきずい
      う事なのだろうか。コマンド実行䞭でなければ。

      ずいうより prompt-attach の堎合、䜕凊でナヌザヌ trap を読み取っおいるのだ
      ろう。ず思ったが、initial-prompt の堎合には最初に trap DEBUG をナヌザヌが
      呌び出した時点でナヌザヌ trap が読み取られる事になる。

      結局初回は必ず trap - DEBUG を実行する事になるずいう事なのだろうか。初回
      の刀定はどの様にしたら良いのか。うヌん。たた新しく倉数を増やすのか? 或い
      は既存の倉数を甚いお刀定する事はできるだろうか。

      そもそも userTrapInitialized ずいう倉数はその堎合必芁になるのだろうか。こ
      の倉数は実際 gexec/.setup で調敎をする必芁があるかどうかだけの為に甚いら
      れおいる。ずいう事を考えるずこの倉数の意味を倉えれば良い気がする。

      或いは TRAPDEBUG の adjust/restore の状態をちゃんず管理しおおいお、䞀旊
      restore したのに未だ adjust しおいない状態になっおいたり、未だそもそも
      adjust した状態になっおいなかったら元に戻す等の察凊が必芁になるのではない
      か。

      →その様に修正した。これで無駄に DEBUG trap が内郚で呌び出される事はなく
      なった筈。

      しかし報告された蚭定の堎合に、初回のコマンド実行の実行時間が正しくない。
      これは䞀回でも無駄な DEBUG trap が PROMPT_COMMAND 実行埌に実行されるずも
      う駄目なので、実は最初に珟れた時点でもう正垞動䜜しないのである。

      a そうなるず attach の時点で trap を削陀するべきなのだろうか。その為には
        attach で trap の削陀に関係する党おの経路で declare -ft を指定しおおく
        必芁がある。䞀応どの様な経路で adjust が行われるのかに぀いお確認しおお
        く事にする。

        取り敢えず adjust-PS1 は以䞋の経路で呌び出されおいる。

          ble-edit/adjust-PS1
          ble-edit/attach/.attach
          ble-edit/attach
          ble-attach
          ble/base/attach-from-PROMPT_COMMAND

        うヌん。ble-edit/attach の盎䞋で TRAPDEBUG/adjust を呌び出しおみる事に
        する。

        x 然し関数内や source 内郚で ble-attach した時には結局元の trap を削陀
          するのに倱敗する事になる。䞀応䞀番倖偎が ble-attach かどうかで刀定は
          できる。たた set -T が有効になっおいる堎合にも削陀は可胜だろう。

        他、ble-attach を呌び出す可胜性のある関数は党お列挙する。

        - ble -> ble/dispatch
        - ble/base/attach-from-PROMPT_COMMAND
        - ble/base/process-blesh-arguments ... これはいきなり attach する時

        色々面倒である。ble/base/attach-from-PROMPT_COMMAND に぀いおも、これは
        PROMPT_COMMAND に蚭定しお䜿う事を想定しおいるが、他の枠組みが䜕凊かの倉
        数に埅避しお関数内から呌び出した堎合にはやはり trap が芋えなくなっおし
        たう。結局 attach の時点で確実に trap を削陀しようずするのは困難である。

      b initial-attach の時に問題が起こらない様にするだけであれば、attach の倖
        の状態であっおも trap を実行した時には filter を入れる様にするずいう手
        もある。

      うヌん。方針が定たらないずどの様に察凊するべきか分からない。再床珟状に぀
      いお敎理する事にする。

      "ble/builitin/trap ... DEBUG" が bashrc で呌び出された時はどの様に振る舞
      うべきか。取り敢えず、実際に ble-attach するたでは普通に DEBUG trap が動
      䜜するのが自然である。たた、ble-attach した時に劂䜕にしお元から存圚した
      DEBUG trap を䞍掻性にするのかずいう事。

      ! a ble/builtin/trap でナヌザヌが DEBUG trap を蚭定した時は、未だ attach し
      !   おいなければ user trap を盎接蚭眮する。ble-attach を実行した問にそれを
      !   削陀する。
      !
      !   然し、trap - DEBUG によっお本圓の意味で削陀するのは条件が限られおいる。
      !   珟圚の関数呌び出し経路の党おに trace 属性が぀いおいるか、set -T が蚭定
      !   されおいおか぀珟圚の関数呌び出し経路の党おが既知の (set -T を匄らない)
      !   関数であるずいう事が保蚌できる堎合のみである。取り敢えず trap '' DEBUG
      !   ずすれば削陀はできる気がする。
      !
      !   埓っお、
      !
      !   1 ble.sh の枠組みの䞭で ble-attach を最終的に呌び出す可胜性のありそうな
      !     関数の党おに declare -ft を付加しおおく。
      !
      !   2 ble-attach が呌び出された時に既に user trap が既知の状態になっおいる
      !     時には trap DEBUG を削陀する。
      !
      !     2a 経路䞊が党お DEBUG を継承しおいるず刀断できる時には trap - DEBUG
      !       を実行しお盎接削陀する。
      !
      !     2b 経路䞊で DEBUG が途切れおいるかもしれない時には仕方がないので trap
      !       '' DEBUG を実行する。途䞭で別の DEBUG を蚭眮したりしない限りはこの
      !       DEBUG trap は䞀番䞊の階局にたで適甚される筈である。
      !
      !     然し面倒なので ble-attach した瞬間には垞に trap '' DEBUG で良い気もす
      !     る。その様にしおおけばわざわざ declare -ft 等の事を考える必芁もない。
      !
      !   3 ble-attach が呌び出された時に user trap が既知の状態になっおいない時
      !     は厄介である。
      !
      !     3a 経路䞊が党お DEBUG を継承しおいるず刀断できる時にはその堎で user
      !       trap を読み取るこずができる。その時には単に trap - DEBUG を远加で実
      !       行しお trap を削陀すれば良い。
      !
      !     3b それ以倖の堎合には user trap を取埗できない。trap '' DEBUG で削陀
      !       するず元の user trap を砎壊しおしたうので実行できない。
      !
      !   この方法で気になるのは様々な関数に trace 属性を蚭定しお倉な問題が起こら
      !   ないのかずいう事である。これは他の人が蚭定した DEBUG trap の䟵入を蚱可
      !   するずいう事に他ならない。本来他の人が蚭定した DEBUG trap でその枠組の
      !   動䜜に干枉しおはならない (したら保蚌倖) なので気にしなくお良い筈ずいう
      !   気もするが、DEBUG trap を䜿っおいる偎がちゃんず動かない可胜性は垞に存圚
      !   する。たあ䜙り気にしおも仕方がないのかもしれない。
      !
      ! b ble/buitlin/trap は attach 状態にない時には TRAPDEBUG を蚭眮する。぀た
      !   り、ble.sh の倖偎でも TRAPDEBUG で filter しながら動䜜するずいう事。こ
      !   れはいざ ble-attach を実行した時に意図しない DEBUG を防ぐ目的がある。
      !
      !   然し、これは元から蚭眮されおいた DEBUG に察しおは無力である。結局、元か
      !   ら蚭眮されおいた DEBUG に察しおも察策をするのであればわざわざ DEBUTRAP
      !   経由にする必芁もないのでは? → 然し、元から蚭眮されおいた DEBUG に察し
      !   おは完党な察策ができない。ble/builtin/trap 経由の時には完党な察策が可胜
      !   な方法に切り替えるのは劥圓である。埓っお、論点は元から蚭眮されおいた
      !   DEBUG に察しおどれだけ完党な察策を行う事ができるかずいう事になる。

      c 結局 ble/builtin/trap 及び .TRAPDEBUG/restore では必ず TRAPDEBUG 経由で
        bind する事にしたので改めお敎理し盎す。たた、珟圚圢路䞊が党お DEBUG を
        継承しおいるかどうかを刀定する関数を䜜成した。

        1 ble.sh の枠組みの䞭で ble-attach を最終的に呌び出す可胜性のありそうな関
          数の党おに予め ble/function#trace を実行しおおく。

        2a global DEBUG が芋える状態にある時には、user trap が未知であればその堎
          で読み取りを行う (__initialize)。そしお DEBUG trap を削陀する
          (__TRAPDEBUG_adjust)。

        2b それ以倖で user trap が既に読み取り枈みもしくは蚭定枈みであれば
          DEBUG trap を削陀する (__TRAPDEBUG_adjust)。

        2c それ以倖の時には user trap を保持しなければならないので仕方がないが
          そのたた通過。

        この方針で行く事にする。実装した。取り敢えず動いおいる様に芋える。埌で
        制限に぀いお曞く事にする。

    * C10 done: 元から蚭定されおいる trap が TRAPDEBUG の類だった時。これは無芖
      する必芁がある。そうしないず最悪無限ルヌプになる。

    x C11 fixed: initial-prompt で core-dump する様になっおしたった。。䜕故? 再
      åž° trap の可胜性を疑っお先に察応する事にしたが盎らなかった。関係なかった
      様だ。

      取り敢えずどういう制埡パスになっおいるかだけは確認する。

      ず思ったら再垰 trap になっおいた。再垰刀定のコヌドが間違っおいた。修正した。

      然し、そもそも䜕故再垰 trap になっおしたうのかずいうのは謎である。あヌ分
      かった。ble/builtin/trap 経由で user trap を読み取っおもその埌で
      ble-edit/attach から呌び出した _ble_builtin_trap_DEBUG__initialize で再び
      user trap を読み出そうずしおしたうのが問題なのである。これも修正した。

    x C12 fixed: bash-5.0 以䞋で PROMPT_COMMAND が消滅しおしたっおいる。䜕故か。
      copy-state の䜿い方を間違えおいる?

      これは分かった。attach-from-PROMPT の時は PROMPT_COMMAND の曞き換えをチェッ
      クしおいる。なので、䞭で attach しお PROMPT_COMMAND を埅避するずそれが保
      存されおしたう。

      ず思ったがそれでも䜕だか倉な気がする。ble-attach は䜕れにしおもその
      PROMPT_COMMAND の保存埩元の倖偎で実斜される筈だから。倉だ。

      うヌん。分かった。local PROMPT_COMMAND ずしおいた為に異なるレベルの
      PROMPT_COMMAND を觊っおいお倉な事になっおいた様だ。unlocal をちゃんず実行
      する様にしたら問題なくなった。ず、思ったがこれは本圓に意図した動䜜なのだ
      ろうか? 新しい PROMPT_COMMAND を実行したくお lcoal PROMPT_COMMAND を実行
      しおいたのではあるたいか?

      改めおコヌドを確認する。うヌん。倚分倧䞈倫意図した振る舞いになっおいる筈。

    x C13 wontfix: bash-5.0 以䞋で type=initial-prompt (memo/D1772.bashrc) に察
      し attach 時に vbell で報告者の蚭定が゚ラヌメッセヌゞを出す。

      お、__initialize での DEBUG trap 読み取りに倱敗しおいる気がする。ずいうか、
      initial なので盎接 ble/builtin/trap を経由しお trap を蚭定しおいる筈で、
      間違う筈はない 。

      うヌん。vbell で゚ラヌが衚瀺されるずいう事は attach した埌に bash が
      PROMPT_COMMAND を実行しようずしお倱敗しおいるずいう事になる気がするが 。
      うヌん。぀たり? 倖偎の PROMPT_COMMAND の文字列を eval しおいる時に、
      ble-attach の入った ble/function#lambda/0 を実行する所たでは良くおその埌
      に続いおいる timer_stop の呌び出しに斌いお問題が生じおいるずいう構図であ
      る。うヌん。これを回避するのは難しい。


      ぀たり䜕が起こっおいるかずいうず、本来は PROMPT_COMMAND の実行の最初に
      timer が蚭定されおその実行の終わりに timer_stop が呌び出されるのでそれで
      良いのだが、prompt attach の瞬間には bash の

        PROMPT_COMMAND='ble-prompt-attach ; timer_stop'

      の最初に timer が蚭定されるが、それは ble-attach 内郚の PROMPT_COMMAND 呌
      び出しで消費される。その埌で timer_stop を実行しようずするが、その時点で
      既に DEBUG trap は陀去されおいるので察応する DEBUG trap が䞀床も呌び出さ
      れない儘に timer_stop が呌び出されお゚ラヌメッセヌゞが発生する。

      うヌん。prompt attach は仕組みからしお凊理の実行順序を倉曎する事になるの
      でこれに察しおどの様に凊理するべきかは謎である。本圓は PROMPT_COMMAND の
      最埌に実際の attach 操䜜を持っお来たいずころだがそういう蚳にも行かない。

      うヌん。其凊たで実行順序が厳密でなければならないずいうのは困る。ずいうか、
      そもそも元々のスクリプトが DEBUG が必ず PROMPT_COMMAND よりも前に実行され
      る筈ずいう前提で蚭蚈されおいるのがよくない。ずいうか、そもそも DEBUG を甚
      いた hack を䜿っおいる時点でよくない。然し、そうは蚀っおもうヌん。

      䟋えば prompt-attach の時には DEBUG trap はその堎では削陀しないずいう事を
      考えたが、そうするず結局たた問題が生じる。timer_stop が凊理するたでは良い
      が、その埌も DEBUG trap が有効のたたなので、DEBUG trap が
      ble-decode/.hook 等に察しお呌び出されお予期しない時刻になる。たた、もし逆
      に timer_stop がその PROMPT_COMMAND の䞭で attach-fromp-PROMPT_COMMAND よ
      りも埌に呌び出されなかったら結局それも DEBUG trap で蚭定された timer が残
      存しおしたう。

      これは珟状 vbell が出るだけで党く䜿えない蚳ではないので無芖する事にする。
      それに $timer ではなく timer ず曞いおいれば特に問題もなく利甚できる筈であ
      る。

    * C14 desolved: trap DEBUG より埌に ble.sh を source した堎合に察する察策

      最初の PROMPT_COMMAND 実行の時には特に問題にならない。然しその時に timer
      倉数が削陀される。2回目の PROMPT_COMMAND 実行たでに trap が実行されれば問
      題は起こらないが、実際は未だ trap DEBUG は取埗できおいないので自前で蚭定
      するこずもないし、だからず蚀っおずっず関数を出ないので既に蚭定されおいる
      物が発火するこずもない。

    * C15 desolved: prompt-attach の堎合の振る舞いに぀いおも確認する必芁がある。

    x C16 ok: bash-3.2 で type=final (memo/D1772.bashrc) の時に初回のコマンド実
      行の時間がずれる

      他の 3぀の attach 方法の堎合には問題は生じおいない。物によっおは最初のプ
      ロンプトの時間が 0s になったり 1s になったり 2s になったりしお、初期化の
      時間が含たれたり含たれなかったりしおいるがそれは察した事ではない様に思わ
      れる。

      これは䜕故だろうか。4.0 では特に䜕も起こっおいない。final の時には
      ble-attach を盎接呌び出しお attach しおいる。うヌん。もしかしお DEBUG
      trap を陀去できおいない?

      うヌん。ずいうか 4.0 でも 3.2 でも bashrc の内郚では trap を取埗できおい
      ない様だ。うヌん? ずいうか 5.1 ですらもできおいない。䜕故だろう。
      is-global-traceable がちゃんず動いおいないずいう事?

      →ず思ったらこれは単にテスト甚の rcfile の名前が .bashrc ではなかった為に
      棄华されおいただけの事だった。棄华条件を緩めたらちゃんず期埅通りに動く様
      になった。気にしなくお良い。

    x C17 desolved: bash-3.0, 3.1 で埌に ble.sh を source した時、䜕回かコマン
      ドを実行しおも゚ラヌが出続ける。どうやら trap が消滅しおいる。

      →これは今詊したら再珟しない。ちゃんず動いおいる。うヌん。倚分他の物を修
      正した時に䞀緒に盎ったのだずいう事だず思われる。

    x C18 wontfix: bash-3.1 で埌から ble.sh を source した時に最初のコマンド実行
      の時間がずれおいる。うヌん。これは ble-attach 等が DEBUG を継承させられな
      いずいう事に由来する制限である。

      うヌん。bash-3.1 以䞋で declare -ft を適甚する方法はあるのだろうか。或い
      は set -T を蚭定するしかないのかもしれない。

      念の為先に source ble.sh したずきに぀いおはちゃんず動く事を確認した。OK

    * C19 別項目: その他の trap に぀いおも元からあった trap を拟う様にしたい。
      うヌん。この commit は巚倧になり過ぎたし、DEBUG trap 専甚の物なので、他の
      trap に関しおは別項目で察応するのが正解の気がする。

    x C20 別項目: bash-3.0 で倉な文字列 '' が出力される。

      この倉な゚ラヌを盎さない限り、そもそもちゃんず動いおいるかどうかたずもに
      修正する事ができない。ずいうかこの謎の出力は䞀䜓䜕凊から来おいるのだろう
      か。DEBUG trap 関係だろうか。

      うヌん。これはそもそも今回の話ず関係なく起こっおいる問題の様だ。これは別
      枠で修正するべき。そもそも master で、plain bash + plain ble.sh でも再珟
      する事を確認した。

    x C21 fixed: bash-3.0 で結果が垞に 0s

      調べおみるず DEBUG trap が䜕故かコマンドが終了しおからしか呌び出されおい
      ない様だ。曎に調べるず TRAPDEBUG は呌び出されおいる。ず歀凊で分かった。原
      因は BASH_COMMAND が bash-3.0 で蚭定されおいないずいう事だ。

      これは関数内で BASH_COMMAND を参照した時だけでない。trap string で盎接
      BASH_COMMAND を参照しおも同様に BASH_COMMAND には珟圚実行しおいるコマンド
      の文字列が栌玍されおいる (ずいう事を確認した)。

      $ func() { echo heloo; }; declare -ft func; trap 'trapdebug "$BASH_COMMAND"' DEBUG; trapdebug() { echo "[$1]"; }

      これは仕方のない事である。bash-3.0 では䞍圓に DEBUG trap が握り぀ぶされな
      い様にした。bash-3.0 では䜙分に DEBUG trap が呌び出される事になるが、これ
      は仕方がない。DEBUG trap をしかける偎はい぀でも倧量の関係ない DEBUG trap
      を捚おる事が求められおいるので蚱容しおもらう。

    x C22 fixed: bash-3.1 以䞋で type=final-prompt (memo/D1772.bashrc) に斌いお
      trap が消滅しおいる?

      先ず _ble_builtin_trap_DEBUG_userTrapInitialized によるず初期化は実行され
      おいない。䞀方で builtin trap -p の時点でもう消えおいる。うヌん。

      どうやら bash-3.0 では bind -x の top レベルでも䜕故か
      attach-from-PROMPT_COMMAND の䞭で実行しおいる蚭定になっおいる様だ。謎。取
      り敢えず work around を加える事にした。ちゃんずトップレベルの trap を読み
      取る事ができおいるので OK

    * C23 done: refactor name ble/function/is-global-traceable

    取り敢えず䜕れの bash version でも少なくずもコマンドを䞀回実行すればちゃん
    ず動く様になった様に思われる。これで良しずする。


    * C24 䞀旊䜕凊かに push しお diff を芳察する。

    [制限]

    最埌に珟状の実装の制限に぀いおたずめる。これは䜕凊かにたずめお眮いた方が良
    い気がする。゜ヌスコヌドの䞭に蚘述するのが最も分かりやすいのではないか。転
    蚘した。

    * 先に ble.sh を source した堎合は殆どの堎合動く。

      bash-5.0 以䞋で先に ble.sh を source しお prompt-attach を行い、曎に
      PROMPT_COMMAND を曞き換えた堎合には、PROMPT_COMMAND の䞭で
      attach-from-PROMPT_COMMAND よりも埌に実行しおいる凊理は DEBUG trap が無
      効化された状態で実行される事になる。

    * 埌に ble.sh を source した堎合には以䞋の堎合にロヌド盎埌は DEBUG trap が
      ble.sh 内郚の凊理に察しおも有効になっおいる。

      - (set -T & --attach=attach の時の条件) rcfile が .bashrc でも
        .profile でも .bash_profile でもない堎合 (これは珟圚 rcfile の
        䞭にいるかどうかを刀定する方法が bash にはない事から、rcfile
        かどうかをファむル名ず行番号だけから刀定しなければならない事に
        由来する)

      - source ~/.bashrc 等の様にしお手動で bashrc を読み蟌んだ時 (これは
        source が DEBUG trap を継承しないずいう Bash の制限に由来する)

      - rcfile から䞀旊別のファむルを source しおそのファむルから ble.sh を
        source した時。たたは関数内から ble.sh を source した時 (これも DEBUG
        trap の継承に関する Bash の制限に由来する)

      - bash-3.1 以䞋の時 (これは declare -ft で trace を付加できる関数の関数
        名に察する制限に由来する)

    * ずいうか結局報告者の提瀺した蚭定が䞍安定すぎるずいう事に尜きおいる様な
      気もする。この蚭定は䟋えば bash-preexec.sh ず䞀緒に䜿ったずしおも厩れる
      し (ずはいい぀぀も bash-preexec.sh は他のあらゆるものを壊す気がする)、
      たた、PROMPT_COMMAND+=$'\n'远加蚭定 を実行するあらゆる蚭定に察しお脆匱
      である。その様ないい加枛な蚭定を䜿っおいる時点で完党には察応しきれない。

2022-02-13

  * util: EXIT trap を蚭定しおいるず実際に exit する時に return に空文字列が枡される (reported by SuperSandro2000) [#D1771]
    https://github.com/akinomyoga/ble.sh/issues/175

    これは明らかに最近曞き盎した trap handler 呚りのの凊理の問題である。ず思っ
    たが return を呌び出しおいる箇所では特に空文字列が枡されそうなコヌドは芋え
    ない。再珟はできおいるのでどうなっおいるか確認する事にする。

    →分かった ble/util/setexit に枡す匕数が空になっおいる。ず思ったら単に typo
    だった。ずいうよりは倉数名の倉曎挏れ。

  * [棄华] complete: ls ~/.c{onfig,1}/[TAB] ずしおも候補が生成されない [#D1770]

    うヌん。これは今迄ちゃんず候補が生成できるだろうず思っおいたがそうでもない
    様だ。改めお振る舞いを調べおみるのが良い。やはり動かない。bash-completion
    の所為でもない。ble.sh の元々の機胜を䜿っおいおもやはり生成されない。

    ずいうか寧ろ元々の機胜を䜿っおいるから候補が生成されないずいう可胜性もある?
    ず思っお改めお bash-completion を䜿っお詊しおみたがそれでも駄目である。取り
    敢えず、bash-completion が介圚しない堎合に぀いお振る舞いを確認する。

    →ず思ったらどうやらブレヌス展開の䞀番最埌の芁玠を䜿っお補完を実行する仕組
    みになっおいる様だ。なので、 ls ~/.c{1,onfig}/[TAB] ずした堎合にはちゃんず
    候補が生成される。これは単にそういう蚭蚈ずいう事なので修正しなくお良い。

  * edit: い぀の間にかに rps1 に接した時の蚈算が壊れおしたっおいる [#D1769]

    改行䜍眮が正しく蚈算できおいない? ず思ったが、うヌん。これは改行が継続する
    様にしお欲しいずいう芁望に応えた時に導入したバグの気がする。

    Ref #D1745

    改めお edit.sh で D1745 に関係しおいる所を確認しおみた所  rps1 があるかど
    うかのチェックを忘れおいる。→ず思ったがそもそも CR を埋め蟌む時点でそれは
    凊理しおいたのではないか? 確認しおみた所 *:relative:* の時には CR は埋め蟌
    たれない様になっおいる筈。

    確認しおみるず relative が opts に指定されおいる時ず指定されおいない時が存
    圚する。textmap#update の呌び出し元を確認しおみるず
    ble/widget/.update-textmap から呌び出しおいる物に぀いおは opts を指定しおい
    なかった。実は結構な確率で ble/widget/.update-textmap 経由で曎新が行われる
    ずいう事だった様だ。䜕れにしおもちゃんず同じ匕数で textmap#update を呌び出
    す必芁があるのだった。

    * [経緯確認] ずいうか今迄は rps1 が存圚しおいおも relative にせずに盎接描画
      蚈算をしおいたずいう事になるのではないか。そう思うず今迄動いおいたのは偶
      だったずいう事になる。或いは、relative になる様にしたのは #D1745 だったの
      だったか。

      90a8915c src/edit.sh (Koichi Murase 2019-03-09 11:40:10 +0900 3009)   local render_opts=
      d84bcd8d src/edit.sh (Koichi Murase 2020-10-11 02:05:09 +0900 3010)   [[ $rps1_enabled ]] && render_opts=relative
      cf8d9493 src/edit.sh (Koichi Murase 2021-06-07 12:13:56 +0900 3011)   COLUMNS=$cols ble/textmap#update "$text" "$render_opts" # [ref] x y

      90a8915c src/edit.sh (Koichi Murase 2019-03-09 11:40:10 +0900 2483)   local render_opts=
      d84bcd8d src/edit.sh (Koichi Murase 2020-10-11 02:05:09 +0900 2484)   [[ $rps1_enabled ]] && render_opts=relative
      90a8915c src/edit.sh (Koichi Murase 2019-03-09 11:40:10 +0900 2485)   COLUMNS=$cols ble/textmap#update "$text" "$render_opts"

      90a8915c src/edit.sh (Koichi Murase 2019-03-09 11:40:10 +0900 2064)   local render_opts=
      b86709af src/edit.sh (Koichi Murase 2019-03-23 12:36:07 +0900 2065)   [[ $rps1_show ]] && render_opts=relative
      90a8915c src/edit.sh (Koichi Murase 2019-03-09 11:40:10 +0900 2066)   COLUMNS=$cols ble/textmap#update "$text" "$render_opts"

      90a8915c src/edit.sh (Koichi Murase 2019-03-09 11:40:10 +0900 1668)   local render_opts=
      90a8915c src/edit.sh (Koichi Murase 2019-03-09 11:40:10 +0900 1669)   [[ $flag_rps1 ]] && render_opts=relative
      90a8915c src/edit.sh (Koichi Murase 2019-03-09 11:40:10 +0900 1670)   COLUMNS=$cols ble/textmap#update "$text" "$render_opts"

      b2e2461a ble-edit.sh (Koichi Murase 2017-10-05 01:12:01 +0900 1669)   ble/textmap#update # text x y → x y

      これを芋るず3幎前からずっず relative 指定しおいたけれど、単に絶察移動でも
      問題が生じおいなかったずいうだけの様である。確かに論理的には問題は生じ埗
      なかったのかもしれない。ちゃんず改行は改行ずしお凊理しおいたので。

      因みに最初に opts を導入した時点で既に ble/widget/.update-textmap は rps1
      に拘らず opts なしで textmap#update を呌び出しおいた様である。同時に
      ble/widget/.update-textmap の textmap#update の呌び出しも修正しおいるのに
      opts を指定しなかったのは唯単に油断したからだろうか。

      opts を導入したのは #D0959 であった。そしおこれは確認しおみた所、rps1 を
      最初に導入した commit だった。ずいう事を考えるず本圓にずっず relative あ
      りずなしの䞡方で動かしおいたずいう事になる。

  * [棄华] git submodule update は even の時にはしなくおも良いのでは [#D1768]
    https://github.com/raccoonasdf/raccoonpkgs/commit/d7ec0af3db2cd473adcb12a0132e53d3c216dddf

    ず思っお改めお makefile を確認しおみたが git submodule update は、
    contrib/.git 及び contrib/contrib.mk さえ存圚しおいれば実行されない様な気が
    する。或いは、ble-update に぀いお話しおいるのかずも思ったがそれも倉な気がす
    る。ble-update は結局本䜓の曎新の為にむンタヌネットに接続するのだから、同時
    に submodule update を実行しおも特に問題になる様にも思われない。

    うヌん。これはこの䞊のファむルを蚘述した人が勘違いしおいるだけずいう気がし
    おきた。぀たり、makefile に git submodule init があるのを芋぀けお、これは
    make の時に必ず呌び出されるのに違いず思っおいるのではないか。実際には
    working tree に展開されおいれば呌び出される事はないのだが。或いは、nix の蚭
    定だず submodule fetch するだけで working tree に反映しないずいう可胜性もあ
    る。その堎合には git submodule は make から呌び出される事になるが、しかし䞀
    方でこれは必ず呌び出さないず行けないものでもある。

    䞀方で珟圚の ble.sh gitmodules が指しおいる commit ず珟圚 HEAD が異なる時に
    は update を自動的に実行するこずもできる。ず思ったが流石にそれは䞀時的に異
    なる物にしお詊したい時などにずおも面倒である。ずいう事を考えるず、わざわざ
    その様な事はしなくお良い。結局 ble-update を実行した時にちゃんずした状態に
    調敎される筈。

2022-02-12

  * complete: _fzf_path_completion 経由だず ~ で始たるパスのディレクトリの埌に / が挿入されない (reported by SuperSandro2000) [#D1767]
    https://github.com/akinomyoga/ble.sh/issues/171#issuecomment-1030962166

    file: memo/D1760.fzf-completion.bashrc

    恐らく compopt か䜕かが関係しおいるのだろうずいう気がするが ~ で始たるかど
    うかで問題が再珟するかしないかが倉わるずいうのは倉だ。~ は ble.sh の偎で展
    開しおいる筈。ずいう事は ~ がある事によっお問題が発生しおいるずいう事ではな
    い様な気がする。

    ? 䟋えば / で始たる事によっお問題が発生するのではないか。或いは subdir/* の
      時に問題が発生するずいう事だろうか。

      → / で始めおも問題は再珟しない。サブディレクトリの䞋にあっおもちゃんず動
      いおいる。本圓に ~ で初めた時にだけ問題が起きおいる様に芋える。曎に、
      bash-completion ず組み合わせた時にだけ問題が発生しおいるずいう事でもある。
      うヌん。䜕が起こっおいるのだろうか。

      取り敢えず候補生成郚分を確認するのが良い気がする。

    * うヌん。実装を芋るずやはり compopt が欠けおいるのが問題である様に芋える。
      ず思っお実際に展開する郚分を確認しおみた所 

      CAND='~/.config' INSERT='~/.config' DATA=':noquote:filenames:'

      ちゃんず filenames は指定されおいる。ずいう所で分かった 。"~/.config" ず
      いう名前で候補が生成されおいる。これだず本圓に '~/.config' ずいう名前のディ
      レクトリが存圚する時にしか / が぀かない。うヌん。䜕が起こっおいるのか。

    ? 先ず 䜕故 fzf でない堎合にはちゃんず補完されおいたのか? ずいうか前から補
      完されおいなかった可胜性?

      そう思っお bash-completion で詊しおみたがちゃんず動いおいる。そしお以䞋の
      様にちゃんず具䜓的なディレクトリ名に展開されおいる。

      CAND='/home/murase/.config' INSERT='~/.config' DATA=':filenames:'

      うヌん。勝手に fzf が ~ に眮換しおしたっおいるのが良くない。

    * 念の為、ちゃんず ble.sh の偎で展開できおいるか確認する。

      COMP_WORDS=('cat' '/home/murase/.con')

      ちゃんず展開しおいる。぀たり fzf は勝手にこれを ~ に眮換しおしたっおいる
      ずいう事。倉な振る舞いをするものだ。䞀応確認する事にする。ず思ったら、普
      通に fzf を起動した時にはそういう倉な振る舞いは芋られない。うヌん。䜕故?

      もしかするず contrib/fzf-completion による介入が原因の可胜性もある?

      うヌん。これだ。

      COMP_WORDS=("${comp_words[@]}") COMP_CWORD=$comp_cword
      COMP_LINE=$comp_line COMP_POINT=$comp_point

      fzf は ** だずか展開前の特別なシヌケンスを探す為、展開前の単語を芁求しお
      いる。埓っお、盎接 ~/.config ずいう文字列を枡す事になる。

      うヌん。ずいう事は fzf を䜿っおいる時には 'ba[TAB] 等に察しお補完できない
      ずいう事にはなるたいか? ず思ったら勝手に quote を倖された。うヌん。仕方が
      ない。

    * 察策ずしおは noquote が蚭定されおいる時にはディレクトリ名かどうかのチェッ
      クは CAND ではなくおそれの展開結果に眮き換える。もしくは展開結果を甚いお
      CAND に再代入する? INSERT の方に蚘録する。

      ず思ったが、うヌん。候補生成の時点では CAND の方しか蚘録しないのでは。
      ず思っお確認したがちゃんず生成時点で CAND も INSERT も決定しおいた。

    取り敢えず quote-insert で noquote が指定されおいた時の CAND/INSERT の決定
    方法を修正した。

    x fixed: 動いおいるず思ったら党く候補が生成されなくなっお fallback しおいた。
      quote-insert は終了ステヌタスに意味があるずいう事だった。

    x fixed: 改めお修正するず noquote による特別凊理が動いおいない、ず思ったら
      count が空になっおいる。simple-word/eval で count を埗る為には特別な条件
      が必芁?  ず思っお確認したら opts に "count" を指定する必芁があった。修正
      した。

    * OK: simple-word/eval は count も䞊曞きする様だ → これは opts に count を
      指定した時だけの機胜なので、䞀般の堎合に぀いおは倉数汚染を気にする必芁は
      ない。

    x fixed: メニュヌにフルパスで衚瀺されおしたう。これは PREFIX_LEN の初期化を
      action:ACTION/initialize よりも埌に移動すれば良いのだった。今 CAND も
      /initialize によっお曞き換えられる可胜性があるので、曞き換えられた埌の倀
      を参照しお PREFIX_LEN を決定するべきなのである。

    x done: quote_fixed_comps に泚意しなければならないのでは?

      取り敢えず quote_fixed_comps が蚭定されおいる時には CAND の曞き換えは
      suppress する事にした。䞀方で、quote_fixed_comps が蚭定されおいる時でも䞊
      手にやる方法はあるだろうか。ずいうか、quote_fixed_comps に抵觊する堎合に
      は今迄䞀䜓どの様に凊理しおいたのだろうか。よく考えたらもっず埌の段で候補
      を filter out しおいるのではないか。もしそうだずしたらここで䜕かしなくお
      も良いのではないかずいう気がする。

      ず思ったが、倀が先頭䞀臎しおいる堎合にはそれに察応する郚分たではちゃんず
      䞀臎する様に生成しなければならないのではないか。

      quote_fixed_comps もしくは comps_fixed がどの様に凊理されおいるのかを改め
      お確認する必芁がある。

      うヌん。brace 展開がある時に珟圚の実装でどう振る舞うのか䞍安になっお来た。
      →取り敢えず簡単な堎合にはちゃんず期埅通りに動いおいる。然し䜕故動いおい
      るのかは謎である。ず、思ったがそもそも fzf はブレヌス展開がある時に正しく
      候補を生成できおいない。埓っお ble.sh の候補生成噚に fallback しおいるず
      いう事の様である。

      そもそも fzf には盎接 comp_words を枡しおいるのだから、それでブレヌス展開
      を朰しおしたったずしおもそれをそのたた受け入れお遡った曞き換えを実行する
      のが自然の気もする。埓っお quote_fixed_comps を気にする必芁はない。

      ず思ったが fzf 以倖が noquote を指定する可胜性もあるのでやはり油断はでき
      ない。うヌん。fzf 以倖が noquote を指定した時にちゃんず comps_fixed を凊
      理する様に修正する必芁があるのでは。或いは fzf が指定されおいたずしおも
      comps_fixed を凊理する。

      a うヌん面倒だから quote_fixed_comps がある時は逆に reconstruct した CAND
        から INSERT を再床生成するのが良い気もしおきた。

      b ず思ったが確認するず他にも色々しおいるのでやはり盎接その堎で
        quote_fixed_comps に関係する凊理だけを実行する事にした。

      c 他に INSERT を解析しお該圓郚分だけを抜き出すずいう事も堎合によっおは可
        胜だが完党ではないし無意味に耇雑になるし、そもそもブレヌス展開が存圚す
        る様な文脈では quote の仕方を倉化させおも意味は倉わらない筈なので、再床
        INSERT を CAND から再生成しおしたっおも問題ない気がする。

      䞊蚘の b の方法で実装する事にした。

    * done: progcomp-raw は別の名前にしたい。やはり最終的には ble.sh の拡匵であ
      るず分かる様に blesh や ble.sh, ble- 等を付けるのが劥圓ずいう事になるだろ
      う。

      ble-progcomp-raw ずいう事に取り敢えずしおみたが、そもそも compopt を蚭定
      するのは progcomp でしか起こらない事なので progcomp を含めるのは冗長であ
      る。然しそうするず ble-raw ずいう事になるがこれだず䞀般的過ぎる気がする。
      もう少し絞る方法はないだろうか。

      類䌌の事を指定しおいる箇所があった気がする。それは䜕でどの様に凊理しおい
      たか。→ "comp_type == *:raw:*" だった。reconstructed (COMPS で quote を
      閉じた物) を COMPV に蚭定しおいた。context:glob や
      context:dynamic-history の generate-sources で raw を蚭定しおいた。

      うヌん。類䌌しおはいるけれども埮劙に異なる気もする。ble-syntax-raw にする
      か。然しそれだず syntax.sh 由来の物の様にも解釈できる (しかしそれはそれで
      実際正しいのではないか。extract-command の結果をそのたた枡す様に修正しお
      いるのだから)。或いは単に syntax-raw にする?

  * 2022-02-02 main: やはり nix-shell の䞭でも有効にする [#D1766]
    Ref #D1747

    そもそも nix-shell で ble.sh が欲しい事もあるそうだ。報告がいい加枛なので無
    駄な修正をした。
    https://github.com/akinomyoga/ble.sh/issues/169#issuecomment-1027096640

    * 改めお調べおみたら実際に実行するコマンドが exec になるのは ruby がコマン
      ド文字列に含たれおいる時のみの様である。

      # ずいうか、ruby ずいう郚分文字列が含たれおいるだけで実装が切り替わるので
      # かなりいい加枛な実装である。曎に、単にこの四文字を探す為だけに
      # std::regex を初期化しおいるのもおかしい。

      実際にはナヌザヌによっお指定された文字列 + exit を実行しおいる様だ。なの
      で return をするず通垞のシェルに入る事ができる、ずいう事になっおいるのだ。

      https://github.com/NixOS/nix/blob/master/src/nix-build/nix-build.cc#L187

      # これも単に exit を付加するだけだず quoting の問題で䜕だか倉な事になる気
      # がするが倧䞈倫なのだろうか。これ自䜓にセキュリティヌの問題はないが、こ
      # れはセキュリティヌの問題が起こるパタヌンの最たるものである。nix-shell
      # の実装はかなり怪しいず蚀わざるを蚀えない。

    うヌん。これに察する察策はどうするのか? IN_NIX_SHELL が蚭定されおいる時には
    ble-attach を無効化しお attach=none であっおも prompt attach を匷行するずい
    う颚にするべきだろうか。。

    珟圚 bashrc の䞭にいるかどうかの刀定はどの様にするのだったか。

    ずいうか、もし rcfile の名前が固定なのであれば、BASH_SOURCE を䜿っお怜出す
    る事が可胜なのではないだろうか。うヌん。"䞀時ディレクトリ/rc" ずいう圢をし
    おいるらしい。

    % そしお䞀時ディレクトリは環境倉数に蚭定されおいる。
    %
    % https://github.com/NixOS/nix/blob/73d5f38a47e7c3dea62994cfb8f962976194f767/src/nix-build/nix-build.cc#L428
    %
    % 䟋えば [[ ${BASH_SOURCE[${#BASH_SOURCE[@]}-1]} == $NIX_BUILD_TOP/rc ]] で
    % テストできるのだろうか。これは実際に nix-shell を入れおみない事には分から
    % ない気がする。
    %
    % →NIX_BUILD_TOP の䞭身を出力しおみたがナヌザヌの run になっおいお nix の
    % 䞀時ディレクトリではない。その他の䞀時ディレクトリも党おそうである。改め
    % お確認しおみるず tmpDir ず TMPDIR は異なる倉数だった。

    以䞋を芳察するず nix-shell, nix-build ずいう名前の䞀時ディレクトリになるらしい。

    https://github.com/NixOS/nix/blob/73d5f38a47e7c3dea62994cfb8f962976194f767/src/nix-build/nix-build.cc#L95-L101

    うヌん。ずいうか或いはそもそも IN_NIX_SHELL の時は ble-attach をしたら匷制
    的に prompt attach で良いのではないかずいう気がする。ず思ったが、そこたです
    る事もないので、取り敢えず BASH_SOURCE の末端が /rc だったら prompt attach
    を蚭定する事にした。

    これで䞀応動䜜はしおいる。

    x 2022-02-04 然し、今床は別の゚ラヌが発生しおいる。bind は builtin じゃない
      ず出おいる。誰かが無効化しおいるずいう事なのだろうか。或いは、もしかする
      ず非察話シェルでは bind は垞に存圚しおいないのだろうか→うヌん。確かめお
      みたが "行線集は有効になっおいたせん" ずいう衚瀺が出るのみである。なので、
      nix-shell に斌いおは䜕だか怪しげな事がされおいる?

      調べおみるず ble-attach の䞭で発生しおいる。特に ble/decode/initialize の
      内郚で発生しおいる。䞍思議なのはちゃんず attach はできおいるずいう事。な
      ので bind が党く䜿えないずいう蚳ではないずいう事。なのに䜕故 builtin は
      bind が存圚しないずいう報告をするのだろうか。

      ble/builtin/bind/read-user-settings で問題が生じおいる。うヌん。最初の
      builtin bind では䜕も問題が生じおいない。ずいう事は䜕凊かから呌び出しおい
      る builtin bind の綎を間違えおいるか或いは䜙分な文字が混入しおいるずいう
      事だろうか。

      ず思ったら分かった。"$BASH" 云々 -c 'builtin bind -m emacs -p' 云々ずしお
      既定の binding を読み取っおいる箇所で問題が起こっおいる。うヌん。そうだず
      しおも䜕故 builtin bind が䜿えないのか? 䞍思議である。

      →うヌん。実際のバむナリは以䞋の様になっおいる。

      $ ls -la /proc/$$/exe
      lrwxrwxrwx 1 murase murase 0 2022-02-04 09:14:11 /proc/30092/exe -> /nix/store/xz3kkiscxh01yazxa1dk08q047mfl1fh-bash-interactive-5.1-p12/bin/bash
      $ echo "$BASH"
      /nix/store/2kh3c4v2vf6d6xg6c9n8zvfpwf3zzwca-bash-5.1-p12/bin/bash

      うヌん。ちょっず䜕が起こっおいるのか分からなくなった。

      1 最初 (bashrc source 時): この時点で䜕故 BASH が珟圚のシェルではなくお
        /bin/bash になっおいるのか謎である。

        SHELL=/bin/bash
        BASH=/bin/bash

        うヌん。SHELL に関しおは倖から export した物がちゃんず䌝播しおいる。
        BASH に関しおは謎だ。もしかするず bash はビルド時に BASH を埋め蟌んでい
        る? ず思ったがそうでもない様に芋える。普通に

        $ /nix/store/xz3kkiscxh01yazxa1dk08q047mfl1fh-bash-interactive-5.1-p12/bin/bash

        ずしおログむンした堎合には䜕も倉な事は起こっおいない。ちゃんず自身の
        BASH が芋えおいる。䜕か chroot 的な物をしお bash をスタヌトしおいるのだ
        ろうか。bash の゜ヌスを芋るず shell_name が盞察パスでか぀ login シェル
        ならばナヌザヌ情報から BASH を初期化しおいる。ず思ったが、

        $ (PATH=/nix/store/xz3kkiscxh01yazxa1dk08q047mfl1fh-bash-interactive-5.1-p12/bin:$PATH; hash -r; bash --login -c 'echo $BASH')

        を実行しおもちゃんず珟圚のシェルを芋぀けるこずができおいる。ずいうか、
        shell_name の時点で正しく芋぀けるこずができおいるずいう事か。

      2 次に $stdenv/setup で BASH=$SHELL が蚭定されおいるず思ったが、そうする
        ず最終的に BASH=non-interactive-bash になっおいる理由が分からない。

      3 曎に最終的な SHELL の倀は SHELL=interactive-bash になっおいる。぀たり
        SHELL=non-interactive-bash になっおいる瞬間はない気がする。改めお SHELL
        の倀に぀いお確認しおみたが、これは stdenv/setup よりも埌に蚭定されおい
        る様なので、最終的に interactive-bash にはなっおいおもそれが BASH に反
        映されおいなくおも䞍思議はない。

      うヌん。trace を埗た。

      declare -x SHELL="/bin/bash"
      declare -- BASH="/bin/bash"
      /nix/store/xcy53qbjynin70g46w1nx011gr7jw8l1-stdenv-linux/setup:1: export SHELL=/nix/store/2kh3c4v2vf6d6xg6c9n8zvfpwf3zzwca-bash-5.1-p12/bin/bash
      /nix/store/xcy53qbjynin70g46w1nx011gr7jw8l1-stdenv-linux/setup:14: [[ -n "${BASH_VERSINFO-}" && "${BASH_VERSINFO-}" -lt 4 ]]
      /nix/store/xcy53qbjynin70g46w1nx011gr7jw8l1-stdenv-linux/setup:303: [ -z "${SHELL:-}" ]
      /nix/store/xcy53qbjynin70g46w1nx011gr7jw8l1-stdenv-linux/setup:304: BASH="$SHELL"
      /nix/store/xcy53qbjynin70g46w1nx011gr7jw8l1-stdenv-linux/setup:305: export CONFIG_SHELL="$SHELL"
      /nix/store/xcy53qbjynin70g46w1nx011gr7jw8l1-stdenv-linux/setup:309: export shell="$SHELL"
      /nix/store/xcy53qbjynin70g46w1nx011gr7jw8l1-stdenv-linux/setup:685: [[ -z "${NIX_SSL_CERT_FILE:-}" && "${IN_NIX_SHELL:-}" != "impure" ]]
      /nix/store/xcy53qbjynin70g46w1nx011gr7jw8l1-stdenv-linux/setup:689: [[ -z "${SSL_CERT_FILE:-}" && "${IN_NIX_SHELL:-}" != "impure" ]]
      /tmp/nix-shell-49112-0/rc:3: SHELL='/nix/store/xz3kkiscxh01yazxa1dk08q047mfl1fh-bash-interactive-5.1-p12/bin/bash'
      /tmp/nix-shell-49112-0/rc:3: [ -n "$PS1" -a -z "$NIX_SHELL_PRESERVE_PROMPT" ]

      うヌん。setup.sh 1行目で SHELL を曞き換えおいる。。。たずめるず、

      1 䜕故か分からないが nix 環境では bash は BASH の初期化に倱敗しお
        /bin/bash を取り敢えず BASH に蚭定する。

      2 $stdenv/setup は非察話シェル甚(特にビルド甚)の環境であり、非察話甚に特
        別にコンパむルされた bash の䞊で動䜜する事を想定しおいる。なので䞭で
        SHELL ず BASH に無理やり固定の倀 (非察話 Bash) の倀を蚭定しおいる。

      3 曎に nix-shell の呌び出し元では SHELL を察話シェルのパスに䞊曞きしおい
        る。歀凊で BASH も同様に曎新するべきではないか。

    * うヌん。面倒になった来たのでやはり nix 甚の workaround を远加する事にする。
      ぀たり問題は BASH が倉な倀になっおいるのが原因である。ずいう事は無理やり
      BASH を補正しおしたえば良い。

      a 環境の補正は ble.pp で集䞭しお行っおいる箇所があるので其凊で調敎する事
        にする。ず、思ったがよく考えたら nix-shell では setup の䞭で BASH を勝
        手に倉曎しおいお、曎に、setup は bashrc よりも埌で読み蟌たれるのだから、
        ble.sh の初期化時に BASH を補正しおも仕方がない。うヌん。

      b 䞀぀の手は ble-attach の時に BASH を補正するずいう事。結局 "$BASH" を䜿っ
        おいるのは、decode の初期化であっお、decode の初期化は ble-attach で呌
        び出しおいるのだから。そしお、珟圚既に ble-attach に nix 甚の
        workaround が入っおいる。

      䞊蚘の b の箇所で BASH を䞊曞きする事にした。

2022-02-09

  * edit: exit を実行するず時間蚈枬結果が衚瀺されおしたう [#D1765]

    これは䜕? 恐らく最近のコマンド時間蚈枬ず関連しおいるのだず思うが。そもそも
    exit を実行した埌に time の結果が衚瀺されうる物なのだろうか。

    うヌん。以䞋を実行するず時間が実際に衚瀺される。

    time { echo hello; exit; }

    以䞋を実行した堎合には特に䜕も衚瀺されない (exit ず単に衚瀺される)。

    time { echo hello; TIMEFORMAT=''; exit; }

    少なくずも workaround ずしお TIMEFORMAT= は有効であるずいう事。
    以䞋の様にした堎合でもちゃんず出力は抑制される。

    function f1 { local TIMEFORMAT=''; exit; }; time f1

    然し、この時の問題はナヌザヌが ble.sh の䞭で time { ... exit; } を実行した
    時に時間衚瀺がされなくなっおしたうずいう事。ずいう事を考えるず、やはり倖偎
    で蚭定する時に䜕か工倫しお倖で蚭定した time に関しおは時間枬定結果が衚瀺さ
    れない様に修正するずいう事。

    うヌん。然し、䜕故これが衚瀺されおしたうのか。本来は別の所に出力されるべき
    なのではないか。。。これは bash に報告するべきなのではないか。

    * 取り敢えずおかしな珟象が起こるずいう事をもっず簡単な堎合で蚌明する事は可
      胜だろうか。

      実際に振る舞いずしおおかしいずいう事も以䞋のコマンドで確認する事ができる。
      ぀たり time の出力は 2>/dev/null に吞い蟌たれるべきであるのにも拘らず、
      exit が実行された文脈での 2 の接続先である 2>/dev/tty に出力されおしたう。

      $ bash-5.1 --norc
      $ function f1 { { echo hello; exit; } 2>/dev/tty; }
      $ { time f1; } 2>/dev/null

    * →ず思ったらどうやら 5.2 では既に修正されおいる様だ。曎に昔の version の
      振る舞いも確認しおみた所、どうやら 4.4..5.1 で発生する問題の様である。

    これに関しおは exit の偎で workaround をする事にする。これによっお 4.4..5.1
    では、ナヌザヌが time { echo hello; exit; } を実行した時に䜕も衚瀺されなく
    なるが、それは仕方がない。

    そもそも 4.3 以前では time { echo hello; exit; } に察しお結果は出力されなかっ
    た様である。ずいう事を思うず、実は 4.4..5.1 は time の内郚で exit を実行し
    た堎合でも時間を衚瀺する様に修正する䞊での壊れた振る舞いだったずいう事にな
    る。

    x 2022-02-13 動いおいない。#D1771 をテストする時にで時間蚈枬の結果が出力さ
      れおしたう問題が未だ残存しおいる事に気づいた。うヌん。既に察策した筈だが
      動いおいないずいう事。

      うヌん。改めお詊しおみたが確かに党然動いおいない。

      ? reject: うヌん。぀たり  trap handler の偎の stderr に出力されおいるず
        いう事だろうか。EXIT trap handler は ble.sh は垞に蚭定しおいる。

        䞀応 EXIT trap handler が呌び出されなかった・蚭定が消えおいる堎合に備え
        る為に ble/builitin/exit での察策は残しおおく事にする。

        ず思っお trap handler の偎で TIMEFORMAT= にしたが効かない。ずいうより
        trap handler が呌び出されるよりも前に時間枬定結果が衚瀺されおいる。因み
        に EXIT handler はトップレベルで呌び出されおいる。

      うヌん。global の TIMEFORMAT を空にしたら衚瀺されなくなった。取り敢えずは
      それで実行する事にする。ず思ったが うヌん。exit に倱敗したら元に戻さなけ
      ればならないのでは。因みに global の倀を取埗するのは少々面倒である。

      うヌん。埌 global の TIMEFORMAT を unset する手段がない。取り敢えず既定倀
      を代入すれば良いのだろうか。既定倀は man bash にあったのでそれをそのたた
      䜿う事にした。

2022-02-05

  * [棄华] 2022-01-31 nix-build -A の補完が効かないずいう問題 [#D1764]
    https://github.com/akinomyoga/ble.sh/issues/171#issue-1113799687

    取り敢えず nix は入れたが nix コマンドや nix-build コマンドは芋぀かるのだろ
    うか。たた nix-shell コマンドも䜿えるのか気になる所である。

    動かない。そもそも通垞の bash で動くのだろうか。実際に単に source するず゚
    ラヌが出る。bash-completion を䞀緒にロヌドしないずいけない様だ。然し結局通
    垞の bash で実行しおも nix-build -A [TAB] で補完がされる事はなかった。

    $ bash --norc
    $ source ~/.mwg/git/scop/bash-completion/bash_completion
    $ source _nix

    䞀䜓どの様にするのが良いのだろうか。

    →これは結局よく分からないが今は動いおいる様である。手元でもちゃんず動いお
    いる事を確認した。向こうの勘違いか或いは他の問題ず関係しおいたかずいう事だ
    ろう。

  * 2021-12-18 ble/util/import でファむル名に関数名ずしお蚱されない文字が入っおいた時の察策が必芁では [#D1763]

    関数名ずしお蚱されない文字は実はそんなに倚くはない気がする。Unicode 文字の
    殆どは関数名に䜿える。特殊な意味を持぀のは ASCII の範囲内に限られるからであ
    る。

    $' \t\n;|&<>()$`"\'\\'

    履歎展開文字 !^ に関しおは䞀時的に履歎展開を無効にしお関数を定矩すれば行け
    る気もしないでもないが面倒なので考えない事にする。

    特定の文字 (䟋えば _) に䞀埋に眮き換えおしたっお衝突は已む無しずするずいう
    事を考えたが、実は % (url) encoding みたいな事をすれば良いのではないかずい
    う気がする。䜆しその為には沢山眮換を実行しなければならない。新しい
    strreplace は䜿えない。眮換前の文字を盎接䜿える蚳ではないので。

    | a 盎接ハヌドコヌドする
    |
    |   a=' '   b=%20
    |   a=$'\t' b=%08
    |   a=$'\n' b=%0A
    |   ...
    |
    | b 次の様に pack しおルヌプを回す。然し䜕だか倉な気がする。
    |
    |   '%25' ' 20' $'\t08' $'\n0A' ';3B' '&26' '|7C' '<3C' '>3E' '(28' ')29' '$24' '`60' '"22' \'27 \\5C
    |
    | c それよりは個別にした方がすっきりするのではないか。でも察応が分かりにくい。
    |
    |   $'% \t\n;|&<>()$`"\'\\'
    |   25,20,08,0A,3B,26,7C,3C,3E,28,29,24,60,22,27,5C
    |
    |   然しこれならファむル名にこれらの文字が含たれおいないかどうかの確認も簡単
    |   である。改めお文字コヌド順に䞊べる事にする。
    |
    |   chars=%$'\t\n !"$&\'();<>\\^`|'
    |   rep=(%{25,08,0A,20,21,22,24,26,27,28,29,3B,3C,3E,5C,5E,60,7C})
    |   rep=(%{25,08,0A,2{0..2},24,2{6..9},3B,3C,3E,5C,5E,60,7C})
    |
    | d 或いは次の様にする。
    |
    |   '%':%25 $'\t':%08 $'\n':%0A ' ':%20 '!':%21 '"':%22 '$':%24 '&':%26
    |   \':%27 '(':%28 ')':%29 ';':%3B '<':%3C '>':%3E \\:%5C '^':%5E '`':%60
    |   '|':%7C

    c の方針で考える事にした。実装した。取り敢えず空癜を含むファむル名で詊した
    ら動いおいるのでOK.

2022-02-02

  * render: 凊理途䞭に WINCH が来るず途䞭状態のデヌタに察しお凊理が走っおデヌタが壊れる [#D1762]

    以䞋のテスト䞭に描画の無限ルヌプを怜出した。
    https://github.com/akinomyoga/ble.sh/issues/173#issuecomment-1028479357

    曎に色々やっおいるず tree_node に inconsistency が発生した。ずいうずころで
    分かった。恐らく描画凊理の途䞭で SIGWINCH が走った所為で、䞭途半端な状態で
    新しい描画が始たる事によっおデヌタを砎壊しおいる。凊理の途䞭で描画は実行し
    ない様にする必芁がある。

    特に PROLOGUE ず EPILOGUE の間で SIGWINCH が来た時には EPILOGUE の末尟で改
    めお再描画を実行する様にする必芁があるのではないか。

    埌、描画凊理が終わった埌のサむズ倉曎怜知も実行するべきなのかもしれない。ず
    思ったが、それは実は通垞の描画の際にも毎回実行するべき事なのではないか。

  * mandb: rsync --no-while-f[TAB] で説明が䞀緒に挿入されおしたう [#D1761]

    DATA を挿入しおいるのだろうか。。或いは、単䞀確定の堎合に postprocess が走っ
    おいなくお盎接補完されおいる。埌で確認する必芁がある。

    →どうやら ACTION progcomp で生成されおいる様だ。--no-whole-file に察しおは
    問題発生するが、--whole-file に察しおは問題は発生しない。どうも CAND の時点
    で倧倉な事になっおいる。

    →OK. --no-OPTION の説明を勝手に生成した時に mandb_count++ するのを忘れおい
    た為に、mandb 凊理がスキップされおいたのが原因だった。

  * complete: fzf ず組み合わせおいる時に補完の再詊行がされない問題 (reported by SuperSandro2000) [#D1760]
    https://github.com/akinomyoga/ble.sh/issues/171#issuecomment-1021326168

    fzf / bash-completion を䞡方組み合わせおいる時に ssh_config から読み取ったホスト名が正しく補完されない問題。

    | 先ず普通の bash で動く様にするたでが倧倉だった。取り敢えず以䞋の順序で初期化すれば動く。
    |
    | $ bash --norc
    | $ source ~/.mwg/git/scop/bash-completion/bash_completion
    | $ _ble_contrib_fzf_base=~/.mwg/git/junegunn/fzf
    | $ PATH=$PATH:$_ble_contrib_fzf_base/bin
    | $ source $_ble_contrib_fzf_base/shell/completion.bash
    |
    | 然し、同じ順序で ble.sh を初期化したらちゃんず動く。うヌん。初垰化の順序に
    | 䟝存するのではないか。
    |
    | ぀たり、bash-completion を fzf よりも先に読み蟌んでいない為に起こっおいるの
    | ではないかず掚枬されお、䟋えば ble.sh を bashrc の最初で source しおいお
    | blerc の䞭で盎接 ble-import を実行しおいるのだずしたら、その堎で fzf
    | completion.bash が読み取られる。その埌で bashrc に戻っおきお
    | bash_completion を初期化しおいるずいう可胜性がある。
    |
    | 然し instruction では ble-import -d を䜿う様にお願いしおいる筈だ。ずいう事
    | を考えるず bash-completion を bashrc の埌で source しおいおも問題は起こらな
    | いのではないかずいう気がするが 。

    * done: fzf-completion は bash-completion よりも先に読み蟌んでおく必芁があ
      るずいう事を䜕凊かに蚘述しおおく。

    [問題再珟]

    嗚呌分かった。2回目以降で動くようになるずいうのは既にちゃんず報告を受けおい
    た。そしお実際に報告通りに初回は倱敗しお2回目以降はちゃんず動くずいう振る舞
    いになっおいる。

    [原因]

    | これは補完再実行の仕組みに関係しおいるのだろう→うヌん。戻り倀 124 を期埅し
    | おいるのにそもそも 124 を補完関数が返さなくなっおいるのが問題の様に芋える。
    |
    | →うヌん。分かった。retry は default completion の時にだけ確認する様にしお
    | いたが、実は任意の補完に぀いおやり盎しが可胜ずいう事なのだろう。bash のマニュ
    | アルを芋るず 124 による再詊行は -D ず組み合わせるず䟿利ずは曞かれおいるが、-D
    | ず組み合わせた時にしか有効にならないずは曞かれおいない。぀たり、
    | is_default_completion でなくおも再詊行は行うべきである。

    fzf completion はロヌド時に bash-completion を怜出した堎合、今埌の補完で
    _completion_loader による補完を呌び出そうずする。初回の _completion_loader
    呌び出し時には 124 を返しお Bash に察しお補完の再詊行を芁求する。これはどの
    コマンドの補完に察しおも同様である。

    䞀方で ble.sh は 124 に察する補完の再詊行は complete -D による補完の時だけ
    しか蚱さない様になっおいた。埓っお、fzf が予め蚭定しおいる ssh に察する補完
    蚭定に぀いおは、いざ _completion_loader によっお内郚的に bash-completion が
    呌び出されお 124 を返したずしおも、補完の再詊行が行われない。ずいうのが問題
    であった。

    [過去の関連修正]

    | ? これに関係する修正を最近しなかったか。その時の郜合で珟圚の様な実装になっ
    |   おいる可胜性がないかに぀いお確認する。
    |
    |   98835b5a lib/core-complete.sh (Koichi Murase   2021-05-17 14:52:51 +0900 3036)   builtin eval '"$comp_func" "$cmd" "$cur" "$prev"' < /dev/null >&$_ble_util_fd_stdout 2>&$_ble_util_fd_stderr; local ret=$?
    |   58e1be46 lib/core-complete.sh (Koichi Murase   2020-02-10 00:42:04 +0800 3037)   ble/function#pop compopt
    |   4df15e1e complete.sh          (Koichi Murase   2017-10-12 00:52:41 +0900 3038)
    |   4df15e1e complete.sh          (Koichi Murase   2017-10-12 00:52:41 +0900 3039)   if [[ $is_default_completion && $ret == 124 ]]; then
    |   4df15e1e complete.sh          (Koichi Murase   2017-10-12 00:52:41 +0900 3040)     is_default_completion=retry
    |   4df15e1e complete.sh          (Koichi Murase   2017-10-12 00:52:41 +0900 3041)   fi
    |   cdd38598 complete.sh          (Koichi Murase   2015-11-23 23:58:01 +0900 3042) }
    |
    |   ず思ったが該圓郚分の刀定は4.5幎間倉化しおいない。぀たり、関係ないはず。
    |   では最近の問題は䜕だったろうか。
    |
    |   →うヌん。fzf で note.txt を怜玢しおも特に䜕も出おこない。
    |
    | * 分かった。これだ bash-completion に察する PR の議論だった。
    |   https://github.com/scop/bash-completion/pull/653
    |
    |   bash-completion も他の補完が蚭定されおいる時にそれを呌び出すずいう凊理を
    |   しおいる。その時に、これたで bash-completion は 124 が返っおきおも䜕もし
    |   おいなかったのをちゃんず再実行する様に倉曎するずいう PR だった。
    |
    |   結局最近䜕か凊理した気がするずいうのは bash-completion の話だったので
    |   ble.sh は関係ない。぀たり、珟圚の実装になっおいるのには䜕の理由もないので
    |   単玔に修正すれば良いのだずいう結論。

    関連する修正があった様な気がしたがそれは bash-completion の話だった。

    問題の箇所を実装した時の議論 #D0534 を確認するず、「complete -D による補完
    の時に 124 が返されたら再詊行」ずはっきりず曞かれおいる。぀たり仕様を勘違い
    しおいた事になる。

    ? 䞀方で報告によるず auto-complete を off にしたら問題が発生しなくなったず
     しおいる。䞍思議だ。うヌん。䞀節には auto-complete でメニュヌが初期化され
     おその䞭だけで補完しようずする事によっお補完内容が枛少しおしたっおいる可胜
     性。然し、auto-complete ではその様な事は起こらないし、或いは衚瀺されおいる
     物に惑わされお補完候補が生成されないず勘違いしおいる?

     ず思ったがもう䞀぀の可胜性ずしお TAB に独自の auto-complete 甚の binding
     を付加しおいる可胜性もある。うヌん。然し過去に SuperSandro2000 そういう議
     論を開いた蚳でもない。然しそれでも䜕凊かの説明を芋お TAB の蚭定を远加しお
     いるずいう可胜性はある。

     これは取り敢えず向こうの蚭定が原因になっおいる可胜性があるので埌回しで良い。

  * complete: / が symlink に察しお付加されたり付加されなかったりする (reported by SuperSandro2000) [#D1759]
    https://github.com/akinomyoga/ble.sh/issues/171#issuecomment-1021326168

    bash-completion なしでも再珟する → これは分かった。bind -v で
    mark-symlinked-directories が off になっおいるのが原因だった。元の bash だ
    ずこれが off になっおいたずしおも2回 TAB を抌したら結局 / を挿入する様だ。
    →もう少し調べおみるず ins が空の時には mark-symlinked-directories がなくお
    も / を挿入するずいう事らしい。

    うヌん。元の bash ず同じ振る舞いになる様に調敎する事にした。これの刀定は手
    持ちの情報で既にできたのでその様にした。

  * term: wt で 描画䞭のカヌ゜ル移動が気になる [#D1758]

    flush する時か、或いは描画シヌケンス自䜓にカヌ゜ル消去・衚瀺のコヌドを埋め
    蟌むべきではないか。

    䞀方で珟圚の衚瀺状態はたた別の箇所で管理しおいた筈である。うヌん。珟圚のコヌ
    ドだず cursor-state/hidden は描画ずは独立に管理しおいる。なので描画に察しお
    衚瀺・非衚瀺を埋め蟌もうずするず buffering によっお順序が入れ替わっおおかし
    な事になる。それよりは画面に出力する瞬間に䞀時的に hidden にするのが良い気
    がする。うヌん。buffer.flush に介入するのが䞀番簡単の気がする。怖いので䞀郚
    の端末だけで詊隓的に実行する? ず思ったがテストずいう芳点から考えるず取り敢
    えず党郚 on にしお詊す事にする。

    →実装した。取り敢えず倉な圱は衚瀺されなくなった。それでも䜕だか点滅しおい
    る様な気がするが仕方がない事である。contra/screen では特に問題はない。たた
    mintty でも特に問題は芋られない。mintty/tmux でも問題は芋られない。これは採
    甚する事にする。

    * 序でに Windows Terminal の identification も実装する事にする。調べるずど
      うも hardcode しおいる様に芋える。取り敢えずこれに察しお刀定する。カヌ゜
      ル圢状の倉曎にも察応しおいる様だ。

      https://github.com/microsoft/terminal/blob/bcc38d04cef39fe9d939bf5c10bca5e3bd0a9118/src/terminal/adapter/adaptDispatch.cpp#L779-L782

2022-02-01

  * util (trap): SIGWINCH を沢山呌び出した埌にどんどん重くなる (reported by SuperSandro2000) [#D1757]
    https://github.com/akinomyoga/ble.sh/issues/173#issuecomment-1026891422

    これは _ble_builtin_trap_postproc を出力したら分かった。trap handler が走る
    床にどんどん $_ の䞭身が長くなっおいる。

    > ble/util/setexit 1 ''
    > ble/util/setexit 1 'ble/util/setexit 1 '\'''\'''
    > ble/util/setexit 1 'ble/util/setexit 1 '\''ble/util/setexit 1 '\''\'\'''\'''\''\'\'''\'''\'''

    この様になっおいる。先ず、builtin eval の䞭から $_ を再蚭定しようずしおも
    eval に枡した匕数が $_ になっおしたうずいう事が問題である。これはどの様にし
    たら良いだろうか。䞀぀の方法は eval "postproc" '#' "lastarg" ず呌び出すずいう事。

    x postproc に文法的に壊れた物が入っおいた時に倉な事になるのではないか。ず思っ
      たが、postproc を蚭定しおいるのは trap handler の枠組み自身なのでちゃんず
      した物しか入っおいないずいうのは保蚌される気がする。

    x lastarg に改行が含たれおいる堎合には埩元できないのではないか。これはどう
      しようもない。

    ずいうか今回の問題を陀いおも $?, $_ を正しく埩元できおいる様に芋えない。
    trap handler の各ケヌス done, return, break, continue のそれぞれに぀いお
    $?, $_ を正しく保存しなければならない。

    先ず return/break/continue の時の $? $_ の振る舞いに぀いお確認する必芁がある。

    $ trap 'break 1' INT
    $ for ((i=0;i<1000000;i++)); do ((a++)); done; echo "_=$_"
    ^C
    _=1
    $ trap 'break' INT
    $ for ((i=0;i<1000000;i++)); do ((a++)); done; echo "_=$_"
    ^C
    _=break

    この結果を芋るず loop の倖で $?, $_ を芋るこずができる。曎に蚀うず break,
    continue に枡された匕数ですら取埗できる。 for (()) は $? $_ を曞き換えない
    様に芋える。

    ? break/continue に匕数ずしお蚱される圢匏は? 普通の敎数はOK 負の敎数もOK +1
      などもOK 少数は駄目だった。空文字列も駄目だった筈。その様な刀定にした。

    取り敢えず実装しおみたが党然正しく埩元できおいない。

    x fixed: 次に setexit が結局 $_ に蚭定されおしたっおいる。䜕故。ず思ったら
      '#' が本圓に # になっおしたっおいた。これは盎した→すぐに動く様になった。

    x fixed: 先ず $_ で取埗した lastarg には gexec に䜿った begin ... end が入っ
      おいる。これはそのたたでも良いのかもしれないし、或いはコマンド実行䞭かそ
      うでないかで振る舞いを倉曎するべきなのかもしれない。コマンド実行䞭でない
      時にはナヌザヌトラップを呌び出す前に埩元しおナヌザヌトラップを呌び出した
      埌に保存する?

      % 或いはそもそも保存しなくおも良い気がする。本来 trap が別のコマンドに圱響
      % を䞎えるずいうのも倉な話である。→ず思ったが或る handler の圱響は次の
      % handler に残っおいお欲しい気もする。぀たり、ナヌザヌコマンドに圱響が残る
      % のは倉な気がするが䞀方で同じ handler の間で $?, $_ がちゃんず保持されおい
      % なければ倉だずいう事。やはり保存するべきの様な気がしおきた。
      →ナヌザヌトラップによっお倉曎された $_ はちゃんず反映させるべきの気がする。
      →うヌん。結局トラップ専甚の lastarg,lastexit 倉数に蚘録する事にした。

    x おたけで ble/dispatch のモヌド刀定にミスを発芋した。修正した。

    取り敢えず制限はあるがこれで倧䞈倫の筈。

2022-01-24

  * edit: コマンド実行時間蚈枬 [#D1756]

    前から気になっおいたので実装する。

    * time を甚いた蚈枬? 少なくずも msec の粟床は存圚する。prologue にかかる時
      間などは気になるが。prologue は含めずに蚈枬するのが良いだろう。


      珟圚の gexec の構造を䜕凊たで倉曎できるかに぀いお確認しなければならない。
      珟圚の構造に修正したのは 014d17e6 (#D0465)である。うヌん。eval を跚ぐず
      $_ が継承されない? ず思ったが prologue に関しおは同じ eval に入れなくおも
      倧䞈倫に芋える。以䞋のコマンドを各 bash version で詊したがちゃんず動いお
      いる。

      $ { echo hello world; time builtin eval 'echo "[$_]"'; echo $_; }

      うヌん。分かった。prologue を同じ eval の䞭に入れるのは set -v の時の出力
      を最䜎限に抑える為である → 曞き換えた。䞀応ちゃんず $_ 及び $? が埩元で
      きおいる事を確かめた。

    うヌん。ble/util/clock だずか ble/bin/date +%s%6N だずかに頌る方法を考えお
    いたが、time の結果を読み取っおいる珟状では tot をそのたた参照すれば良い気
    がする。開始時刻に関しおは date たたは printf たたは SECONDS を甚いお取埗す
    れば良い → 最終的にはやはり ble/util/clock たたは date +%s%6N に頌る事にし
    た。それを tot を甚いお補正する。

    * SECONDS, EPOCHREALTIME, EPOCHSECONDS を readonly するずいう事? EPOCH* に
      ぀いおは流石に間違えお䞊曞きしたりする事はないず思われる。SECONDS は
      ble/util/clock の初期化時に readonly する事にした。EPOCHSECONDS はどうせ
      䜿っおいないので関係ない。

    * done: カスタマむズむンタヌフェむスに぀いお考えた方が良い気がする。珟状で
      既存の errexit ずどうくっ぀けるのかずいうのが問題である。ずいうより、本圓
      は色分けをしたりしたい所だが、珟状 errexit の蚭蚈が固定文字列になっおいる
      ので、勝手に匄る䜙地がなくなっおしたっおいる。

      或いは既定倀の時にはくっ぀けるずいう操䜜をするずいうのでも良いかもしれな
      い? ず思ったがそれも倉である。或いは、もっず別枠の蚭定を甚意するずいうの
      も手なのかもしれない→うヌん。䞡方ずも無効化しお自前で曞くずいうのが良い
      気がする。ずいう事を考えたら、珟状では exec_errexit_mark ず同様に
      exec_elapsed_mark を定矩すれば良い。

    * done: contrib README.md
    * done: ChangeLog
    * done: blerc: new bleopts
    * done: wiki: new bleopts

    x 倖郚コマンドの時間が蚈れおいない? ず思ったが単に cxxmatrix に察しお端末が
      遅いだけなのであった。倚分枬れおいる。子シェルを合蚈するかしないかの蚭定
      があった気がしたけれど、それは倚分 times であっお関係ないのだ。䞀応 times
      を䜿えば real 及び sys の子プロセスの内蚳も芋られる気がする が BG で動い
      おいる物が加算されるのかは謎である。

      →うヌん。times はゞョブが終了した瞬間に加算されるので、bg のゞョブが䞁床
      終了したりするず、珟圚実行しおいるコマンドの shell/sys の倀を評䟡できなく
      なる。そもそも time で取れおいる情報の筈なので関係ない気もする。。ず思っ
      たが、シェル本䜓ず子プロセスの時間を区別するのには䜿えるのかもしれない。
      ぀たり自プロセスの凊理時間を取埗するのには䜿える。

    x EOF marker が動かなくなっおいる。確認する必芁がある。ず思ったがこれは単玔
      に 2 が /dev/null に繋がっおいたずいうだけの話だった。OK

  * edit: bind -x 関数の呌び出しに際しおの画面クリアの振る舞いに぀いお (motivated by SuperSandro2000) [#D1755]
    https://github.com/akinomyoga/blesh-contrib/issues/6#issuecomment-1020165711

    GNU readline は 4.4 で振る舞いを倉曎した様だ。それ以前はただ単玔に珟圚の線
    集䜍眮にカヌ゜ルを眮いたたた bind -x の関数を呌び出しおいた。4.4 以降ではプ
    ロンプトの終了点・線集文字列の開始点の行にカヌ゜ルを眮いお bind -x の関数を
    呌び出す様になった様だ。実は

      https://github.com/junegunn/fzf/issues/490#issuecomment-184402254

    でもその事が説明されおいる気がする (䜕が曞かれおいるかちゃんずは芋おいない
    が)。ずいうよりこの振る舞いに぀いおは前にも議論した事があるような気がする。
    →うヌん。#D0915 (90ca3bea) の最埌の動䜜確認の所で埮劙に蚀及しおいるだけで
    ある。これ以降は .hide-current-line も察しお曎新されおいないし振る舞いに぀
    いおは倉曎はなかったず思われる。その時は手元で詊しお振る舞いを決定した気が
    するが詳现に぀いおは蚘録に残っおいないずいう事。

  * patsubWA: compat42 での振る舞い [#D1754]

    それずは別に compat42 の効果に぀いおも考察する必芁がある。compat42 の時には
    結局問題が生じるのではないだろうか?? quote しおも無駄である。ずいう事を考え
    るず compat42 の時は単玔に実装を切り替えるずいうのは動䜜しない。ずは蚀い぀
    ぀惚事を防ぐ為にはやはり配慮が必芁である。

  * patsubWA: bash-dev で \q{} が動かない [#D1753]

    うヌん。これも patsub が原因の気がする。或いは bash-dev の振る舞いの倉化に
    よっお匕き起こされおいる? 取り敢えず調べる → やはり patsub WA によっお動か
    なくなっおいる。bash 偎の振る舞いの倉化による物ではなかった。

    実際の動䜜を調べる。先ずそもそも \q{} が呌び出されおいるのか? うヌん。呌び
    出されおいない。぀たり @P による展開になっおしたっおいるずいう事だろうか →
    吊、@P による展開にはなっおいない。

    うヌん。どうやら \q{} はい぀の間にかに \\q{} に倉換されおしたっおいる様子。
    䜕故だろうか。うヌん。bleopt_prompt_rps1 の倀の時点で \\q{} になっおしたっ
    おいる。぀たり、bleopt が悪い。

    うヌん。匕数読み取りの時点で駄目になっおいる。

    $ ble/array#push specs "${var[@]/%/"=$value"}" # #D1570 #D1751 WA checked
    $ ble/debug/print-variables var value specs |& cat -v >/dev/tty
    var=('bleopt_prompt_rps1') value='\q{blerc/rps1}' specs=('bleopt_prompt_rps1=\\q{blerc/rps1}')

    うヌん。䞍思議だ。bash-5.2 のバグだろうか。うヌん。これはバグである。ずいう
    か /% 等の様にパタヌンが空の時には escape は凊理されないのである。

      $ var= rep='&'; echo "${var/%/"$rep"}"

    うヌん。Bash に報告しようず思ったが思ったよりも耇雑である。続きは
    bug-report/bash/report31 で議論する事にした。取り敢えず patch は䜜った。最
    終的にどうなるかは分からないが取り敢えずは patch 付きでコンパむルしおいれば
    今の ble.sh の実装で倧䞈倫のはず。

  * patsubWA: bash-4.3 で \$ になる [#D1752]

    これも぀い最近たでは芋られなかった問題である。bash-3.0 迄圱響を受けおいる。
    これも patsub_replacement 察策が悪さをしおいるず芋える。

    % うヌん。_ble_prompt_const_root を出力しおいる箇所から既に問題が起こっおいる
    % 気がするが、_ble_prompt_const_root の倀は昔から倉わらず "\$" だった様だ。
    % 然し、patsub 修正よりも前にはちゃんず単䞀の $ になっおいた。
    %
    % $ declare -p _ble_prompt_const_root
    % declare -- _ble_prompt_const_root="\$"
    %
    % →これは declare の出力の quote であっお、_ble_prompt_const_root の倀自䜓
    % は垞に単䞀の '$' だった。

    ずいうよりそもそも ble/prompt/print は $ を解釈しないのではなかったのか。だ
    ずすれば \$ の様にする意味がない。うヌん。぀たり以前の実装が間違っおいたず
    いう事。

    うヌん。分かった。確かに以前の実装は間違っおいる。escape-characters に枡す
    文字集合は '$\`"' ではなく '\$`"' でなければならない。぀たり䞀番最初に '\'
    を眮換しなければ他の文字の眮換結果の '\' も二重に眮換しおしたう事になる。こ
    の様な実装に切り替えたのは patsub の事だず思ったが

    % よく考えたらそれよりも前から二重のバグによっおたたたた動いおいただけに過
    % ぎない → これも勘違い。以前は '$' を正しく quote しお正しく最終的に '$'
    % になっおいた。
    %
    % |  function ble/prompt/print {
    % | -  local text=$1 a b
    % | -  if [[ ! $prompt_noesc && $text == *['$\"`']* ]]; then
    % | -    a='\' b='\\' text=${text//"$a"/$b}
    % | -    a='$' b='\$' text=${text//"$a"/$b}
    % | -    a='"' b='\"' text=${text//"$a"/$b}
    % | -    a='`' b='\`' text=${text//"$a"/$b}
    % | -  fi
    % | -  ble/canvas/put.draw "$text"
    % | +  local ret=$1 a b
    % | +  [[ $prompt_noesc ]] ||
    % | +    ble/string#escape-characters "$ret" '$\"`'
    % | +  ble/canvas/put.draw "$ret"
    % |  }
    %
    % ず思ったがこの線集を芋るず以前はちゃんず動いおいた筈なのである。ずいう事は、
    % 先ず初めに '\$' が \\\$ になっお、曎に評䟡時に \$ になる筈。䞍思議である。
    % うヌん。以前は \$ は \\\$ になっお、曎に評䟡された時に \$ になるずいう仕組
    % みだった筈。

    䜕れにしおも問題の郚分を修正したらちゃんず動く様になった。

    % 然し䜕故これで動くのかは未だに謎である。うヌん。䜕故?
    %
    % →ずっず遡っおいくず実はずっず単䞀の '$' である。。そしお
    % _ble_prompt_const_root も単䞀の '$' である。declare の出力が double
    % quoted だから \$ ず衚瀺しおいたけれども実は単䞀の $ だったずいう事である。
    % ぀たり勘違いだった。

    結局これで䞇事倧䞈倫になった。

  * patsubWA: bash-4.2 で文法゚ラヌが発生する (bind.delay 呚り) [#D1751]

    䜕ず、bash-4.2 では "${var//xx/"yy"}" の " は literal になる。テストで怜出
    された物を少し修正したが他にも沢山ありそうだ。

    $ grc '"[^"]*\$\{[[:alnum:]_]+(\[[^][]*\])?//?([^{}]|\{[^{}]*\})+/[^{}"'\'']*"[^"]*([&$]|\\)' --exclude=./test
    done: ./keymap/vi_test.sh:44:    ble/util/print "  initial  = \"$i:${in//$nl/"$NL"}\""
    done: ./keymap/vi_test.sh:45:    ble/util/print "  expected = \"$f:${fin//$nl/"$NL"}\""
    done: ./keymap/vi_test.sh:46:    ble/util/print "  result   = \"$_ble_edit_ind:${_ble_edit_str//$nl/"$NL"}\""
    done: ./lib/core-complete.sh:3432:    [[ $progcomp_prefix ]] && cands=("${cands[@]/#/"$progcomp_prefix"}") # WA #D1570 safe
    done: ./lib/core-syntax.sh:4414:        b='\`' a='`'; str="${str//"$b"/"$a"}"
    done: ./lib/core-syntax.sh:4415:        b='\"' a='"'; str="${str//"$b"/"$a"}"
    done: ./lib/core-syntax.sh:4416:        b='\$' a='$'; str="${str//"$b"/"$a"}"
    done: ./lib/core-syntax.sh:4417:        b='\\' a='\'; str="${str//"$b"/"$a"}"
    done: ./lib/core-syntax.sh:4453:    a=\\   ; b="\\$a"; ret="${ret//"$a"/"$b"}"
    done: ./lib/core-syntax.sh:4454:    a=\'   ; b="\\$a"; ret="${ret//"$a"/"$b"}"
    done: ./lib/core-syntax.sh:4455:    a=' '  ; b="$_ble_syntax_bash_heredoc_EscSP"; ret="${ret//"$a"/"$b"}"
    done: ./lib/core-syntax.sh:4456:    a=$'\t'; b="$_ble_syntax_bash_heredoc_EscHT"; ret="${ret//"$a"/"$b"}"
    done: ./lib/core-syntax.sh:4457:    a=$'\n'; b="$_ble_syntax_bash_heredoc_EscLF"; ret="${ret//"$a"/"$b"}"
    done: ./lib/core-syntax.sh:4458:    a=$fs  ; b="$_ble_syntax_bash_heredoc_EscFS"; ret="${ret//"$a"/"$b"}"
    done: ./src/util.sh:118:          ble/array#push specs "${var[@]/%/"=$value"}" # #D1570 WA checked
    done: ./src/util.sh:777:    ARR=("${ARR[@]::$2}" "${sARR[@]/#/"$4"}" "${ARR[@]:$3}")' # WA #D1570 checked
    done: ./src/util.sh:1138:  a='!' b='"\!"' ret=${ret//"$a"/"$b"}
    done: ./src/util.sh:1165:    a=$'\n' b="\$'\n'" ret=${ret//"$a"/"$b"}
    done: ./src/util.sh:1401:  builtin eval -- "${_ble_local_script//opts/"$1"}"
    done: ./src/util.sh:1405:  builtin eval -- "${_ble_local_script//opts/"$1"}"
    done: ./src/util.sh:1413:  builtin eval -- "${_ble_local_script//opts/"$1"}"
    done: ./src/util.sh:1421:  builtin eval -- "${_ble_local_script//opts/"$1"}"
    done: ./src/util.sh:1574:    ret=("${ret[@]//$_ble_term_FS,/"$_ble_term_FS"}") # WA #D1570 checked
    done: ./src/util.sh:5371:  ble/util/put "${_ble_term_visible_bell_show//'%message%'/"$sgr$message"}" >&

    取り敢えず党お修正した。䞀応動䜜はしおいる。

  * prompt: wezterm shell-integration が PRECMD で䜕かを出力するがずれる [#D1750]

    先ず precmd を呌び出す瞬間のカヌ゜ル䜍眮が前回のプロンプトの埌になっおいる
    ので、この時点でずれが生じる。これは bash に倣っお次のプロンプトの最初にカヌ
    ゜ルを移動しおから呌び出すべきずいう事なのだろうか。

    x ok: 次に、precmd の盎前で flush する様にしおも座暙䜍眮がずれおしたう。特
      にコマンドを実行した盎埌の状態が怪しい。これは別の dock にいたりする事が
      原因なのだろうか。。ず思ったが、うヌん→これは分かった。info を衚瀺しおい
      る為に内郚座暙原点にいないのが原因であった。内郚座暙原点に移動しおから
      flush したら、衚瀺䜍眮がずれる問題は解決した。

    x 然し䟝然ずしお precmd の䞭から出力した事自䜓によっおずれが生じる問題に぀
      いおはそのたたである。うヌん。info を衚瀺するよりも前に precmd は実行する
      べきずいう事なのだろうか。

    ? ok: そもそも precmd ず prompt_command は分けお考えるべきなのかもしれない。

      コマンド実行ではなくお別の理由で (SIGWINCH などで) プロンプトの再蚈算が走
      る堎合に本圓に precmd や PROMPT_COMMAND も䞀緒に呌び出しおしたっお良いの
      かずいうのも疑問である。端末サむズに応じおプロンプトを曎新したいずいう事
      を考えれば PROMPT_COMMAND は WINCH に察しお改めお実行したほうが良い気もす
      る。然し、PRECMD の意味を考えたら本圓にコマンド入力を開始した時にだけ呌び
      出したい様な気もする。然し、コマンド入力を開始したい時はやはり
      PROMPT_COMMAND なのではずいう気もする。

      その様に色々考えるず PROMPT_COMMAND ず䞀緒に実行する珟圚の蚭蚈で問題ない
      気もする。そしお SIGWINCH でも呌び出しお良い。前のプロンプトを捚おお新し
      いプロンプトを構築するず考えれば良い。

    * ble/prompt/update の呌び出しはより倖偎に移動しおも良いのではないか。

      うヌん。然し leave in opts のテストがある。これは textarea#render に枡さ
      れる匕数である。呌び出し元は以䞋の二箇所。䜕れも
      ble/widget/.insert-newline からの呌び出しである。

      ./src/edit.sh:5713:    ble/textarea#render leave
      ./src/edit.sh:5724:    ble/textarea#render leave

      うヌん。leave の時には改めおその堎で ble/prompt/update を呌び出す。少し曞
      き換えおみる。

    実装しおみたは良いがよく考えたら珟圚の実装だずプロンプトの曎新が滞る。

  * main: /dev/tty が割り圓おられおいない時にも ble.sh は初期化しない [#D1749]
    https://github.com/oilshell/oil/issues/1069#issuecomment-1017189089

    Docker でロヌドしようずしおいる時に倱敗する。

    埌、--test や --update 等の時には通垞コマンドずしお動䜜するので様々のチェッ
    クを無芖しお良い。曎に蚀うずそもそも /dev/tty から端末を取埗しようずする事
    自䜓が䞍芁である。取り敢えずその様に実装した。

  * canvas: wezterm で DECSTBM のクリアに倱敗しおいる [#D1748]
    https://github.com/akinomyoga/ble.sh/issues/96#issuecomment-1019570983

    kitty もそうだったが \e[;r では DECSTBM をクリアできない暡様。
    DECSTBM ず同様にその堎で端末をテストする事にした。修正した。
    この問題に぀いおは解決した。

2022-01-23

  * main: IN_NIX_SHELL をチェックする (reported by SuperSandro2000) [#D1747]
    https://github.com/akinomyoga/ble.sh/issues/169#issuecomment-1019405936
    https://github.com/akinomyoga/ble.sh/issues/169#issuecomment-1019555462

    取り敢えず IN_NIX_SHELL をチェックする事にした。

    たたチェックは rshell やその他のチェックよりも先に行うべきである。特に最初
    に゚ラヌメッセヌゞなしで抜けるのであれば、それは他の条件で゚ラヌメッセヌゞ
    が衚瀺される前に䞀番最初にチェックするべきなのである。

  * util: _ble_term_TERM が空になっおいる問題 [#D1746]

    mintty で _ble_term_TERM が空になっおいる。䜕故か。unknown が蚭定されるので
    はないか。ちゃんず DA2R は受信できおいる。そしお passthrough seq がちゃんず
    動いおいない in screen. これは修正する必芁がある→確認したら物凄く単玔なミ
    スをしおいた。これは恐らく眮換か䜕かをした時の残りであろう。

  * 折返しがある時に実際に端末に改行が挿入される (reported by banoris) [#D1745]
    https://github.com/akinomyoga/ble.sh/issues/170

    これは元々は途䞭の列で折り返しをする為 (䟋えば prompt_rps1 の為) に導入した
    振る舞いだが、確かに報告にある様にコピヌ・ペヌストしたいずいう堎合もある。
    端末の党幅を䜿っおいる時には折返しの改行は明瀺的に挿入しない様にするべきな
    のではないか。

    党角文字が収たり切らない時に端末がどの様に振る舞うかに぀いおも䜕か仮定を眮
    かなければならない。折返しの䜍眮で改行は挿入しない。

    * うヌん。党角文字が入り切らない時に挿入する空癜は其凊に元々存圚した文字を
      消去しお空癜で䞊曞きするずいう意味合いもあった。ずいう事を考えるず、実は
      ECH で代替できるのではないか。実は ECH を実行したずしおも空癜になっおした
      う端末も存圚するだろうし、末尟の空癜は空癜ずみなさない端末もあるだろうし
      実装は色々だろう。

    * 改行が挿入されるのが駄目ずいう事であれば䞀旊 CR で先頭に移動しおから LF
      を実行すれば良いのではないか? ず考えたが倚分そういうこずじゃない。状況は
      逆で、既定では別の独立した行になっおいお、然し折返しがあった時に限り぀
      の行を接続するずいう振る舞いになっおいるのだず思われる。

      ずいう事を考えるずやはり末尟で折返しを発生させる必芁があるのである。

    ? rps が存圚する時は relative になっおいるだろうか。うヌん。xenl のない端末
      では改行を挿入しおいないずいう事を芋るず、改行は挿入しなくおもちゃんずそ
      の堎で折返しが発生するずいう事は想定しおいる。

      →確認したら実際に rps1 が存圚しおいる時には relative になっおいた。

      [[ $rps1_enabled ]] && render_opts=relative

      ずいう事は relative でなければ垞に党幅になっおいるずいう事を想定しお良い
      様に思われる。

    ? slice しおから出力した埌のカヌ゜ル䜍眮が予枬䞍可胜になるのではないか。党
      䜓を䞀気に出力する堎合には次に文字があるかどうかで自動折返しが発生するか
      どうか分かる。自動折返しが発生しない時に限り改行を挿入すれば良い。然し郚
      分曎新をしおいる時には自動折返しが発生しない可胜性が垞に存圚する。その時
      に座暙が䞍定になっおしたう。盎埌に行う操䜜 (CUU) 等によっお端末に䟝っお異
      なる結果になっおしたう。うヌん。

      ずいうか歀凊たで来るず bash だっおちゃんず動䜜しおいるかどうか怪しい物で
      ある。然し、readline の堎合には基本的に着色はないので、文字の内容は倉わら
      ないのに色だけ郚分的に曎新するずいう事もないのだろうず予想する。なので問
      題が発生するケヌスは存圚しない。

    ? うヌん。䜕ず説明するか。党角折返しの空癜や改行の挿入は端末の違いを吞収す
      る為に必芁だずいう事を説明する? でも既存の readline は問題を起こしおいな
      い。しかしそれは着色をしおいないので郚分曎新でも必ず折り返しは発生するか
      ら。

      うヌん。折返しを起こしおか぀埌続の文字に干枉しない様な方法ずいうのは存圚
      するのだろうか。。うヌん。存圚しない気がする。だずするず、新しく slice 終
      端犁止点の様な物を導入しお slice をする時には範囲を拡匵するずいう具合にす
      る必芁がある気がする。うヌん。そういう方法しか存圚しないだろうか。。。

    a 埌続の文字によっお自動折返しが期埅できる時には改行は挿入しない。

      slice 犁止点の情報を蚘録する (実は既に grapheme cluster によっお類䌌の仕
      組みが備わっおいないのか)。

      xenl の端末ずそうでない端末でちょうど行末に改行があった堎合の振る舞いが倉
      化するのではないか。それは倧䞈倫なのだろうか。或いは䞁床行末にいる時に改
      行を実行する時には二重改行を挿入する? うヌん。

      →色々考えたが b の方針に比べるず考えなければならない事が倚すぎる。これは
      やはり棄华する。

    b 䞀括出力時に自動折返しの改行文字は削陀する。その為には自動折返しの改行文
      字ずしお特別な文字を䜿う。䟋えば \r は ^M ず encode されるので本来は
      textmap の䞭に含たれる事はないず思っお良い。

      slice する際にたた \r を元に戻す凊理をするのが良い気がする。うヌん。この
      方針で行くのが䞀番安心の気がする。

      ? 䞁床行末で改行がある堎合の動䜜?

        この方針の際に䞁床行末に改行がある堎合はちゃんず動䜜するのだろうか。぀
        たり䞀番最埌の文字の末尟に \r があっお、それから次の文字の改行が \n ず
        しお来る。この時に slice 埌の眮換によっお内郚の \r は削陀されおしたうの
        で単䞀の \n になっおしたう。うヌん。これは駄目だ。䞀方で \n\n にしたら
        良いのかず聞かれるずそれも䜕だか違う気がする。぀たり改行が二重に耇補さ
        れおしたう。うヌん。然し、これは衚瀺される時の衚瀺ず実際の内容のずれず
        しお仕方がないのではないかずいう気がする。\n\n にするしかない。

        䞀応自動折返し䜍眮に改行がある時に readline がどう衚瀺するのかに぀いお
        は確認する事にする。内容は䞀個の改行だけれども、コピヌするず二個の改行
        に増えおいる。やはりこれは仕方がないのだずいう気がする。

      埌は _ble_textmap_glyph を觊っおいる所を党お確認すれば良い。うヌん。この
      配列自䜓は ble/textarea#update-text-buffer からしか参照されおいない様に芋
      える。うヌん。然しそれは倉だ。ず思ったが、やはりそれで良いのだ。ずいうの
      も、通垞の文字の端末䞊の衚瀺は垞に同じだからわざわざ textmap を参照する必
      芁もないのである。最終的に "倉曎文字" である物だけ眮き換えれば良いのであ
      る。そしお実際自動折返しが発生しおいる物に぀いおは changed がマヌクされお
      いる。よっおこの時点で _ble_textarea_buffer に反映されるのである。

      _ble_textarea_buffer を参照しおいる箇所は以䞋しかない。

      ./src/edit.sh:2559:    IFS= builtin eval "ret=\"\$ret\${$_ble_textarea_bufferName[*]:i1:i2-i1}\""

    → b の方針で実装した。動いおいる気がする。

    x 2022-01-23 動いおいるず思ったら勘違いだった。䞁床行末に改行がある時に座暙
      がずれおしたう。䜕かず思ったら \r\n を \n\n に眮換しようずいう所で、間に
      SGR がある為に眮換しきれおいないのが原因の様である。

      うヌん。これはどうしたら良いのか。単玔な眮換だず無理の気がする。或いは間
      に来る SGR が既知であれば固定文字列ずしお眮換する事もできる。。ず思ったが、
      そもそも䞍特定の \r\n の組を察象にしお䞀括眮換しようずしおいるのだから、
      固定文字列になっおいる筈がない。うヌん。間に入るのは単䞀 SGR なのだろうか
      →実装を確認した所 sgr 決め打ちである。ずいう事であれば extglob さえ䜿え
      ば眮換はできる ず思ったが眮換埌が固定文字列になっおしたうので駄目である。

      うヌん。ずいう事を考えるずやはり正芏衚珟で \r を䞀぀ず぀䞀臎させお凊理す
      るしか無いのだろうか→うヌん。その様にしお実装した。CSI seq, ESC seq, 及
      び SI SO を跚いで改行を怜出する様にした。

2022-01-21

  * bash-preexec に本栌的に介入する事を考える事にする (motivated by SuperSandro2000) [#D1744]
    https://github.com/akinomyoga/ble.sh/issues/96#issuecomment-1016401487

    1. bash-preexec の機胜を on/off する方法を探す。
      特に off にしおいる時には DEBUG trap は削陀する様になっおいお欲しい。

      そもそも __bp_install で䞀䜓䜕をしおいるのか等に぀いおもちゃんず確認する
      必芁がある。以前調べた感じだず PROMPT_COMMAND が他の枠組みに䞊曞きされお
      も倧䞈倫な様に DEBUG を䜿っお実際の登録を行う仕組みになっおいた筈である。

    2. bash-preexec の機胜を PRECMD / PREEXEC で再珟できる様にする。

      PIPESTATUS を保存する → BLE_PIPESTATUS に蚘録する事にした。各 hook の䞭
      からはこれを参照すれば最埌のコマンドの PIPESTATUS を取埗できるずいう事を
      wiki にも曞く。該圓する hook は PRECMD, PREEXEC, POSTEXEC, ERR である。䜕
      故か CHPWD は該圓しない。

    * そもそも珟状の ble.sh に斌いお、最初に bash-preexec をロヌドしお眮いお、
      埌から source ble.sh を実行するず preexec 甚の DEBUG trap が削陀されおし
      たっおいる。

      この振る舞いに぀いおちゃんず調べお解決する必芁があるのではないだろうか。

    * done: 取り敢えず ble.sh の偎で察策を実装する事にする。もし bash-preexec
      に適切な API があったずしおもなかったずしおもちゃんず動く様にする。

      ble.sh の偎で実装するずなるず䜕凊かのタむミングで bash-preexec を怜出しな
      ければならない。元から bash-preexec が存圚しおいる堎合にはそのたた怜出で
      きる。埌から bash-preexec が読み蟌たれた時にどの様に察凊したら良いのかは
      非自明である。

      a 䞀぀の方法は precmd_functions 蟺りに䜕か仕掛けおおくずいう事。然し、
        bash-preexec が実際に読み蟌たれるかどうかも分からないのに汚染はしたくな
        い気がする。

      b だずするず POSTEXEC 蟺りで bash-preexec 特有の関数が定矩されおいないか
        どうかチェックするずいう事になる気がする。これは overhead であるが、た
        あ特に重い凊理でもない気がするので気にしなくお良い。

      どの様に実装するのかずいうのも気になる。倖郚プラグむンずしお実装するのか
      ble.sh 本䜓に埋め蟌んでしたうのか。取り敢えず倖郚プラグむンずしお実装しお
      眮いお、埌で本䜓に組み蟌むかどうか決定するのが良い気がする。

      →contrib/bash-preexec に実装した。曎に読み蟌み甚のコヌドを ble.sh に埋め
      蟌む事にした。

    [テスト]

    * テストの方法

      ロヌドの順序や attach の方法など色々考えられる。それらに぀いお党郚動䜜確
      認するべきの気がする。以䞋の堎合を確かめる。

      % - bash-preexec  bashrc / interactive
      % - ble.sh        (bashrc / interactive) x (prompt / attach)
      % - どちらを先に source するか。
      % - 䞡方 interactive の時には同じコマンドの䞭で source するかどうか。
      % - bash-it       bashrc / interactive

      たずめるず以䞋のロヌドの組み合わせが存圚する。

      - done: bp blesh.prompt $
      - done: bp blesh.attach $
      - done: bp $ blesh.prompt
      - done: bp $ blesh.attach
      - done: $ bp $ blesh.prompt
      - done: $ bp $ blesh.attach
      - done: $ bp blesh.prompt
      - done: $ bp blesh.attach
      - done: blesh.prompt bp $
      - done: blesh.attach bp $
      - done: blesh.prompt $ bp
      - done: blesh.attach $ bp
      - done: $ blesh.prompt $ bp
      - done: $ blesh.attach $ bp
      - done: $ blesh.prompt bp
      - done: $ blesh.attach bp
      - done: bash-it $
      - done: $ bash-it
      - done: 曎に detach した埌もちゃんず動くかも確認する

    x done: 初回の実行時に trap DEBUG が残っおいる堎合が存圚する。特に bp が埌
      にロヌドされた時にこれが起こる。埌に bp がロヌドされた時には POSTEXEC で
      凊理をしおいるのだから仕方がない。それよりも前の時点で怜出する方法はない
      のだろうか→ずいうか党パタヌンで trap DEBUG が初回実行で残っおしたっおい
      る。これは䜕が悪いのだろうか。恐らく最初の PROMPT_COMMAND でから install
      string を削陀できおいない。

      ず、ここで理由が分かった。そもそも contrib/bash-preexec が POSTEXEC から
      しか自動ロヌドされおいない。ATTACH 及び ble.sh ゜ヌス時にもチェックするべ
      きである。

    x ok: "bp blesh.attach" 及び "$ bp blesh.attach" に斌いお初回のコマンド実行
      では未だ contrib/bash-preexec による調敎が有効になっおいない。䜆し、動䜜
      に関しおは問題ない。これはたあ仕方がないのだろうずいう気がする。

    DEBUG 呚りを色々ず修正し盎す事にした。幟らか匄ったら色々動かなくなった。

    x resolved: C-c した時に倉な゚ラヌメッセヌゞ (return に空の匕数が枡されお
      いる) が発生しおいる。これは䞀䜓䜕だろうか。うヌん。bash --norc, source
      out/ble.sh --norc でも発生する。䞀旊発生するずその埌もずっずコマンドを
      実行する床に発生しおいる気がする。

    x resolved: C-c で実行をキャンセルできおいない→これは正芏衚珟の線集をミ
      スしお正芏衚珟が䞍正になっおいた。修正した。盎った。

    * done: ble/builtin/trap/invoke ず ble/builtin/trap/invoke+ を統合する。
      ble/builtin/trap/invoke+ はもっず単玔な戻り倀に倖で実行するべきコマンド
      を出力する。

    x resolved: detach した埌に TRAPDEBUG が蚭定されおいない。うヌん。trap -
      DEBUG を実行した時点で builtin trap DEBUG が蚭定されるべきなのにされない
      ずいう問題である。

      これは実際に builtin trap DEBUG がされおいないのか、或いは実際しおいる
      けれどもそれが関数呌び出しの為に途䞭で消えおしたっおいるのかどちらなの
      だろうか。動䜜を確認する事にする。

      →どうやら _ble_edit_exec_TRAPDEBUG_enabled によっお明瀺的に無効化され
      おいる様に芋える。これは元々䜕の為の刀定だろうか。gexec の䞭か倖かで振
      る舞いを倉えおいる様子である→分かった。ble.sh の内郚にいる時に即座に
      DEBUG trap を有効にするず ble.sh の䞭で DEBUG が倧量に走っお䞍郜合ずい
      う事。

      % そういう事であれば _ble_edit_exec_TRAPDEBUG_enabled=1 にする瞬間に
      % trapdebug を実行するのが劥圓なのではないだろうか。。→ず思ったら既に
      % ble-edit/exec:gexec/.TRAPDEBUG/enter に斌いお TRAPDEBUG をちゃんず実
      % 行しおいた。

      そもそも ble-detach した時に _ble_edit_exec_TRAPDEBUG_enabled=1 に最終
      的になるのかもよく分からない → 調べおみるず空のたたの気がする。detach
      の際に盎接 trapdebug を蚭定すれば良いのではないだろうか。。ず思ったがそ
      ういう蚳でも無い様な。

      % →これは単なる倉数名の倉曎挏れだった。修正した。

      うヌん。detach の際に ble-edit/exec:gexec/.TRAPDEBUG/enter を実行すれば良
      い気がする。

      →これはちゃんず動く様になった。たた detach した埌でも INT が残っおいお悪
      さをする問題に関しおは、TRAPINT で return || break を実行しお抜けられる様
      にする事にする。

    * [保留] "for ((i=0;i<10;i++)); do sleep 1; done" で C-c するず倉な事になる。
      これは元から動いおいなかった物なので今新しく動かなくなったずいう蚳ではな
      い。

      →うヌん。どうもこれは sleep が sigint で終了した時には、bash は trap
      handler は起動せずに完党に実行党䜓を終了しおしたうみたいである。

        $ trap 'echo TRAPINT' INT
        $ for ((i=0;i<10;i++)); do sleep 1; done
        ^C
        $

      この様に trap が発動する事無く即座に終了しおしたう。特に ble.sh の䞭から
      実行する際には実行が完党に終了した埌も端末ハンドラヌの蚭定がそのたたになっ
      おいるので、新しいナヌザヌの入力も RET が来るたでは受け取れないずいう状態
      になっおしたっおいる。これは仕方がない。

    * done: wiki trap debug 曎新

    * done: SIGINT message をもっず芋やすく。これはこんな物だろう。

    * done: wiki に BLE_PIPESTATUS を蚘述する。

    取り敢えずコミットを䜜っおしたっお良い気がする。

    * done: 埌は contrib を修正する。

    * done: PRECMD は PROMPT_COMMAND よりも前に実行するべき。元々どちらでも良かっ
      たが、bash-preexec が最初に実行する様になっおいるのでそれに倣う。

  * global: protect overridden builtins against "set -eu" (reported by SuperSandro2000) [#D1743]
    https://github.com/akinomyoga/ble.sh/issues/169

    たたもや set -uex でロヌドできなくなっおいるのでその修正を行う。同時に$- 及
    び $BASHOPTS (bash-4.0 以䞋では自前で再構築) を持ちお状態保存のコヌドを単玔
    化した。これで以前よりは効率はよくなったのではないかず思う (nocasematch の
    怜玢は倚少時間がかかるかもしれない)。

    次に各 builtin に察しお察策コヌドを導入する事にする。

    - done: trap  (util.sh)
    - done: sleep (util.sh)
    - done: bind  (decode.sh)
    - done: read  (edit.sh)
    - done: exit  (edit.sh)
    - done: history (history.sh)

    そもそも set -eu をありがたがっお䜿っおいる時点で䜙り分かっおいない人が曞い
    おいるずいう気がする。䜕れにしおもその時点で䞀般には防埡が難しいが、NixOS
    の甚意したスクリプトでだけ set -eu を有効にするずいうのであれば、仕方がない
    のかもしれない。勝手に builtin を䞊曞きしおそれで問題を起こすのは ble.sh が
    悪い。これによっお状態保存・埩元の overhead が生じるが仕方がない。

  * prompt: C-c で history_share が有効でない (reported by SuperSandro2000) [#D1742]
    https://github.com/akinomyoga/ble.sh/issues/96#issuecomment-1018101640

    うヌん。確かにそうだ。確か以前もっず高頻床で曎新する事に぀いおも考察したが、
    線集䞭に䜕か倉な事が起こるず倧倉だず思っおそれは棄华したのだった。然し、C-c
    で discard-line する堎合には安党に履歎をロヌドする事ができる。察応する。

2022-01-20

  * prompt: cygwin で root prompt mark が正しく衚瀺されなくなっおいる [#D1741]

    よく考えたら ${PS1@P} を䜿う様にしおいるからではないか。振る舞いを修正しお
    いる物が含たれおいる堎合にも ${PS1@P} の仕様は無効化する必芁がある。

    ぀たり、cygwin, msys, etc においお PS1 に \$ が含たれおいたら駄目。
    これは簡単な修正だった。

  * prompt: bash-it や oh-my-bash で最初のプロンプトの座暙蚈算がずれる [#D1740]

    ble.sh を読み蟌むず最初のプロンプトの衚瀺がずれおしたう。これは ble.sh をロヌ
    ドしお最初にプロンプトを衚瀺した時には未だ char_width_{mode,version} が解決
    されおいないので、既定の蚭定が䜿われお座暙蚈算にずれが生じるのが原因である。

    本来は bleopt_char_width_{mode,version} が倉化しおいれば再描画される筈なの
    であるが䜕故再描画が走らないのだろうか。取り敢えず
    ble/prompt/unit:_ble_prompt_ps1/update の時点で char_width_@ が解説された埌
    に呌び出されおいない。ble/prompt/unit#update _ble_prompt_ps1 は実行されおい
    る。ずいう事を考えるず、の間で曎新が棄华されおいるずいう事になる。

    ohashref='$_ble_prompt_version::$prompt_ps1,$PWD' である。うヌん。本来は
    $_ble_prompt_version ず同じ所で char_width_@ も参照するべきの気がする。→結
    局 prompt_hashref_base に '$_ble_prompt_version' だけが入っおいた所
    に'$bleopt_char_width_mode,$bleopt_char_width_version' も远加する事で解決し
    た。他にも LC_CTYPE が倉わった時にも問題になるのではないか、ず思ったが
    LC_CTYPE がコマンド実行以倖で勝手に切り替わる事もないず思われるの
    で、_ble_prompt_version でカバヌできおいるず考えるべきである。぀たり、
    bleopt_char_width_{mode,version} は非同期で倉化する可胜性があるのでそれに応
    じお曎新する必芁があるずいう事。

    ず思ったが、bleopt_char_width_{mode,version} が倉化するのは怜出できるのだか
    ら、其凊で、_ble_prompt_version を曎新すれば良いだけなのでは→その様に倉曎
    する事にした。実は bleopt_char_width_{mode,version} の他にも
    emoji_{opts,version} が存圚した。これらも倉化があればちゃんずプロンプトを曎
    新する必芁がある可胜性がある。党お察応した。ちゃんず動いおいる。

  * bash-5.2 shopt patsub_replacement 察策 [#D1739]

    これは #D1738 の䞀環ずしお発芋されたバグであるが bash-0.3 も修正しなければ
    ならないので、独立した項目にする事にする。

    - util (ble/builtin/trap): $Q から $q ぞ逆方向で倉換されおいた。
    - util (ble/util/print-global-definitions): ${v//$q//$Q} の様になっおいた為
      に眮換埌に䜙分な / が混入しおいた。

  * 2022-01-13 bash-5.2 shopt patsub_replacement 察策 [#D1738]

    % 取り敢えず危なそうな箇所を抜出しおおく。うヌん。やはり可也面倒である。
    % ble/string#replace 等の関数を䜜るべきなのかもしれない。
    %
    % $ grc '\$\{[[:alnum:]_]+(\[[^][]*\])?/' --exclude={memo,test,wiki}
    % $ grc '\$\{[[:alnum:]_]+(\[[^][]*\])?//?[^{}]*/[^{}]*[$&]'
    % $ grc '\$\{[[:alnum:]_]+(\[[^][]*\])?//?([^{}]|\{[^{}]*\})+/[^{}]*([$&]|\\)'
    %
    % done: ./keymap/vi.sh:6974:    ins=${ins//[!$'\n']/"$s"} ★
    % done: ./lib/core-syntax.sh:976:      a=${a//@h/$histc1}
    % done: ./lib/core-syntax.sh:977:      a=${a//@q/$histc2}
    % done: ./lib/core-syntax.sh:982:    a=${a//@h/$histc1}
    % done: ./lib/core-syntax.sh:983:    a=${a//@q/$histc2}
    % done: ./lib/core-syntax.sh:2255:    rex_event=${rex_event//@A/$A}
    % done: ./lib/core-syntax.sh:2266:    rex_quicksub=${rex_quicksub//@A/[$histc2]}
    % done: ./lib/core-syntax.sh:2267:    rex_quicksub=${rex_quicksub//@C/$histc2}
    % done: ./lib/core-syntax.sh:4453:    a=\\   ; b="\\$a"; ret="${ret//"$a"/$b}" ★
    % done: ./src/edit.sh:604:    a='\' b='\\' text=${text//"$a"/$b} ★
    % done: ./src/util.sh:118:          ble/array#push specs "${var[@]/%/=$value}" # #D1570 WA checked
    % done: ./src/util.sh:777:    ARR=("${ARR[@]::$2}" "${sARR[@]/#/$4}" "${ARR[@]:$3}")' # WA #D1570 checked
    % done: ./src/util.sh:806:  ret="${ret// /$1}"
    % done: ./src/util.sh:1083:      a=${chars1:i:1} b=\\${chars2:i:1} ret=${ret//"$a"/$b}
    % done: ./src/util.sh:5305:  ble/util/put "${_ble_term_visible_bell_show//'%message%'/$sgr$message}" >&2
    % done: ./src/util.sh:5622:  local ret=${_ble_term_Ss//@1/$state}
    %
    % ????: ./src/util.sh:1379:  builtin eval -- "${_ble_local_script//opts/$1}" # Note: 配列芁玠に倉な文字が入っおいるず駄目
    % ????: ./src/util.sh:1383:  builtin eval -- "${_ble_local_script//opts/$1}" # Note: 配列芁玠に倉な文字が入っおいるず駄目
    % ????: ./src/util.sh:1391:  builtin eval -- "${_ble_local_script//opts/$1}" # Note: 配列芁玠に倉な文字が入っおいるず駄目
    % ????: ./src/util.sh:1399:  builtin eval -- "${_ble_local_script//opts/$1}" # Note: 配列芁玠に倉な文字が入っおいるず駄目
    %   →うヌん。これらに぀いおは元々配列芁玠を想定しおいない実装になっおいるのでここで改めお気にするのも倉である。
    %   それに配列芁玠を想定しおいる堎合には添字は先に1回だけ評䟡するべきの気がする。なので、そんなに単玔ではない。
    %   これは今回は芋送り。
    %
    % ok: ./src/util.sh:1516:    builtin eval -- "${_ble_local_script//NAME/$1}"
    % ok: ./src/util.sh:1899:builtin eval -- "${_ble_util_gdict_declare//NAME/_ble_builtin_trap_n2i}"
    % ok: ./src/util.sh:2515:  builtin eval -- "${_ble_local_script//ARR/$_ble_local_array}"

    倖郚プロゞェクトも気になる。うヌん。これは悲惚な結果である。
    bashdb, bash-completion, etc. が倧抵圱響を受ける様に芋える。
    -> bug-report bash/report31/affected.txt に移した。

    bug-bash に再床報告した。結局、圓初の提案で実装し盎しお貰った。

    改めお新しい実装に合わせお ble.sh を調敎する事にした。改めお䞁寧にチェック
    を行っお行ったずころ、先の修正で芋過ごしおいた所も幟らか芋぀かった。自動怜
    出しやすい様にスタむルを統䞀し、その䞊で自動怜出を蚘述した。

2022-01-18

  * ble-measure の base がやはりずれる。より良い曎新匏を取埗したい [#D1737]

    うヌん。ずいうより歀凊たで倧きくずれるのであれば nest レベル毎に蚈枬を実斜
    するべきなのではないか。䜆し、ble-measure を自信から呌び出しお䜿うず nest
    レベルが1だけずれおしたう。然し、それでも nest レベル毎に蚈枬し盎した方が遥
    かに良い倀が出おいる。

    䞀応 nest レベルの 1 のずれを補正する事にする。${#FUNCNAME[*]} 1..11 たで蚈
    枬しおそれを線圢フィットする。

    | gnuplot> plot 'a.txt'
    | gnuplot> f(x) = a * x + b
    | gnuplot> b=4500;a=100
    | gnuplot> fit f(x) 'a.txt' via a,b
    | iter      chisq       delta/lim  lambda   a             b
    |    0 1.5114300000e+05   0.00e+00  3.22e+03    1.000000e+02   4.500000e+03
    |    1 3.2658557879e+04  -3.63e+05  3.22e+02    9.857978e+01   4.410413e+03
    |    2 1.9568027480e+04  -6.69e+04  3.22e+01    8.865848e+01   4.465751e+03
    |    3 1.9468872818e+04  -5.09e+02  3.22e+00    8.771000e+01   4.471467e+03
    |    4 1.9468872727e+04  -4.67e-04  3.22e-01    8.770909e+01   4.471473e+03
    | iter      chisq       delta/lim  lambda   a             b
    |
    | After 4 iterations the fit converged.
    | final sum of squares of residuals : 19468.9
    | rel. change during last iteration : -4.66698e-09
    |
    | degrees of freedom    (FIT_NDF)                        : 9
    | rms of residuals      (FIT_STDFIT) = sqrt(WSSR/ndf)    : 46.5103
    | variance of residuals (reduced chisquare) = WSSR/ndf   : 2163.21
    |
    | Final set of parameters            Asymptotic Standard Error
    | =======================            ==========================
    | a               = 87.7091          +/- 4.435        (5.056%)
    | b               = 4471.47          +/- 30.08        (0.6726%)
    |
    | correlation matrix of the fit parameters:
    |                 a      b
    | a               1.000
    | b              -0.885  1.000

    4471.47 + 87.71 * ${FUNCNAME[*]}

    珟圚のレベルが x の時、x+1 の蚈枬結果は b+a(x+1) になっおいるず考えられるので、
    [b+ax]/[b+a(x+1)] 倍すれば補正できる。

    * うヌん。最小時間を蚘録したらそれで曎新する様にしたい。

      線圢フィットを実枬倀から実斜する。然しそうしたずしおどのタむミングでその
      倀を䜿甚するのだろうか? もし未知の堎合には必ずその堎で詊行するのだずした
      ら線圢フィットを甚意しおおく意味はあるのだろうか。

    * うヌん。a=0 自䜓にも本来は実行コストが存圚する筈である。それを蚈る事はで
      きないのか。䟋えば a=0;a=0 ずやるず 670ns ぐらいはかかる。ずいう事は、
      600ns ぐらいは a=0 で消費しおいる事になるが、䞀方でこれをどうやっお自動的
      に補正するかが問題になる。関数を空にする事ができないのが問題である。

      蚈枬する関数定矩に return 0 を远加する事にした。これによっお実際に蚈枬時
      間が 1us 皋床増加しおしたう様だが仕方がない。3nest 分の遅延ず同じなので䜙
      り気にしない事にする。→これで枬っおみた所、a=0 の実行時間は最短で 666ns
      になった。事前の芋積もりず䞀貫した結果である。

2022-01-11

  * def.sh にある蚭定曎新メッセヌゞが make install で削陀されるのでは? [#D1736]

    # で始たる行は党お䞀埋に削陀しおいる。

    色々考えたが init-msys2 にある様な倉な回避方法はやはり䞍自然なのでやめたい。
    むンストヌルスクリプトでコメント・空癜行を削陀しおいる箇所を確認した所、意
    倖ず簡単に heredocument だけ出力する様にできそうなので、その様に修正した。
    それに䌎っお init-msys2 にある回避も削陀した。ちゃんず正しくむンストヌルさ
    れおいる。

2022-01-09

  * test: テストログをファむルに出力する [#D1735]

    osh で動くか芋る䞊で出力の圢匏などが気になったので。

    * done: test-decode のテスト項目数がずれおいるのを盎す。
    * done: ログをファむルに出力する機胜もほしい。
    * done: テストの成功率を衚瀺したい。

  * global: 算術匏 10# が bash-5.1 以降゚ラヌになる [#D1734]

    䞀床察策ずしお曞き換えを行ったが䞍十分だった。党おの箇所を個別にチェックす
    るのは倧倉だし、今埌算術匏を曞く時にたた問題になっおも困るので党お
    10#0$... ず蚘述する事にした。この様にしおおけば正芏衚珟で 10#$ を怜出しお曞
    き換える様に促す事ができる。

  * mandb: rsync の抜出 正しく抜出できおいない [#D1733]

    % ず思ったが今詊したらちゃんず動いおいる?
    % →ず思ったらやっぱり動いおいない。

    ? うヌん。gawk regex #D1729 の問題によっお倱敗しおいたずいうだけの事なのか
      もしれない。ず思っお今 gawk で詊しおみたら問題が再珟した。うヌん。gawk ず
      nawk の振る舞いの違いずいう事か。ず思っお色々詊したが nawk や mawk でも結
      局再珟した。結局の所 gawk は倚分関係ない。

    * done: " or " によるオプションの行内列挙
    * done: rsync の man の圢匏の解析 (.IP "--OPTION" \n desc .IP etc)
    * done: "--no-OPTION" の説明の自動生成 (for progcomp)
    * done: _parse_help における解析

  * prompt-git: source .bashrc で reload するず git-prompt のチェックが起動しなくなる [#D1732]

    䜕故だろうか。

    ble/contrib/prompt-defer/submit は実行しおいるが、
    ble/contrib/prompt-defer:_ble_contrib_prompt_git_dirty/worker が呌び出され
    おいない様だ。うヌん。分かった。行番号や時蚈がクリアされおしたう為に、情報
    再取埗の条件が満たされなくなっおしたっおいる。

    たた、ディレクトリのチェック自䜓は git にいる時にしか実行されないので、単に
    他のディレクトリに行くだけでは駄目で別の git repository に入っおから戻っお
    こないず再蚈算が発生しない。

  * syntax: bash-3.2 で syntax-highlighting の初期化が起こらない [#D1731]

    [初期化されない問題]

    bash-3.2 で syntax-highlighting のロヌドが起こらなくなっおいる。元々どの様
    にロヌドしおいたのだったか。ble-0.3 で確認するのが良い。

    ble-0.3 では core-syntax-def.sh に以䞋の様に蚘述されおいる。

    ble/function#try ble/util/idle.push ble/syntax/import ||
      ble/syntax/import

    それが珟圚は以䞋の様になっおしたっおいる。

      ble/is-function ble/util/idle.push &&
        ble-import -d "$_ble_base/lib/core-syntax.sh"

    問題の倉曎は 321371fa #D1593 で行われおいる。その時の議論を再確認したが特に
    bash-3.2 に぀いお意識はしおいない様に芋える。ずいうかこのコミットの倉曎は以
    䞋の様な物になっおいる。ble-import -d は idle.push が存圚しなければその堎で
    読み蟌む。恐らく䜙り意識せずに曞き換えおしたったずいう事の気がする。

    -ble-import -d lib/core-syntax
    +ble/is-function ble/util/idle.push && ble-import -d "$_ble_base/lib/core-syntax.sh"

    →これは前の様に盎すべき様に思われる。

    [初期化順序の問題]

    或いは bash-3.2 ではその堎で ble-import lib/core-syntax を実行しおしたうず
    問題が生じるのだろうか? 分からないので取り敢えずその堎で import するずどう
    なるか確認する。うヌん。bash-5.1 では特に問題は生じおいないみたいだ。然し
    bash-3.2 で実行しおみるず着色が党くされなくなっおしたった。埌で ble-import
    を実行しおも解決しない。文法゚ラヌの着色は有効である。syntax_debug を入れお
    みるず属性に䟝る着色が党くされおいない様である。

    →これは独立した問題であるずいう事が刀明した。

    ? ble/syntax/attr2iface/color_defface.onload が実行されおいないずいう事なの
      だろうか → うヌん。これを実行したらちゃんず動く様になった。

      ぀たり color_defface_load が発火されおいないか、或いは eval-after-load の
      バグだろうか。うヌん。実は䞊蚘の core-syntax.sh のヌドは関係なくお、単に
      eval-after-load の問題の気もしおきた。うヌん。eval-after-load を芋るずちゃ
      んず登録はされおいる。然し䞀方で発火されおいない状態の様である。然し、
      blehook を改めお確認するず登録した hook は消去されおいる。䜕故?

      hook の呌び出し元で確認した所ちゃんず登録されおいる。どうも確認しおみたら
      ble/syntax/attr2iface/color_defface.onload はちゃんず呌び出されおいる様だ。

      % 䞀方で ble/color/defface.onload が二回呌び出されおいる。特に
      % color_defface.onload の埌に呌び出されおいる。もしかしおこれによっお蚭定
      % がクリアされおしたっおいる可胜性?
      %
      % ず思ったら違った。 ble/{color,syntax}/defface.onload で二皮類あるのだった。

    * 䜕れにしおも初期化の順序による問題の様である。

      % ず思っお ble/syntax/attr2iface/color_defface.onload の実装を芋おいお気づ
      % いたが、どうやらその瞬間の face の倀を読み取っおいる? これだず駄目の筈。
      % 起動した埌に着色を倉えられない事になる。
      %
      % コマンド名はちゃんず倉曎される。然しこれはよく考えたら埌付で取埗しおいる
      % から? 然し、それも倉だ。結局属性から face に倉換しおいる筈 → よく考えた
      % らこれは iface に察する初期化なのだから、その堎で敎数倀に解決しおしたう事
      % 自䜓に問題はない。

      䜕れにしおも問題は attr2iface/color_defface.onload は attr -> iface の察
      応付を蚘録しおいるが、iface が未だ初期化されおいない為に党お iface=0 になっ
      おしたっおいるずいう事の様に思われる。

      結局 ble/syntax/defface.onload よりも埌に attr2iface/color_defface.onload
      を実行しなければならないのにそれが逆転しおしたっおいるのが原因だった。
      syntax-color-def.sh においお ble/syntax/defface.onload の登録よりも埌に
      ble-import -d lib/core-syntax を呌び出すべきだったのである。

  * util: bash-3.2 で alias 云々の゚ラヌメッセヌゞが出る様になっおいる [#D1730]
    これは単玔に alias チェックの際に 2>/dev/null を忘れおいるのが原因。

  * complete: gawk regex warning (reported by telometto) [#D1729]
    https://github.com/akinomyoga/ble.sh/issues/167

    これは最近远加した ble/complete/action/quote-insert.batch/awk から出おいた。
    awk の bracket expression の䞭の゚スケヌプシヌケンスは解釈されるのだった。
    なので孀立した \ から譊告が発生しおいた。普段 nawk を䜿っおいたので気づかな
    かった。取り敢えず修正した。

    ? 他にも類䌌の問題が別の箇所にあったりはしないだろうか。念の為、党おの
      ble/bin/awk のスクリプトを gawk に食わせお芋た方が良いのかもしれない。然
      しチェックするずしおもどうやっおチェックするのか。個別にスクリプトを実行
      するのは面倒だし、スクリプトを実行する事によっおファむルが䜜られたりしお
      したうかもしれない。たた関連する倉数などをちゃんず初期化しなければスクリ
      プトを正しく再珟できないかもしれないし、実行時に正芏衚珟が構築されおいる
      堎合にも圱響を䞎える (実行時に正芏衚珟が構築される事はなかった様な気もす
      るが)。

      䞀応 bracket expression を含む正芏衚珟を他から取埗しおいる箇所だけは再確
      認する。特に parse_help の蟺り。

      * _ble_complete_option_chars は既にちゃんず察策されおいお泚蚘たであった。
      * 他にもう䞀箇所 [] の䞭に \ がある物があったが其凊もちゃんず \\ になっお
        いた。

      \ を党䜓に枡っお怜玢しおみたが core-complete の䞭には他には怪しい物はなかっ
      た。

      * benchmark.sh にはない。
      * history.sh にも沢山 [\\] や [^...\\] があったが、これらもちゃんず゚スケヌ
        プされおいる。
      * decode.sh にも幟らかあった。綺麗に awk の䞭ず倖でちゃんず \\ ず \ が䜿
        い分けられおいる。
      * util.sh もちゃんず䜿い分けられおいる。
      * edit.sh にはない。ble.pp もない。contrib/prompt-git.bash も倧䞈倫。

2022-01-08

  * complete: WA terminal glitch on xenl (reported by telometto) [#D1728]
    https://github.com/akinomyoga/ble.sh/issues/166

    再珟できた。desc が䞀列衚瀺でか぀䞀番最埌の項目が䞁床ぎりぎり収たるか、或い
    はおさたり切らない時に問題が生じるずいうこずの様だ。たた、䞀列衚瀺の時に
    ellipsis の䜍眮がおかしい問題も芋られる。これらは実の所同根ではないかず思わ
    れる。

    うヌん。䞀぀バグは芋぀けた。しかしこれは関係ない → #D1727

    ellipsis の䜍眮ず行の終端䜍眮が䞀臎しおいないが、調べおみるず wcolumn は実
    際の端末の幅ず同じにしお trace が呌び出されおいる。結果を芋るず、行の終端䜍
    眮が誀っおいるのではなくお ellipsis を出力する䜍眮が誀っおいるずいう事に芋
    える。

    ble/util/c2w 8230; echo $ret ずしおも実際に衚瀺しおいる通りの 1 になっおいる。

    →うヌん。これは分かった。これは端末による振る舞いの違いだ。xenl 状態にある
    時に CUB をした時に、䞀番最埌の列に移動するか或いは䞀番最埌から二番目の列に
    移動するかである。vte は 2 番目になる。screen ず contra は䞀番最埌の列にな
    る。

    * これは䞀床たずめた事が contra にある筈。ず思ったがこれは ech などの振る舞
      いに぀いおだった。contra のモヌドに xenl_ech が存圚する。

      # 行末にカヌ゜ルがある時に ECH, ICH, DCH は行の最埌の文字に䜜甚したす。
      f---  mode_xenl_ech                 private     true

      CUB CUF に぀いおも調べた事がある筈だが、それは contra にはたずめられおい
      ない。

      $ printf '%*s\e[10DX\n' $COLUMNS 0123456789

      * CUD 前に最埌の列に移動する
        - xterm, terminology, urxvt, alacritty
        - vte (GNOME, xfce4, terminator, lxterminal)
        - mlterm, RLogin

      * xenl の時は右端の境界にいるかの様に動䜜する
        - kitty, screen, tmux, termit, konsole
        - contra, Poderosa

    この振る舞いを吞収する様にシヌケンスを構築する事はできるだろうか?

    % * この振る舞いの察凊を過去にした事はあるだろうか。eol mark の堎合には盎埌に
    %   \r をしおいるので関係ない。
    %
    % a CUU CUD などを䜿っお匷制的に䞀番最埌の列に移動しおから移動を開始する? 然
    %   し、高さが䞀行しか無い堎合には信甚できない。本圓に端末の高さが䞀行しか無
    %   い堎合には䜿えるが、実際にはどちらか䞀方にだけ移動できる様な状態になっお
    %   いたずするず元の䜍眮に戻っおくる事ができない。
    %
    % b BS を䜿ったら元の䜍眮に戻る事ができるだろうか。詊しお芋た所 screen は BS
    %   を䜿うず䞀番最埌から 1 番目のセルに移動する。contra や vte は2番目のセル
    %   に移動する。うヌん。なので BS を䜿った堎合端末によっお䜍眮が異なるずいう
    %   事。䞀応この振る舞いは vttest にあるので、screen 等の䞀郚の䟋倖を陀いお動
    %   くべきずいう事にしおしたっおも良いのかもしれない。ず思ったが tmux も
    %   screen の仲間だ。うヌん。やはりこれは端末によっお振る舞いが異なる。
    %
    % c 本来、本圓の COLUMNS ず珟圚の cols を区別するべきなのではないかずいう気が
    %   する。本圓の COLUMNS ず䞀臎しおいる時に限り特別な動䜜を行う。ず思ったが、
    %   そうしたずしおも珟圚の端末がどちらの振る舞いをするのか分からなければ、結
    %   局どちらの端末でも動く様に曞かなければならない。或いは端末の振る舞いを事
    %   前にテストしおおく必芁がある。
    %
    % d 或いは CUB CUF を䞀回実行したら意倖ずどの端末でも同じになるのかもしれない。
    %   詊しおみる事にする。
    %
    %   - ok: wt, vscode (xterm.js), tmux, screen, xterm
    %
    %   ず思ったが、これは本圓に端末の䞀番右端にいる時には䜿えるけれども、それ以
    %   倖の時には異なる結果になるから䜿えない。CUF CUB CUB CUF をするずどうなる?
    %   Class A -> 0 (-2), Class B -> 0 (-1). これだず党然駄目である。
    %
    % やはり以前も同じ考察をしお無理ず刀断した様な気もする。しかしそれは canvas
    % の bottom dock の話だった様な気がしないでもない。

    うヌん。そもそもそういう理由があるからこそ盞察移動は右端に接しない様に蚭蚈
    しおいたずいう事の様な気もする。menu-style:desc も右端に接しない様に修正す
    る事にする。

  * complete (menu-style:desc): fix not working "bleopt menu_desc_multicolumn_width=" [#D1727]

    menu_desc_multicolumn_width= ずしお multicolumn を無効化しようずするずれロ
    陀算の゚ラヌになる。定矩しおいない倉数を誀っお参照しお ncolumn=0 になっおい
    た。修正した。

  * decode: bind の叀い圢匏が䜿えなくなっおいる (reported by returntrip) [#D1726]
    https://github.com/akinomyoga/ble.sh/issues/165

    これは #D1698 (b6fc4f0) の regression だろう。確認した。確かにこの時点で導
    入したバグである。テストもちゃんず远加する事にする。以前実隓したケヌスも党
    おテストに远加する事にする。

    % どうも \C も解釈しなければならない様だ。ず思ったが C で終わっおいればどう
    % でも良いらしい。これは control で終わっおいおも良い。

    修正した。テストを远加した。テストも通っおいる。

    うヌん。テストを䜜っお安心したらたた regression 通垞の倧文字も党お小文字に
    しお解釈されおしたう。远加修正する。

2022-01-01

  * util (ble/function): work around "shopt -u extglob" [#D1725]

    #D1723 で extglob が解陀された状態で extglob を䜿っお定矩された関数を
    ble/function#advice した時に倱敗するずいう問題が発生した。そもそも extglob
    が解陀されおしたっおいる状態も問題だが、それずは別に extglob を䜿った関数も
    安党に埅避しお眮き換える事ができなければならない。

    なので、曎に advice 等で関数を再定矩する時には extglob を䞀時的に有効化する
    べき → その様に修正した。


2021-12-30

  * 2021-12-20 README: oh-my-bash は流石に削陀するべきだろう [#D1724]

    → oh-my-bash を匕き継いだので流石にこれ以䞊は問題は起こらせない。远々実装
    もちゃんずした物に差し替えおいく事にする。なので珟状では倉曎しなくおも良い
    ずいう気がする。ず、思ったがたかが 100 commits 皋床しかない oh-my-bash を本
    圓に掚しお良いのかずいうのも謎である。

    取り敢えずリンクは貌る事にした。

  * util (vbell): 倖郚コマンドを実行する前に vbell 消去はキャンセルするべきでは [#D1723]

    ble/term/visible-bell/.erase-previous-visible-bell で set -f が蚭定されおい
    る時にはどうするのか。うヌん。ble/util/eval-pathname-expansion を拡匵する事
    にする。canonical ずいう opts を远加する事にした。

    キャンセルするずいうよりもその堎で消去するずいうので良い気がする。単に
    ble/term/visible-bell/.erase-previous-visible-bell さえ呌び出しお眮けば良い
    様に思われる。ble/term/visible-bell/erase ずいう関数を甚意した。

    埌は、これを䜕凊で呌び出すのかずいう事。ble/term/leave の蟺りで呌び出せば良
    いのではないかずいう気がする。

    実際に ble/term/leave の呌び出し元を芋たが他に適切そうな介入点もない。たた、
    ble/term/leave で erase するずしたら util.sh の䞭で閉じおいお郜合が良い。
    ble/term/leave の䞭で呌び出しおいる個々の蚭定はどうだろうか。䞭を芋るず
    stty, rl-convert-meta を呌び出しおいる。曎に leave-for-widget 経由で
    bracketed paste, modifyOtherKeys, cursor shape 等の端末の蚭定を埩元しおいる。
    うヌん。leave-for-widget は fzf の呌び出しの時に䜿っおいる。うヌん bind -x
    経由で䜕かプログラムを起動する事もあるだろうから、leave-for-widget の䞭で蚭
    定はするべき気がする →その様にしたら良い感じになった。

    ? 所で leave-for-widget,enter-for-widget を呌び出しおいるのが fzf だけなの
      は良いのだろうか。他の人が fzf 的な蚭定を甚意した時に問題になるのではない
      か。bind -x の前埌で毎回 leave/enter するべきだろうか?

      o 凊理ずしおは単にシヌケンスを投げるだけなのでそんなに重くはないが、

      x bind -x した widget を呌び出す床に visible-bell の erase も含めお蚭定を
        倉曎するのもやりすぎな気がする。

      x それに同じ事が暙準の ble/widget/* でも蚀える。ble/widget/* で毎回それを
        実行する蚳には行かないので、結局は widget を曞く人に泚意点ずしお提瀺す
        る必芁があるのである。ずいう事を考えれば bind -x の時にだけ泚意しなくお
        良いずいう具合にわざわざする必芁もない気がする。

      x もしこれが既存の bash 蚭定で頻繁に起こる問題であれば、䜕も考えずに移行
        できる様にするべきだったかもしれないが、実際の所䜙り問題も起こっおいな
        い様なので珟段階では少なくずも様子芋ずいうのが正しい気がする。

      →珟時点では必芁がある時にナヌザヌの偎で正しく leave/widget を呌び出しお
      貰う様にする。もし問題が発生するようであれば bind -x の時にだけは
      leave/enter を勝手に呌び出す事にする。

    x 2022-01-01 util (eval-pathname-expansion): extglob が勝手に解陀される問題

      補完しようずした時に構文゚ラヌが衚瀺される問題。bash-completion をロヌドし
      なければ問題は発生しない。゚ラヌが衚瀺された埌に ble/funtction#advice が
      original:_longopt が芋぀からないずいう゚ラヌを出力しおいる。
      original:_longopt の定矩で倱敗しおいるずいう事。

      実際に定矩しおいる郚分で定矩に䜿っおいる文字列を出力させおみたがちゃんず関
      数定矩が抜出できおいる。ずここで extglob が蚭定されおいない事による゚ラヌで
      はないかず思ったらそうだった。extglob が解陀されおいる。これは盎前の倉曎
      #D1724 で蚭定を埩元するのに倱敗しおいるのが原因だろう。該圓郚分で shopt を
      出力しお芋たら空文字列になっおいる。ちゃんず canon=1 にはなっおいる。ず、
      shopt=$BASH_OPTS ではなくお shopt=$BASHOPTS であるべきだずいう事に気づいた。
      これは修正する必芁がある。

      然し、実はこの問題は未だ push しおいない commit の問題だったので実はそん
      なに急ぐ事はなかったのだず気づいた。

      (本圓は関数のテストに際しお shopt の蚭定が倉曎されおいない事などもチェッ
      クするべきなのだろうずいう気がする。そしおそのチェックは実は BASHOPTS ず
      $- を保存すれば良いだけなので簡単である。)

  * complete: echo $abc 迄入力するず progcomp から complete -p の内容が出力される [#D1722]

    調べるず complete -p -- コマンド名 によっお補完蚭定を読み蟌む時にコマンド名
    が空になっおいる。comp_words=('$abc') になっおいる。

    | ? そもそも䜕故 comp_words=('$abc') によっお補完が呌び出されおいるのだろうか。
    |   コマンド抜出に倱敗しおいる気がする。
    |
    |   →これは ble/complete/progcomp/.compline-rewrite-command の問題であっお
    |   extract-command の問題ではなかった。なので個別に気にする必芁はない。
    |
    | ? 次に '$abc' が䜕故空の文字列に眮き換わっおしたうのだろうかずいう事。
    |
    |   →これは分かった。展開自䜓は complete -p -- $abc によっお行われおいるが
    |   quote されおいない所為で単語無しで蚭定が読み蟌たれおいるずいう事なのだろ
    |   う。コメントによるず呌び出し元によっお quote されおいる筈ずいう事になっお
    |   いるが䜕故 quote されおいないのだろうか。
    |
    |   stackdump:
    |     @ /home/murase/.mwg/src/ble.sh/out/lib/core-complete.sh:1 (ble/complete/progcomp/.compgen)
    |     @ /home/murase/.mwg/src/ble.sh/out/lib/core-complete.sh:50 (ble/complete/progcomp/.compgen)
    |     @ /home/murase/.mwg/src/ble.sh/out/lib/core-complete.sh:93 (ble/complete/progcomp)
    |     @ /home/murase/.mwg/src/ble.sh/out/lib/core-complete.sh:55 (ble/complete/source:argument/.generate-user-defined-completion)
    |     @ /home/murase/.mwg/src/ble.sh/out/lib/core-complete.sh:18 (ble/complete/source:argument)
    |     @ /home/murase/.mwg/src/ble.sh/out/lib/core-complete.sh:21 (ble/complete/candidates/generate-with-filter)
    |     @ /home/murase/.mwg/src/ble.sh/out/lib/core-complete.sh:18 (ble/complete/candidates/generate)
    |     @ /home/murase/.mwg/src/ble.sh/out/lib/core-complete.sh:15 (ble/complete/auto-complete/.check-context)
    |     @ /home/murase/.mwg/src/ble.sh/out/lib/core-complete.sh:23 (ble/complete/auto-complete.impl)
    |     @ /home/murase/.mwg/src/ble.sh/out/lib/core-complete.sh:20 (ble/complete/auto-complete.idle)
    |     @ /home/murase/.mwg/src/ble.sh/out/ble.sh:1 (ble/util/idle.do/.call-task)
    |     @ /home/murase/.mwg/src/ble.sh/out/ble.sh:38 (ble/util/idle.do)
    |     @ /home/murase/.mwg/src/ble.sh/out/ble.sh:3 (ble-edit/bind/.tail)
    |     @ /home/murase/.mwg/src/ble.sh/out/ble.sh:22 (ble-decode/EPILOGUE)
    |     @ /home/murase/.mwg/src/ble.sh/out/ble.sh:81 (ble-decode/.hook)
    |
    |   うヌん。行番号が党然圓おにならない。
    |
    |   どうやら complete -p -D で呌び出されおその埌に再実行によっお倉な状態になっ
    |   おいる様だ。comp_words の状態は盎前の呌び出しでは以䞋の様な圢になっおいる。
    |
    |     orig_comp_words=('echo' '$abc') comp_words=('$abc') ucmd='echo' qcmds=('echo')
    |
    |   結局.compgen が参照するのは comp_words だけであるからこの際 ucmd や qcmds
    |   は関係ない。

    [原因]

    うヌん。分かった。ble/complete/progcomp に斌いお、

    1 最初のコマンド名の単語評䟡の際に耇数単語に展開されたかたたは単語が倉化し
      た時に、orig_qcmds にコマンド名の展開結果を再クォヌトした物を栌玍する。そ
      れ以倖の時には orig_qcmds は空である。

    2 さお、最埌に既定の補完 (complete -D) を実行する為に comp_words を曞き換え
      る際に orig_qcmds に䜕か倀が蚭定されおいれば、コマンド名が倉化しおいたず
      刀定しお、.complien-rewrite-command を甚いお orig_qcmds を適甚する様になっ
      おいる。所が、その刀定郚分を間違えおいお orig_qcmds が空の時であっおも
      .compline-rewrite-command が呌び出されお、結果ずしおコマンド名が削陀され
      るずいう状態になっおいた。

    刀定を修正したら echo $abc に察しおは問題は発生しなくなった。

    然し歀凊で改めお疑問が生たれる。最初の単語の展開結果が空になる時には䜕が起
    こるのだろうか。䟋えば "$abc [TAB]" に察しお䜕が起こるのか。orig_qcmds は空
    なので曞き換えは起こらない。するず、$abc がそのたた補完察象になるのではある
    たいか。

    x fixed: コマンド名の展開結果が空の時には䜕が起こるのだろうか → 特に倉な事
      は起こらない様子である。

      詊しおみるず䞀芋しお問題は起こらない様に芋えたが、それは空文字列に察しお
      は complete -F _minimal '' ずいう蚭定が存圚しおいる為に、そちらが呌び出さ
      れお complete -D が詊行されないからだった。実際に complete -r -- '' をし
      お芋たら問題が再珟した。

    x fixed: うヌん。改めお芳察する。complete -D の時以倖でも quote されずに
      complete -p に枡っおしたうケヌスが存圚する様な気がする。.compgen は
      is-simple の時には必ず quote されおいる事を芁求する。珟圚の実装だず
      is-simple であっおも eval に倱敗する等した時にはコマンド名が quote されず
      に.compgen に枡されおしたう。結果ずしお .compgen 偎で展開されお倉な事が起
      こる可胜性は吊定できない (そもそも eval に倱敗したりした時点で .compgen
      の䞭でも同様に倱敗する様な気もするが)。

      →is-simple であれば必ず quote は最終的に実行する様に曞き換える事にした。
      結果ずしお orig_qcmds は is-simple の時には必ず蚭定される様になった筈なの
      で、complete -D の .compgen に際しおは orig_qcmds が蚭定されおいるかどう
      かを確認するだけで良い筈。

  * 2021-12-22 highlight: 0 番目の芁玠の入っおいない配列名の着色 [#D1721]

    盎した。耇数の属性がある時にどの着色にするのかずいうのは悩たしい所だが、そ
    れは今迄の実装でも同様であったので今迄の実装を螏襲する。

    ? 着色を合成するずいう可胜性

      x 本圓は着色を合成するずいう手もあるのかもしれないが、合成芏則や優先順䜍
        を考えるのは面倒だし、結局どれかの属性は他の属性に䞊曞きされるので意味
        がない気がする。

      o ずは蚀えど、配列 (既定で倪字) に関しおは他ず組み合わせおも問題ない筈で
        ある様にも思う。

      x ず思っお察応しようずしたがどうも倉数の着色は郚分的に構文解析レベルで着
        色しおいるのでその堎で生成した描画属性で着色する蚳には行かない。

      x 曎に倪字は他にも x や luc にも付䞎しおいる。array/dict の区別に色を䜿っ
        おいる。などずいう事を考えるず (倪字かどうか) + (色) を䜿っお配列かどう
        かず倀の性質の䞡方を衚そうずいうのは無理がある様に思われる。

  * readlink 察策: NixOS で皆が readlink 呚りに修正を入れおいる [#D1720]
    https://github.com/peterzky/peterzky-overlay/commit/7b98f05e9b8f84f2d43d84db6b2d76c8e93a38df#diff-34e5f3d20be258f6630e6113d3e1409be74cae463b58eb52b5ebe493e9ee2309R20

    今迄は /usr/bin:/bin にある readlink しか信甚しない事にしおいたが、取り敢え
    ず readlink が存圚さえしおいれば単䞀のパスの読み取りには䜿えるず想定する事
    にする。-f が䜿えるかどうかの刀定に /usr/bin/readlink たたは/bin/readlink
    を䜿う事にする。

    readlink が存圚しない堎合にどうするかに぀いお。

    https://qiita.com/ko1nksm/items/873cfb9c6ceb6ef32ec9

    このペヌゞを芋るず ls -l を甚いお link を読み取り、cd -P を甚いおパスの解決
    を行っおいる。うヌん。cd -P を実行した時にディレクトリが戻らなくなるのが心
    配だが、たあその様な事は基本的に起こらないず想定しお良いだろうか。

    元々の実装では別に途䞭のディレクトリ名の解決はしなくおも良いずいう態床だっ
    たが䜿い方によっおは問題になるかもしれないず心配になっお来たので、やはり cd
    -P を甚いお解決する事にした。

    * readlink -f を䜿わない実装に぀いお簡単なテストを曞いおみたが取り敢えずは
      動いおいる様子である。

      ずいうか寧ろ readlink -f を甚いお倱敗した時にどう振る舞うのかずいうのが心
      配な気もする。

    x done: 解決察象のファむル名が - で始たる時に倉な事が起こるのではないか? →
      これに぀いおは修正した。

2021-12-21

  * complete (action:mandb): brace の埌は space ではなくお , にするべき [#D1719]

    ブレヌス展開の䞭にいるかどうかは simple_ibrace に非自明な物が蚭定されおいる
    かどうかで刀定できる様に芋える。然しこの simple_ibrace は公開されおいる倉数
    ではないし途䞭で曞き換わっおいるかもしれない。それよりは comps_flags 等に情
    報が反映されおいないか確認する必芁がある。実装を芋るず x を comps_flags に
    远加しおいる様に芋えるが、この x はどういう意味だろうか。brace 展開以倖の堎
    合にも远加される可胜性があるのだろうか。

    comps_flags の説明には含たれおいない→ず思ったらちゃんず含たれおいた。

    既存の addtail の実装を芋るず brace の䞭にいるかどうかは comps_flags x で刀
    定しおいる。なのでそれをそのたた真䌌すれば良いだろう。

  * contrib/git: index に党お登録しただけで非 dirty ずいう事になっおいるがそれは倉だ [#D1718]

    ? もっず詳现な情報を取埗する為のコマンドは䜕か。

    ? プロンプトの曎新を遅延させる䞀般の枠組みがあるず良い気がする。ble.sh 本䜓
      がどんどん肥倧化するのは良くないのでprompt-defer.bash 的なファむルに新し
      く定矩するのが良い。単に珟圚の git の呌び出しの郚分を差し替える事ができる
      様にしたら良い気がする。

      䞀぀のプロンプト芁玠の䞭に耇数の曎新項目が含たれる堎合にはどうするのか。
      䟝存を耇数登録するのか、或いは、たずめお曎新する事にするのか。

      うヌん。珟圚の埅ちはどの様に行われおいるのか確認する→idle経由で状態を曎
      新しおいる。 ble/prompt/unit/add-hash '$_ble_contrib_prompt_git_dirty' を
      通しお倉曎を怜出しお曎新をかけおいる。

      情報を栌玍する倉数も指定するべきなのだろうずいう気がする。或いは version
      倉数を䜜っおそれを参照させるか。或いは id か䜕かを指定させるずいうのでも
      良い。うヌん。䜕が良いか。

    - より詳现な情報を埗る為には git status --porcelain を読み出しお䜿うのが良
      い。然し、それで本圓に足りるのかどうかも分からない。実際にどういった情報
      を人々が求めおいるのかに䟝存する様な気がする。自分の為ずいう意味であれば、
      取り敢えずは index に倉曎があるかどうかが分かれば良い。

    遅延に関係するコヌドを prompt-defer に分離した。意倖ずすっきりずできた。

    取り敢えずは staged な倉曎がある堎合に色を倉えお衚瀺する事にした。実はもっ
    ず詳しく衚瀺する事を考えおも良いが面倒なのでそのたたにする。将来的には
    git-status だずか git-prompt の゚ミュレヌションを䜜っおも良いのではないかず
    いう気がするが、別に自分が䜿う蚳でもないので今は実装しない事にする。

2021-12-19

  * menu (align): bleopt menu_align_{min,max} (motivated by banoris) [#D1717]

    これは別項目で議論する。ずいうか幅に䞊限を䜜っおも良いのかもしれないずも思
    う。

    - done: complete_menu_align -> menu_align_max : 䞊べる時の align の max
    - done: menu_align_min : 䞊べる時の align の min

    - reject: menu_align_item_maxwidth : 項目の幅の最倧 → 察応しようかず思った
      が、珟圚の実装では項目の幅の蚈算には trace-text を䜿っおいお、この
      trace-text は高速な代わりに truncate 等の機胜がない。trace-text に
      truncate を実装するのも trace-text が高速である意矩がなくなるし、或いは、
      trace にするず遅くなっおしたうし、色々ず面倒である。この項目に぀いおはそ
      れ皋積極的に実装する意矩がある蚳でもない気がするので取り敢えずは実装しな
      い事にする。

    * done: wiki
    * done: blerc

2021-12-18

  * complete: コマンド名に䞀臎しない globchar が含たれるず゚ラヌメッセヌゞ [#D1716]

    '*' を含む alias を定矩するず failglob のメッセヌゞが線集䞭に珟れる。ずいう
    か、これは alias に関係なく今迄にも発生しおいた問題だった様だ。これは別項目
    で凊理するべき問題の様に思われる。

    | bash-completion が有効になっおいる時に起きる問題の様である。然し、䞀方で、
    | ble.sh が有効でない時には特に問題は生じない。ずいう事は bash が
    | bash-completion を呌び出す時にはその問題を自然に回避しおいるずいう事だろう
    | か。調べる。
    |
    | ? 䜕凊から゚ラヌが生じおいるのか?
    |
    |   うヌん。そもそも bash-completion が呌び出されおいるのか怪しい気がしおき
    |   た。__load_completion を調べおみる事にする。
    |
    |   ble/complete/progcomp/.compgen の stderr を朰したら問題が発生しなくなった
    |   ので、bash-completion が悪かった蚳ではなかった。
    |
    | ? bash から呌び出された時ずの違いは䜕か?

    これは分かった。progcomp/.compgen は最初の単語 (コマンド名) が quote 枈みで
    ある事を想定しおいた。bash-completion などの関数を通しお補完が実行される時
    には確かに compline-rewrite-command によっお quote された単語に眮き換えられ
    おいたが、䜕も補完蚭定が芋぀からなかった時の芏定の progcomp/.compgen 呌び出
    しに察しおは、qcmds ぞの曞き換えが実行されおいなかった。その曞き換えを実行
    する様に修正した (既定の補完は alias 展開する前の物に察しおなので、初回の
    qcmds を別に保存しおおく事にした)。

  * complete (source:command): quote しおいおも alias が候補ずしお生成されおいる [#D1715]
    その為に、menu の䞭で゚ラヌ着色されおいる。

    うヌん。特に自分で alias を生成しおいる蚳ではなくお compgen -c -- s 等の時
    点で alias が生成される様だ。䞀方で、 compgen -c -- "'s'" 等ずするず、䜕も
    生成されなくなっおしたうので alias を陀倖した生成にする事は難しそうである。

    曎に compgen -c は expand_aliases が off になっおいおも alias を列挙する様だ。

    䞀方で、for 等の keyword はどの様に刀定しおいるのだったか。うヌん。
    source:command で filter しおいる様だ。同じ箇所で alias のチェックもする事
    にした。

    x fixed: 実装しおみたら党お赀くなっおいる→ これは今回の線集ではなくお前回
      の commit の時点で既に駄目になっおいる。#D1714 で修正した。

    x fixed: alias は noquote を付加する必芁があるのでは? → 修正した。その他に
      も ! や [[ 等は quote しない様にする必芁がある。

    x fixed: alias が *? 等の文字を含んでいる堎合コマンド着色で゚ラヌになっおし
      たう。修正した。

      ず思ったが、考えおみれば、そもそも alias 名に䞀臎しおいる堎合には展開を詊
      みる前に alias に確定させるべきなのではないか。

  * menu-complete で 30s かかるずいう話 (2/2) yield quote-insert 高速化の詊み [#D1714]
    https://github.com/banoris/dotfiles/issues/11

    #D1710 に斌いお、蚭定を調敎すれば以前より倧分高速になるようにはしたが、それ
   でも yield の速床が気になる。別項目で yield の高速化ができないか考察する事に
   した。

    * 先ず蚈枬しおみる事にする。

      | * quote-insert をコメントアりトするず 0.63s かかっおいる。quote-insert
      |   があるず 2.24s かかっおいる。うヌん。3/4 ぐらいが quote にかかっおいる
      |   ずいう事。䞀方で、quote 䜜業を gawk 等に任せたずしお高速化の皋床は限
      |   られるし、たた、gawk が出力した結果を読み出す為に远加の凊理が必芁にな
      |   る事に泚意する。その様に考えるず gawk で quote 凊理を実斜する事に積極
      |   的な意味は芋いだせないかもしれない。
      |
      | * 曎に yield 関数の䞭身たで考えたらより高速化できる可胜性もある。→然し
      |   文字数を数えたり等の操䜜が入っおいるので solaris などの駄目な awk 実
      |   装で察応するのが難しい様な気がする。曎に filter 等、より様々の事を実
      |   装する必芁が生じる気がする。
      |
      |   念の為 filter を抜いおみるず 2.02s なので、filter のチェックに 0.22s
      |   かかっおいる。quote-insert にかかっおいるのが 1.61s だった。残りは
      |   0.4s である。成皋、䞡方ずもくっ぀けたら倧分短くできるのではないかずい
      |   う気がする。
      |
      | * ずいうか progcomp ばかり高速化しおも仕方がない。党おの yield ルヌプで
      |   共通しおいる項目は高速化できるのではないかずいう気がする。䜕れにしおも

      yield loop の凊理時間の内蚳
      ------------ --------------------
      filter       0.22s (fignore, etc)
      quote-insert 1.61s
      残り         0.40s

    * awk で実装しおみお速床を比范する。

      % うヌん。詊しに実装しおみお比べるのはありかもしれないずいう皋床。そうだ
      % ずしおも gawk を呌び出すのにかかる時間を蚈枬しお、ある皋床以䞊の項目数
      % の時に呌び出す様に倉曎するのが望たしい。gawk を䜿っおすら重いずいう状況
      % に぀いおは䜙り考えおいない。ずいうかそもそも '' 等で補完を開始しようず
      % する事が間違っおいる様な気もする。

      done: 先ずは各皮の escape を awk で実装する必芁がある。

      →最終的に awk で色々 quote-insert する所たで実装できた。然し、awk の内郚
      で test -f file 及び test -e file を刀定する事ができないので、必芁になる
      堎合 (progcomp) の堎合には予めテストを実行しおからそれを awk に枡す事にす
      る。

      倖偎でファむル刀定する必芁がない堎合には 28ms であり、ファむル刀定する必
      芁がある堎合には 129ms である。曎に読み出しの速床も考える必芁がある。然し
      そうだずしおも速床的には十分速い。将来的には沢山の項目数の堎合には awk に
      移行する事に぀いお考えお良いのではないかずいう気がする。

    * 珟圚の quote-insert の実装も、倖偎でできるだけ準備をしおから、䞭では最䜎
      限の刀定だけで行ける様に修正する事ができる筈。

      その様にした方が珟圚の awk による実装ずも近くなり、䞡者の䞀貫性を保ちやす
      くなる筈である。

      →実装した。然し倧しお高速化しおいない。元々 2260ms 皋床だったのが 2090ms
      皋床に枛少しただけである。぀たり bottleneck はやはり其凊ではないずいう事
      だろうか。

      うヌん。escape-for-bash-specialchars が遅いずいう事の気がしおきた。ずいう
      のも ' を入力した状態で補完するだけで 1600ms にたで枛少する為。

    * done: refact ble/complete/action/util/ ble/complete/action/? ず思ったが色々
      の関数が既にある様だから、取り敢えずは珟状を維持する事にする。ず思ったが、
      やはり珟圚の action/inherit-from は action#inherit-from に改名しお、代わ
      りに action/util/ を action/ に曞き換えた。

    * done: 候補の数で awk を䜿うか䜿わないかを切り替える様にしたい

      ファむル数    埓来   nawk    mawk    gawk
      100           24ms   10ms    10ms    12ms
      200           43ms   16ms    17ms    19ms
      500          106ms   35ms    39ms    41ms
      1k           212ms   67ms    76ms    78ms
      2k           424ms  128ms   147ms   150ms
      5k          1092ms  319ms   360ms   364ms
      10k         2094ms  626ms   720ms   723ms

      適圓に 500 項目以䞊の時に awk に切り替える事にした。
      䜆し、cygwin/msys の堎合には閟倀は 2k にたで匕き䞊げる事にする。

    * 䞀般の堎合に適甚しようずするず改行の取り扱いに気を぀けなければならない。

      ずいうか progcomp の堎合だっお \ を䜿っお候補を繋ぐ事ができたずいう可胜性?
      ず思ったが詊しに compgen -f を実行しおみたが、改行が含たれるファむル名を
      そのたた出力しおしたっおいお、別々のファむル名の時ずの区別が぀かない実装
      になっおいるので、progcomp に限っおは䜙り気にしなくお良い様に思われる。

      䞀方で䞀般の堎合には awk が \0 区切りに察応しおいるかどうかで実装方法が倉
      わっおくるのではないかずいう気がする。曎に bash の version に䟝存しお効率
      的に読み取る事のできる圢匏も倉わっおくるだろう。

      取り敢えずは progcomp の堎合だけ意識しお実装しお、改行に関しおは泚釈を加
      えるべきだろうず思われる。

      * 改行が含たれおいる可胜性があるかどうかの情報を枡しおそれに応じお刀定す
        る様に倉曎した。今、quote-insert.batch は終了ステヌタス 1 を返した時に
        䜕もしない事に泚意する。

      * 曎に quote-insert.batch が䜿える所ではできるだけ䜿える様にする→取り敢
        えず沢山の候補が生成されそうな堎所は党お yield.batch に切り替える様にし
        た。

    * done: user-input で途䞭キャンセルできる様にする必芁がある。
      →conditional-sync 経由で呌び出す様に倉曎した。動䜜確認した。

    * done: xpg4 の sed でちゃんず "\\\\\\\\&" 眮換が期埅通りに動くかどうか確認
      する必芁がある → "\\\\&" ずしなければならない様だ。その様にした。

    x fixed: コマンド候補が党お赀く着色されおいる

      → conditional-sync にした時点で駄目になっおいる様だ。うヌん。
      出力結果を確認しおみたがファむルは空である。䜕も出力しおいない。
      A & で起動したコマンドは、どうも倖偎でリダむレクトした fd から読み出せおいない様だ。
      A の内郚でリダむレクトする様に倉曎したら動く様になった。

    2021-12-22 远加修正。"continue 0" ずいう文が混入しおいた。

  * ble/string#escape-for-bash-specialchars で HT を SP HT に眮換しおいるのは䜕故? [#D1713]
    manu-complete 最適化䞭に気づいた事。

    e344a156 ble-core.sh (Koichi Murase     2018-08-06 13:43:50 +0900 1135)     a=$'\t' b=$' \t'   ret=${ret//"$a"/$b}
    9629b9dd lib/core-complete.sh (Koichi Murase 2018-08-05 15:28:25 +0900   75)     a=$'\t' b="\\$a"   ret=${ret//"$a"/$b}

    うヌん。これを芋るず e344a156 のリファクタリング時のミスの様な気がする。該
    圓する項目は #D0719 であるが、たった䞀行で枈たせおいるずいう事を考えるずこ
    れは本圓にミスであるず刀定しお良い。ずいうかそもそも元々の実装自䜓が間違っ
    おいる。

    改行ず同様に $'\t' に眮き換えるずいう手ず、恐らく珟圚・以前の実装で意図しお
    いたず思われる \[TAB] ずいう圢に眮き換えるずいう二぀の方針が考えられる。本
    来意図しおいた筈の埌者にする事にする。

  * main: root ナヌザヌで入るず the owner of '' is not correct ず衚瀺される (reported by zim0369) [#D1712]
    https://github.com/akinomyoga/ble.sh/issues/163

    _ble_base_run か _ble_base_cache のどちらかの初期化の途䞭で、ディレクトリ所
    有暩の問題が起こっおいる。それから゚ラヌメッセヌゞにも問題がある。うヌん。

    * 再珟の詊み

      取り敢えず手元で再珟できないかどうかは詊しおからより詳现を求める事にする。

      うヌん。root ず user の䞡方にむンストヌルしたずしおいるがどのように入れた
      のだろうか。取り敢えず root の home ディレクトリをチェックするべきなのだ
      ろうか。うヌん。色々やっおみたが特に問題は生じおいない様だ。

      或いはむンストヌルの方法に問題があるのかもしれない。ナヌザヌから root の
      .local/share/blesh にむンストヌルした等。ず思ったが、これだずむンストヌル
      できない筈である。䞀方で、root からナヌザヌのディレクトリにむンストヌルし
      た可胜性? 然しそれだず root user に switch した時に゚ラヌメッセヌゞが出る
      ずいう珟象にはならない。

    分からないので取り敢えず゚ラヌメッセヌゞを修正しお䜕が衚瀺されるか問い合わ
    せる事にする。

    2021-12-19 分かった。'/run/user/1000/blesh' である。぀たり、XDG_RUNTIME_DIR
    が su する前のナヌザヌのディレクトリのたたになっおいるのが問題である。

  * complete: FIGNORE で党おが棄华されるバグ (reported by seanfarley) [#D1711]
    https://github.com/akinomyoga/ble.sh/issues/162

    これは極めお単玔なバグだった。そもそも実は FIGNORE は今たで党く動いおいなかっ
    たず思われる。

2021-12-16

  * menu-complete で 30s かかるずいう話 (1/2) construct-page のバグ (reported by banoris) [#D1710]
    https://github.com/banoris/dotfiles/issues/11

    確かに ble.sh は bash で曞かれおいるし遅いが其凊たで遅いかっただろうか。自
    分の手蚱でやっおみた所、確かに bash-completion を有効にしおいるず 10k files
    に察しお 15s かかっおいる。調べおみるず良いだろうずいう気がする。

    ble/complete/progcomp/.filter-and-split-compgen は 0.1s

    うヌん。_minimal 自䜓の呌び出しが 4 秒かかっおいる。ble.sh の倖では 0.2s な
    のでこの違いは倧きい。䞀䜓䜕凊から違いが出おくるのだろうか。

    % →実際に _minimal の時間を蚈枬しようずしたら _minimal 自䜓はそんなに遅く
    % なかった。実は、それよりは ble/util/assign の読み取りが遅いのではないかず
    % いう疑惑。ず思ったらそうでもなかった。_filedir が実際に遅くなっおいる。

    * 䜕やら _filedir が勝手に眮き換わっおいるず思っおいたら
      /etc/bash_completion/redefine_filedir ずかいう倉なファむルによっお実装が
      眮き換わっおいた。うヌん。おかしな事をする物である。

      叀い実装では while read -r line; do done で䞀぀ず぀行を読み出しおいるので
      遅かった。これを眮き換えたら _minimal の呌び出しにかかる時間はほが 0 になっ
      た。然しそれでもやはり 13s ぐらいは埅たされる様である。

    * その他の bottleneck は、2) yield ルヌプが遅い、3) 䞀時ペヌゞに沢山衚瀺し
      ようずしおいる為に menu 配眮の蚈算が遅いずいう事がある。

      yield ルヌプに関しおはどうしようもない。絞り蟌みをする為には結局事前に実
      行しなければならないので、スキップする事はできない。ずするず、awk 等を䜿っ
      お加速するずいう事も考えられるが、凊理を重耇しお実装するのも面倒である。
      それでも堎合によっおはそれを考えおも良いのかもしれないずは思う。

    * menu 配眮で初期化遅延が効いおいなかったバグ

      | menu 配眮に関しおもなかなか難しい所がある。C蚀語で曞ければそれで終わりな
      | のかもしれないがそれも難しい。或いはより高速な Bash スクリプトのむンタヌ
      | プリタに぀いおも考えおみるが、そもそも制限された Bash の機胜を䜿っお実装
      | しおいるので䞍自然な実装になっおいる。劇的に早くなるずは思えないのが珟状
      | である。
      |
      | 実際に枬定する。
      |
      | [1639646039.075008]compgen:1
      | [1639646039.076485]compgen-helper:2 <_minimal echo  echo>
      | [1639646039.101227]compgen-helper:3
      | [1639646039.111599]compgen:2
      | [1639646039.111884]compgen:3
      | [1639646039.139718]compgen:4
      | [1639646039.139801]compgen:5
      | [1639646041.294533]compgen:6
      | [1639646041.464829]menu#construct:1
      | [1639646049.977139]menu#construct:2
      |
      | 1. compgen 呌び出しは珟圚は 0.04s
      | 2. filter-and-split は 0.028s
      | 3. yield に 2.15s かかっおいる
      | 4. construct-page には 8.5s かかっおいる。
      |
      | やはり䞀番重いのは construct-page である。
      |
      | complete_menu_style や complete_menu_maxlines を蚭定しお1ペヌゞに衚瀺する
      | 項目の数を制限するしかない気がする。念の為、1ペヌゞに衚瀺する項目の数を制
      | 限した時に改善するかどうか確認はしおおく
      |
      | →うヌん。党然改善しおいない。8.3s である。もしかするず党項目スキャンしお
      | いる可胜性がある?
      |
      | 調べおみた所、䜕ず党項目を凊理しおいる。しかも
      | .measure-candidates-in-page の時点で党お凊理しおいお、これが最も時間を消
      | 費しおいる。

      結局 menu 配眮に関しお頁毎に必芁なだけ trace を実行しおいる぀もりだったのが、
      実は毎回党項目に察しお配眮蚈算を実行しおいたずいう事が刀明した (しかしそう
      だずしおも、耐えられる速床の範囲だったずいうのは驚きではある)。

      以䞋の ncell_eol の匏を間違えおいる。

      | 43bb0749 lib/core-complete.sh (Koichi Murase 2019-03-23 21:41:19 +0900  119)     if [[ $menu_style == align-nowrap ]]; then
      | 43bb0749 lib/core-complete.sh (Koichi Murase 2019-03-23 21:41:19 +0900  120)       # Note: nowrap が起こるのはすでに wcell == max_wcell の時なので、
      | 43bb0749 lib/core-complete.sh (Koichi Murase 2019-03-23 21:41:19 +0900  121)       # 改行凊理が終わった埌に wcell が倉化するずいう事はない。
      | 43bb0749 lib/core-complete.sh (Koichi Murase 2019-03-23 21:41:19 +0900  122)       local x1=$((ncell%line_ncell*wcell))
      | 43bb0749 lib/core-complete.sh (Koichi Murase 2019-03-23 21:41:19 +0900  123)       local ncell_eol=$(((ncell+line_ncell-1)/line_ncell*line_ncell))
      | 43bb0749 lib/core-complete.sh (Koichi Murase 2019-03-23 21:41:19 +0900  124)       if ((x1>0&&x1+w>=cols)); then
      | 43bb0749 lib/core-complete.sh (Koichi Murase 2019-03-23 21:41:19 +0900  125)         # 行送り
      | 43bb0749 lib/core-complete.sh (Koichi Murase 2019-03-23 21:41:19 +0900  126)         ((ncell=ncell_eol+cand_ncell))
      | 43bb0749 lib/core-complete.sh (Koichi Murase 2019-03-23 21:41:19 +0900  127)       elif ((x1+w<cols)); then

      元を蟿るず以䞋の様に䞀番最初に頁を実装した時から間違っおいたずいう事の様だ。

      | commit a488e0193927b78ea2066c5d3118ff5a38c6872c
      | Author: Koichi Murase <myoga.murase@gmail.com>
      | Date:   Thu Mar 7 18:29:51 2019 +0900
      |
      |     complete: support pages of menu/style:{align,dense}
      |
      | a488e019 lib/core-complete.sh (Koichi Murase 2019-03-07 18:29:51 +0900 2117)     if [[ $menu_style == align-nowrap ]]; then
      | a488e019 lib/core-complete.sh (Koichi Murase 2019-03-07 18:29:51 +0900 2118)       # Note: nowrap が起こるのはすでに wcell == max_wcell の時なので、
      | a488e019 lib/core-complete.sh (Koichi Murase 2019-03-07 18:29:51 +0900 2119)       # 改行凊理が終わった埌に wcell が倉化するずいう事はない。
      | a488e019 lib/core-complete.sh (Koichi Murase 2019-03-07 18:29:51 +0900 2120)       local x1=$((ncell%line_ncell*wcell))
      | a488e019 lib/core-complete.sh (Koichi Murase 2019-03-07 18:29:51 +0900 2121)       local ncell_eol=$(((ncell+line_ncell-1)/line_ncell*line_ncell))
      | a488e019 lib/core-complete.sh (Koichi Murase 2019-03-07 18:29:51 +0900 2122)       if ((x1>0&&x1+w>=cols)); then
      | a488e019 lib/core-complete.sh (Koichi Murase 2019-03-07 18:29:51 +0900 2123)         # 行送り
      | a488e019 lib/core-complete.sh (Koichi Murase 2019-03-07 18:29:51 +0900 2124)         ((ncell=ncell_eol+cand_ncell))
      | a488e019 lib/core-complete.sh (Koichi Murase 2019-03-07 18:29:51 +0900 2125)       elif ((x1+w<cols)); then

      取り敢えずこれに぀いおは修正した。

    * complete_menu_maxlines を蚭定したらもっず高速になるか?
      →恐らく高速になる。

      * 4.0s _filedir       -> 0.04s
      * 2.2s yield          -> -----
      * 8.5s construct-page → 2.50s (これは maxlines を蚭定する事でもっず枛らせる)

      うヌん。_filedir は倖郚の問題である。たた construct-page は修正したが、党
      画面衚瀺にしおいる堎合には効果は限定される。yield に関しおはたあ、仕方が
      ないのかもしれない。䜕れにしおも construct-page の修正だけでも適甚しおも
      らっお、それで様子芋する。それでも改善しなかったら yield の高速化に぀いお
      も真面目に考える事にする。

      complete_menu_align
      complete_menu_maxlines
      complete_limit

  * complete: gawk-4.0.2 workaround (reported by Knusper) [#D1709]
    https://github.com/akinomyoga/ble.sh/issues/161

    これは gawk のバグだった。特定のパタヌンの正芏衚珟に察しお false warning を
    出す。圱響範囲が倧きいず思っお䞀぀䞀぀察策するのは困難かずも思われたが、正
    芏衚珟で問題の正芏衚珟を怜出できる気がするので、やはり個別に察策する事にし
    た。

2021-12-15

  * mandb: オプション候補生成で倉な動䜜が幟぀かある [#D1708]

    * ...] ずいう謎の項目が生成されおいる at man.d/man

      どうやら以䞋の項目から生成されおいる様子だ。

      | -m system[,...], --systems=system[,...]
      |
      |        man を含めたす。このオプションは $SYSTEM 環境倉数を䞊曞きしたす。

      うヌん。オプションを分割する時に /,\s*/ ではなくお /,\s+/ で分割する事に
      した。スペヌス無しで蚘述するずいう事は考えにくいだろう。或いは
      --arg=(hello, world) みたいになっおいる可胜性もなくはないが面倒なので考え
      ない。OK

    * fixed: declare で空の completion が生成されおいる。

      空の候補に぀いおは集玄の際に混入しおいる様だ → これは修正した。
      nodesc のオプションを集める時に name[count++] ずしおいたのを name[count];
      count++に分けた所、count を初期化しおいなかったので空文字列の添字に栌玍さ
      れる様になっおしたっおいたのが原因だった。

    * fixed: wget の man page 抜出で short option の desc が空になっおいる。
      これは man.d/man 由来である → 修正した。

  * progcolor: mandb_opts をキャッシュする様にする [#D1707]

    progcolor_optctx ず同様に。これは declare のより詳现な実装で mandb_opts を
    参照したいから。

  * refactor: mandb_opts はコマンド䞀般甚に転化しおも良いのではないか [#D1706]

    その時には cmdspec に移動しお、曎にそれを core-complete から読み蟌む様にす
    れば良い。ず思ったが help, help-usage 等は名前的には mandb_opts 専甚の物で
    ある。名前を倉曎する必芁があるかもしれない。

    或いは、help:help-usage 等 mandb 専甚のオプションはそれ専甚の配列に栌玍する?

    取り敢えず珟圚䜿われおいるオプションに぀いお敎理する。たた、将来的に䜿い
    そうなオプションに぀いおも考える。

      mandb-disable-man
      mandb-help
      mandb-help-usage
      mandb-usage

      plus-options=xxxxx
      no-options
      stop-options-at=IWORD
      stop-options-on=REX_STOP
      stop-options-unless=REX_CONT
      stop-options-postarg
      disable-double-hyphen

      加えお no-options も远加するべきかも

    →cmdspec に移動しお cmdspec_opts に名前を倉曎した。mandb 特有の項目には
    mandb- の接頭蟞を付ける事にした。

    * done: 説明を曞く

2021-12-12

  * highlight: declare のオプション名 倉数名よりも埌にあるのぱラヌ着色にするべき [#D1705]
    これは #D1704 で䞀緒に察応した。

  * complete: declare a -[TAB] でも候補が生成されおしたっおいる [#D1704]

    →調べおみた所、これは declare の匕数 (倉数圢匏) が extract-commands で抜出
    されおいないのが原因であった。匕数の皮類を調べるず ATTR_VAR である。然し色々
    ず振る舞いを調べるず ATTR_VAR はコマンドの前に぀く a=b の圢の倉数代入に䜿わ
    れおいる単語の皮類である。

    もっず調べるず declare a=b の堎合には a=b の単語の皮類はちゃんず ARGI になっ
    おいる。たた、a=b declare hello の時にも hello の単語の皮類はちゃんず ARGI
    になっおいる。぀たり、特定の条件で declare hello の倉数名が倉数代入であるか
    の様に単語登録されおしたっおいるのが原因である。

    wtype の決定経緯を調べる。ctx-command/check-word-end に入った時点で既に
    wtype == ATTR_VAR になっおいる。埓っお、word-begin の段階で ATTR_VAR になっ
    おいるのが問題である気がする。然し、check-word-begin の段階では wtype =
    CTX_ARGVX の様である。぀たり、䜕凊かで wtype が曞き換わっおしたっおいるのが
    原因ずいう事になるのだろうか。

    うヌん。分かった。ble/syntax:bash/check-variable-assignment の䞭で ARGVI 及
    び ARGEI の時には = の有無に関係なく ATTR_VAR にしおしたっおいる。これは䜕
    故だったろうか。経緯を調べる必芁がある。

    | 2f2f0eb6
    | @@ -2401,7 +2406,7 @@ function ble-syntax:bash/check-variable-assignment {
    |    # パタヌン䞀臎 (var= var+= arr[ のどれか)
    |    local suffix='=|\+=?'
    |    ((_ble_bash<30100)) && suffix='='
    | -  if ((ctx==CTX_ARGVI)); then
    | +  if ((ctx==CTX_ARGVI||ctx==CTX_ARGEI)); then
    |      suffix="$suffix|\[?"
    |    else
    |      suffix="$suffix|\["
    |----------------------------------------------------------------------
    | commit 1823c540cfe25c952fc96d8e50ae7dab712aacaf
    | Author: Koichi Murase <myoga.murase@gmail.com>
    | Date:   Mon Nov 27 23:46:09 2017 +0900
    |
    |     syntax (tilde expansion): support ordinary words with variable assignment form
    |
    | @@ -2054,6 +2112,109 @@ function ble-syntax:bash/check-tilde-expansion {
    |      ((_ble_syntax_attr[i]=ctx,i+=${#BASH_REMATCH}))
    |    fi
    | [äž­ç•¥]
    | +
    | +## 関数 ble-syntax:bash/check-variable-assignment
    | +## @var[in] tail
    | +function ble-syntax:bash/check-variable-assignment {
    | +  ((wbegin==i)) || return 1
    | +
    | [äž­ç•¥]
    | +
    | +  # パタヌン䞀臎 (var= var+= arr[ のどれか)
    | +  local suffix='=|\+=?'
    | +  ((_ble_bash<30100)) && suffix='='
    | +  if ((ctx==CTX_ARGVI)); then
    | +    suffix="$suffix|\[?"
    | +  else
    | +    suffix="$suffix|\["
    | +  fi
    | @@ -2577,51 +2760,6 @@ function ble-syntax:bash/ctx-command/.check-word-begin {
    |    return 0
    |  }
    |
    | -## 関数 ble-syntax:bash/ctx-command/.check-assign
    | -## @var[in] tail
    | -function ble-syntax:bash/ctx-command/.check-assign {
    | -  ((wbegin==i)) || return 1
    | -  ((ctx==CTX_CMDI||ctx==CTX_ARGVI)) || return 1
    | -
    | -  # パタヌン䞀臎 (var= var+= arr[ のどれか)
    | -  local suffix='=|\+=?'
    | -  ((_ble_bash<30100)) && suffix='='
    | -  if ((ctx==CTX_CMDI)); then
    | -    suffix="$suffix|\["
    | -  elif ((ctx==CTX_ARGVI)); then
    | -    suffix="$suffix|"
    | -  fi
    |----------------------------------------------------------------------
    | 7d862418 (Koichi Murase 2017-03-01 06:29:55 +0900 2580) ## 関数 ble-syntax:bash/ctx-command/.check-assign
    | be5c4616 (Koichi Murase 2015-12-23 22:09:39 +0900 2581) ## @var[in] tail
    | 7d862418 (Koichi Murase 2017-03-01 06:29:55 +0900 2582) function ble-syntax:bash/ctx-command/.check-assign {
    | be5c4616 (Koichi Murase 2015-12-23 22:09:39 +0900 2583)   ((wbegin==i)) || return 1
    | be5c4616 (Koichi Murase 2015-12-23 22:09:39 +0900 2584)   ((ctx==CTX_CMDI||ctx==CTX_ARGVI)) || return 1
    | be5c4616 (Koichi Murase 2015-12-23 22:09:39 +0900 2585)
    | be5c4616 (Koichi Murase 2015-12-23 22:09:39 +0900 2586)   # パタヌン䞀臎 (var= var+= arr[ のどれか)
    | 69bac74a (Koichi Murase 2015-12-24 21:47:15 +0900 2587)   local suffix='=|\+=?'
    | be5c4616 (Koichi Murase 2015-12-23 22:09:39 +0900 2588)   ((_ble_bash<30100)) && suffix='='
    | be5c4616 (Koichi Murase 2015-12-23 22:09:39 +0900 2589)   if ((ctx==CTX_CMDI)); then
    | be5c4616 (Koichi Murase 2015-12-23 22:09:39 +0900 2590)     suffix="$suffix|\["
    | be5c4616 (Koichi Murase 2015-12-23 22:09:39 +0900 2591)   elif ((ctx==CTX_ARGVI)); then
    | be5c4616 (Koichi Murase 2015-12-23 22:09:39 +0900 2592)     suffix="$suffix|"
    | be5c4616 (Koichi Murase 2015-12-23 22:09:39 +0900 2593)   fi
    |
    | commit be5c461693ddacd2acf581011c3decd1390641d5
    | Author: Koichi Murase <myoga.murase@gmail.com>
    | Date:   Wed Dec 23 22:09:39 2015 +0900
    |
    |     (ble-syntax:bash): special treatment of arguments of `declare'.
    |
    |     * (ble-syntax:bash): declare, typeset, local, export, alias コマンドの匕数を文法的に特別に扱う。特に配列構文 =() を蚱容する。
    |       その為に新しい文脈倀 CTX_ARGVX, CTX_ARGVI を远加する。
    |     * (ble-syntax:bash): CTX_ARGVI に察する補完候補は倉数名。等号 '=' 以降の郚分に぀いおはファむル名の補完候補を列挙する。
    |     * (ble-syntax:bash): 通垞の代入構文における配列構文の動䜜を倉曎。
    |     [以䞋略]
    |
    | +2015-12-23
    | +
    | +  * ble-syntax:bash declare 配列初期化構文察応
    | +
    | +    > * [2015-02-16] ble-syntax.sh: local a=(arr) a+=
    | +    >   これは declare や local typeset readonly 等を文法的に特別扱いしなければ察応できない
    | +
    | +    色々詊しおみた所、以䞋のコマンドの匕数で =() を特別扱いする様である。
    | +      declare readonly typeset local export alias
    | +    alias に関しおは他のコマンドず党然性質が違う様な気がするし、
    | +    export に関しおは配列の初めの芁玠しか export されない気がするが、
    | +    文法的には䞡者ずも =() の圢匏を蚱容する様である。
    | +    或いは、他にも同様の圢匏の匕数を蚱容する組コマンドが存圚するかもしれない。
    | +
    | +    (少なくずも echo などの組み蟌みコマンドや、倖郚コマンドに関しおは
    | +    匕数に =() 等ずいう物が含たれおいるず倱敗する。)

    これを芋る限りは特別扱いは ARGVX, ARGVI を導入した最初の瞬間からあった様で
    ある。特に埌付で ARGVI に察しお特別扱いを実装したずいう蚳ではなく、最初から。
    実装の経緯を芳察する限りはどうも補完で倉数名を生成させる為に特別な単語の皮
    類を割り圓おおいる様な気がする。䞀方で珟圚の実装に斌いおは、補完は特に
    wtype を参照しおいる蚳ではないのでこの様に特別に取り扱う理由もない気がする。

    * ARGVI, ARGEI の際の倉数代入で = を芁求しない振る舞いは修正する方向で考え
      る。

      x 然し、そうしたら単語着色が消えおしたった。うヌん。ARGVI 及び ARGEI の時に
        は単語着色はするべきだろうか。

        先ず文法レベルで。それから匕数レベルで。

        | うヌん。先ず初めに、文法レベルでの着色に぀いおは ARGVI だけで良い。
        | ARGEI の時には = 無しで単語が珟れたずしたらそれは単語ではないので着色し
        | なくお良い。
        |
        | そもそも文法レベルの着色をするべきなのかずいう疑問も実は存圚する。bash
        | の文法的には実は declare hello= は倉数代入になっおいるが、declare hello
        | は倉数代入になっおいないず思われる。ずいう事を考えるず文法レベルの着色
        | はするべきでない。

        匕数レベルの着色に぀いおは declare 系列専甚の着色を定矩する必芁がある。

        うヌん。ble/cmdinfo/color: ずいう名前も䜕だか埮劙な気がするが、これは埌
        でいくらでも倉曎できるので取り敢えずは実装する。既存の実装は存圚しおい
        ない様だ。ble/cmdinfo/chroma: に倉曎する。

        うヌん。ファむルを分離しようず思ったが名前はどうしたら良いだろうか
        ... やはり cmdinfo は䜕だか名前ずしお䞍自然な気がする。core-cmdinfo,

        | * core-help, core-man, core-mandb, core-info, core-whatis, core-which,
        |   これらは既存のマニュアル系のコマンドの名称を取っおきた物。
        |
        | * core-catalogue, core-manual, core-dictionary, core-book,
        |   corer-guidebook, core-map, core-cmdmap, core-reference,
        |   core-commandreference, core-cmdref (reference 系は別の意味になるので
        |   駄目), core-library, core-cmdlib, core-spelllib (library 系も別の意味),
        |   core-spellbook ... 或いはより珟実的な物に䟋えおみる等の方針。
        |
        | * core-getopt これは、実際に cmdinfo を定矩する䞻芁な圢態ずしお getopt
        |   的な方法を考えおいる事から。然し、これだけが唯䞀の定矩方法ずいう蚳で
        |   もないし、getopt は曎にその䞊の階局の枠組みに名付けたい気がする。実際
        |   には、cmdinfo の䞭に定矩する圢になるのではないかず考えおいる。
        |
        | * core-cmddb, core-database (䞀般的過ぎる), core-commanddatabase,
        |   core-cmdspec, core-commandspec, core-cmdspec

        うヌん。cmdspec の方が幟らかたしの気がするので取り敢えず cmdspec ずいう
        事にする。

        然し本圓に cmdspec に定矩するべきなのだろうかずいう疑問も残る。実は
        bash-completion でやっおいる様に contrib/cmdspec/* の䞋に個別のファむル
        ずしお定矩した方が良いのではないかずいう疑惑。うヌん。然しそうだずしお
        も取り敢えずの実隓的な実装ずしお cmdspec の䞭に色々蚘述しお API が萜ち
        着いおからファむルに分割するずいうので良い気がする。そう。それがしたかっ
        た事の気がする。

      o ちゃんず匕数レベルでの着色で倉数名着色ができおいる。

      o declare の通垞匕数の埌のオプションを゚ラヌ着色する機胜もOK

    * done: コマンドレベルで declare, etc. + alias の着色を行う。
      うヌん。alias に぀いおは今回は察応しなくお良い。

    * done: 倉数代入も extract-command で列挙する。䜆し、extract command に圱響
      がない様にしなければならない。

    x fixed: もう䞀぀の謎は a=b declare a= の圢匏の時には倉数代入が怜出されない
      ずいう事。そもそも、倉数名着色だっお無効化されおいる。これは䞀䜓どういう
      事だろう

      調べおみるず "a=b declare@ " の時には @ の䜍眮に stat ARGX が眮かれおいる
      様である。䞀方で、 "declare@ " の堎合には @ の䜍眮には stat は眮かれおい
      なくお、代わりにその次の䜍眮に ARGVX が眮かれおいる。この振る舞いは他の通
      垞コマンド (echo など) でも同様であった。CMDXV の特別な振る舞いずいう事な
      のだろうか。

      →うヌん。正にそれを実行するコヌドが check-word-end にある。これはどうい
      う事だろうか。→分かった。どうもこれは倉数代入の盎埌にはキヌワヌドは来な
      いずいう事を逊成する為のコヌドの様だ。昔は単に ctx=ARGX を蚭定しお抜けれ
      ば良かったが、その埌の耇雑化で只単に ARGX を蚭定すれば良いずいう蚳ではな
      くなった。各文脈に応じた耇雑な凊理を CMDXV の時にも実行する必芁がある。

    o ok: declare a -[TAB] での候補生成の抑制は動いおいる。

    幟぀か残っおいるのを修正する必芁がある。

    * ok: global -- が着色されおいない。これは今確認したらちゃんず動いおいる。
      勘違いだったか或いは別の物を修正した時に䞀緒に盎ったか。

    * done: blerc, wiki, 移動: argument_error

    * done: ble/syntax/progcolor は最早 ble/progcolor で良いのではないか。そも
      そも玔粋な文法解釈から離れおきおいお、bash 特有の実装になっおいる。

2021-12-11

  * [External] bash-completion: printf -v ... [#D1703]
    https://github.com/akinomyoga/ble.sh/issues/155#issuecomment-984619516

    これは bash-completion 偎で察応するべき事の気がする。

    取り敢えず --help 察応が終われば、倉数名の補完はできないにしおも、オプショ
    ンの衚瀺ぐらいはできる様になる。printf の堎合には最初の匕数には '' を指定す
    るのが良い気がする → 取り敢えずオプションは衚瀺される様になった。

  * [External] bash-completion: better support for "test", "[" [#D1702]
    https://github.com/akinomyoga/ble.sh/issues/158

    これも bash-completion の偎で察応するべき事の気がする。
    䜆しオプションの説明に぀いおはちゃんず生成しなければならない。
    progcomp の枠組みで説明も䞀緒に生成できる仕組みがあっおも良いのではないか。

    うヌん。生成し切れおいない物は別枠で指定する? うヌん。getoptions 的仕様を確
    定する必芁がある気がする。

  * complete: [[ 及び declare の補完 (requested by EmilySeville7cfg) [#D1701]
    https://github.com/akinomyoga/ble.sh/issues/155
    https://github.com/akinomyoga/ble.sh/issues/157

    | user-customization を蚱可? 或いは自前で実装しおも良い
    |
    | うヌん。declare に関しおは a=(....) 等が含たれる堎合の取り扱いが謎だし、
    | 自前で実装する方が良いのではないかずいう気もする。
    |
    | 䞀方で [[ に぀いおはナヌザヌが指定できる様にする? ず思ったが、それでも今床
    | は [[ (a == b && c== d)||x == y ]] 等の様な入れ子構造があった時に、ナヌザヌ
    | に枡すコマンドラむンを構築するのが倧倉である (実は珟状の実装だずそんなに難
    | しくないかもしれないが、歀凊は将来的に改修する予定なので珟段階で䞋手にナヌ
    | ザヌむンタヌフェむスを提䟛するず、将来匄る時に面倒な事になる)。たた'[[' '('
    | 'a' '==' 'b' '&&' ... ずいう具合に分割するのが自然だず思われるが、䞀方で勝
    | 手に空癜を挿入しおも良いのかだずか色々よく分からない (たあこれは実装を詳し
    | く芳察しお調敎すれば枈む話ではある)。
    |
    | うヌん。結局、どちらも自前で実装した方が良い様に思われる。これは仕方がない
    | ので、取り敢えず自前の実装を提䟛する事にしお customization に぀いおは諊めお
    | 貰う事にする。

    将来的に自前で実装する事にする。

    取り敢えず declare 系統は簡単な気がするので先に実装するこずにする。

    * done: 珟圚 source:option に斌いお ["--" 以降のオプションを解釈しない] や
      [非オプションよりも埌のオプションを解釈しない] などの各コマンドの性質はほが
      ハヌドコヌドされおいる。これを倖郚から指定できる様にする。

    * ok: ble/complete/mandb/get-opts ... alias 展開もする? → refactor しお、
      alias 展開なども党お凊理しお mandb が芋぀かった時点で初めお get-opts を呌
      び出す様に倉曎した。

    * done: 曎に $_ble_complete_option_chars もちゃんず様々の箇所で䜿う様にする。
      →これは元々より緩いのを郚分的に厳しくしおいるだけなのでそんなに気にしな
      くお良い様に思われる。

    x fixed: "declare [TAB]" で補完が開始されない。

    * done: +o に関しおは䞀番最埌の集蚈時に説明を適甚に生成する。

    * done: mandb: 珟圚 + で始たるオプションは積極的に抜出しおいない。これにも察応したい。

      * ble/complete/mandb:help/generate-cache (--help|--usage 抜出甚) に぀いおは察応した。

      * generate-from-man は未だ → 察応した。埮劙な修正しかしおいないが倚分これ
        で倧䞈倫。

    x "top -[TAB]" が正しく動䜜しない。

    取り敢えず declare に぀いおは倧䜓完了した。

    [[ に関しおは文法も考慮したより正しい補完をすぐに実装するのは難しいが、取り
    敢えずオプションだけは生成できる様にするのが良い。

    * 文脈だけでも確認する → 郚分的には察応しおいたみたいである。ファむル名を
      補完しおいた。其凊に source:option を远加する。
    * それから空文字列からの補完の蚭定が欠けおいたのでそれも远加する。
    * mandb_opts に耇数の help=... を蚘述できる様にする。
    * オプション抜出で -a, --file=<...> や -b (this is test) 等の圢匏の物にも察
      応した。

  * complete: 沢山 quote が発生する堎合には '' で囲むべきなのではないか [#D1700]

    然しこれだず、䟋えば 'a b c' ず 'alpha' ずいうファむルがあった時に前者は 'a
    b c' を生成しお、校舎は alpha を生成する事になり、共通䞀臎郚分がなくなっお
    したう。共通䞀臎郚分をちゃんず求める為には、候補によらない quote の方法に頌
    らざるを埗ない。そうするず、 a' b c' 等の様な䞍栌奜な物になっおしたうずいう
    気がする。

    或いは最埌の挿入時に、COMPS= の時に挿入文字列を修正するずいう事も可胜かもし
    れない。

    うヌん。今たでの実装を芋るず ACTION/complete で suffix を修正はしおいるが、
    挿入文字列本䜓 insert を倉曎しおいる䟋は芋圓たらない。然し、呌び出し偎の実
    装を芋る限りは insert を自由に取り替えおも問題は無いように芋える。ずいうの
    も insert 自䜓が、determine-common-prefix によっお動的に生成されおいるから
    である。特に COMPS= だった時によりコンパクトな衚珟に倉曎するずいうのは十分
    に考えられる凊眮である。

    実装しおみた。良い。眮き換える時に違和感があるかもしれないず思ったが、実際
    やっおみるず "絞り蟌み甚の衚珟" が最終的なコンパクトな衚珟に切り替わる瞬間
    ずいうのは気持ちの良い物である、ずいう感じである。

    * done: もう少し積極的になっおも良いのではないか。䟋えば / や = の盎埌から
      補完を開始した堎合等にも適甚しお良いのではないか → 察応した。

    x fixed: requote を実装したら頭の悪い auto-complete が衚瀺されおいる

      cd tmp/filename_contains_symbols/'() () [] directory'/ [tmp/filename_contains_symbols/\(\)\ \(\)\ \[\]\ directory]

      これは bash-completion がなくおも再珟する珟象である。うヌん。
      auto_complete の候補衚瀺に斌いお ACTION/complete で insert が倉曎されない
      ずいう事を仮定しおいるのかもしれない。

      うヌん。ACTION/complete 前の状態を芋るず以䞋の様になっおいる。
      COMPS="tmp/filename_contains_symbols/'() () [] directory'/"
      insert="tmp/filename_contains_symbols/\\(\\)\\ \\(\\)\\ \\[\\]\\
      directory" ACTION=file

      分かった。insert が COMPS を prefix ずしお保持しおいないのが原因である。
      然し、䜕故その様な事になっおいるのだろうか。どうしたらこの様な候補が生成
      されるのだろうか。本来は COMPV が共通しおいる筈だから陀倖されるのではない
      のか。

      →䜕故この様な事になっおいるか分かった。その実、この補完候補は単語を短く
      する (末尟の / を陀去する) 事を提案しおいるのである。なので、遡った曞き換
      えずなっお quote が保持されないずいう圢になっおいるのである。

      うヌん。遡った曞き換えの時にはどうせ党䜓が眮き換わるのだず思えば、やはり
      党䜓を requote しおしたっおも良いのではないか?

    x fixed: そもそもスラッシュが陀去される時点で倉なのでは? どうやっお候補が生
      成されおいるのだろうか → construct-ambiguous-pattern が誀っおいた。今た
      でに予期せず遡っお眮き換えが起こったりしおいたが、それの原因の䞀端は歀凊
      にあるのかもしれない。

  * README: 䞀぀のキヌで耇数の widget を呌び出す方法? (motivated by michaelmob) [#D1699]
    https://github.com/michaelmob/portable-config/commit/49f9566afd8b62d47a090328104ad803962e6d3f

    説明を曞いた。蚭定䟋の動䜜確認もした。

  * bind: "" で囲たれおいない keyseq \C-l を解釈できない (motivated by cmplstofB) [#D1698]
    https://github.com/cmplstofB/dotfiles/blob/master/_dffiles/.config/bash/bashrc#L170-L172

    うヌん。bash の振る舞いを色々調べおみた所、"" で囲たれおいない時にはやはり
    完党には解釈しないが、\C-x 等の圢の時は解釈できる様だ。

    * \C-x\C-y の時には \C-y ず解釈される。
    * xyz の時には x ず解釈される。
    * \a も \ ず解釈される。
    * \C-nop は \C-n ずなる。
    * \C-xC-y は C-y ずなる。
    * \C-axC-b は C-b ずなる。
    * helloC-b も C-b ずなる。
    * helloC-x,TAB も C-x ずなる。
    * C-xTAB も C-x ずなる。
    * TABC-x も C-x ずなる。
    * BC- は C-@ ずなる。

    ぀たり 最埌の "C-文字" が採甚される?

    * C-M-a および M-C-a は \201 ずなる。
    * C-aalpha-beta は C-b ずなる。
    * \C-a\M-c は \203 である。
    * panic-trim-c は \204 である。

    ぀たり、最初に - で split しおそれから評䟡しおいる。

    * C-- は C-@ になる。
    * C--x は C-x になる。
    * - は抑々指定できない (bind に察するオプションず解釈されおしたう)。
      inputrc に入れたら恐らく C-@ になるのだろうずいう気がする。

    取り敢えず bash ず同様の振る舞いになる事を確認した。

  * util (cursor-state): tmux や screen の䞭では pass through シヌケンスを甚いる? (motivated by cmplstofB) [#D1697]
    https://github.com/cmplstofB/dotfiles/blob/3e41ac47f47cc7788215409a5c3f26635f02d6a0/_dffiles/.config/blesh/blerc#L193

    tmux: \ePtmux;%s\e\\ (䞭に含たれる \e は二重にする)
      たた tmux; の郚分は存圚しなくおも良い様である (https://gist.github.com/saitoha/4723390)
    screen: \eP%s\e\\

    察応した。

    * done: 本来は倖偎の端末の察応状況に応じお _ble_term_Ss を送るべきの気がする。

      | 然しそうするずナヌザヌ蚭定たたは terminfo の _ble_term_Ss ずどちらを優
      | 先するべきなのかずいう問題が生じる。うヌん。実質的に _ble_term_Ss は察
      | 応しおいるずしたら䞀意なので、有限文字列かそうでないかだけが問題である。
      | だずすれば、ble.sh の偎で倖偎の端末が Ss に察応しおいるず刀定したならば、
      | それに察応するシヌケンスを送り぀けおしたっお問題ない気がする。

      _ble_term_Ss が空で端末multiplexerの倖偎の端末が察応しおいるず刀断できる時、
      独自の刀断で倖偎の端末の察応する DECSCUSR を pass through で送信しお良い。

      Note: _ble_term_Ss が空でない時には既に倖偎に pass through で送り぀ける様に
      なっおいる。䜆し、_ble_term_Ss に蚭定された倀を尊重する。ナヌザヌが奜みで蚭
      定しおいるかもしれないので。

      →倖偎の端末情報の取埗も実装した。任意の階局だけ入れ子になった端末マルチ
      プレクサでもちゃんずカヌ゜ル圢状の倉曎が䌝播する様になった。

  * edit: self-insert の振る舞い [#D1696]

    * 䞀番最埌のキヌを挿入するべき。珟圚は䞀番最初のキヌを挿入しおいる。
    * C-l 等、察応する制埡文字が存圚する物に぀いおは単に ctrl を倖すのではなくお、その元々の文字に埩元するべきである。

    或いは CHARS を盎接挿入するべき? → CHARS を確認したが歀凊には escape
    sequence の文字列が入っおいるずいう事の気がする。うヌん。䜕れにしおも
    fallback なので気にしなくお良い様な気がする。

    * 類䌌の物が実は幟぀かある。isearch や auto_complete で読み出す郚分。
      他にも _ble_decode_MaskChar や KEYS[0] を参照しおいる箇所は確認するべきである。

    o bind '"\C-t\C-l":self-insert'
    o ble-bind -f 'C-t right' self-insert

  * wiki: C-BS に察する binding に぀いお蚘述した (found by banoris) [#D1695]
    https://github.com/banoris/dotfiles/commit/f36b396c8de18159e9b5cf23974f789e3766d8ba

2021-12-08

  * complete: bind -[TAB] で bash-completion がオプションを生成しおくれない [#D1694]
    ble.sh の倖偎ではちゃんず生成しおくれおいる。

    これは分かった。䞊曞きしおいる builtin が --usage オプションに察応しおいな
    いのが原因。ずいうか unrecognized option ず衚瀺する時に、゚ラヌメッセヌゞず
    しお usage を出力しおいお、それに埓っお usage が出力されおいるのであった。

    うヌん。これに察しおはどの様に察凊するべきだろうか。぀たり、bash-completion
    は敢えお誀った甚法でコマンドを呌び出しおその結果を解析しおいる。䞊曞きする
    builtin は誀った甚法に察する゚ラヌ時の振る舞いに察しおも同様に振る舞う必芁
    があるのだろうか?

  * mandb: --help から読み出し? [#D1693]
    https://github.com/akinomyoga/ble.sh/issues/158

    少なくずも builtin に関しおは (䞀郚を陀き) --help を䜿っおも良いのでは?

    bash-completion で --help を呌び出しおいる物に関しおは --help を参考にしお
    も良いのではないかず思われる。_parse_help 蟺りに hook しおしたえばこちらの
    物である。

    * ずいうか、--help を䜿っおも良いコマンドのリストを contrib に保持しおも良
      いのではないかずいう気がする。

    * うヌん。bash-completion の _parse_help に hook しお、_parse_help が呌び出
      されたらそれに察応するオプションを䜿っお db を構築しようずも思ったが、こ
      れだず bash-completion が呌び出される迄は曎新されない。

      それよりは自前で --help が䜿えるコマンドの䞀芧を保持しおいた方が良いので
      は? ず思ったが、それだず --help を呌び出すのに -h を䜿うコマンドや '/?'
      を䜿うコマンドなど、コマンド毎の倉化を管理するのが面倒である。

      それよりは bash-completion 経由で必芁な時に情報を読み取る方が良い?

      ず思ったが、bash-completion で耇数の異なるオプションで _parse_help を呌び
      出した時に、どの様にキャッシュを統合するのかずいうのが問題である。そもそ
      も man ずの統合でも問題になる。bash-completion を呌び出す前の時点で man
      から呌び出しおキャッシュを䜜っおしたうず以埌それを䜿う様になっおしたう。
      なので、bash-completion で _parse_help を呌び出した時に man & --help で再
      生成しなければならないのではないだろうか。或いは、man から生成されたデヌ
      タず --help から生成したデヌタは別々に管理する事にしお、埌でそれを統合す
      るずいう圢にするのかもしれない。その時には、_parse_help の他に
      _parse_usage だずか或いは _parse_help の異なるオプションの堎合に぀いおも
      党お統合する必芁がある。

    * man ず --help のどちらを優先させるべきか?

      | かなり面倒である。埌、man による説明ず --help による説明のどちらを優先さ
      | せるべきなのかずいう問題も生じる。
      |
      | o man の方が詳しい説明がある?
      |
      | x 或いは --help の方が簡朔な説明になっおいるから menu の desc に衚瀺する
      |   のに適しおいる?
      |
      | x man 日本語は叀い事があるのでコマンドの --help の方が良い?
      |
      | o 逆にコマンドには盎接日本語の説明が察応されおいなくおも man では察応され
      |   おいるずいう事があるのではないか? ず思ったが逆のパタヌンもあるだろうし
      |   䞀抂には蚀えない。
      |
      |   man の方は単にファむルを甚意すれば良いだけなので察応は簡単である。䞀方
      |   で、翻蚳量が倚いずいう芳点で --help よりは察応が遅れおいるのではないか
      |   ずいう考え方もできる。
      |
      |   䞀方で --help の方の日本語察応に぀いおは、そのコマンドが locale に䟝存
      |   しお振る舞いを倉えなければならないので、そういう意味で察応が遅れおいる
      |   可胜性はある。特に python や go や rust 等、新しい蚀語で曞かれた物に぀
      |   いおは i17n の暙準的な方法が確立しおいるのか怪しい。ずするず察応が遅れ
      |   おいるずいう可胜性があるのではないか。然し、そもそもそう蚀ったツヌルに
      |   至っおは man ですら察応しおいないかもしれない。結局分からない。
      |
      | o man から抜出した物に぀いおは倪字や䞋線等の装食が぀いおいる。--help で
      |   は装食をしおいる事は滅倚にない。あったずしおも抜出の過皋で削陀しなけ
      |   ればならない気がする。

      --help を優先させるべきの気がする。぀たり、同じオプションに関する説明があっ
        たら --help から抜出した物を優先させる。倪字等の装食に぀いおは諊めるし
        かない。

    * コマンドによっおは man を無効化する遞択肢があっおも良いのでは?

      然し、䜙分に man から生成したずしおも䜙分な遞択肢が衚瀺されるだけで、ある
      べき物が欠けるずいった圢での䞍郜合は生じない。たた、man が有甚な情報を含
      んでいなかったずしおも man から䜕も抜き出せないずいう圢になるだけの気がす
      るので気にしなくお良い気がする。

      うヌん。ず思ったが  declare や bind 等は bash のマニュアルからオプション
      を拟っおしたうかもしれないのでやはり抑制する機胜があっおも良いのではない
      か。

    * bash-completion でオプションを生成したずしおも、内郚的には _parse_help を
      呌ばない可胜性はある。そう考えるず --help を甚いるコマンドのリストを管理
      しお良い気がする。

    * todo: 存圚しないコマンドに぀いお mandb cache を生成するのは無駄なのではな
      いか。䞀応存圚チェックをしおから mandb 生成を詊みるのが良い気がする。

      然し、䜕凊かのディレクトリに入っおいるコマンドの堎合にはどうするのか?
      abc/def/hello.exe に察しお mandb を呌び出す堎合には結局 hello.exe が呌び
      出されるのではないか。

      然し、そもそも abc/def/hello.exe ずしなければ呌び出せないコマンドで普通に
      hello.exe では呌び出せない物が、man の䞭に説明があるずも考えにくい。ずい
      う事を考えるず、mandb はやはり存圚するコマンドに察しおだけ生成すれば良い
      気がする。

    [方針]

    * done: 存圚しないコマンドに察しおは mandb キャッシュは生成しない。

    * <del>man は垞に有効。</del>

    * done: それずは別に --help を䜿えるコマンドのリストを保持する。printf 等は
      その最たる䟋。man を抑制するリストも甚意する。うヌん。リストよりは
      ble/set# の方が良いのかもしれない。うヌん。ble/gset は実装しおいない。寧
      ろ ble/gdict の方が良い気がする。其凊に opts 方匏で色々栌玍できる。

    * done: _parse_help 及び _parse_usage に trap する。呌び出し方に応じお異な
      るファむルに保存する。その埌で、既存の個々のキャッシュ (man, help, usage,
      ...)  を纏めお統合キャッシュを再生成する。

      Note: _parse_help は必ずしも補完したいコマンド名に察しお呌び出される蚳で
      はない。䟋えば gcc に぀いおは prefix/share/libexec/cc1 的な物に察しお
      --help が呌び出される。

      → _parse_usage をしおもオプションの䞀芧が取埗できるだけで説明を生成でき
      る蚳でもない。ずいう事を考えれば、_parse_usage には察応しなくお良い気がする。

    * done: desc が䞀぀もない堎合には desc にする必芁はないのではないか。

    * done: ず思ったが _parse_usage からオプション匕数を取るか取らないか皋床の
      情報は抜き出せるような気もする。実装した。取り敢えずは動いおいる様な気が
      する。

    * fixed: hash-pjw の実装が怪しい

    * done: help 解析で -a, --aaaa=X は -a X, --aaaa=X に翻蚳する必芁がある。

2021-12-06

  * highlight: for の第䞀匕数のファむル名着色はしない。倉数名着色はする [#D1692]

    for - の word highlighting で option を陀倖。ずいうか for の highlighting
    を普通のコマンドずしお凊理しおいるのはおかしい。

    for - in の゚ラヌ着色は - だからしおいるず考えおいたがそうではなかった。唯
    単に for 文が䞍完党であるこずによる゚ラヌ着色だった。ずいうか for の第䞀匕
    数は倉数名に合臎しない物を指定した時にぱラヌ着色になる様にするべきである。

    うヌん。どうやら for の倉数名の郚分は here-document の word ず同じで、切り
    出しは文法的に行われる物の、実際にはコマンド眮換もクォヌト陀去も䜕も解釈さ
    れずに盎接倉数名かどうかの刀定察象ずなる様である。

    取り敢えず arr[xxx] 等に察しおぱラヌ着色が出る様にしたが、その他の入れ子
    構造 (䟋えば "for $(echo var)" など) に察しおぱラヌ着色になっおいない。

  * 2021-09-08 complete: 'fo で補完するず 'for' になっおしたうが for はキヌワヌドなので駄目 [#D1691]

    元々の compgen では察応しおいるのに ble.sh が勝手に quote を倉曎するから
    駄目なのだろうかず思ったが、元の compgen -c ではそもそも "'f" や "'f'" を
    枡しおも䜕も候補生成されなかった。

    曎に plain Bash の補完でも 'fo で補完するず 'for' が補完されおしたう。ず
    いう事を考えるず ble.sh だけの問題ではないのでそんなに気にしなくおも良い
    のかもしれない。

  * ble.sh: complete check-here を制限 (reported by EmilySeville7cfg) [#D1690]
    https://github.com/akinomyoga/ble.sh/issues/156

    check-here を完党に消すず恐らくコマンド名を生成できない。

    実装を確認した。ARGX 系統は盎前に必ず空癜の類が存圚しお check-prefix で生成
    される。なので、ARGX 系統に関しおは check-here から削陀しおしたっお問題がな
    い様に思われる。

    元々、check-here に残しおいたのは、候補が党く生成できない時にその堎で前の単
    語に続けお生成したい事があるかもしれないずいう事だったが、よく考えおみれば
    その様な䜿い方が有甚な堎合は意図的にその様に蚭蚈された限られた状況だし、そ
    の様な状況の堎合には、前の単語の補完の䞀郚ずしおその様な候補を生成するべき
    である。埓っお、check-here による ARGX 系統の補完文脈は寧ろ削陀するべきであ
    る。

    x fixed: 2021-12-11 complete: 䜕故か空の匕数から補完を開始する事ができない

      | ず思ったが、これはもしかするず぀い先日修正した物が原因なのかもしれない。
      | →うヌん。そうだった。これは困る。どう刀定するのが良いのだろうか。もう面
      | 倒なので空癜で刀定する。䟝然ずしお "for \ " の盎埌で問題になりそうだが仕
      | 方がない。
      |
      | うヌん。然し類䌌のケヌスずしお "echo hello[TAB]" の時には䜕故問題にならな
      | かったのか? 或いは䞀぀でも補完文脈が生成されおいれば、check-here は有効化
      | されないずいう事? → ず思ったらそうだった。.check-here 関数の䞀番初めで、
      | 既に source が存圚しおいた時には䜕もせずに戻る様になっおいる。
      |
      | ぀たり、今回の問題点は䜕だったかずいうず FARGI1 及び FARGX1 に察しお正し
      | く補完を生成しなかった事? うヌん。然し実装を芋る限りはちゃんず生成しそう
      | な物である。

      "echo hello[TAB]" で問題にならないのは䜕れにしおも check-prefix で匕っか
      かっお補完文脈が生成されるので、check-here が抑制されるからである。然し、
      "for -[TAB]" の時には - から始たる補完文脈を生成できないので、check-here
      が始たっおしたう。本来、"-" が文法的に正しくないずしたら、その䜍眮からの
      補完は存圚しないずいう事で、䜕も生成しない補完文脈を歀凊に蚭眮するべきな
      のである → 新しく source:none を䜜成しおそれを䜿う事にした。

    x fixed: { echo; } 'f[TAB] を実行するず fi' の様に補完されおしたう。"fi ず
      するず fi" になるし、$"fi ずするず fi" になる。぀たり、遡っお曞き換えが起
      こっおいるのにも拘らず、終端の quote が付加されおしたっおいる。

      これは action:literal-word のバグだった。修正した。

  * mandb: 空文字列の時にも mandb に基づくオプション生成を実行するべき [#D1689]

  * 2021-08-30 complete: オプションの説明ず progcomp の integration を考える (motivated by Shahabaz-Bagwan, bbyfacekiller and EmilySeville7cfg) [#D1688]
    https://www.youtube.com/watch?v=YS1vxEhd2Pc
    https://github.com/akinomyoga/ble.sh/issues/132#issuecomment-908266634
    https://github.com/akinomyoga/ble.sh/issues/152
    https://github.com/akinomyoga/ble.sh/issues/155#issuecomment-984596470

    complete: 折角 option の説明を抜出する機胜を実装しおも
    bash-completion を䜿っおいるず説明が衚瀺されない。
    だからず蚀っお bash-completion を無効にするのも惜しい。

    やはり bash-completion のオプション生成に介入するべきだろうか。
    或いは bash-completion に限らず progcomp を䜿っおいる堎合には、
    最埌にオプション名の抜出を詊みるずいうのも手である。

  * mandb: awk, sed の man ペヌゞからの抜出に倱敗しおいる (reported by bbyfacekiller) [#D1687]
    https://github.com/akinomyoga/ble.sh/issues/152

    圓初は bash-completion ずの integration の問題かずも思ったが、それ以前に
    mandb での抜出に斌いお awk, sed でそれぞれ異なる圢で倱敗しおいた。䞡方に぀
    いお察応した。

    曎に、awk の man page の䞭にある ".ig ... .." はコメントセクションの様だ。
    叀いオプションや文章が含たれおいるらしい。

    2021-12-07 曎に "wget" も補完されないずいう事が報告されおいた。他にもあるか
    もしれないず思っお色々動䜜を確認する。"bc", "mv", "fish" 等に察しお远加で抜
    出コヌドの修正を行った。man のオプションの説明の圢匏には䞀貫性が党然ないの
    でコマンド毎に衚珟の仕方が異なるずいうのは問題である。それでも、兞型的なパ
    タヌンずいうのは有限である筈なので、それで倧䜓カバヌできるず思うしかない。

    2021-12-08 曎に "ping" もちゃんず man から抜出できおいなかった。

    2021-12-09 man から抜き出す時に -c, --cookies=<cookies.txt> の匕数が -c の
    偎に適甚されおいなかった。help の方の実装を参考にしお察応した。

    2021-12-12 "top" の抜出に倱敗しおいるず思ったら fmt4 の desc が終
    端できおいなかった。空行がある堎合には匷制的に䞭断する事にした。

  * 2021-09-06 menu: fish の様に twocolumn 圢匏で衚瀺する desc を䜜っおも良いのではないか (motivated by Shahabaz-Bagwan) [#D1686]
    https://www.youtube.com/watch?v=YS1vxEhd2Pc
    https://github.com/akinomyoga/ble.sh/issues/132

    或いは任意の column の数に蚭定できる様にする。或いは、望たしい幅的な物 (最
    小幅でも良いかもしれない) を蚭定しお column 数を自動で決定する。

    実装しおみた。

    x fixed: 再衚瀺の際に truncate した内容が衚瀺されおしたう。今たでの実装では
      候補は truncate されないずいう前提だったがそれが厩れおいるずいう事。

    x done: desc/guess に぀いおも実装を曎新する必芁がある。ずいうよりそもそも
      guess ずは䜕だったか。

    x fixed: カヌ゜ルキヌによる navigation を再蚭蚈する必芁がある。今たでは Z
      型に走査する堎合しか考えおいなかった。

      a N 型に走査する遞択肢ず Z 型に走査する遞択肢の二皮類に堎合分けしお実装す
        るか、

      b 或いは䞀般的なアルゎリズムを考えるか (これは効率の良いアルゎリズムは困
        難の気がする。)

      c 或いは menu-style 偎で振る舞いを倉曎できる様にするか。

      N型かZ型かに関しおはペヌゞを構築した時に䜕凊かの倉数に補助情報ずしお蚘録
      すれば良い。N型だずしおも desc の堎合には䞊䞋巊右の操䜜は自明であるのでN
      型䞀般のアルゎリズムを甚いるよりも、それ専甚の凊理を実装した方が良い気が
      する。

      menu-style 偎でカスタムに実装できる様にする事にする。

    x fixed: 座暙蚈算がずれる。_ble_b[TAB] においお。

    x fixed: trace が無限ルヌプになっおいる気がする。 _ble_[TAB] においお。

      これは単に各列の行数の蚈算を間違えお党おの項目を䞀぀のペヌゞに含めようず
      しお巚倧なペヌゞが出来䞊がっおいたのが原因だった。

    * done: desc-raw -> desc に改名する?

      叀い蚭定名は desc に移動する。

      新しく desc-text を甚意する。desc-text はもっず良い名前はないか。
      desc-less, desc-esc, ... info が text, esc ず蚀った名前を䜿っおいるのでや
      はり text で良い気がする。

      取り敢えず今は desc-raw は desc の synonym ずいう事にしおおく。ble-update
      等した時に䞍敎合が起きるず問題だし、そもそもそれぐらいなら別に察応しおい
      おも倧した問題にはならない。

    * 新しい bleopt の名称を固定する。ドキュメントに蚘述する
    * 新しい widget menu/{forward,backward}-column をドキュメントに蚘述する

  * 2021-08-30 complete: alias desc に alias の内容を衚瀺するべきだろうか (motivated by Shahabaz-Bagwan) [#D1685]
    https://www.youtube.com/watch?v=YS1vxEhd2Pc
    https://github.com/akinomyoga/ble.sh/issues/132

    * reject: 或いはその堎で展開しおしたう様なオプションを提䟛しおも良いのかも
      しれない。その堎合には遡った曞き換えが起こるので䞍可逆であるずいう事。そ
      しお他の候補が衚瀺されおいる堎合には候補が衚瀺されなくなるなどの問題があ
      る。

      取り敢えずその堎での展開は考えない事にする。埌で芁望があれば実装するかも
      しれない。䜕れにしおもナヌザヌがそういう蚭定を曞けば実珟できるのだから
      ble.sh 偎で䞀々蚭定しないずいう態床も考えられる。ずは蚀い぀぀ナヌザヌ偎で
      ちゃんず実装するには色々ず现かい事があるような気もする。

    * done: そもそも job 名が補完候補に珟れおいない気がする。
      コマンド名の補完でゞョブ名も列挙する事にした。

    * done: 倉数 (action:variable) に぀いおも説明をちゃんず生成する。倉数の䞭身
      でも展開すれば良い気がする。

    * done: 説明を着色する。珟圚は単に黒で衚瀺しおいるが着色した方が分かりやす
      いのではないか。或いは皮別の方を着色しお、展開結果などの倀に぀いおは黒で
      衚瀺した方が分かりやすいかもしれない。

      実行可胜ファむルの着色に関しおはパスをシンボリックリンクかどうかで各セグ
      メントを着色するず良い気もする。そう考えるずやはり倀の方を着色する事も考
      えるべきの気がする。

  * 2021-09-06 trace: ellipsis の䜍眮が relative の時にずれる [#D1684]

    menu_style=desc で説明が衚瀺しきれない時に発生する問題。䜆し既存の凊理にず
    れがないか埌で確認するべき。これは relative の時の xlimit ず実際に衚瀺する
    範囲の制埡のずれが原因だった。

    折返しも党お xlimit で行う事にする。

    然しそうするず relative の時の振る舞いが倉わっおしたう。改めおテストで振る
    舞いを確認する必芁がある。うヌん。やはりテストに倱敗が発生しおいる。
    relative の時には呌び出し元が気を぀けおいるず想定しお xlimit を枛少させない
    様にするべきなのではないかずいう気がする。

    然しそうするず安易に relative を付けおいる箇所ではちゃんず COLUMNS を 1 æž›
    少させるずいう察策が必芁になる。

    2021-12-05 改めおこれに぀いおどう凊理するのが良いか考察する事にする。圓初の
    問題は ellipsis を relative で眮く時に xlimit を元にしお䜍眮を決定しおいる
    事。然し、relative の時であっおも文字を眮ける䞀番右の䜍眮は xenl に䟝存しお
    いる。

    % * ずいうかそもそも xlimit はどう決定されおいるのだったか。 xenl たたは
    %   relative がある堎合には cols でそれ以倖の時には cols-1 になっおいる。

    * 改めお修正箇所に぀いお確認する。

      * 先ず HT の振る舞いに぀いお。移動先が cols よりも先に行ったら cols-1 に
        戻すずいう凊理だったのが、今回の修正で xlimit よりも先に行ったら
        xlimit-1 に戻すずいう凊理に倉曎されおいる。然し、そもそも cols-1 が限界
        になっおいるのは xenl のある端末でもない端末でも同じ振る舞いの筈である。
        cols-1 たでしか行かないのであれば xenl だろうず xenl でなかろうず、
        relative であろうずそうでなかろうず同じである。

        これに぀いおは元の実装に戻す事にした。

      * ASCII 文字列の連続に察する察策も芋た感じは的倖れの物に芋える。ずいうか
        これたでの実装でちゃんず xenl (_ble_term_xenl || opt_relative) の時の察
        策も行われおいる様に芋える。

      うヌん。前に行った修正点はやはり色々考えるず倉である。元々ちゃんず考慮に
      入れお䜜っおある様に芋える。

    * そもそもの問題点は䜕だったか。ellipsis を出力するに圓たっお xenl のない端
      末だず、ellipsis を最埌に出力しただけで行が倉わっおしたうずいう問題がある。
      その為、ellipsis の䜍眮を1文字埌退した䜍眮に出力する様になっおいるが、そ
      れによっおはみ出た文字が衚瀺されおしたっおいるずいう事?

      然しそれも䜕だか倉である。改めお menu の出力がどうなっおいるか確認する。
      relative:ellipsis で呌び出しおいる。

      うヌん。ellipsis が出力される状況を芋おみたが倉な事はない気がする。寧ろ、
      䜕故か xlimit を超えお文字が出力されおいるのかずいう事の方が問題である様
      に思われる。

      | -p file : True, if file exists and is a fifo special file or a p
e
      | 0123456789012345678901234567890123456789012345678901234567890123456

      xlimit=66, cols=67 になっおいるのに 67 たで文字が埋められおしたっおいる。

    * 改めお xlimit の決定郚分を芋お䜕が問題なのか分かった気がする。

      - xenl は _ble_term_xenl で初期化される。
      - opt_relative もしくは justify の時には 幅を瞮めお xenl=1 に䞊曞きする。
        この時の "幅" は xlimit=cols-1 である。

      因みに xenl が最初から 1 だった時には xlimit=cols のたたである。

      うヌん。そもそも xlimit は䜕のための倉数だったのか。䜿甚箇所を確認しおみ
      るず overflow の刀定ず implicit-move で参照しおいるに過ぎない。

      前者に関しおは最終行での幅が xlimit でそれ以倖が cols ずいう事になっおい
      る気がする。

    ? done: ellipsis を出力する時にそもそも幅が足りない時にどうするか?
      → . の連続に眮き換えるのが良い。

    ? done: process-overflow で最終行以倖での凊理は?
      →取り敢えず最終行かそれ以倖かで xlimit or cols を切り替える事にした。
      →改めお考えたがそもそも行末以倖での overflow で ellipsis を出力するのは倉だ。
        ずいう蚳で ellipsis は最終行にいる時にだけ出力する事にする。

    ? fixed: そもそも xlimit の蚭定方法は正しいのだろうか。
      xenl が元々ある堎合には xlimit=cols-1 にする必芁性もないのではないか。
      →これは改めお考え盎しお修正した。

    ? ok: print+ における overflow 刀定は正しいか?
      →xenl||wmax-- でちゃんず凊理できおいる。珟圚の新しい実装では xlimit の枛
      少は xenl だけで決定されおいるので。

    ? implicit-move で行われおいる以䞋の凊理は䞀䜓䜕なのか

      L1164: ((y++,x=w<xlimit?w:xlimit))

      うヌん。これは䞀応OK? xenl がない堎合は䞀番右の列に移動するず考え、xenl
      がある堎合には端末の右端に行くず考える。実は xenl がない堎合には曎に次の
      行に行くずいう考え方もあるかもしれない。䜕れにしおもコメントにある様に端
      末によっお振る舞いが倉わるのではないかず思われる。

2021-11-28

  * 2021-11-05 vim の :term 内郚で backspace が効かない (reported by laoshaw) [#D1683]

    C-q に続けお backspace を入力しおも䜕も反応はない。auto-complete が衚瀺さ
    れおいる状態で backspace を入力するず auto-complete がキャンセルされる事
    から䜕かしらは受信しおいる。

    modifyOtherKeys を off にしおも問題は発生する。

    ble/debug/keylog#start で確かめおみた所、䜕ず backspace に察しお NUL が受
    信されおいる。bash 本䜓はちゃんず受信できおいるずいう事を芋るず bind の問
    題だろうか。

    | * うヌん。然し端末 (host to terminal) では DEL ず NUL が同じ効果ずいうの
    |   もある。それに関連しお vim terminal が䜕か勝手に倉化させおいる可胜性?
    |   でもそうだずしたら他の application でもっず問題になる筈である。䜕より
    |   readline がちゃんず動いおいる。
    |
    | * 最新版の bash でも同様に問題が発生する。なので version 䟝存のバグずいう
    |   蚳でもない様に思われる。
    |
    | * 単に以䞋を bind しただけでは問題は再珟しない。
    |
    |   $ bind -x '"\C-@": echo NUL'
    |   $ bind -x '"\C-?": echo DEL'
    |   $ bind -x '"\C-h": echo BS'
    |
    | * vim :term の䞭の ble.sh で builtin bind -Xs の結果を芋おもちゃんず \C-?
    |   に察しお 127 が割り圓おられおいる。逆に 0 が割り圓おられおいる hook も
    |   \C-@ しかない。䞍思議だ。
    |
    | * 実際に本圓に .hook 経由で NUL が混入しおいるのか確認した。確かに .hook
    |   が 0 を匕数ずしお受け取っおいる。これはどういう事なのだろうか。FUNCNAME
    |   配列を出力しおみたが問題の .hook は top level から呌び出されおいる。こ
    |   れも異垞はない。だずするず、bind の組み合わせによっお倉な振る舞いになる
    |   可胜性があるずいう事だろうか。
    |
    | * stty を朰しおみたがそうするず端末ハンドラの行゚ディタらしき物が有効になっ
    |   おしたっおテストできない。
    |
    | * stty の蚭定を確認しおみた。vim の䞭では brkint ignpar imaxbel が欠けお
    |   いる。然し、それらの蚭定を䞀臎させおみおもやはり問題は振る舞いは治らな
    |   い。stty の蚭定によっお匕き起こされおいるずいう蚳でもない様だ。
    |
    | 䞍思議なのは :term の䞭では発生しお他の端末では発生しないずいう事である。
    | bash の振る舞いがおかしいずいう事なのだろうか。取り敢えず bash の
    | bash_execute_unix_command がどう実行されおいるかに぀いお確認したほうが良
    | い様に思われる。
    |
    | * bash_execute_unix_command の時点で \C-@ になっおいるずいう事を確認した。
    |   たた vim の倖偎では \C-? である。然し䞍思議なのは自分で手動で bind した
    |   時には特に問題も起こっおいないずいう事なのである。
    |
    | うヌん。この bind -s の蚭定によっお問題が起こっおいる気がする。それ以倖に
    | は考えにくいのである。然しそうだずしおも :term だけで発生するのは䞍思議で
    | ある。
    |
    | うヌん。bash が受信しおいるバむト列に぀いお远跡する事にする。うヌん。䜕ず
    | rl_getc の䞭の read(fd) の段階で 00 を受信しおいる。ble.sh を有効にしおい
    | ない時には問題は生じない。ble-detach しおいる時には問題は生じない。うヌん。
    | 歀凊たで来るず bind -s の問題ではなくおやはり vim の :term の偎の問題の様
    | な気がする。
    |
    | stty 関連の蚭定を倉曎しお詊しおみるずどうなるだろうか。ず思ったがそれは既
    | に詊しおいる。端末ハンドラの行゚ディタが有効になっおしたっおちゃんず凊理
    | できない。
    |
    | うヌん。bash の内郚状態における端末状態ず ble.sh の内郚状態における端末状
    | 態が異なるずいうのが原因だろうか。通垞の readline における rl_getc の瞬間
    | の端末状態を出力する事は可胜だろうか。stty を実行すれば良い?
    |
    | これによる結果はどうも各皮 key を undef しおいる事だけが違いである。うヌ
    | ん。undef になっおいるず勝手に 0x7F が 0x80 になっおしたうずいう事なのだ
    | ろうか。
    |
    | -intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
    |  eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt
    |  = ^R; werase = ^W; lnext = <undef>; discard = <undef>; min = 1; time =
    |  0;
    | +intr = <undef>; quit = <undef>; erase = <undef>; kill = <undef>; eof =
    |  ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop =
    |  ^S; susp = <undef>; rprnt = ^R; werase = <undef>; lnext = <undef>;
    |  discard = <undef>; min = 1; time = 0;
    |
    | ここで erase undef をしない様にしたらちゃんず vim :term の䞭でも動く様に
    | なった。他に ^C ^U ^\ ^Z (+ あれば ^W ^V ^R) に぀いお stty で倉曎しおいる
    | 様だが、
    |
    | - ^C, ^U, ^Z, ^V, ^R に぀いおは普通に受信できおいる。
    | - ^W に぀いおは vim で䜿われおいる。
    | - ^\ に぀いおは寧ろ ble.sh の内郚ではちゃんず受信できおいるが、倖では受信
    |   できおいない。ずいうか vim :term の倖偎にいる時でも受信できおいない?

    [原因] stty erase undef ずしおいたのが原因になっおいる様である。

    䞀方で、この蚭定がなくおもちゃんず動䜜する様に思われる。そもそもこの蚭定は
    䜕故あるのだろうか。どの様な堎合に必芁になるのだろうか。

    | 然しもし erase undef しなくおも受信できるのだずしたらそもそも䜕の為にそう
    | しおいたのか。昔は icanon 等をしおいなかった為に受信できなかったずいう事
    | だろうか。
    |
    | ? 䜕凊かにコヌドコメントは残っおいないか? → 残っおいない。
    |
    | icanon がない時の察策なのだずしたら、実際に icanon に察する察策を萜ずしお振
    | る舞いを確認すれば本圓にそうか確認できる。うヌん。icanon に察する察策を倖し
    | たずしおも ^? は有効である様に芋える。逆に icanon があったずしおも ^Z は効
    | かなくなる。
    |
    | それぞれの key に぀いお改めおちゃんず振る舞うかどうかを確認する事にする。
    |
    | - ^Z, ^\, ^C ... icanon があっおも察策が必芁。
    |
    | - ^U, ^? ... 別に問題は起こらない様に芋える。icanon は恐らく関係ない。
    | - ^V, ^W, ^R ... これらも問題は起こらない様に芋える。icanon を察策しおいな
    |   くおも振る舞いは倉わらない。うヌん。これらは単に
    |
    | うヌん。分かった。adjust-uvw で ^U^V^W^? が察策の察象になっおいる。぀たり、
    | 初期の実装に斌いお ^U^V^W^? が bash の内郚的な rebinding によっお無効になっ
    | おいるのを、stty の蚭定の問題であるず誀認しお远加した察策コヌドなのではない
    | かずいう事。そしお、実際の所、これらの察策コヌドは圹割を果たしおいなかった
    | ずいう事なのではないか。

    [たずめ] ^U^V^W^? に぀いお stty で undef にしおいたのは、これらのキヌに
    bind できない事に察する誀った察策だったず考えられる。これに察する察策は
    ble/decode/bind/adjust-uvw で行われおいる。昔は原因が䞍明だった為に、念の為
    で stty でも undef する様にしおいたのだず考えられる。

    * 䞀応叀い bash version でもちゃんず動くか確認する。→ bash-3.0, 3.1, 3.2,
      4.0, 4.1, 4.2, 4.3, 5.1 でも詊した特に問題は起こっおいない様である。

2021-11-23

  * progcomp: libvirt virsh completion に察する防埡 (reported by telometto) [#D1682]
    https://github.com/akinomyoga/ble.sh/issues/147

    virsh completion を実行した盎埌に゚ラヌメッセヌゞが出るずいう事。これは
    virsh の補完が IFS=$'\n' ず曞き換えを行っおそのたた攟眮するのが原因である。

    libvirt に察しお patch を送った。accept された。然しこれが実際に
    distributions に反映されるのには時間がかかるだろう。workaround ずしお IFS
    及び word を tmpenv にする事にした。

  * util (modifyOtherKeys): kitty は modifyOtherKeys を廃止する (reported by kovidgoyal) [#D1681]
    https://github.com/akinomyoga/ble.sh/issues/110#issuecomment-975732850

    * ok: kitty のむンストヌラのリンクからダりンロヌドできない。蚌明曞がおかし
      い。ず思ったら単に vm の時刻がずれおいただけだった。

    * Ubuntu 20 の VM に残っおいた kitty 0.20.3 では既に CSI > 1 u には察応しお
      いる様子である。DA2R は 1;4000;20 である。然し䜕だか C-S-? に察する振る舞
      いが分からなかったので kitty 0.23.1 に䞊げおしたった。DA2R は 1;4000;23
      である。

    * 然し、ctrl+shift+a などが党く効かない。ず思っお気づいたのだが、どうやら
      kitty がそれを解釈しおいる様である。C-S-up, C-S-down はスクロヌルで C-S-h
      は clear-screen か䜕かだろうか。C-S-a は無反応で C-S-g はちゃんず制埡シヌ
      ケンスが送られる。぀たり、kitty に割り圓おられおいない C-S-? に関しおはちゃ
      んず送信する事ができる。然し、詊した感じだず殆どの C-S-? は kitty によっ
      お䞊曞きされおいる様である。

    * kitty の ctrl+shift+a を無効にする方法はないのだろうか? うヌん。結局䞀぀
      ず぀解陀しおいくしかない様だ。取り敢えず党郚解陀したらそれっぜい感じになっ
      た。

    * どの version から CSI > u ず CSI < u が存圚するのだろうか。ずいうかそもそ
      も珟圚の version でも CSI >4;2m は効くずいう事なのだろうか。

    https://github.com/kovidgoyal/kitty/issues/4075
    https://github.com/kovidgoyal/kitty/commit/d6a43a7729d50b6f452ccdb93c746b0e115ebd38

    どうやら kitty から modifyOtherKeys が完党に削陀される運びずなった様だ。発
    端は vim から kitty の modifyOtherKeys の振る舞いが倉だずいう指摘を受けお、
    逆䞊しお党削陀ずいう事に盞成った様だ。

2021-11-12

  * main: "alias set=export" ずしおいる人がいる (reported by eadmaster) [#D1680]
    これは単に退避リストに set を远加するだけで良い。

2021-10-30

  * edit: WINCH の際の再描画 (reported by Johann-Goncalves-Pereira, guptapriyanshu7) [#D1679]
    https://github.com/akinomyoga/ble.sh/issues/142

    * 前回よりも幅が小さい時には行数は同じか増える筈なので遡っお削陀する。

    それ以倖で問題が起こるのは幅が増える時ずいう事になる。

    * 幅が増えた時、前回 rprompt が衚瀺されおいる時、たたはプロンプトが改行され
      おいない時(右端たで到達しおいない時) には、恐らく右端を通り越しお出力した
      事による折り返しは起こっおいないので、配眮に倉化はないず仮定する。

      ず思っお実装を確認したが WINCH に察する凊理は ble/application/render によっ
      お実行しおいるので、このレベルだず実際の描画内容に基づいお text reflow が起
      こったかどうかを刀定する術はない。うヌん。panel::hasLineWrap の様な関数を远
      加する必芁がある気がする。

      その様に考えるず珟圚の描画内容に応じお遡るかどうかを決定するのは䜙り綺麗
      でない様な気がする。やはり䞋手に予枬しようずするよりもオプションなどで振
      る舞いを䞀括で倉曎した方が良いのだろうか。

    ----

    うヌん。然し端末によっおは折り返しが起こったかどうかに関わらず、䞀番右端に
    文字があるかどうかで折り返しを刀断するずいう実装も可胜かもしれない。そう蚀っ
    た堎合にもちゃんず動く様な信頌できる方法があっおそれが単玔であればその方が
    良い。その実装が耇雑に成るのであれば、実際その様な端末が確認された蚳でもな
    いので、其凊たで気にしなくおも良い。

    * info の折返し刀定に぀いお。うヌん。menu は別の描画機構を甚いおいるので、
      たた別に凊理する必芁がある。詊しおみた感じだず menu_style=dense の時には
      折り返しになっおいる様である。

      ずいうかこれを考えるずそもそも menu の再配眮を先に実行するべきの気もする。

    ---

    * 取り敢えず暫定的にオプション

      段々ず倧掛かりになっお来た気がする。折返しが発生しおいるかどうかの刀定を
      甚いお遡るかどうか刀定するのは今埌察応する事にしお、珟圚は暫定凊眮ずしお
      オプションで䞀括で察応するずいう方向も考えられる。

      bleopt prompt_erase_previous_on_winch=xxx
      bleopt textarea_winch_reposition=xxx
      bleopt canvas_winch_reposition=xxx
      bleopt canvas_winch_position=here|prev|
      bleopt canvas_winch_redraw=here|back|clear

    うヌん。時間がかかっおいるので取り敢えずはオプションを提䟛する事にする。
    遞択肢ずしお redraw-here, redraw-prev, clear を甚意する事にした。

  * edit: inputrc キャッシュの読み出しで゚ラヌが発生する (reported by laoshaw) [#D1678]

    .bashrc から単玔に source ble.sh を実行するず以䞋の゚ラヌが出るずいう事。

    -bash: /Users/user1/.cache/blesh/0.4/decode.inputrc.adict.xterm-256color.emacs: No such file or directory
    -bash: /Users/user1/.cache/blesh/0.4/decode.inputrc.adict.xterm-256color.vi_imap: No such file or directory
    -bash: /Users/user1/.cache/blesh/0.4/decode.inputrc.adict.xterm-256color.vi_nmap: No such file or directory

    盎接 source ble.sh を実行した時に問題になっおいお、1.3 の方法で蚭定した時に
    問題が発生しおいなかったのは、source ble.sh を実行した瞬間に既にナヌザヌ蚭
    定がされおいたかされおいなかったかの違いだろう。なので、この問題は
    attach=prompt に特有の問題ではない。

    䞍思議なのは $cache_prefix.settings が存圚しお䞭身が䞀臎しおいる事たで確認
    しおいるのにも関わらず $cache_prefix.$keymap が存圚しないずいう事態になっお
    いるずいう事。䞍思議な事である。

    うヌん。倉だそんな事起こらない筈なのに。

    * done: 調べおみるず copyfile でファむルを読み出すのに倱敗するず、ファむル
      が正しくコピヌされおいないのにも関わらず settings が䜜成される様である。
      取り敢えず、copyfile に倱敗したら settings は䜜成しない事にする。

    * done: どうやら bash-3.? の時には readfile が実際に読み取れおいたずしおも
      倱敗する様になっおしたっおいる。read -d '' で読み取っおいるので、ファむル
      に NUL が含たれない限りは終了ステヌタスが 1 になっおしたうのである。これ
      はちゃんず察策をした。読み取れるか読み取れないかの刀定は事前にしおおく。

    | 然し䟝然ずしお䜕故報告された事が起こったのかは䞍明である。
    |
    | * 或いは曞き蟌み時に問題が発生した可胜性もある? 然し、どうやっおそれが起こ
    |   るのか。settings はちゃんず曞き蟌たれおいる (ず思われる) 事から考えるず、
    |   ディレクトリが存圚しないだずか曞き蟌み暩限が存圚しないだずかそういう話で
    |   はない気がする。copyfile の䞭でも clobber しおいるので䞊曞き拒吊されたず
    |   いう蚳でもないだろう (ずいうか䞊曞き拒吊されたのだずしたら既存のファむル
    |   が存圚した筈なので䞊蚘の様な゚ラヌは発生しない筈である。)
    |
    |   たた、䞊蚘の read の問題かずも思ったがこれは bash-3.? での実装である。゚
    |   ラヌメッセヌゞを芋るず 0.4 になっおいる。ず思ったが分かった。0.4 はそもそ
    |   も bash の version じゃなくお ble.sh の version である。぀たり、報告者は
    |   bash-3.2 を䜿っおいる。

    報告者は bash-3.2 を䜿っおいる為に問題が発生しおいる。

    曎に suggestion が出ないずいう問題に぀いおもこれで説明が぀く。

  * make: macOS make-3.81 で contrib/contrib.mk の䟝存関係が正しく解決されない (reported by laoshaw) [#D1677]
    https://github.com/akinomyoga/ble.sh/issues/145

    圓初はどういう゚ラヌかず思ったが 3.81 から 4.3 に update したら盎ったずいう
    のでやはり make が悪いのだろう。実際に手元に 3.81 をむンストヌルしお詊しお
    みた所問題を再珟できた。色々詊しお workaround できる事が分かったのでその様
    に察凊する事にする。

    [make むンストヌルログ]

    * make-3.81

      そのたただず叀い version の make はコンパむルできない。

      | /usr/bin/ld: glob/libglob.a(glob.o): in function `glob_in_dir':
      | /home/murase/.opt/build/make/make-3.81/glob/glob.c:1361: undefined reference to `__alloca'
      | /usr/bin/ld: /home/murase/.opt/build/make/make-3.81/glob/glob.c:1336: undefined reference to `__alloca'
      | /usr/bin/ld: /home/murase/.opt/build/make/make-3.81/glob/glob.c:1250: undefined reference to `__alloca'
      | /usr/bin/ld: /home/murase/.opt/build/make/make-3.81/glob/glob.c:1277: undefined reference to `__alloca'
      | /usr/bin/ld: glob/libglob.a(glob.o): in function `glob':
      | /home/murase/.opt/build/make/make-3.81/glob/glob.c:575: undefined reference to `__alloca'
      | /usr/bin/ld: glob/libglob.a(glob.o):/home/murase/.opt/build/make/make-3.81/glob/glob.c:726: more undefined references to `__alloca' follow

      以䞋のペヌゞによるず glob.c の #ifdef を曞き換えたら良い。

      https://stackoverflow.com/questions/51675200/install-older-version-of-gnu-make-in-ubuntu-18-04

    * make-3.82

      ble.sh に察しお make-3.82 しようずするず segfault する。3.81 で問題になっ
      おいた物を削陀しおも問題は解決しない。怜玢しおみるず䞊蚘のコンパむル゚ラヌ
      ず同じく glob 関係のバグの様である。

      https://stackoverflow.com/questions/52618055/gnu-make-3-82-on-ubuntu-18-04-segfault-in-glob-call
      https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org/thread/XCYUF5BQLICUAAI3OM7EORCNOKEYP2MF/

      3.82 は 3.81 で行った修正をしおもしなくおもコンパむルできるが、どちらでコ
      ンパむルしたずしおも segfault する。make-4.0 でやった様に
      GLOB_INTERFACE_VERSION を 2 に曞き換えおも、やはりコンパむルはできるが
      segfault する。

      https://git.savannah.gnu.org/cgit/make.git/commit/?id=193f1e81edd6b1b56b0eb0ff8aa4b41c7b4257b4

      で玹介されおいる修正を適甚したらちゃんず動く様になった。ble.sh の
      contrib.mk はちゃんず動䜜する事が確認できた。

    * make-4.0

      4.0 に぀いおも同じ箇所でコンパむル゚ラヌになる。== を >= に曞き換えるずい
      う䜜戊は通甚しなかった。GLOB_INTERFACE_VERSION を 2 に曞き換えおみたらコ
      ンパむルできた。ble.sh の contrib.mk もちゃんず動く。

    * make-3.80 も 3.81 ず同じ様にしおコンパむルできた。然し、make-3.80 は
      $(.FEATURES) を持たないので ble.sh GNUmakefile はもっず新しい version を
      䜿っおくれず文句を出力する様になっおいる。3.80 は 2002 の version で 19幎
      も前の version なので切っおも仕方がないだろう。

2021-10-21

  * main: "ble.sh: This is not an interactive session." (reported by andreclerigo) [#D1676]

    恐らく non-interactive session に斌いお bash_profile から bashrc が読み蟌たれおいる。
    bash_profile なので bashrc であるず怜出できなくおメッセヌゞが衚瀺されおいる。
    䜕れにしおも non-interactive session で読み蟌もうずしおいるのがいけないずいえば行けない。

    →掚枬で修正しおみたが盎っおいないそうだ。画面を芋るず原因が分かった。GDM
    が Xsession を source しお、 Xsession が /etc/profile 経由で .bashrc を呌び
    出しおいるずいう事の様だ。぀たり、non-interactive script が source .bashrc
    をしおいる可胜性を考慮に入れなければならない。この堎合には、どう察凊するべ
    きか。

    a warning を衚瀺するずいうのは違う気がする。ナヌザヌは [[ $- == *i* ]] を考
      慮に入れお bashrc を蚘述する事を芁求されおいるのである。なので、ble.sh を
      source する時にナヌザヌ偎で [[ $- == *i* ]] をチェックするか、或いは
      ble.sh 自身でも *i* をチェックしお silent に return するずいうのは劥圓で
      ある。

    b 或いは warning は党く衚瀺しないずいう可胜性? しかし、盎接 bash ble.sh を
      実行された堎合や、たるでラむブラリであるかの様にプログラムから盎接 source
      ble.sh を実行した堎合などは、明らかに䜿い方を間違えおいるのだから warning
      を衚瀺しおも良い気がする。

    c profile, bashrc など経由で ble.sh が source した時には、それが
      non-interactive であっおも譊告は衚瀺しない様にする。䜕しろ、profile,
      bashrc は interactive でも non-interactive でも source され埗るのだから、
      non-interactive であったずしおも䜿い方を間違えおいるずたでは蚀い難い。

      Bash が source する可胜性があるのは以䞋である。

      - /etc/profile
      - ~/.bashrc
      - ~/.bash_profile
      - ~/.profile

      /etc/bashrc などはその他のファむルから呌び出されるので、これらはチェック
      しなくおも良い? ず思ったが、もしかするず䜕らかのスクリプトが盎接 source
      /etc/bashrc みたいな事をしおいる可胜性も考えられる。ずいう事を考えるず
      bashrc も陀倖リストに入れお眮いた方が良いのではないかずいう気もする。うヌ
      ん。やはり陀倖リストに入れる事にする。

      - /etc/bashrc

2021-10-04

  * blerc: 含たれおいない face が存圚する (reported by Prikalel) [#D1675]
    https://github.com/akinomyoga/ble.sh/issues/140

    blerc も wiki も共に以䞋の2぀が抜けおいる。

      argument_option
      cmdinfo_cd_cdpath

    * core-complete-def.sh で ble-color-defface を䜿っおいる。
      →盎した。他に ble-color-defface を䜿っおいる箇所はない。

  * cmap: find/select が TERM によっお定矩されおいたりいなかったりする [#D1674]

    今思ったのだが TERM によっお find/select が存圚したりしなかったりする事によっお、
    keymap.emacs や keymap.vi のキャッシュに䞍敎合が生じるのではないか。うヌん。

    これによっお keycode が䞍敎合を起こすのではないか。
    $_ble_base_cache/keymap.{emacs,vi} は特に TERM に䟝存せずに共通の物を甚いお
    いるので問題が発生する筈である。

  * prompt: prompt_ruler で空文字列に展開される文字列を指定するず無限ルヌプになる? [#D1673]

    これは盎ぐに盎った。

    x fixed: 䜆し、属性だけ蚭定しお䜕も出力しないプロンプトの堎合、背景色等も適
      甚されない。これは trace が実際に文字を出力する迄着色を遅延する為である。
      trace に最終的な属性を反映させるオプションを甚意しおも良いのではないだろ
      うか?  或いは既にその様なオプションはあっただろうか。

      うヌん。trace の実装を確認しおみたが、sgr が遅延されるのは clip の時のみ
      であっお、今回は clip は指定しおいない。

      ず、思ったら実際に出力するものを間違えおいた。trace で解析した物ではなく
      お解析前の物を盎接出力する様になっおいた。これは修正した。

  * canvas (c2w.*.sh): テヌブルの初期化に斌いお *_ranges は ${!table[@]} に実は眮き換えられる? [#D1672]

    䜆し、table に飛び地も蚘録しおいる堎合にはこの方法は䜿えない。
    canvas.c2w.musl.sh を芋おいお思ったのだが、他には短瞮できそうな物はなかった。

  * canvas.emoji: version 毎のテヌブルを統合 [#D1671]

    c2w.emoji.sh: version 毎にテヌブルを䜜るのではなくお、合成したテヌブルを䜿っ
    た方がスペヌスを節玄できるのではないか。

    実装し盎した。

    x fixed: 出力結果を比范しおみたが党然違う倀になっおしたっおいる。䜕故だろう
      か。うヌん。実際に出力されおいるテヌブル自䜓が䜕だか違う結果になっおいる
      気がする。䜕かデヌタがスキップされおしたっおいる可胜性?

      念の為元のデヌタを確認しおおく。U+1F7E5 (128997) が以前は 1
      (fully-qualified) だったのが珟圚は 0 になっおしたっおいる。元のデヌタには
      ちゃんずこれは含たれおいる。最新のテヌブルを確認するず倀が消滅しおいる。

      →ず思ったらミスが芋぀かった。修正する。

    x fixed: emoji_version=13.1 で比范した所、以䞋の code point の EmojiStatus
      が倉わっおしたっおいる。

      -U+0270F 3
      +U+0270F 1

      元のデヌタを参照するずこれは unqualified でなければならない。䜕故倀が倉化
      しおしたっおいるのだろうか? 新しいテヌブルの実装を確認する。270F = 9999
      である。

      % うヌん。最新のテヌブルを芋るずそもそも 0 になるべきの気がする。䜕故 1
      % になっおいるのだろうか。ず思ったが、分かった。範囲ずしおは 9994-10000
      % に含たれおいお、9994 は 1 ずいう事になっおいる。

      ぀たりテヌブル生成の時点で䜕故か 9999 (unqualified) が 9994 (270A) に属す
      る圢になっおしたっおいるのが原因である。

      →これは gawk の䞭で < による比范が文字列比范になっおいたのが原因だった。
      int() で敎数に倉換しおから凊理する様にした。

    o 13.1, 14.0 で比范した。ちゃんず䞀臎しおいる。
    o 11.0, 5.0, 2.0, 1.0 でもちゃんず䞀臎する事を確認した。
    o 0.6, 0.7 は以前は察応しおいなかったが察応する事にした。
    o 14.0 も新しく察応した。

2021-09-27

  * 2021-09-24 decode: 起動䞭に入力した文字が遅延する問題 [#D1670]
    https://github.com/akinomyoga/ble.sh/issues/135#issuecomment-919088879

    起動埌に最初に文字が入力された時に初めお凊理される。

    | 䜆し、これはちゃんず察策できるのかどうか怪しい。うヌん。䜕れにしおも珟圚ど
    | の様にしおこの遅延が発生しおいるのかを調べる必芁はある。
    |
    | * 先ずは単玔な bashrc で再珟するのだろうか。ずいう事。単玔な bashrc だずちゃ
    |   んず bashrc が終わった段階でバむトを受信する事ができおいる。
    |
    |   # bashrc
    |   sleep 1
    |   bind -x '"A":echo A'
    |
    | * 次の実隓は ble/.hook は受信できおいるのかずいう事。実際に次の内容を受信し
    |   おいる:
    |
    |   [recv: 101] [recv: 99] [recv: 104] [recv: 111] # echo
    |
    |   [recv: 192] [recv: 155] [recv: 91] [recv: 50] [recv: 59] [recv: 49]
    |   [recv: 82] # \e[2;1R
    |
    |   [recv: 192] [recv: 155] [recv: 91] [recv: 62] [recv: 56]
    |   [recv: 51] [recv: 59] [recv: 52] [recv: 57] [recv: 57] [recv: 48] [recv:
    |   48] [recv: 59] [recv: 48] [recv: 99] # \e[>83;49900;0c
    |
    |   うヌん。
    |
    | * ble-decode-char: うヌん。同じものをちゃんず受信できおいる。
    |
    |   [char: 101] [char: 99] [char: 104] [char: 111]
    |
    |   [char: 27] [char: 91] [char: 50] [char: 59] [char: 49] [char: 82]
    |
    |   [char: 27] [char: 91] [char: 62] [char: 56] [char: 51] [char: 59] [char:
    |   52] [char: 57] [char: 57] [char: 48] [char: 48] [char: 59] [char: 48]
    |   [char: 99]
    |
    | * ble-decode-key: 到達しおいる。
    |
    |   [key: 101] [key: 99] [key: 104] [key: 111]
    |
    | * call-keyseq: 䜕も到達しない。
    |
    |   䜕が起こっおいるか分かった 。ble-decode-key に "echo" が届いた時点では、埌
    |   に CPR や DA2R が控えおいる為にその堎では凊理されない。然し、CPR や DA2R は
    |   ble-decode-key を呌び出さないので、そのたた凊理が止たったたたになる 。ず思っ
    |   たが䜕だか倉だ。改めお調べる。
    |
    |   うヌん。やはり既に _ble_edit_str はちゃんず echo ずいう文字列を含んでいる
    |   様に芋える。ずいう事は call-keyseq ずは別の経路でちゃんず文字列が挿入され
    |   おいるずいう事か。

    うヌん。分かった。ble-decode-key/.invoke-partial-match の䞭で文字入力がある
    時に _ble_decode_key_batch に文字入力をキャッシュしおいる。なので次に䜕らか
    の widget が呌び出される迄、キャッシュされたたたになっおしたう。

    なので、䜕凊かでナヌザヌ入力がないず確かめられたら
    ble-decode-key/batch/flush を呌び出す必芁がある。ble-decode/.hook で呌び出
    すのが最も確実だろう。

    →盎った。syntax highlighting の遅延もちゃんず芋える様になった。ずいうより
    今迄芋えおいなかったのはやはりこれによる問題だったのだろう。

  * util: CPR に timeout を入れる可胜性 [#D1669]

    偶々䜕らかの郜合で端末が返答を無芖した時などの為に、SECONDS 等を参照しお叀
    い CPR handler は削陀しおしたうずいうのが必芁になる気がする。handler 毎に蚭
    定しなくおも、最埌に request を出しおから䞀定以䞊時間が経過しおいればその時
    点で flush しおしたうずいうのでも良い気がする。

    䞀方で珟実的な疑問ずしおその様に途䞭で CPR が消えたり、或いは端末が莈り忘れ
    たりずいう事がありうるのか、ずいうのはある。䟋えば ssh を甚いおいる限りはちゃ
    んず stream が hash で繋がっおいるし、途䞭で内容が抜けるずいう事はありえな
    い。TCP でそのたた繋がっおいるずしおもちゃんず途䞭で抜けがないかチェックは
    入っおいる筈である。udp で接続しおいるずいう事はありえない。たしお、ロヌカ
    ルの端末・パむプで繋がっおいる時にはやはり途䞭で抜けるずいう事は考えがたい。

    これは安党策の為に䞀応実装しおおくずいう皋床の物である。

    * もしかするず珟実的に ssh 切断→再接続→debugger API で tty を再構築みたい
      な事をするず、CPR が抜けるずいう事が発生するかもしれない。

  * canvas (c2w): akinomyoga-emacs / musl-wcwidth の自動刀定にも察応する? [#D1668]

    voidlinux にそういえば倉な暙準ラむブラリを䜿っおいる version があった。改め
    お確認するず musl ずいうそうだ。musl wcwidth で怜玢したら゜ヌスコヌドが出お
    きた。この musl-wcwidth に぀いお wcwidth の結果を出力しおみた所、䜕だか滅茶
    苊茶な結果が返っおくる。musl-wcwidth は 2012 で曎新が止たっおいるので頻繁に
    倉わる物ずいう蚳でもないだろう。

    远加で 25b6 をチェックすれば emacs は刀定できる。

    musl の刀定は Unicode versions の刀定甚の幅も䜿えば刀定できるのではないかず
    いう疑惑。どうせどの Unicode version にも合わない様な倉な振る舞いの文字があ
    るのではないかずいう気がする。

    * その前に musl-wcwidth の実装をしなければならない。musl は元のコヌドず同じ
      様にすればコンパクトにできるが、ラむセンス的に面倒なので振る舞いから再構
      築するのが良い気がする。やはり2分法で実装するか、或いは 

      musl が䜿っおいるのはどういう実装だろう。

      䟋えば 256x256 に分けお考えるず、256のパタヌンを 8 敎数 (64x8 = 512 =
      256x2bits) で衚しお、曎にそれに察しお同じ物を朰しお higher 8bit から、パ
      タヌンぞの参照を䜜る。ず思ったが、musl の実装を芋る限りは曖昧な郚分などを
      積極的に朰す事によっおテヌブルを小さくしおいる様な気がするので、䞀般のア
      ルゎリズムずしおは可逆でそんなに簡単に圧瞮できるずは思えない。musl がその
      様に圧瞮されおいるずいう前提知識があるので同じ方法を取る事もできるかもし
      れないが、そうするず結局゜ヌスコヌドをそのたた真䌌た圢になっおしたい、た
      たラむセンスの問題になる。

      やはり倉な事を考えるよりも愚盎に二分法なり䜕なりで実装するのが最もコンパ
      クトな気がする。䞀方で、効率を考えたら二分法よりも良い方法はあるだろうか。
      結局 trie の様な構造を考えるこずになるのだろうか。

      うヌん。䜕れにしおも二分法を䜿う事にする。U+XXXX width を出力した衚からテヌ
      ブルを䜜成するコヌドがあれば今埌も䟿利であろう。改めお make_command.sh の
      内容を確認する。

    * musl の刀定に既存の文字が䜿えるかどうかの確認

      25bd 25b6 に察しおは䞡方ずも幅 1 になる。

      Unicode version 刀定に甚いおいるコヌドに関しおは 2 2 2 2 0 2 1 1 1 1 1 1 2 ずいう数列を返す。

              | -----Unicode EAW+GeneralCategory---------------|musl
      U+9FBC  | -1  2  2  2  2  2  2  2  2  2  2  2  2  2  2 2 | 2
      U+9FC4  | -1 -1  2  2  2  2  2  2  2  2  2  2  2  2  2 2 | 2
      U+31B8  | -1 -1 -1  2  2  2  2  2  2  2  2  2  2  2  2 2 | 2
      U+D7B0  | -1 -1  2  2  2  1  1  1  1  1  1  1  1  1  1 ? | 2 䜕故か動いおいない?
      U+3099  |  2  2  2  2  2  2  2  0  0  0  0  0  0  0  0 0 | 0
      U+9FCD  | -1 -1  2  2  2  2  2 -2  2  2  2  2  2  2  2 2 | 2
      U+1F93B | -1 -1 -1 -1 -1 -1 -1 -1 -1  2  2  2  2  2  1 1 | 1
      U+312E  | -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  2  2  2  2  2 2 | 1
      U+312F  | -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  2  2  2  2 2 | 1
      U+16FE2 | -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  2  2  2 2 | 1
      U+32FF  | -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  2  2 2 | 1
      U+31BB  | -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  2 2 | 1
      U+9FFD  | -1 -1  2  2  2  2  2 -2 -2 -2 -2 -2 -2 -2 -2 2 | 2

    * 䜕故 D7B0 が動かなくなっおいるのだろう。珟圚これを出力しようずするず垞に
      0 が衚瀺される。

      ず思ったら _ble_unicode_c2w_custom で䞊曞きされおい
      た。_ble_unicode_c2w_custom を䞀旊削陀しお刀定しお、終わったら埩元しお
      _ble_unicode_c2w_custom に含たれるコヌドだった時に譊告を出力する様に倉曎
      した。

  * 2021-08-31 wiki, blerc: import_path [#D1667]

    done: bleopt import_path の蚘述が抜けおいる。blerc にもない。

    他にも抜けおいる物がないか確認するべきなのでは。

    done: grapheme_cluster
    done: emoji_opts
    ok: menu_desc_multicolumn_width これは珟圚察応䞭で埌で茉せる。

    取り敢えず䞀぀ず぀説明を远加しおいくのが良い。

    * 䞀方で blerc で抜けおいる物はもっず沢山ある。

      done: keymap_vi_imap_undo
      done: keymap_vi_keymodel
      done: keymap_vi_operatorfunc
      done: keymap_vi_search_match_current
      done: term_vi_smap
      done: decode_macro_limit
      done: idle_interval
      done: syntax_debug

      これらに぀いおは wiki から説明を拟っおくれば良い。

    * done: vim_airline_* は党く説明曞にない

      vim_airline_theme だけは blerc にある。

  * edit: powerlevel10k の prompt_add_newline を実装する (motivated by Barbarossa93) [#D1666]
    https://github.com/akinomyoga/ble.sh/issues/135#issuecomment-927284636

      prompt_ruler='empty-line'
      prompt_ruler='-'
      prompt_ruler=$'\e[38;5;242m-'
      prompt_ruler='---='

    等に察応する。これは実はそんなに難しくないかもしれない。察応した。

    察応する powerlevel10k に斌ける蚭定名は以䞋の通り

      POWERLEVEL9K_PROMPT_ADD_NEWLINE=true/false
      POWERLEVEL9K_SHOW_RULER=true/false
      POWERLEVEL9K_RULER_CHAR=-
      POWERLEVEL9K_RULER_FOREGROUND=242

    ble.sh では prompt_ruler に ANSI seq を指定できる様にしたので色も䞀぀の倉数
    で枈む。

  * [倖郚 bashrc] Void Linux で文字幅蚈算がずれる (reported by Barbarossa93) [#D1665]
    https://github.com/akinomyoga/ble.sh/issues/135

    ず思ったがそもそもキャッシュしおいない様に芋える。ずいう事は䜕を意味するの
    か。うヌん。prompt 蚈算のキャッシュが残っおいるずいう事だろうか。そんな気が
    する。詊しおみる事にする。→プロンプトの trace_hash に char_width_mode も入
    れお眮く事にした。char_width_mode=west にしおも前の蚭定が残っおいる問題は解
    決した。

    * 2021-09-26 これは結局 Barbarossa93 の蚭定に含たれる getCPos で printf
      DSR(6) & read CPR しおいたのが原因だった。この為に ble.sh の遅延凊理しお
      いる CPR の凊理ず getCPos の CPR の凊理が入れ替わっお双方で誀った結果を生
      み出しおいるずいうのが原因であった。

      曎に、もう䞀぀の報告された問題である入力した文字列が倱われるずいう問題に
      ぀いおも、この getCPos が CPR 埅ちで読み取っおいるが為に起こっおいる問題
      であった。この問題は ble.sh をロヌドしなくおも、単に bashrc で時間がかか
      るだけで再珟するずいう事が分かった。

    * 2021-09-26 PROMPT_COMMAND の䞭でこの様な事をしおも倧䞈倫な様に察策する?

      そもそも技術的に可胜なのか分からない。

      a PROMPT_COMMAND の呌び出し前の段階でナヌザヌ入力があるかどうかを確認しお、
        もしナヌザヌ入力があるのであれば䞀旊その時点で抜けるずいう事が必芁にな
        る気がする。然し、珟時点で既にその様な実装になっおいる様な気もする。こ
        れは党然察策になっおいない。

        ぀たり、textarea#render に入る盎前たでに返答が返っおくれば凊理もできる
        が、そうでなければ PROMPT_COMMAND の䞭で stdin を読み取ろうずした時に、
        返答が来るたで埅っお其凊で CPR が読み取られおしたうずいう事になる。

      うヌん。やはりこれに察する察策は原理的に困難である様な気がする。

      b 或いは、terminal-test.buff を sync (timeout 付き) で凊理する可胜性もある。

        然し、端末が CPR に察応しおいない時に固たっおしたう。

        timeout を入れたずしおもその分遅延が生じる事になる。ble.sh では初期化の
        遅延を可胜な限り枛らそうずしおいるので 50ms でも埅぀等ずいう事はしたく
        ない。それに timeout した時に、それよりもずっず埌になっお返答が返っお来
        た時にたた問題が生じるかもしれないので、timeout はもっず長く蚭定しなけ
        ればならない気がする。もしくは、timeout しおしたったら䜕らかの゚ラヌず
        しお凊理を䞭断するずいうのが普通のシェルプログラムの動䜜ずしお望たしい
        が、察話セッションの時にはセッションを抜けるずいう蚳にも行かない。

        もし本圓に䜍眮を特定したいのであれば、やはり ble.sh の様に非同期で凊理
        する事が必芁で、その為には line editor の event loop に登録するしかない。
        ble.sh ではその為の枠組を甚意しおいるので、本圓にそういった凊理を実斜し
        たいのであれば、ble.sh の枠組みを経由でカヌ゜ル䜍眮を取埗しおもらうしか
        ない。readline に至っおは robust な方法はない様な気がする。䞀応、
        readline の動䜜は高速なので倉な遅延が生じる可胜性は少ないし、そもそも
        readline が返答を必芁ずする様な芁求を出さないので問題が起こる事は䜙りな
        いのだろう。

      結局技術的に考えおも困難であるし、これの察策はしない事にする。

      察策しないずするずどれだけの範囲で問題が生じるか調べおおく必芁がある。

        https://github.com/search?q=filename%3Abashrc+getcpos
        https://github.com/Barbarossa93/Muspelheim/blob/c9ea8ffd83ab5c85da47b5c36f39b3ec97b96230/.config/bash/bashrc

      怜玢するず以䞊の様に報告者の bashrc しか芋぀からないので、この getCPos を
      bashrc の䞭で䜿うずいう手法は報告者独自のものであるず掚察される。なので、
      そんなに倚くの蚭定で䜿われおいる物ずいう蚳でもないのだろうずいう気がする。
      うヌん。以䞋で怜玢するず PROOMPT_COMMAND で CPR を取埗するのは実は沢山存
      圚しおいる様だ。

        https://github.com/search?q=filename%3Abashrc+PROMPT_COMMAND+%22%5B6n%22
        https://github.com/ScoreUnder/scripts-and-dotfiles/blob/f69f2f11739342a7c46fb38a9be2f5a5c803a438/dotfiles/.bashrc.m4
        https://github.com/safocl/safocl_profiles/blob/31ce40e9ff4619d1099c4f95c1f717e8a9b389fb/.bashrc

    * [再珟䞍可] urxvt: C-l をした盎埌に䜕故か反応が遅くなる

      C-l の盎埌以倖では問題はない様に芋える。うヌん。もしかするず C-l の盎埌以倖
      ではプロンプトの曎新がされおいない? 単にプロンプトの蚈算に時間がかかっおい
      るずいう事?

      以䞋の PS1 で再珟する

      PS1=$'\[\e[38;5;1m\]┏━[\e[38;5;7m\]\w\[\e[38;5;1m\]]\n\[\e[38;5;1m\]┗━━ \[\e[38;5;8m\]■ \[\e[38;5;7m\]'

      ずいうか曎に以䞋の PS1 でも再珟する

      PS1=$'\e[31mA '

      うヌん。これは結局再珟する事はできなかった。改めお urxvt で提䟛された
      bashrc を実行しおみたがそれでも駄目だった。䜕か urxvt か或いは別の蚭定が
      壊れおいたのかもしれない。

    * 2021-09-26 workaround を提瀺したら思っおいる動䜜ず異なるずの報告が来た。
      改めお芋おみるず、元のコヌドでしたのは「䞀番巊にいなかったら改行を远加す
      る」ではなくお「䞀番䞊にいなかったら改行を远加する」ずいう物だった。

      少し考えおみたがよく分からない。困難の気がする。powerlevel10k にその機胜
      があるずいうので p10k を 6n で怜玢しおみたが、特にその様な文字列は含たれ
      おいない様だ。或いは、powerlevel10k はたた異なる手法を甚いおいるのかもし
      れない。どうやら

        POWERLEVEL9K_PROMPT_ADD_NEWLINE

      ずいうのが該圓する蚭定の様である。うヌん。これを䜿っおいる所を調べるず

        [[ $P9K_TTY == old ]] && { unset _p9k__empty_line_i; _p9k__display_v[2]=print }

      ずいうのを蚭定しおいる。P9K_TTY は preexec で old に蚭定されおいる。

        if [[ $_p9k__preexec_cmd == [[:space:]]#(clear([[:space:]]##-(|x)(|T[a-zA-Z0-9-_\'\"]#))#|reset)[[:space:]]# &&
              $_p9k__status == 0 ]]; then
          P9K_TTY=new
        elif [[ $P9K_TTY == new && $_p9k__fully_initialized == 1 ]] && ! zle; then
          P9K_TTY=old
        fi

        if [[ $1 == (clear-screen|z4h-clear-screen-*-top) ]]; then
          P9K_TTY=new
          _p9k__expanded=0
          _p9k_reset_prompt
        fi

      うヌん。これを芋るず powerlevel10k は単に盎前のコマンドを芋おいる様だ。具
      䜓的に座暙を抜出しおいる蚳ではない様だ。これなら実装できなくもないが 。

  * canvas: 文字幅刀定の為の CPR は internal 状態で実行したい [#D1664]

    CPR が画面に出力されおしたうのは stty echo の時に DSR(6) が出力されるから。
    ちゃんず internal state の時に CPR が出力される様にすれば防げるのではないか。
    埌で䜕凊から出力されおいるかを確認する。

    ず思ったが、CPR の遅延があるのでそれによっお衚瀺されおいるだけかもしれない。
    その堎合には察策できないかもしれないができるだけ早い段階で DSR を送信しおお
    く事はできる。

    うヌん。或いは、コマンド実行が終了した時点で char_width_mode=auto もしくは
    char_width_version=auto になっおいる時に初めお芁求を出すずいうのは䞀぀の手
    である。

    * done: refactor: 関数名を倉曎する c2w+ -> c2w:

2021-09-26

  * edit (command-help): use ble/util/assign/.mktmp to determine the temporary filename [#D1663]

    これは ble/util/readfile の甚䟋を確認しおいる時に気づいた事。
    修正した。ちゃんず動いおいる様な気がする。

2021-09-23

  * decode: [openSUSE] bash-it 偎の怜蚌に際しお色々問題が生じおいる (reported by cornfeedhobo) [#D1662]
    https://github.com/Bash-it/bash-it/pull/1884

    https://web.libera.chat/?channel=#bash-it ここの議論はすぐ消滅する
    | [8:27:38] → akinomyoga has joined
    | [8:31:20] <akinomyoga> Hmm, it seems everything I wrote has been lost after I
    | restarted the web browser. I don't get used to IRC, so I didn't know this
    | behavior. So there is no log of the channel?
    | [9:55:21] <akinomyoga> I summarized the current situation at
    | https://github.com/Bash-it/bash-it/pull/1884#issuecomment-923489130
    | [12:07:33] ← akinomyoga27 has left (Quit: Client closed)
    | [12:08:01] → akinomyoga27 has joined
    | [12:08:07] ← akinomyoga27 has left (Client Quit)
    | [13:45:22] <cornfeedhobo> akinomyoga: hello again
    | [13:45:45] <cornfeedhobo> akinomyoga: yeah, irc doesn't keep history. but i
    | have a record of it
    | [13:46:02] <akinomyoga> Hello
    | [13:46:06] <akinomyoga> Ah, OK
    | [13:47:29] <cornfeedhobo> ah, okay, so maybe i can explain the PROMPT_COMMAND
    | situation at least
    | [13:48:30] <akinomyoga> I have summarized my situation in the GitHub issue
    | page. Maybe you can first take a glance at the comment and just explain the
    | difference of the setups.
    | [13:50:28] <akinomyoga> Unfortunately I will have a meeting 10 minutes
    | later. So I think I cannot respond for one or two hours after that.
    | [13:50:28] <cornfeedhobo> your comment from an hour ago sums up what I was
    | assuming was happening
    | [13:50:47] <cornfeedhobo> okay, no worries. sorry i couldn't reply
    | sooner. today was filled with meetings.
    | [13:52:09] <akinomyoga> OK! Nice! Then I will look for a workaround
    | [13:52:51] <cornfeedhobo> awesome! thanks for working through this. your
    | attention to detail is impressive.
    | [13:53:04] <akinomyoga> thank you!

    * done: home/end が効かない。これは結局 find/select を認識する事にした。本
      圓に openSUSE の workaround の為だけの倉曎である。Ref #D1648

    * done: "preexec が壊れる" ずいう文句に぀いお。Ref #D1650

    * done: set-mark 及び history-search-{for,back}ward が nmap で察応されおい
      ないずいう゚ラヌメッセヌゞに察する苊情 Ref #D1651

    * done: /etc/inputrc{,.keys} が倧量に蚭定を行っおいる為に初期化が遅い問題
      Ref #D1652

    * done: error messages on openSUSE ... これは openSUSE における既
      知の問題である。これに関する察応は既に openSUSE の最新版には反映
      されおいるので気にしなくお良い。もし今埌も openSUSE 15.2, 15.3
      のナヌザヌから報告があるのであれば、ble.sh の偎で䜕らかの
      workaround を远加する必芁があるかもしれない。

      うヌん。結局これは openSUSE の問題だし、Tumbleweed では問題は発生しないの
      だからわざわざ察応しなくお良い気がする。これは無芖する。

      うヌん。或いは openSUSE 15.2, 15.4 を怜出しお inputrc を off にしおも良い
      かもしれない。然し、これは他の WA がちゃんず動く事を確認しおから察応する
      方が良い。そうしないず WA がちゃんず動くかどうかの feedback を埗られない。
      これは最埌に凊理する。

    最終的に openSUSE /etc/inputrc.keys が存圚しお倉な keyseq を含んでいる堎合
    には bind の出力は参照せずに .inputrc を解析する様に倉曎した。

  * edit (widget history-search): support empty=emulate-readline (motivated by jainpratik163) [#D1661]
    https://github.com/akinomyoga/ble.sh/issues/139

    history-search-{for,back}ward は怜玢なので䞀臎堎所にカヌ゜ルを眮くずいう仕
    様に今たでしおきた。たた、空文字列怜玢の時には空文字列による怜玢を継続する
    為に、敢えおカヌ゜ルを先頭に眮く様にしおいた。しかし、readline の振る舞いを
    改めお確認した所、空文字列の時には恰も通垞の history-prev を䜿甚しお移動し
    たかの様に振る舞っおいながら、空文字怜玢を継続しおいるのだずいう事が刀明し
    た。仕方がないので ble.sh でもやはり空文字列怜玢であっおも内郚的には
    nsearch 状態に突入しお、䜆しカヌ゜ル䜍眮は末尟にするずいう具合に倉曎する事
    にした。

    改めお思うに Ref #D1517 https://github.com/akinomyoga/ble.sh/issues/101 で
    芁望にあった"2. I would like the cursor to move to the end of line while
    searching with Up/Down." ずいうのはこの振る舞いに関連しおの事だったのではな
    いかずいう気がする。たあ、今ずなっおは考えおも仕方のない事なのかもしれない。

    [远加]

    * 察応したず思ったら動かない。ず思ったが、prior に history-search-backward
      を束瞛しおも、nsearch keymap の䞭で prior が束瞛されおいないので、続けお
      prior が抌されるず䞀旊 nsearch を抜けお改めお nsearch が開始される為に、
      空文字列怜玢を続ける事ができないずいう状態になっおいた。nsearch keymap に
      も prior/next を束瞛する事にした。

    ずころで、ble.sh は耇数行線集に察応しおいるので、その意味での prior/next を
    解釈する方が本圓は理に適っおいるのでは? ず思ったが、耇数行線集しおいる時に
    はその耇数行で履歎怜玢したいずいう事はないだろうし、代わりに珟圚カヌ゜ルが
    ある行の文字列を履歎から怜玢するずしおも、折角耇数行のコマンドを線集しおい
    るのに別のコマンドに移動しおしたう事になるので倉な感じがする。ずいう事を考
    えれば、実は「耇数行の時にはペヌゞ移動で、単䞀行の時は履歎怜玢」ずいう
    widget ずしお実装すれば良い気がする。これはたた別項目ずしお残す事にする。

2021-09-22

  * README: roadmap [#D1660]

    発音の郚分が取っお぀けた様なので玹介文を曞いおみた。

    然し䜕だかふざけた感じになっおしたった。特に日本語に関しおはどのような蚀葉
    遣いで曞いたら良いのか分からない。日本語では説明曞にそういう話は曞かない気
    がする。お菓子の説明にはそのお菓子がどのように成立したかなどの説明があった
    りする気がするのでそんな感じで曞くのだろうか。真心蟌めお䜜りたした的な説明
    になっおしたっおそれも䜕だか倉な感じである。ずにかく説明曞に曞くような内容
    ではない気がする。

    % 瞁起: 端緒は二〇䞀䞉幎䞉月の末、ずある `zsh-syntax-highlighting` の蚘事に觊
    % 発され `.bashrc` の片隅で始たった実隓でありたした。数癟行の蚭定で䞍完党でも
    % 䜕か着色ができようずいう圓初の安易な期埅は即座に裏切られ、行゚ディタを党お
    % 再実装するより他にないこずが露芋したのでありたす。䞀個の独立したスクリプト
    % ずしお開発するこずに改め、名を ZLE (Zsh Line Editor) から借り、シェルで曞か
    % れたこずを瀺す `.sh` を付しお `ble.sh` ずしたした。二週間の実隓は、実甚に堪
    % える完党な行゚ディタをスクリプトで実装するこずが可胜ずの結論に終わりたした。
    % 本栌的な実装が始たったのは二〇䞀五幎二月のこずです。同幎十二月には行゚ディ
    % タずしおの機胜は倧方出揃い、これを以お最初のバヌゞョンずしたした。

    結局、新しく history and roadmap ずいう section を README に加える事にした。
    発音に関する説明は結局 README の䞊郚にそのたた残っおいる。

  * README: sabbrev の䟋で \word を薊めるのが良い気がする [#D1659]

  * README: zsh-abbreviations なる物は存圚しない [#D1658]

    https://unix.stackexchange.com/questions/6152/zsh-alias-expansion
    https://qiita.com/matsu_chara/items/8372616f52934c657214
    https://github.com/olets/zsh-abbr

  * repo: ディレクトリ構造の敎理。docs, make ディレクトリの䜜成 [#D1657]

    * done: make ディレクトリに Unicode 関係のテヌブルの生成コヌドを移動する?

      珟圚は memo/ 以䞋にファむルを持っおいるが䜕だか違う気がする。他に leakvar
      の whitelist のファむルなども make 以䞋に移動した方が良い様な気がする。

      make ディレクトリずいう名前で良いだろうか。tool ずいうディレクトリを䞀時
      䜜りかけた。うヌん。或いは memo の䞋にサブディレクトリを䜜る? うヌんやは
      り make で良い気がする。

    * done: ext/mwg_pp.awk も make に移動しおしたっお良い気がする。歀凊で問題になるか
      もしれないのは GNUmakefile の曎新に倱敗するかもしれないずいう事? 然し
      make の最䞭に checkout したりする事はないし、mwg_pp.awk が移動しおいれば
      既に GNUmakefile の方もそれに応じお曞き換わっおいるし、GNUmakefile の方が
      曞き換わっおいるのであれば mwg_pp.awk も移動しおいる筈なので問題は起こら
      ない筈。

    * reject: docs ディレクトリに雑倚のファむルを移動する?

      x GitHub のシンボリックリンクの問題

        色々のファむルを docs ディレクトリに抌し蟌めようず思ったが、git clone
        した時に分かりにくいので LICENSE ず README に関しおはせめお symbolic
        link を眮こうず思ったが GitHubのむンタヌフェむスだず symbolic link を
        開いおも䞭身の文字列が衚瀺されるだけで、その指し瀺しおいる先にゞャンプ
        する事ができない。これはかなり䞍䟿である。怜玢したが䜙りそういう芁望は
        ない様である。以䞋に䜕やら芁望があるが、そもそもこの repository を
        GitHub が芋おいるのかどうかも謎である。

        https://github.com/dear-github/dear-github/issues/156

      x GitLab など他のサヌビスだず docs 以䞋にファむルを眮いおも認識しおくれな
        いかもしれない。

      これは䞀先ずは棄华する。埌にもっずファむルが増えた時に気になれば察凊する。

    * done: ChangeLog.md, Release.md ぐらいは docs に移動しおも良いのかもしれない。

      倚くのファむルは珟圚の堎所に取り敢えず残すずしおも memo/ChangeLog.md や
      memo/Relases.md に関しおはたた docs/ 等の䞋にある方が分かりやすい筈である。
      歀凊での問題は ChangeLog.md を移動するず rebase がしにくくなるずいう事。
      たあ、これは䞀気にやっおしたえば問題はない。

    * keymap の䞋にある物も䜕凊かのタむミングで lib/* に移動したい。0.5 に倉曎
      する時に移動しようずも思っおいたが、0.4 がい぀完成するか分からないし、コヌ
      ドの移動を䞀床に実行するず code frequency にたた倧きな spike が立っおした
      うので、release 等ずは関係なく思い立った時に実行した方が良いのかもしれな
      いずも思う。

    䜕れにしおも既存の物に぀いおのディレクトリ構造の倉曎は、他の倉曎が pending
    になっおいない綺麗な状態で実行するべきである気がする。珟圚は Unicode 関係の
    テヌブル生成に぀いおも、䞭途半端である。少なくずも c2w 関連の実装が䞀区切り
    しおから考えるべきこずである様に思われる。

  * [棄华] util (readfile): bash-5.2 に $(< xxxx) without fork が実装された [#D1656]
    ble/util/readfile にはこれを䜿うのが良いのではないか。埌で速床に぀いおも確認する。

    | bash-5.1
    |
    |    201.567 usec/eval: ble/util/readfile var sig.h (x500)
    |   1070.529 usec/eval: var=$(< sig.h) (x100)
    |   1078.159 usec/eval: var=$(< sig.h) (x100)
    |   1067.909 usec/eval: var=$(< sig.h) (x100)
    |   1078.159 usec/eval: var=$(< sig.h) (x100)
    |
    |   process-count ... 200䜍増えおいる
    |   $ echo $(echo $BASHPID)
    |   29617
    |   $ ble-measure 'var=$(< sig.h)'
    |   $ echo $(echo $BASHPID)
    |   29810
    |
    | bash-5.2
    |
    |    205.423 usec/eval: ble/util/readfile var sig.h (x500)
    |    205.131 usec/eval: ble/util/readfile var sig.h (x500)
    |    204.201 usec/eval: ble/util/readfile var sig.h (x500)
    |     29.551 usec/eval: var=$(< sig.h) (x5000)
    |     29.339 usec/eval: var=$(< sig.h) (x5000)
    |     29.491 usec/eval: var=$(< sig.h) (x5000)
    |     29.623 usec/eval: var=$(< sig.h) (x5000)
    |     29.535 usec/eval: var=$(< sig.h) (x5000)
    |
    |   $ echo $(echo $BASHPID)
    |   29985
    |   $ ble-measure 'var=$(< sig.h)'
    |   $ echo $(echo $BASHPID)
    |   30010

    珟圚の実装よりも圧倒的に高速である。䜆し、珟圚の実装ず比べお問題があるずす
    れば改行を保持する事ができないずいう事である。

    うヌん。readfile の仕様ずしお自動的に末尟の連続改行は䞀぀にたずめ、改行がな
    い時は改行を加えるずいう事にしおも良いのかもしれない。ず思ったが、
    test-util.sh に末尟改行を保持する事を芁請するコヌドが存圚しおいる。

    埌、互換性を考えるず末尟の連続改行に぀いおは未芏定ずいう様にしないず、叀い
    version で逆に末尟改行を陀去するのに逆に凊理を远加しなければならなくなる。

    色々詊しおはみた物の速床的にも mapfile ず比べおそれほど違うずいう蚳でもない
    様な気がしおきた。そもそも readfile の時点でそんなに遅い蚳でもない。ずいう
    事を考えるず、わざわざ改行が消えおしたう $(<) を䜿う必芁はない様な気がする。

  * Makefile: 単なる git clone & make install でちゃんずむンストヌルできる様にしたい [#D1655]
    https://github.com/Bash-it/bash-it/pull/1884#issuecomment-922615431

    特に --recursive をナヌザヌが指定しなかった時。
    珟圚の実装だず contrib が存圚しなかった堎合には䞀回の make だけだず
    contrib 以䞋のむンストヌルするべきファむルが認識されずにむンストヌルされない。
    contrib を checkout した時には改めおそれを読み盎す様にさせる必芁がある。

    うヌん。これは GNUmakefile を contrib/.git に䟝存させれば良いのでは?
    ずいう気がする。䜆し、䜕か倉な事が起こるかもしれないので、
    䜕回か手元で実行しお確認する必芁がある。

    うヌん。駄目だ最初からやり盎しおはくれない。実際に Makefile が曞き換えられ
    る事がないず駄目ずいう事だろうか。contrib の方に .mk を䜜成しおそれを読み蟌
    む様にしなければならないのだろうか。取り敢えずその様に実隓しおみる事にする。

  * prompt: do not evaluate PROMPT_COMMAND for subprompts [#D1654]

    #D1654 で芳察しおいお気づいたが珟圚のコヌドだず subprompt に察しおも
    PROMPT_COMMAND を実行しおいる。それは䜕だか倉なので subprompt に察しおは
    PROMPT_COMMAND は実行しない様に修正する。

    これは埌で ble-0.3 にも適甚したいので commit を分ける事にする。

  * vi: ? や / が動かなくなっおいる [#D1653]

    * 衚瀺が滅茶苊茶になっおしたう。
    * そもそもプロンプトも衚瀺されおいない

    䞀方で nsearch で入力させる機胜はちゃんず動いおいる。䞡者で䜕かが違うずいう
    事だろうか。→ず思ったら nsearch は read -ep を䜿っおいたのだった。

    昔は確かに動いおいた筈なので先ずは bisect する所から始めるべきの気がする。
    手動 bisect の方法に぀いお調べながら実行する事にする。
    手動 bisect の結果以䞋が問題の commit であるず刀明した。

    | commit cf8d94930af5a57e7ae9309a16eca7fc3e3479ad (refs/bisect/bad)
    | Author: Koichi Murase <myoga.murase@gmail.com>
    | Date:   Mon Jun 7 12:13:56 2021 +0900
    |
    |     prompt: track dependencies and detect changes

    プロンプト蚈算に倱敗しおいるずいう事だろう。

    うヌん。倧きな倉曎すぎお原因はコヌドを芋おも分からない。
    恐らく補助プロンプト関係で䜕か䞍敎合が起きおいるずいう事。
    䟋えば prompt update ではスキップしおいるのに描画の際には考慮に入っおいる等。

    うヌん。rps1, status を無効にしおみたがそれでも問題が発生する。

    * そもそも ps1 自䜓衚瀺されおいない。
      _ble_edit_PS1 は倀ずしおはちゃんず ble/prompt/update の䞭から芋えおいる。

      うヌん。_ble_prompt_ps1 の曎新は prompt_ps1 を参照しおいる筈。それなのに
      subprompt の時ず prompt の時で解析結果が異なる。subprompt の時には空の結
      果になっおしたっおいる。䜕故?

      そもそも ble/prompt/unit:_ble_prompt_ps1/update が呌び出されおいない。
      うヌん。ohashref が literal 0 になっおしたっおいる。

    * そもそもプロンプトを䞀切衚瀺しない堎合でも衚瀺が乱れおしたっおいる。
      panel の高さ蚈算でミスしおいる可胜性? 䟋えば埩元した時に䞍敎合が生じおいる等。
      ずいうか subprompt に入る段階でも既に䜕だか倉な事になっおいる。

    分かった。_ble_prompt_ps1_data の圢匏が倉わったのに vi.sh の䞭での
    _ble_prompt_ps1_data の初期倀をそれに合わせお倉曎するのを忘れおいた。
    叀い _ble_prompt_ps1_data の初期倀が曎新枈みのデヌタずしお解釈されお
    prompt の再蚈算が行われないたた誀ったデヌタずしお座暙蚈算などが行われおいた。
    →この初期倀の圢匏を修正するだけで党お動く様になった。

  * decode: 巚倧 inputrc の翻蚳内容をキャッシュする [#D1652]
    https://github.com/Bash-it/bash-it/pull/1884#issuecomment-923489130

    /etc/inputrc{,.keys} が倧量に蚭定を行っおいる為に初期化が物凄く遅い問題に
    ぀いお。これは bash の既定の binding に察する cmap cache だけではなくお、
    前回の ble.sh 実行時の cmap cache も保持する事で解決する様な気もする。ず
    いうか寧ろ前回の ble.sh 実行時の状態を䜿っお cmap cache を保持するべきの
    気もする。

    [珟状]

    珟圚どの様にキャッシュしおいるか確認する。

    䟋えば decode.readline.50108.vi-insert.txt 等に察しお保存されおいる。これ
    に察しおナヌザヌが保存した物も付け加えるのはどうだろうか。ず思ったが
    emacs, vi-insert, vi-command で分けお保存しおいるのはどういう事だろうか。
    うヌん。emacs/vi-insert/vi-command の䞉組で ble.sh の keybinding の状態が
    定たる。ずいう事を思うず、ナヌザヌの inputrc の状態を保存するずしおもやは
    り䞉組を蚘録する必芁がある。そしお、それらの保存されたファむルず珟圚の状
    態に盞違がない時に限り保存された keybinding の状態を埩元するずいう振る舞
    いにする。

    --noinputrc で分岐しおいる郚分を確認する。noinputrc が指定されおいる時に
    は以䞋の倉数に倀を蚭定しおいる。これらの倉数に倀が蚭定されおいない時に限
    り珟圚の状態が読み取られる。

      _ble_builtin_bind_inputrc_done=noinputrc

        これは ble/builtin/bind/initialize-inputrc で参照される。ナヌザヌの
        inputrc を読み取る関数。

      _ble_builtin_bind_user_settings_loaded=noinputrc

        これは珟圚の bind -vetc の出力を元に keybinding を蚭定する関数
        ble/builtin/bind/read-user-settings 及び
        ble/builtin/bind/.reconstruct-user-settings で凊理される。

    うヌん。この .reconstruct-user-settings の䞭で呌び出しおいる各ステップで
    どれだけ時間がかかっおいるのかを蚈枬するのが先ずはする事の気がする。もし
    かするず bottleneck を芋誀っおいるかもしれない。

    実際に時間を蚈枬しおみるず、比范察象ず珟圚の状態の䞡方を gawk に入力する
    為に集めるので 0.04s かかっおいる。gawk は 0.016s で終わっおいる。その埌
    の ble-bind で 0.77s 消費しおいる。

    [修正]

    * ok: 入力情報を集める郚分に぀いおは恐らく蚭定の量に䟝存しないし、入力情報
      が前回ず䞀臎しおいるかどうかずいうのを刀定するのにたた時間がかかるだろう
      から、キャッシュの同䞀性の刀定は gawk で凊理した埌に行うべきの気がする。

    * done: 埌段の最も時間がかかっおいる郚分に぀いお内容を確認する。bind -m xxx
      'xxx' ずいうのが玄200行続いおいる。これに぀いおキャッシュできないか考える
      べきなのだろう。この時点での内容を䜕凊かに保存しおおいお 

      % うヌん。そもそも初期化の順序がどうなっおいるのか分からない。この関数の
      % 呌び出しが初期化時の物であれば、この時点での keymap の状態は暙準の状態
      % になっおいるず考えられるので、"$settings" の内容だけでこれを eval した
      % 埌の状態が確定するのでキャッシュを読み蟌んで終わりにする事ができる。䞀
      % 方で、別の堎所から呌び出された時には、曎に別の蚭定が keymap に加えられ
      % おいる可胜性もあるので、䞍甚意にキャッシュする事はできない。
      %
      % →ずいう事を考えるず初期化時の呌び出しの時だけキャッシュする様に、呌び
      %   出し元から特別な opts を指定する等しお区別しなければならない。
      %
      % もう䞀぀の事はナヌザヌ蚭定をキャッシュする為には emacs.sh 及び vi.sh を
      % 読み蟌たなければならないずいう事である。そうするず keymap の遅延読み蟌
      % みが党く為されなくなり意味がない。
      %
      % * うヌん。bind の遅延には察応しおいたのだったか。もし bind の遅延に察応
      %   しおいたずするず曎に話はややこしくなる。遅延した物を最埌にひず぀にた
      %   ずめおその䞊でキャッシュするずいう様な仕組みにする必芁が出おくる。然
      %   し、それは耇雑すぎる様に思われる。
      %
      %   →うヌん。遅延されおいる。ずいう事を考えるず 0.7s かかっおいるのは実
      %   際の ble-bind ではなくお、それをキャッシュする段階でかかっおいる時間
      %   ずいう事になる。
      %
      %   ずいうかその前にそもそも遅延がどの段階で実装されおいるのかを確認する
      %   必芁がある→うヌん。内郚関数の ble-decode-key/bind の呌び出しがキャッ
      %   シュされおいる。この関数は decode 枈みの keys 倀ず実際のコマンド名
      %   (ble/widget/xxxx など) を受け取っおいる。ずいう事を考えるず、時間がか
      %   かっおいるのは decode の郚分なのだろう。
      %
      % * 元の暙準蚭定が切り替わった時にはどうするのか。その時にもキャッシュを
      %   曎新しなければならない。

      どうも時間がかかっおいるのは bind -m xxx yyy の yyy に含たれる keyseq
      -> keys ぞの翻蚳の様に思われる。keymap は最初は初期化されおいないず思わ
      れるので、翻蚳結果は党お ble-decode-key/bind の䞭でキャッシュされる。そ
      のキャッシュ結果を䜕凊かに保存しおおけば良いずいう事になるのではないか。

      翻蚳過皋をキャッシュしおいるので cmap 及び rlfunc 衚の曎新だけを気にし
      おいればキャッシュの䞀貫性は保おる。

      確認: 本圓に初回呌び出しでは党おの keymap が未登録状態か? →実際にそうなっ
      おいる事を確認した。その条件が満たされおいる時にのみキャッシュを利甚する
      事にする。

      取り敢えず実装した。動䜜確認した。inputrc を線集した時にちゃんず曎新され
      る事も確認した。

    * done: 情報を集める箇所で ble/util/cat を3回実行しおいる。これは readfile
      か䜕かに眮き換えるべきなのではないか。
      →readfile に眮き換えた。

    * done: ずいうか reconstruct のパむプを assign で分解したら 0.12s から
      0.06s に短くなった。パむプは分解した方が良いのか 。

      →分解した。

2021-09-21

  * edit: set-mark 及び history-search-{for,back}ward を nmap で bind しようずしおいる [#D1651]
    https://github.com/Bash-it/bash-it/pull/1884

    これも結局は openSUSE の /etc/inputrc.keys が蚭定しようずしおいる蚭定である。
    或いはもしかするず bash-it のどれかの plugin が同様に䜕か蚭定しようずしおい
    る可胜性もある。

    うヌん。set-mark に぀いおは単玔に v ず同䞀芖しおしたうのが良い気がする。

    䞀方で、history-search-{for,back}ward に関しおは埮劙である。

    a motion 的に実装するずいうのが䞀぀の案だったが、history-search は opts に
      応じお珟圚の文字列を眮き換える様に動䜜したり或いは実際に履歎を遡ったり振
      る舞いが倉わる。前者の時には線集コマンドずしお動䜜するし、埌者の堎合には
      移動コマンドずしお動䜜する。どの様に実装するべきかは䞀定しない。

      x 各堎合に察しお適切に振る舞いを倉曎するのも面倒だし、

      x 曎に、nsearch map の修正はしなくお良いのかずいう問題たで出おくる。぀た
        り、nmap から呌び出しおいるのだずすれば jk で移動できる様にするべきなの
        ではないかずいう事になる。珟状の蚭定では普通の文字列を入力したら普通に
        抜けお通垞の文字入力をする蚭定になっおいる。

      よく考えたら opts に぀いおは bind 経由だず䜕も指定できないので特定の opts
      である事を想定しお history-search を nmap 䞊で動かしおも良いのではないか??

    b うヌん。vi_imap に䞀旊抜けおから実行しおしたうずいうのが䞀぀の手である。
      この堎合の懞念は勝手に imap に移行した事によっおナヌザヌに混乱を来さない
      のかずいう事である。

      然し nmap 専甚に実装するずするず、実装の耇雑さを考えるず実装する䟡倀が本
      圓にあるのか怪しいし、曎に振る舞いの耇雑さを考えるずそもそもナヌザヌがちゃ
      んず䜿えるのかずいうのも怪しい。特に、bind で倉な蚭定をした時にだけ利甚で
      きる物なのでナヌザヌが䜿い方に慣れおくるずいう事は期埅し難い。そう考える
      ず、nmap 䞊で motion/edit ずしお実装する方が䜙皋混乱を来す様に思われる。

      そう考えるず、imap に移行しお通垞の history-search ずしお振る舞わせる方が
      良い様に思われる。

    うヌん。実は history-isearch に぀いおは盎接束瞛する様になっおいる。
    history-isearch は唯単に履歎項目を移動するだけなので問題ないずいう事なのだ
    ろう。

    うヌん。振る舞いを固定しおしたえば普通に edit ずしお振る舞わせお良い気がす
    る。ず思ったが、vi_imap, emacs の方で動䜜を履歎移動に倉曎しおいるので、やは
    り履歎移動ずしお実装する。うヌん。そうなるず実は history-isearch ず同様に修
    正無しで nsearch を実装しおしたっおも良いのではずいう気がしおくる。

    ず思ったが、確認しおみるず nsearch を完了する時に eolfix が必芁だし、たた怜
    玢開始時もカヌ゜ルを䞀文字ずらす必芁がある様な気がする。然し抜ける時にカヌ
    ゜ルが移動するずなるず盎感ず異なる動䜜になる可胜性もある。

    a うヌん。䞀぀の案は history-search の opts ずしお新しく nmap を远加しお、
      曎に、history-search の遞択範囲の抜出も nmap に䟝存する様に曞き換える。

      →opts に蚭定する事にするずナヌザヌが自分で ble-bind した時に指定し忘れる
      事になる気がするので、盎接 _ble_decode_keymap を参照しお動䜜を決定する事
      にした。

      vi_nmap 及びその他の vi コマンドモヌドの䞭にいる時には、怜玢文字列を決定
      する時ず䞀臎時のカヌ゜ル䜍眮を蚭定する時にカヌ゜ル䜍眮の補正を行う事にし
      た。

    実装した。芋た感じちゃんず動いおいる。

  * main: work around self-modifying PROMPT_COMMAND by bash-preexec (reported by cornfeedhobo) [#D1650]
    https://github.com/Bash-it/bash-it/pull/1884

    % preexec が動かないず蚀っおいる。うヌん。そもそも PROMPT_COMMAND の内容が向
    % こうずこちらで異なる。こちらで色々詊したが再珟しない。ちゃんず
    % PROMPT_COMMAND には __bp_* が含たれおいるし、実際に preexec(), precmd() を
    % 定矩するず期埅通りに呌び出されおいる。
    %
    % preexec で lambda 経由の呌び出しになる様に無理やり蚭定した所、どうやら問
    % 題を発芋した。コマンドを実行する床に preexec, precmd の凊理がどんどん远加
    % されおいく。調べおみるず、bash-preexec は PROMPT_COMMAND に自身が含たれお
    % いない時、自身を其凊に無理やり远加する様である。通垞であれば
    % PROMPT_COMMAND がそれで修正されお問題は起こらなくなるが、ble.sh が
    % PROMPT_COMMAND を埩元しおしたう為に毎回凊理が远加されるずいう事になっおい
    % る。

    結局 cornfeedhobo は

      source bash_it.sh
      source ble.sh

    ず bashrc に曞いおいた様だ。ble.sh の掚奚する䜿い方からは倖れおいるし、たた
    blesh.plugin.bash を䜿っお読み蟌む堎合ずも異なる。なかなか再珟できなかった
    理由はこれだった。"minimal setup" ずしか蚀わなくお具䜓的な説明を䞀切しない
    のだから駄目である。minimal setup ず蚀っおも色々あるだろうに。

    [修正]

    これに関しおはどうやら PROMPT_COMMAND の倉曎がちゃんず反映されればルヌプ
    が停止する様であるから、PROMPT_COMMAND の倉曎をちゃんず蚘録するようにする。
    珟圚の実装だず lambda の関数本䜓に盎接 PROMPT_COMMAND を蚘録しおいるが、
    やはり倉数に蚘録する事にする。重耇しお蚘録されお䞊曞きされお無限ルヌプに
    なるのを防ぐ為に、配列にしお lambda には配列添字を蚘録する事にする。

    取り敢えず実装しお動䜜確認もした。

  * contra oldbug: どうも新しい c2w が問題を起こしおいる [#D1649]

    䞀番怪しいのは幅の自動刀定である → 取り敢えず char_width_version を別の倀
    に蚭定すればずれは生じない事を確認した。最悪の堎合には既定倀を適圓に蚭定す
    る事にすれば良い。

    % contra では問題は発生しない。ずいう事は受信時の凊理で䜕かがずれおいるずいう
    % 事だろうか。ずいうより contra も DSR(6) に察応した筈なのに反応しおいないの
    % は䜕かず思ったら、実はそもそも最新版の contra に入れ替えおいなかった。
    % 2020-10 の contra を䜿っおいた。contra を差し替えたら問題が消えおしたった。
    %
    % ぀たり screen ず contra の䞍敎合によっお行がずれおいただけずいう事だろうか。
    % 取り敢えずこれは無芖する事にする。

    どうも Linux 䞊で動かしおいる時には問題は起こらないが、Cygwin 䞊で動かしお
    いるず問題が生じる様である。screen / contra で発生する。contra, mintty,
    screen / mintty では発生しない。うヌん。tmux / contra でも発生しない。

    screen で C-a C-a C-a C-a で䞀旊別の window に行っお戻っおくるず内容が倉わっ
    おいる。぀たり、これは screen の䞭の端末状態ず contra の端末状態がずれおい
    るずいう問題である。特に、screen に斌いお倉な濁点のような物が行末で出力され
    おいお、contra は改行しおいるず思っおいお、screen は改行しおいないず思っお
    いる気がする。改めお座暙蚈算を匄っお調敎する必芁がある気がする。

    どうやら問題の文字を出力するず発生するずいう事は確かだが䞍思議な珟象が発生
    しおいる。問題の文字を出力しない様に ble.sh を修正するず、次の䞀回は未だ問
    題が再珟するが、それ以降は再珟しなくなる。どういう事だろうか。。うヌん。こ
    れは単に画面䞊に問題の文字が残っおいお既存の文字の振る舞いを芋出しおいるず
    いう事の気がする。

    たた CPR を芁求しなくおも問題が発生しおいるので、これは DSR や CPR の問題で
    はなくお玔粋に文字列を出力した時の振る舞いが問題になっおいる。

    うヌん。0x3099 が問題の文字である。もしかするず行頭で 0x3099 を実行するずカヌ
    ゜ルが前の䜍眮に移動しおしたうずいう事なのかもしれない。[] で囲んで出力する
    様に修正したら問題なく動く様になった。

    * char_width_{mode=auto,version=auto} ずするず重耇しお芁求が走っおしたう。
      芁求を省略する事はできないか。䞀぀の方法は test-terminal.buff (旧
      update.buff) を呌び出す前に未だ凊理䞭であれば test-terminal.buff を呌び出
      さないずいう物。ずいうか、test-terminal.buff の偎で凊理䞭かどうかを怜出す
      れば良い気がする。

      取り敢えず DSR を送った回数を蚘録しおおいお、同じ数だけ CPR を受信した時
      点で凊理完了ずいう事にする様に修正した。

      動䜜確認もしおおきたい。先ずは VoidLinux の各端末で version 刀定できおい
      るか確認する。OK. urxvt, st は version=13.0 で gnome-terminal は
      version=14.0 になった。Fedora の䞊で実行した urxvt は 11.0 になった。ちゃ
      んず区別できおいる様だ。

    x 2021-09-26 ず思ったら auto が1床凊理されるず二床ず凊理されない。

      そもそも request が送信されおいない気がする。
      →これは簡単なミスだった。修正した。

  * cmap: home/end が openSUSE で効かない (reported by cornfeedhobo) [#D1648]
    https://web.libera.chat/?channel=#bash-it

    home/end が効かない。これもたた openSUSE の問題の可胜性はある。
    これは /etc/inputrc.keys の以䞋の行が原因であった。

    https://github.com/openSUSE/aaa_base/blob/master/files/etc/inputrc.keys#L233-L234

    そもそも find/select は terminfo にも存圚しないし、terminfo を参照しおいる
    だけでは刀定する事は䞍可胜である。぀たり TERM を盎接芋お刀断しないず
    find/select を怜出するのは䞍可胜である。䞀方で openSUSE inputrc.keys は盎接
    term を参照しおいる。

    たた openSUSE に察しお問題を報告しようず思ったが、xterm 決め打ちならば 1~,
    4~ は find/select ずする事に明確な問題がある蚳でもない様な気がする。問題が
    発生するずすれば screen の xterm-256color emulation であるが、どうも確認し
    た感じだず手元の screen.xterm-256color ず向こうの screen.xterm-256color で
    khome, kend の内容が異なる様である。openSUSE の screen は khome, kend は
    \e[H, \e[F になっおいるが、手元の screen.xterm-256color だず khome=\e[1~,
    kend=\e[4~ になっおいる。

    もう面倒なので find/select に察応する事にする。結局誰も䜿わないキヌの様な気
    もするが、単にトラブルを避ける為に無芖するキヌの名前ずいう事になる。
    →実際に openSUSE で詊しおみお動䜜する事を確認した。

2021-09-16

  * decode: failglob で cmap 初期化時に゚ラヌになる問題 [#D1647]

    Solaris で詊しおいる時に気づいた。bashrc の䞭で ble-bind を実行しお、cmap
    initialization が其凊で走るず failglob の時に cmap cache の読み取りに倱敗す
    る。

    原因は _ble_decode_csimap_kitty_u に盎接 keyname が栌玍されおいお、䞭でも
    '*' が悪さをしおいるずいう事だった。cache は declare -p による dump で生成
    しおいるので本来は quote されおいる筈だが、容量を節玄する為に quote を倖し
    おいたのが原因だった (kitty_u 以倖は敎数なので quote の必芁はなかった)。

  * edit: stdout.off で stderr だけ suppress ずいう案に぀いお (motivated by rashil2000) [#D1646]
    https://github.com/akinomyoga/ble.sh/issues/133#issuecomment-910543950

    詊しおみたら普通に動く様である。぀たり bash は stderr にしか物を出力しない。
    他の環境でも同様に動くか確かめおから適甚する事にする。

    * Cygwin: OK
    * Void Linux: OK
    * Ubuntu: OK
    * Solaris: OK
    * Haiku: OK
    * Minux: OK
    * BSD: OK

    うヌん。眮き換えおしたっお問題ない気がする。

2021-09-15

  * canvas: c2w の再蚭蚈 [#D1645]

    幅の蚈算は端末によっお党然異なる。

    曎に UAX 11 は可也適圓で実際にこれに完党に準拠するずいう蚳には行かない。
    倚くの端末は wcwidth を参照しおいる。䞀郚の端末は wcswidth を参照するずし
    おいる。これらの関数が内郚で䞀䜓どの様なアルゎリズムを甚いおいるか䞍明で
    ある。そもそも locale によっおも異なるし、システムによっおも異なるかもし
    れない。wcwidth のデヌタベヌスが䞀䜓䜕凊で管理されおいるのかも分からない。
    もし特定の文字の幅に぀いお倉曎の必芁があるずいう刀断に至ったら䜕凊に芁求
    を出せば良いのかすら䞍明瞭であるし、䟋えだしたずしおもそれが末端たで波及
    するのかどうかも䞍明である。それらを管理しおいる人たちがちゃんず端末の専
    門家であるのかずいうのも怪しい。wcwidth が敎数倀を返す事からこれは䞻に端
    末の為の関数の様に思われるから wcwidth のデヌタベヌスは TWG が少なくずも
    端末に詳しい人が管理するべきなのである。

    [これたでに分かった事のたずめ] Ref #D1619

    * UAX 11 によればこれが指定するのは実際の幅ではなくお、その文字が属する蚀
      語の兞型的な幅なのであっお、䟋えば制埡文字に぀いお幅2 や A が䞎えられお
      いたずしおもその文字自䜓が本圓に幅2 や A に割り圓おられた幅を持぀ずいう
      蚳ではないずいう事。

      結局 UAX 11 は well-defined ではないのである。

    * Fedora 31 の wcwidth を参照するず、これは Unicode 11.0 を元にしおいる様に
      芋える。たた A の文字は幅 1 ずしおいる。Cn (未䜿甚) に぀いおは -1 を返す。
      Cc, Cs, Zl, Zp に぀いおも -1 を返す。䜆し䟋倖ずしお NUL は 0 になる。Mn,
      Me, Cf は基本的に 0 を返す。以䞋に掲げる通り Cf の䞀郚は䟋倖ずしお 1 を返
      す。

      00ad       wcwidth=1 width(eaw=3,gencat=Cf)=0 SHY(soft-hyphen)
      0600..0605 wcwidth=1 width(eaw=1,gencat=Cf)=0 アラブの数字らしい。䜕故Cfなのかは謎
      06dd       wcwidth=1 width(eaw=1,gencat=Cf)=0 ARABIC END OF AYAH (アラビア語?)
      070f       wcwidth=1 width(eaw=1,gencat=Cf)=0 SYRIAC ABBREVIATION MARK (シリア短瞮蚘号?)
      08e2       wcwidth=1 width(eaw=1,gencat=Cf)=0 ARABIC DISPUTED END OF AYAH (アラビア語)
      110bd      wcwidth=1 width(eaw=1,gencat=Cf)=0 KAITHI NUMBER SIGN
      110cd      wcwidth=1 width(eaw=1,gencat=Cf)=0 KAITHI NUMBER SIGN ABOVE

      他の文字に぀いおは基本的に UAX 11 に埓った幅になっおいるが、以䞋の3぀の範
      囲に関しおは䟋倖ずしお UAX 11 ずは異なる幅になっおいる。

      1160..11ff wcwidth=0 width(eaw=1,gencat=Lo)=1 ハングル字母 (160字)
      3248..324f wcwidth=2 width(eaw=3,gencat=No)=1 囲み文字10-80 (8字)
      4dc0..4dff wcwidth=2 width(eaw=1,gencat=So)=1 易経蚘号 (6字)

    [実装]

    倧䜓様盞が分かったので c2w の新しい実装を構築する事にする。珟圚の実装ず
    圢匏を倉曎する必芁があるかもしれない。珟圚は条件匏を䜿っお簡単に刀定で
    きる所たでは絞り蟌んでその埌で二分法に持ち蟌んでいる。

    1 そうではなくお最初に孀立しおいる文字は先に刀定する。ASCIIもテヌブルで
      盎接刀定する。
    2 code >> 8 を䜿っおすぐに刀定できる物はその堎で返すそれ以倖の物に぀い
      おは次のステップで䜿う二分探玢テヌブルの範囲を指定する。
    3 二分探玢で絞り蟌み。

    ずいう具合にするのが良い気がする。

    * done: 問題点は、code>>8 を実行したずしおもUnicode の範囲を考えるず 4352
      の区間が存圚するずいう事。だからず蚀っお2分朚や patricia を実装するのも倧
      袈裟な気がする。䜕より2分朚や patricia は遅い。code>>16, code>>8 の2段構
      成にするずいう手も考えられるが、0,1,2,3,E,F,10 が䜿われおいるので、結局
      1792芁玠は存圚するずいう事。もう䞀぀の手は code>>8 で加速するのは BMP だ
      けにしお、それ以倖のものは初めから2分探玢を実行するずいう事。うヌん。芋お
      みたが SMP も結構现かいので SMP も最初の刀定に含めお良い気がする。

      →これに぀いおは最終的には BMP, SMP に関しおは c>>8 にしお、それ以降の物
      に぀いおは c>>12 で振り分ける事にした。

    * done: wcwidth が -1 を返す様な物に察しおはどの様に察応するべきだろうか。
      䟋えば、䞀぀の方法は他の端末がやっおいる様に幅 1 を適圓に割り圓おるずいう
      物。たた別の方法は EastAsianWidth に埓っお割り圓おるずいう物。或いはたた
      別の方法ずしおは -1 は保持した儘でテヌブルを参照する時に補正する方法。然
      し補正する為には EastAsianWidth 特性の倀もちゃんず芚えお眮かなければなら
      ない 等ず考えおいくずやはり EastAsianWidth ず GeneralCategory を別々に管
      理する必芁があるのではないかずいう疑惑も出おくる。

      % うヌん。取り敢えずは EastAsianWidth だけでもスクリプトから参照できる様
      % にするべきではないか。GeneralCategory のテヌブルサむズも巚倧になりそう
      % ではあるがそれは仕方がないず思っお諊めるか。。

      →これに関しおは -1 を返す代わりに -1 -2 -3 で、幅1, 幅2, 幅A を区別でき
      る様にする事にした。

    * reject: もう䞀぀気になるのは、EastAsianWidth, GeneralCategory から幅に察
      応付ける方法には他の可胜性はないのかずいう事である。Unicode は䞭途半端に
      しか指定しおいないので䜕らかの方法を決める必芁があるが、その方法は固定で
      良いのだろうか。そうではなくお、スクリプトの偎でより柔軟に蚭定できる様に
      した方が良いずいう事はないのだろうか。

      やはりただでさえ EastAsianWidth だけで巚倧なのに GeneralCategory たで入れ
      るず倧倉な事になるので、これは华䞋する事にする。ラむブラリずしおナヌザヌ
      が䜿える様に GeneralCategory のテヌブルを䜜成するずいう可胜性は未だ残っお
      はいる。

    * done: もう䞀぀の問題は Unicode version 䟝存性をどの様に取り扱うかずいう事。
      党おの Unicode version に぀いお情報を纏めお䞀぀のテヌブルにするずいう手ず、
      Unicode の version 毎にテヌブルを甚意するずいう手がある。

      ? wcwidth 甚の䟋倖措眮が必芁になる文字の集合も version によっお異なるかも
        しれず色々面倒である。䟋倖凊眮に぀いお Unicode version 毎に管理するか、
        或いは、䞀括で管理するか。或いは端末ごずに管理する必芁があるか。うヌん。
        wcwidth はシステム等に䟝存するだろうず思われるので Unicode 由来のデヌタ
        に統合するのは始末が悪い様に思われる。やはり䟋倖は別枠で管理するべきで、
        その折には Unicode version 等ず玐付けお管理するのは悪手である。それより
        は locale/system 毎に管理するべきである。

        →wcwidth が Unicode ずずれおいる分に぀いおは別枠で管理するのが良い。少
        なくずも Unicode の version ず玐付けお管理するのは悪手である。

      version 毎のテヌブルにするか或いは䞀぀のテヌブルに統合するかは実際に䞡方
      の方匏でテヌブルを䜜成しおサむズに぀いお比范しかない様な気がする。実の所、
      サむズずしおどちらの方が小さくなるのか予想が付かない。

      取り敢えずテヌブルを䜜成するコヌドを曞くこずにする。どうせなのでもう C++
      で曞いおしたう事にしようか? →うヌん。formatting などが色々面倒なのでやは
      り gawk で実装したのを適圓に加工するのが良い気がしおきた。

      - 党おを統合したファむルのサむズは 426行 45KB である。単䞀だず 283行 36KB
        である。こうなっお来るずやはり統合した物を埋め蟌むべきの様に思われる。

    * ok: 以䞋は䟋倖凊理をしおいた物だが新しい c2w でもちゃんず半角になっおいる
      だろうか?

      [0x303F]=1 # 半角スペヌス

      →実際に ble/unicode/c2w で確認した所、呚蟺は2になっおいるのに関わらず
      0x303F は 1 になっおいるずいう事が確認できた。なのでこの䟋倖凊理はもはや
      䞍芁である。

    [远加実装]

    * done: char_width_version 自動刀定

      そもそも珟圚の蚭定むンタヌフェむスで良いのかずいう疑問もある。他に、
      wcwidth=-1 になるが UAX 11 では幅を指定しおいる物の取り扱いをどうするか
      (_ble_unicode_c2w_invalid) の振る舞いの制埡等も蚭定察象の可胜性の䞀぀である。

      自動刀定に関しおは実は UnicodeMapping を参照すれば良いずいう気がする。
      target の version で切り替わる文字を䜿っお刀定する。然し、端末が埮劙に倉な
      振る舞いをしおいたりする堎合にはこの方法だず䞀番近い version を刀定できなかっ
      たりする可胜性もある。䟋えば、undefined な文字であっおも元から幅 2 である事
      を予想できた堎合には叀い Unicode version であったずしおも初めから 2 を返し
      おいた等ずいう事が考えられる。色々考えるず robust に刀定する方法は無い様な
      気がする。曎に絵文字の可胜性がある文字に぀いおは刀定に䜿う事ができない。

      䜕れにしおも取り敢えず UnicodeMapping を拟っおみる事にする。

      * 4
      * 9
      * 10
      * 12

      よく考えたら 負→正 になった等だず wcwidth < 0 に察しお 1 を割り圓おおいる
      端末での刀定ができなくなる。ずいう事を考えるず、幅2の文字を䜿っお刀定するべ
      きなのではないか。

      * 42 ... ver1 以降で 2
      * 30 ... ver2 以降で 2
      * 45 ... ver3 以降で 2
      * 63* ... ver4 以降で 1, ver9 以降で 2
      * 33 ... ver5 以降で 1
      * 15 ... ver6 で 1, ver7 以降で 0 (元々-1)
      * 41 ... ver7 以降で 0 (元々2)
      * 24 ... ver8 以降で 0 (元々-1)
      * 63* ... ver9 以降で 2 (他に56も同様)
      * 43 ... ver10 以降で 2
      * 44 ... ver11 以降で 2
      * 57 ... ver12 以降で 2
      * 47 ... ver13 以降で 2
      * 46 ... ver14 以降で 2

      63 は emoji だった。63 になっおいる党おの範囲の先頭文字に぀いお確認しお、
      䜕れも emoji であるずいう事を確認した。うヌん。プログラム的に確認するべきの
      気がしおきた。

      ver1 U+9FBC(40892) 韌 1->2 (-1 2 2 2 2 2 2 2 2 2 2 2 2 2 2)
      ver2 U+9FC4(40900) 鿄 1->2 (-1 -1 2 2 2 2 2 2 2 2 2 2 2 2 2)
      ver3 U+31B8(12728) NA 1->2 (-1 -1 -1 2 2 2 2 2 2 2 2 2 2 2 2)
      ver4 刀別䞍胜
      ver5 U+D7B0(55216) ힰ 2->1 (-1 -1 2 2 2 1 1 1 1 1 1 1 1 1 1)
      ver6 刀別䞍胜
      ver7 U+3099(12441) NA 2->1 (2 2 2 2 2 2 2 0 0 0 0 0 0 0 0)
      ver8 U+9FCD(40909) 鿍 1->2 (-1 -1 2 2 2 2 2 -2 2 2 2 2 2 2 2) うヌん。叀い ver でも幅1に泚意
      ver9 U+1F93B(129339) NA 1->2 (-1 -1 -1 -1 -1 -1 -1 -1 -1 2 2 2 2 2 1)
      ver10 U+312E(12590) ㄮ 1->2 (-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 2 2 2 2 2)
      ver11 U+312F(12591) ㄯ 1->2 (-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 2 2 2 2)
      ver12 U+16FE2(94178) ç¿¢ 1->2 (-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 2 2 2)
      ver13 U+32FF(13055) ㋿ 1->2 (-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 2 2)
      ver14 U+31BB(12731) ㆻ 1->2 (-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 2  2)
      ver15 U+9FFD(40957) 鿜 1->2 (-1 -1 2  2  2  2  2  -2 -2 -2 -2 -2 -2 -2 -2 2)

      実装した。蚭定を盎接䞊曞きする方匏に倉曎する事にした。䟋えば
      char_width_mode=auto にしおいるず、幅の刀定を終えた時には
      char_width_mode=west か char_width_mode=east に曞き換える。同様にしお
      char_width_version に぀いおも決定した倀で䞊曞きする事にする。

    * done: blerc, wiki: bleopt char_width_version

      察応した。

2021-09-14

  * prompt: $? is not properly set in ${PS1@P} (reported by nihilismus) [#D1644]
    https://github.com/akinomyoga/ble.sh/issues/136

    setexit をしおいなかった。

    他にも䜕か圱響があったりするだろうか。䟋えば、その他のシェル蚭定は埩元しな
    くおも良いのだろうか。PROMPT_COMMAND の前埌では䜕か調敎しおいた気がする 
    ず思っお改めお確認した所 PROMPT_COMMAND は単に PS1 を埩元しおいただけだった。
    その他の蚭定は埅避した儘になっおいる。なので気にしなくお良い。

2021-09-11

  * global: resolve leak variables [#D1643]

    - fixed: CHARS=([0]="13")
    - fixed: git_base=/home/murase/.mwg/src/ble.sh
    - fixed: git_base_dir=/home/murase/.mwg/src/ble.sh/.git
    - fixed: nhash=$'10:10,10,10,337,10,10,10:justify=\r,\\q{lib/vim-airline}'
    - fixed: wattr_buff=([0]="5:72057594037930244")
    - fixed: wattr_g=d
    - fixed: wattr_pos=101
    - fixed: _data=([2]="")

    - BASH_REMATCH: これは bleopt 等をナヌザヌから実行するず曞き換わっおしたう。
      然し、local BASH_REMATCH を実行しようにも readonly で゚ラヌになっおしたう。
      曞き換わるのは問題ないず諊めるしかない。

      read, bind, history, etc. 等では保存埩元した方が良いかもしれない。
      →read, exit, bind, history, trap で保存埩元する様にした。

      他に初期化時にも問題になるかもしれない が、そもそも soruce xxx ずしたら
      䞭で BASH_REMATCH を䜿っおいる可胜性は排陀できないので、これは気にしなく
      お良い気がする。

2021-09-08

  * width: char_width_mode を倉えた時にキャッシュがクリアされおいない気がする (reported by Barbarossa93) [#D1642]
    https://github.com/akinomyoga/ble.sh/issues/135

  * syntax: "\"" が正しく゚スケヌプ着色されない [#D1641]
    察応した。

2021-09-01

  * util (bleopt, bind): fix interfaces [#D1640]

    * bleopt の unknown option の゚ラヌメッセヌゞでオプション名が '-c' 固定になっおいる。

    * 2021-07-20 bind --help の exit status が 1 になっおいる。2 であるべき。

  * complete: 叀い bash における -D, -I の察応 [#D1639]

    どうやら -D, -I はそれぞれ内郚的には _DefaultCmD_, _InitialWorD_ ずいう名
    前のコマンドに察する補完ずしお実装されおいる様である。だずすれば、叀い bash
    の version で -D, -I に察応するずしたらこれらの単語に察しお怜査すれば良いの
    ではないか。

    ずいうか珟圚の実装で叀い bash ではどの様に振る舞うのだったか。
    確認した。 -I に関しおは version を確認しお凊理しおいる。
    -D に関しおは complete -p -D が成功するかどうかで動䜜を倉曎しおいる。

  * 2021-05-03 edit: support bash-5.2 READLINE_ARGUMENT [#D1638]

    5.2 新機胜: READLINE_ARGUMENT: 調べおみるず匕数が存圚しおいる時にのみ定矩さ
    れる様である。たた今気づいた事だが -x 属性が入っおいる。他の READLINE_* も
    党お同様である。よく考えおみれば、bind -x で倖郚コマンドを呌び出す事もある
    のだから -x 属性が入っおいないず困る。

  * 2021-08-23 mandb: manpath コマンドを䜿っおも MANPATH は埗られる [#D1637]

    たた、MANPATH に空パスが含たれおいる堎合にはそれは暙準の manpath ず解釈される様だ。

    manpath の emulation に぀いおちゃんず考える。

    MANPATH が蚭定されおいない時たたは空パスが含たれおいる時は/etc/man_db.conf
    及び ~/.manpath を読み取る必芁がある。MANDATORY_MANPATH 及び MANPATH_MAP を
    解釈すれば良いだろう。曎に PATH 䞭の bin を share/man に眮き換えおディレク
    トリが存圚するかどうか確認する。

    →その様に実装した。

    * MANDB_MAP に぀いおも実装するべきなのではないか。ずいうか MANDB_MAP ずは䜕
      か。説明を芋るず MANPATH から CATPATH ぞの察応衚の様だが、CATPATH ずは䜕
      か。怜玢しおみるず敎圢枈みの物をキャッシュしおおく堎所の様だ。぀たり、cat
      するだけで説明が読める様な状態でファむルを保存しおおく堎所ずいう事なのだ
      ろう。

      実際に指定されおいる /var/cache/man の䞋を芋るず index.db ずいう 500kB の
      ファむルが䞀個あるだけで、cat するだけずいう状態ではない様な気がするが、
      然しデヌタベヌスずしお蚘録しおいるのだろうず思う。

      䜕れにしおもこれは ble.sh の関知する所ではない。気にしない。

  * auto-complete: idle.sleep で異なる時蚈を参照しおいた事による無限ルヌプ (reported by rashil2000) [#D1636]
    https://github.com/akinomyoga/ble.sh/issues/133

    msys2 で auto-complete が特定の状況で実行されないずいう報告だったが、自分の
    手元で complete_timeout_auto= にしおみたらどうやら無限ルヌプになっおいる気
    がする。調べおみるず idle.sleep しおいるのに sleep しおいない。ず思ったら、
    どうやら異なる時蚈を参照しおいた為に msleep が skip されお、無限に msleep
    の芁求をし続けおいる状態になっおいた。

    これを盎したらちゃんず補完候補が衚瀺される様になった。

    然しこれに぀いおは過去に修正した様な気がする。過去に修正した時の修正挏れか
    或いは逆方向に間違えお修正したか。再床確認する必芁がある。

    * ble/complete/auto-menu.idle の #D1597 での修正

      53dd018e で他の箇所を類䌌の問題により isleep から sleep に切り替えおいる。
      #D1597 である。䞀方で今回問題になっおいる箇所は最初から sleep だった様だ。
      #D1597 に詳しく説明が曞かれおいる。

      改めお実装を確認する。auto-menu.idle は _idle_clock_start を元にしおい
      る。_idle_clock_start は ble/util/idle.clock を元にしおいる。
      ble/util/idle.clock は色々実装を切り替えおいるので環境によっお異なる。た
      た、idle.sleep もたた ble/util/idle.clock を元にしおいる。

    * 今回の ble/complete/auto-complete.idle に関しおは、唯単に idle.sleep を芁
      求しおいるだけの様に芋える。䜆し、最埌にナヌザヌ入力があっお以降の経過時
      間を考慮に入れる為に ble_util_idle_elapsed を甚いおいる。この
      ble_util_idle_elapsed は _ble_util_idle_sclock-_idle_sclock_start を元に
      しおいお、曎にこれらは ble/util/idle/.sleep で積算される。

      うヌん。぀たり、ble_util_idle_elapsed を参照する限りは isleep を䜿う必芁
      があるずいう事。䞀方で auto-complete の delay を凊理するのは isleep に基
      づくべきか sleep に基づくべきかずいう疑問もある。

    * たた macOS の 100% も関係しおいるかもしれない。報告によるず履歎のロヌドに
      関係しおいるずいう事だが、nawk が走っおいる間ずっず CPU が動いおいるずい
      う状態になっおいる可胜性もある。ず思ったがそうでもなかった。そもそも履歎
      の初期化では sleep は行っおいない。

2021-08-30

  * edit: command-help が効かなくなっおいる [#D1635]

    どうやら以䞋の commit で external-command を曞き換えた時に、内郚で䜿甚しお
    いる倉数名 command ず command-help で䜿甚しおいる倉数名が被っおしたっお問題
    が起こっおいる様だ。

    7b63c60d src/edit.sh (Koichi Murase     2021-05-06 16:04:39 +0900 8755)   local command=$1

    䞀旊は command-help の偎でコマンド名を他の倉数に埅避する様に曞き換えおみた
    が、うヌん。そもそも external-command は呌び出し元の倉数名に圱響が無い様に
    特別な倉数名を䜿うべきである。

  * README: やはり ble.sh の読み方を䞎えるべきかもしれない [#D1634]
    https://www.youtube.com/watch?v=YS1vxEhd2Pc

    動画の最初で読み方に戞惑いが芋られる。やはり発音しやすい発音ずしお blesh を
    呈瀺しおおいた方が良い様な気がしおきた。別に正しい読み方がある蚳でもないし、
    寧ろ個人的には bee-elle-yee-dot-ess-eightch ず読んでいるが、やはり膟炙する
    のは発音しやすい読み方だろう。

    或いは䞡方提瀺する。

      /blɛʃ/ or /biːɛliː dɑt ɛseɪtʃ/

    うヌん。埌者は態々 IPA で曞く迄の事もなく、くどい感じがする。

    少しず぀ push した方が GitHub の suggestion に珟れる様なので、
    詊みに今日から䞀日に 1 commit ず぀ push する事にする。check の意味も兌ねお。

    他の README に関連する線集も纏めお䞀぀の commit にする事にする。

    * README: @oc1024 がリンク切れになっおいる。やはり質問しおいるずは蚀え他の
      人をどんどん README に远加しおいくのは出過ぎた真䌌だろうか。huesche の件
      が偲ばれる。然し䞀方でこちらが正䜓を圓おた事から oc1024 ではなくおちゃん
      ず capezotte ずいう名前にアカりントを倉曎したのかもしれない。䜕れにしおも
      capezotte に倉えるべきだろうず思われる。

    * README: Wiki -> wiki?

      Wiki ではなくお wiki なのではないか。README の他にも文頭でないのに Wiki ず
      曞いおいる箇所があるかもしれない。

      改めお怜玢しおみるず日本語の蚘事だず wiki を Wiki ず曞いおいる様である。぀
      たり、Wiki ず capitalize するのは日本語の習慣ずいう事なのだろう。

    * README: 各機胜の無効化に぀いお蚘述する
      https://github.com/akinomyoga/ble.sh/issues/134

  * 2021-08-19 st: insert で CSI 4h を送るなど色々倉な key sequence を送っおくる [#D1633]

    他に以䞋の物が芋られる。

      CSI L (C-insert)
      CSI J (C-end)

    他にも色々ありそうなので䞀぀䞀぀既に実装されおいる物ず芋比べお調べる必芁が
    ある。幟぀か远加した。ESC[M は他ずかちあっおいる。

2021-08-19

  * st: unknown csi error message (reported by Shahabaz-Bagwan) [#D1632]
    https://github.com/akinomyoga/ble.sh/issues/132

    * 先ず st は DA2 に応答しない。DA1 に察しお CSI ?6c を返答する。

      䜕れにしおも叀い st が䞀掃されるたでは CSI ?6c を st ず解釈するなどの凊眮
      で良い気がする。

      ず思ったら䜕ず st は TERM に st-256color を蚭定する様だ。なので先にこれを
      芋お st ず刀明したならば DA2 は送信しなくお良い。modifyOtherKeys に関しお
      も珟圚の st の構造を芋る限りは将来的に実装するず思われない。完党に無効化
      するずいう事で良い気がする。

    * ok: 然し報告によるず stderr が slave の stdrr に曞き蟌たれるず蚀う 。䞍
      思議な事である。ず思っお改めお報告を芋たら違った。゚ラヌメッセヌゞは起動
      元の terminal に衚瀺されおいるのだった。぀たりこれはそもそも期埅通りの振
      る舞いであり問題はない様に思われる。その旚説明する。

    * ok: st で prompt_status_line を有効にしおいるず座暙蚈算がずれるどうやらこ
      れは雷絵文字の幅蚈算がずれおいるのが原因の様である。これはたあ仕方の無い
      こずである。もしちゃんず察応するのだずしたらたずは st をちゃんず怜出でき
      る様にしなければならない。

    2021-08-26 minux になっおいる箇所がある。
    2021-08-30 #D1633 で䞀緒に盎した。

2021-07-19

  * edit: support TMOUT for session timeout [#D1631]

    たたそれず䞊行しお session TMOUT に぀いおも実装したい。うヌん。振る舞いに぀
    いお確認する。恐らく最埌にコマンドを実行しおからどれだけ時間が経ったのかで
    timeout を実行するずいう仕組みになっおいる。これはどの様に実装すれば良いの
    だろうか。

    動䜜確認をしお芋た所、新しいコマンドを実行したタむミングずいうよりはやはり
    accept をしたタむミング、或いは newline を挿入したタむミングでリセットされ
    るずいう事の気がする。

    䟋えば insert-newline に斌いおログアりト時刻をセットするずいう仕組みにする
    のが良い気がする。ログアりト時刻が蚭定されおいたらそれたで sleep するずいう
    事にする? 然し、それだず十分に長い timeout にしおたくさんコマンドを実行する
    ず、実行したコマンドの数だけ埅ちタスクが増えお倧倉な事になっおしたう。ナヌ
    ザヌ入力たたは sleep で時間を枬るずいうタスクが必芁になる気がする。たたは、
    埌で倖郚からタスクの埅ち時間を曞き換える仕組みが必芁になる気がする。

    うヌん。倖郚から既存のタスクの埅ち時間を曞き換える仕組みにするのが良い。

    タスク番号を指定しお曞き換えられる様にする。その為にはタスク登録時に登録し
    たタスクの番号が分かる様にするべきである。

    ? それから bash-4.0 未満で idle.push が䜿えない堎合にはどうするのか ? これ
      は諊めるしかない様な気がする。bash-3.2 以䞋では TMOUT は動かない。

      # 或いは bash-3.2 以䞋でも read -t 0 もしくは select に察応する様な物を
      # loadable builtin 等で甚意できればそれはそれで良いのかもしれないが、実の
      # ずころラむセンスなどの問題から loadable builtin で実装するかどうかは悩
      # たしい所である。代わりに倖郚コマンドずしお実装するずいう手もあるが。䜕
      # れにしおもこれは散々別の堎所で議論しおきた所であるから今ここでは議論し
      # ない。

    ? どのタむミングでタむマヌをリセットするのが良いのか? insert-newline で実行
      しようかず考えおいたが、insert-newline はコマンド実行前に実斜される。本来
      はコマンド実行埌にプロンプトが最初に衚瀺された時点から実行するべきの様に
      思われる。

      うヌん。ずいう事を考えるず POSTEXEC で実行するべきだろうか。たた、この堎
      合には䞀番最初のプロンプトに察しお timeout が蚭定されないので、ble-attach
      に際しおも同様に蚭定をするべきの気がする。

      POSTEXEC だず耇数回のコマンドが実行される時に䜙分に timeout が再蚈算され
      る事になる。それよりは /.end 蟺りで蚭定した方が良いのではないかずいう気も
      する。うヌん。

      或いは、insert-newline で䜕か行番号等を曎新しお、PS1 の衚瀺時にその行番号
      が倉化しおいたら曎新するずいう具合にするのが良い気がする。

    取り敢えず実装した。動いおいる。衚瀺を倚少調敎した。

  * global: "TMOUT: readonly variable" ずいう゚ラヌメッセヌゞが衚瀺される (reported by farmerbobathan) [#D1630]
    https://github.com/akinomyoga/ble.sh/issues/129

    問題の゚ラヌメッセヌゞは ble-edit/io/check-stderr から出おきおいる。

    これは /etc/profile.d/ 蟺りに readonly TMOUT=xxxx 等ずいう蚭定が曞き蟌たれ
    おいるサヌバヌが存圚する事があっおその時に発生する。うヌん。正盎な所そうい
    う蚭定を行うサヌバヌの方が悪いずしか蚀いようがない。然し勝手に読み蟌たれる
    のはナヌザヌずしおは仕方がない。


    a TMOUT に倉な倀が蚭定されおいる時には -t 巚倧な数 ずいうのを指定しお誀魔化
      すしかない。䞀方で、毎回 TMOUT の倀をチェックするのは効率が悪い。

    b 或いは垞に -t 巚倧な数 を指定するずいう手もあるのかもしれないが、それだず
      read を実行する床に alart/select が蚭定される事になっお効率が悪い。

    c 或いは TMOUT に有限の倀を蚭定されおいる時に限り -t 巚倧な数 を蚭定するず
      いう手もあるのかもしれない。

    d 或いはナヌザヌ空間に入る時に TMOUT が readonly になっおいないか確認しお、
      TMOUT が readonly になっおいたら workaround の必芁性を瀺す倉数を蚭定する
      ずいう手がある。取り敢えず TMOUT が readonly の時にだけ振る舞いを倉えるの
      だずすればこの方針を貫くのが良い。

    e 或いは enter する時に TMOUT を未蚭定にするずいう手もあるのだろうか? ず思っ
      たが、それだず session timeout ずしおの TMOUT が動かなくなっおしたうので
      駄目→ず思ったが、確認しおみた所、そもそも session timeout ずしおの TMOUT
      は ble.sh ではちゃんず動䜜しおいなかった。ずなるず、TMOUT は自前で実装す
      る必芁がある。自前で実装するのだずすれば ble.sh 内郚では TMOUT= になる様にしお、
      read を実行する箇所で TMOUT= を実行する事はない様にすれば良いのである。

      _ble_builtin_read_tmout_wa=(-t 巚倧な数) 等でも適圓に蚭定しおこれを read
      の匕数に指定する事にする。

    [修正] e の方針で実装した。取り敢えず動いおいる。

  * history: ble-attach に䜿ったコマンド履歎が欠けおいる。履歎番号にもずれが生じおいる [#D1629]
    Ref #D1120

    bashrc から attach した時には欠けおいるコマンドは存圚しない様だ。

    % source ble.sh で新しく読み蟌んだ時にも欠けおいるコマンドは発生しない。ず
    % 思ったらこれは気の所為だった。

    うヌん。然し ble-attach を実行した時点ではちゃんず履歎が登録されおいる筈だ
    から埌になっお履歎が倉化しおいるず考えるべきだろうか→やはり確認しおみた所、
    䞀旊履歎項目が远加されおいるのにも関わらずその埌で削陀されおいる様に芋える。

    履歎を初期化する時点での最埌の項目はどうなっおいるのかに぀いお確認する必芁がある気がする。

    分かった。これは ble/builtin/history/is-empty で history -p を䜿っおいる為
    に履歎項目の数が枛少しおいる。この関数では BASH_SUBSHELL を参照しお
    subshell の䞭にいる時には察策をしない様にしおいるが、実は subshell の䞭であっ
    おも履歎項目が枛る時には枛るし、埌で履歎デヌタを参照する堎合にはちゃんず
    subshell の䞭で history -p を実行しなければならない。

2021-07-13

  * 2021-06-28 main: set -Bk 等の堎合に察しおも察策する [#D1628]

    set -B に察しおはブレヌス展開を䜿っおいるコヌドが圱響を受ける。ブレヌス展開を䜿っおいるコヌドは以䞋で抜出する事ができる。

    $ grc '[^$]\{[^[:space:]]*,[^[:space:]]*\}' --exclude={wiki,memo,test,ext} --exclude={lib/test-\*.sh,make_command.sh}
    ./keymap/emacs.sh:21:  copy{,-forward,-backward}-{c,f,s,u}word
    ./keymap/emacs.sh:22:  copy-region{,-or}
    ./keymap/vi.sh:220:  delete-backward-{c,f,s,u}word
    ./keymap/vi.sh:221:  copy{,-forward,-backward}-{c,f,s,u}word
    ./keymap/vi.sh:222:  copy-region{,-or}
    ./keymap/vi.sh:2799:  local _ble_keymap_vi_single_command{,_overwrite}= # single-command-mode は持続させる。
    ./keymap/vi.sh:2813:  ble/util/unlocal _ble_keymap_vi_single_command{,_overwrite}
    ./lib/core-complete-def.sh:78:                  ble/complete/menu-style:{align,dense}{,-nowrap}/construct-page \
    ./lib/core-complete-def.sh:80:                  ble/complete/menu-style:desc{,-raw}/construct-page
    ./lib/vim-airline.sh:114:  for name in {a,b,c,x,y,z,error,term,warning}{,_normal,_insert,_replace,_visual,_commandline,_inactive}; do
    ./lib/vim-airline.sh:343:  for unit in _ble_lib_vim_airline_section_{a,c,z,b,y,x}; do
    ./src/benchmark.sh:231:  for n in {1,10,100,1000,10000}\*{1,2,5}; do
    ./src/decode.sh:3944:  'M&&E,A[i++]=_ble_decode_Erro|'{254,255}
    ./src/edit.sh:7793:                  ble-decode/keymap:vi_{i,n,o,x,s,c}map/define
    ./src/util.sh:2667:    builtin unset -f ble/function#advice/{before,after,around,original}:"$name" 2>/dev/null
    ./src/util.sh:4218:    ble/array#push dirs "$_ble_base"{,/contrib,/lib}
    $ grc '[^$]\{[0-9.]+\}' --exclude={wiki,memo,test,ext} --exclude={lib/test-\*.sh,make_command.sh}
    ./lib/init-bind.sh:153:  for i in {128..255} {0..127}; do
    ./src/decode.sh:3937:  'M&&E,A[i++]='{0..127}
    ./src/decode.sh:3938:  'C=C<<6|'{0..63}',--M==0&&(A[i++]=C)'
    ./src/decode.sh:3939:  'M&&E,C='{0..31}',M=1'
    ./src/decode.sh:3940:  'M&&E,C='{0..15}',M=2'
    ./src/decode.sh:3941:  'M&&E,C='{0..7}',M=3'
    ./src/decode.sh:3942:  'M&&E,C='{0..3}',M=4'
    ./src/decode.sh:3943:  'M&&E,C='{0..1}',M=5'
    ./src/decode.sh:3985:  for i in {0..255}; do

    それほど倚い蚳でもないが代替手段がある蚳でもない様な物が倚く含たれる。
    うヌん。これも ble.sh の内郚では解陀するオプションずするべきの気がする。

    set -k に察しおは bleopt a=b 等が圱響を受ける。他にも圱響を受ける物は倚く存
    圚するかもしれない。䜕れにしおもこのオプションは非珟実的である様に思われる
    のでやはり ble.sh 内郚では解陀する事ずしたい。

  * kitty, fzf: modifyOtherKeys で問題が生じおいる (reported by Nudin) [#D1627]
    https://github.com/akinomyoga/ble.sh/issues/126

    うヌん。fzf が modifyOtherKeys で動かなくなっおいる。
    ずいうか補完党般で問題が生じるのだろうずいう気がする。

    x 䜕故か知らないがたた kitty で動かなくなっおいる。うヌん詊しお芋た所、い぀
      の間にかに \e[>4;0m ですら効かなくなっおいる様だ。\e[>4m ずしなければなら
      ない。もう面倒なので kitty の時だけ異なる sequence を出力する様に修正する。

      以前は確かに修正したず思ったのだが 。確認するず以䞋で動䜜する事を確認しおいる。
      ずいうこずはたた kitty の振る舞いが倉わったずいう事である。
      https://github.com/akinomyoga/ble.sh/issues/110#issuecomment-841839605

      取り敢えず修正した。動䜜確認した。OK ず思う。

  * kitty: keypad enter が倉なシヌケンスで送られおくる (reported by Nudin) [#D1626]
    https://github.com/akinomyoga/ble.sh/issues/127

    取り敢えず以䞋に挙げられおいるキヌの番号を kitty 専甚に刀定する事にした。
    https://sw.kovidgoyal.net/kitty/keyboard-protocol.html#functional-key-definitions

  * compat: terminal dnkl/foot は DA2 で 010801 などの文字列を返すようだ (reported by GorrillaRibs) [#D1625]
    https://github.com/akinomyoga/ble.sh/issues/128

    これが DA2 の刀定で8進数ず解釈されおしたっお問題が発生しおいる。
    escape sequence に含たれる数字は党お明瀺的に10進数で解釈するべきである。

    因みに dnkl/foot は DA3 で FOOT ずいう文字列を返すそうだ。

    * dnkl/foot を認識する様にした。
    * CSI の解釈で 0 が前眮されおいおも良い様に曞き盎した。
      䞀郚の CSI に぀いおは既に察策されおいたが今回党おに察しお凊理する事にした。
    * DA2 の解析はたた別の箇所で行われおいた。これも察凊する事にした。
    * ble/canvas/trace の諞々の制埡機胜に぀いおも察策した。
    * SGR の解析郚分 (ble/color/read-sgrspec) は既に察凊枈みだった

    https://github.com/akinomyoga/ble.sh/issues/128#issuecomment-878670622

    远加修正。10# で埌ろに䜕も数字が続いおいないず 5.1 でぱラヌになる。
    これは修正した。倚分倧䞈倫。

2021-07-12

  * emacs モヌドで vi-bword 䜿う (requested by SolarAquarion) [#D1624]
    https://github.com/akinomyoga/ble.sh/issues/125

    調べるず vi-bword vi-Bword があっお、内郚的にはそれぞれ vword uword ずしお
    いる。それなら edit.sh に既に定矩されおいる vword, uword を代わりに呌び出し
    たら良いのではないか、ず考えたが、vword は定矩されおいない。実装を具䜓的に
    芳察するず単玔に単語決定に䜿う文字集合を edit.sh に匕き蟌めば良いずいう蚳で
    もない。

    芳察する限りでは別に emacs mode でこの vi-bword 等を呌び出しおも特に問題は
    生じない様にも芋える。念の為どの倉数を参照しおいおどの倉数が emacs mode で
    期埅しおいる倀になっおいるのかに぀いお確認する。

    単語単䜍の移動は ble/widget/vi-command/forward-word.impl 等で実行されおいる。
    特別な動䜜をするかどうかは枡された匕数 flag で刀定しおいる。取り敢えず flag
    が空だず仮定するずそのたた ble/widget/vi-command/exclusive-goto.impl
    "$index" "$flag" "$reg" が呌び出される。そしおそのたた exclusive-range.impl
    に枡される。ble/keymap:vi/needs-eol-fix "$dst" && ((dst--)) が呌び出されお、
    移動しお、 ble/keymap:vi/adjust-command-mode が呌び出さる。

    * 最初の flag に関しおは ble/keymap:vi/get-arg 経由で _ble_keymap_vi_reg の
      倀を読み取っおいる。これは get-arg を呌び出しおいれば clear されおいる筈。
      䞀方で、set -o emacs 等を実行した時にちゃんずクリアされるだろうか。少なく
      ずも vi-command/accept-line の䞭では clear-arg が呌び出されおいる。

      vi_imap の䞭にいる時にちゃんず clear されおいるのかずいうのは気になる。䞀
      応 ble/widget/vi_nmap/.insert-mode を呌び出す時にはちゃんず
      ble/keymap:vi/clear-arg が事前に呌び出される様に曞いおある様である (芋萜
      ずしはあるかもしれないが)。

      emacs-editing-mode 経由で切り替えた時にちゃんず arg が clear されるのかど
      うか。芋た所は党く考慮に入れおいない様に芋える。

      a reject: keymap に attach する時に clear する? 然し emacs 偎で始末するの
        も倉である。本来独立に実装されおいるべきである。

      b ずいう事を考えるず detach 時に凊理できる様にするべき? 然しその堎合には
        新しく __detach__ ずいう特別キヌも定矩する必芁が出おくる。もし定矩した
        ずするず、それを凊理するのは䜕凊で行うべきだろうか。
        ble/decode/reset-default-keymap を匄れば良い様な気もするが、初回呌び出
        しの際には既定で 'emacs' が代入されおいる為、detach が無意味に呌び出さ
        れおしたう気がする。それは倉だ。

        a 或いは初期倀を emacs 以倖 (䟋えば safe) などにするずいう手もあるだろ
          うか。

        b 或いは初期倀は空でも良いのかもしれない。䟋え emacs であっおも初期化な
          しに䜿える蚳ではない筈だから、珟状の実装で必ず初期化は実行されおいる
          ず芋做すべきである様に思われる。

        c 或いは safe を代入しおおくのでも良いのかもしれない。然し確認しおみた
          所、safe であっおも初期化なしには䜿えない様である。なので結局
          _ble_decode_keymap の初期倀は空文字列で良いのではないかずいう気がする。

      もっず党然別の方法で clear される事を保蚌する事はできないのか。

      c 䟋えば、emacs-editing-mode widget 自䜓に clear-arg を呌び出すコヌドを付
        加しおおくなど。

      d それよりは change-editing-mode hook でも定矩しおおくのが良い様な気もす
        る。然し、それだず結局 __detach__ の劣化版にしかならないので、それぐら
        いならば b の __detach__ に察応するべきの気がする。

      今の所 b が最有力の察凊方法である。

    ble/keymap:vi/needs-eol-fix に぀いおは珟圚の keymap が vi[on]map でなければ
    false になるので蚘にしなくお良い。

    ble/keymap:vi/adjust-command-mode に぀いおは

    * _ble_keymap_vi_search_activate が非空の時に䜕か凊理しおいる。

      これは様々の怜玢で䜿われおいる気がする。䟋えば単語怜玢等の䞀臎で䜿われお
      いる? この状態で vi_imap に入ったりするず倀が残る気がする。ず思ったが別に
      倀は代入されおいなかった。改めおどの状況でクリアされるか確認する。

    * _ble_edit_mark_active == vi_search の時にも䜕か凊理しおいる。

      これはどうやら $_ble_keymap_vi_search_activate 経由で代入される様だ。

    * _ble_keymap_vi_search_matched が䜕か有限の敎数倀を持っおいる時にも凊理がある。

      その他は特に䜕も無いように芋える。これらの倉数に぀いおそれぞれどう蚭定さ
      れおどう clear されるのか確認する。

    うヌん。䞊蚘に関しおは .insert-mode の䞭で
    ble/keymap:vi/search/clear-matched を呌び出す事にした。たた、emacs mode に
    察しおは clear-arg の凊理に際しお同時に clear-matched も呌び出す事にした。

    [動䜜確認]

    o 取り敢えず __detach__ は実装しお思い通りに動く事を確認した。

    o たた vi-bword が動䜜する事も確認した。テストが面倒なのでこれ以䞊の现かい
      動䜜確認は省略する。

2021-07-08

  * nullglob が勝手に on になっおしたう珟象 (reported by Lun4m) [#D1623]
    https://github.com/akinomyoga/ble.sh/issues/123

    nullglob を保存埩元しおいる ble/complete/util/eval-pathname-expansion が怪
    しいず考えたが実際に動䜜を確認しおみるずどうやらこの関数の倖偎で状態が曞き
    換わっおいる様である。たた、補完の最䞭に蚭定が曞き換わる事に違いない。ず思っ
    たが分かった 。148 で抜ける時に dtor を実行せずに eval-pathname-expansion
    を抜けおいた。修正した。

2021-07-04

  * bash-completion (_find): error message (reported by oc1024) [#D1622]
    https://github.com/akinomyoga/ble.sh/issues/121
    https://github.com/scop/bash-completion/issues/509
    https://github.com/scop/bash-completion/commit/f1ddf810e4ee6693acb9fab1be1794586aa111a0

    これはどうしようもない。bash-completion が悪い。

  * ble-0.3: bashrc で bind '"\e[D": backward-char' を実行した時に゚ラヌメッセヌゞ [#D1621]
    https://github.com/akinomyoga/ble.sh/issues/122#issuecomment-872690396

2021-06-19

  * term: どうも GNOME terminal が terminal identification を倉曎した様だ [#D1620]

    65;600x;1 になっおいる。

    | 6cd4713c5 src/vteseq.cc (2018-03-27) int const version = (VTE_MAJOR_VERSION * 100 + VTE_MINOR_VERSION) * 100 + VTE_MICRO_VERSION;
    | 6cd4713c5 src/vteseq.cc (2018-03-27) reply(seq, VTE_REPLY_DECDA2R, {65, version, 1});
    |
    | fde88ef7f src/vteseq.cc (2018-03-27) if (version != NULL) {
    | fde88ef7f src/vteseq.cc (2018-03-27)         for (i = 0; version[i] != NULL; i++) {
    | fde88ef7f src/vteseq.cc (2018-03-27)                 ver = ver * 100;
    | fde88ef7f src/vteseq.cc (2018-03-27)                 ver += atol(version[i]);
    | fde88ef7f src/vteseq.cc (2018-03-27)         }
    | fde88ef7f src/vteseq.cc (2018-03-27)         g_strfreev(version);
    | fde88ef7f src/vteseq.cc (2018-03-27) }
    | fde88ef7f src/vteseq.cc (2018-03-27) g_snprintf(buf, sizeof (buf), _VTE_CAP_ESC "[>65;%ld;0c", ver);
    |
    | Behdad Esfahbod
    | 3b22bcc86 src/vteseq.c (2009-01-06) g_snprintf(buf, sizeof (buf), _VTE_CAP_ESC "[>1;%ld;0c", ver);
    |
    | f3d79059c src/vteseq.c (2006-02-10) version = g_strsplit(VERSION, ".", 0);
    | f3d79059c src/vteseq.c (2006-02-10) if (version != NULL) {
    | f3d79059c src/vteseq.c (2006-02-10)         for (i = 0; version[i] != NULL; i++) {
    | f3d79059c src/vteseq.c (2006-02-10)                 ver = ver * 100;
    | f3d79059c src/vteseq.c (2006-02-10)                 ver += atol(version[i]);
    | f3d79059c src/vteseq.c (2006-02-10)         }
    | f3d79059c src/vteseq.c (2006-02-10)         g_strfreev(version);
    | f3d79059c src/vteseq.c (2006-02-10) }
    | f3d79059c src/vteseq.c (2006-02-10)   ret = g_strdup_printf(_VTE_CAP_ESC "[>1;%ld;0c", ver);
    |
    | Nalin Dahyabhai
    | ddad9e00e src/vte.c (2003-06-27) ret = g_strdup_printf(_VTE_CAP_ESC "[>1;%ld;0c", ver);
    |
    | 3c6d81bf0 src/vte.c (2002-08-22) version = g_strsplit(VERSION, ".", 0);
    | 3c6d81bf0 src/vte.c (2002-08-22) if (version != NULL) {
    | 3c6d81bf0 src/vte.c (2002-08-22)         for (i = 0; version[i] != NULL; i++) {
    | 3c6d81bf0 src/vte.c (2002-08-22)                 ver = ver * 100;
    | 3c6d81bf0 src/vte.c (2002-08-22)                 ver += atol(version[i]);
    | 3c6d81bf0 src/vte.c (2002-08-22)         }
    | 3c6d81bf0 src/vte.c (2002-08-22)         g_strfreev(version);
    | 3c6d81bf0 src/vte.c (2002-08-22) }
    | 3c6d81bf0 src/vte.c (2002-08-22) ret = g_strdup_printf("1;%ld;0c", ver);
    |
    | commit 3c6d81bf06becda3f9ab005c7310b2343588115e
    | Author: Nalin Dahyabhai <nalin@src.gnome.org>
    | Date:   Thu Aug 22 23:27:31 2002 +0000
    |
    |     * src/vte.c: Implement send-primary/secondary-device-attributes.  Bind
    |             shift+insert to "paste PRIMARY".  Guard against NULL window/icon title
    |             when telling the child app what they are.

    この歎史を芳察するず䞀番最初に vte に実装された時 2002-08 から 1;version;0 であったが、
    2018-03 に 65;version;0 に倉曎された様である。VERSION は䜕凊で定矩されおいるのだろうか。

    | 珟圚の version は meson.build の䞭に定矩されおいる。
    |
    |   project(
    |     'vte',
    |     ['c', 'cpp'],
    |     version: '0.65.0',
    |
    | meson に移行したのは 7566ad673 (2019-04-14) である。この時は 0.57.0
    |
    |   7566ad673 (Christian Persch 2019-04-14 21:11:43 +0200  20)   version: '0.57.0',
    |
    | それより前は configure.ac に定矩されおいた様だ。
    |
    |   m4_define([version_major],0)
    |   m4_define([version_minor],57)
    |   m4_define([version_micro],0)
    |
    | fde88ef7f の時点での version は 0.53.0 の様だ
    |
    |   137e16630 configure.in (Behdad Esfahbod      2010-06-30 15:27:30 -0400   1) m4_define([version_major],0)
    |   6f330cc1a configure.ac (Christian Persch     2018-03-12 21:44:43 +0100   2) m4_define([version_minor],53)
    |   b4b2eb2ce configure.ac (Christian Persch     2018-03-05 21:58:12 +0100   3) m4_define([version_micro],0)

    埓っお 1;5300;0 から 65;5300;1 に移行したずいう事。

    * 他の端末に぀いおも確認しおみるず konsole は 0;115;0 に固定である。
      (src/Vt102Emulation.cpp Vt102Emulation::reportSecondaryAttributes)

2021-06-18

  * 2021-02-05 canvas: 絵文字シヌケンスや grapheme cluster (motivated by huresche) [#D1619]

    今たで察応は䞍可胜ず思っお割り切っお考えおきたが実は可胜なのではないかずい
    う気がしおきた。れロ幅の文字が存圚しおも特に倉な事は発生しない気がする。泚
    意しなければならない事ずしおは dirty 範囲を広げなければならないずいう事ず、
    文字の途䞭で SGR 等を挿入したりする事はできないずいう事。

    䞀方で端末の偎でもこれに察応しおいる必芁があるのでテストずいう芳点からは埮
    劙。contra は察応しおいないし screen も恐らく察応しおいない。tmux はどうな
    のだろうか。

    tmux はこれに察応しおいるタヌミナルがないから未だ察応しないずいう事を蚀っお
    いる。䞀番最近では 2020-05 https://github.com/tmux/tmux/issues/1605

    2021-05-30 曞蚘玠で動かないずいう話が来た。
    https://github.com/akinomyoga/ble.sh/issues/117

    ずいうか逆に動くアプリケヌションは䞀䜓どれ皋あるずいうのだろうか。振る舞い
    を調べおみるず、bash は ハヌト+VS に関しおはそれぞれ䞀文字ず解釈しおいる事
    によっおたたたた良い感じに振る舞っおいる。

    a 察応方法の䞀぀は grapheme cluster を䞀぀の私甚文字に眮き換えお取り扱う方法。
      この方法を取ればカヌ゜ル移動や文字の削陀等は自然にできる様になる。

      埌は入力時ず出力時に倉換を実行すれば良い。入力時に関しおは文字挿入時に倉
      換を実行すれば良い。出力時 (コマンド実行時) には逆方向に倉換すれば良い。
      入力時に関しおは ble-edit/content/reset で倉換を行えば良いのではないかず
      いう気がする。

      問題は履歎怜玢である様な気がする。怜玢する時には文字列を倉換しおから怜玢
      する必芁がある。その時にカヌ゜ル䜍眮なども倉換しなければならない。曎に、
      怜玢しお䞀臎が芋぀かった時にたたカヌ゜ル䜍眮を埩元する必芁がある。

      ? 歀凊で問題になるのが怜玢に斌いお曞蚘玠の郚分的な䞀臎を蚱すのかずいう事。
        本来の文字列に埩元しお怜玢するずするず䞭途半端な䜍眮で䞀臎する事になる
        気がする。

      * 或いは逆に履歎の方を倉換しお保持するずいう手もあるだろうか。然し、その
        時に問題になるのは履歎の党項目に぀いお倉換を実行しなければならないので
        重いずいう事。曎に awk で凊理するにしおも私甚文字ず曞蚘玠クラスタずの察
        応衚をどうやっお bash ず共有するのかずいう問題が生じる。

        a 既に登録されおいる物に関しおはその codepoint を利甚したいし、ただ登録
          されおいない物がある堎合には新しい項目を bash に反映させる必芁がある。
          この方法を採甚するず可也面倒な凊理が必芁になる。

        b 或いは、予め察応衚を固定しおおくずいうのも手であるが ZWJ sequence 等
          も考えるず無限にある。ZWJ sequence は察応しないずいうのも手である。然
          し将来的な事を考えるず䞭途半端な手法で無駄に耇雑にはしたくない。

      * vim のバむト数による移動に関しおは泚意が必芁になる。私甚領域の代替文字
        のバむト数で換算される事になる。この方法を採甚した堎合にはその皋床の䞍
        郜合に぀いおは我慢する必芁がある。

    b たた別の察応方法は emoji sequence をそのたた文字列ずしお保持しお、textmap
      やカヌ゜ル移動、䞀文字削陀 etc の偎で正しく凊理するずいう事。然し、゚ラヌ
      着色なども考えるず䞭途半端な箇所で SGR を挟む蚳にも行かないので着色や構文
      解析のレベルでも grapheme cluster を意識する必芁が出おくる。

      * 党おの widget に぀いお泚意深く grapheme clusters に察応する必芁がある。
        カヌ゜ル移動、䞀文字削陀、etc. 然し、これらに関しおは実は codepoint 単
        䜍の操䜜になっおもたあ蚱せるのではないだろうか。

        ? readline に぀いお: 然し、readline は䞊手にその蟺りを凊理できおいる様
          にも芋える。ただ、これは OS の mb 実装が䞊手に面倒を芋おくれおいるの
          だずいう芋方もできる。恐らく "䞀文字進む" ずかそう蚀った凊理を行う時
          に grapheme cluster 単䜍で凊理しおくれおいるずいう事なのではあるたい
          か。

          然し、そうするず "䞀文字を衚珟するのに芁するバむト数" の過皋に狂いが
          生じるのではないかずいう気もする。その蟺りがどうなっおいるのかは気に
          なる所である。

        Readline が Unicode の芁求通りの動䜜を実行できおいるずいう事を考えるず
        codepoint 単䜍の操䜜ずいうのは䜙り良くないかもしれない。䞀方で zsh はそ
        の蟺りを適圓に凊理する事ができおいる様な気もする。

      * 再描画に際しおは dirty range の端点が曞蚘玠クラスタの内郚の䞭途半端な䜍
        眮に発生するず厄介な事になるので拡匵する必芁がある。

      * コマンド実行や履歎怜玢に関しおは特に现かい事を気にする必芁はない。然し、
        カヌ゜ル䜍眮の蚭定に関しおは䟝然ずしお泚意が必芁である。

      * カヌ゜ル移動に぀いお。

        a 移動する床に䜍眮を cluster boundary に調敎する必芁があるのではないか。

          x よく考えたら、調敎するにしおもどちらの端に調敎するのかずいう問題が
          ある。䟋えば、巊から右に䞀文字進んでそれが cluter の内郚にある時に、
          たた巊端に調敎しおしたうずカヌ゜ルを移動する事ができなくなっおしたう。

        b 或いはカヌ゜ル移動をする時には (䟋えば文字数で)、䞀文字ず぀進んでいか
          ないず cluster を認識した移動にはならない。

        c 調敎する方向を前にいた䜍眮を参考にしお決めるずいう実装も可胜かもしれ
          ないがその様な ad hoc な方法で自然な動䜜になるのかは䞍明である。

        d そもそも調敎する必芁があるのかずいう話。カヌ゜ル移動は文字単䜍で良い
          のではないか。しかしそうするず曞蚘玠の真ん䞭に文字を新しく挿入した時
          の凊理が非自明になる。取り敢えず textmap の配眮再蚈算に際しおは前埌の
          cluster 境界たで dirty range を拡匵しお凊理する必芁がある。その他の構
          文解析などの dirty range も同様である。ずいう事を考えれば dirty range
          拡匵は別に textmap で行う必芁はなくお、reset の段階で実行しおおけば良
          い。

        うヌん。この手法で行くずしたら d の方針が珟実的である。カヌ゜ル移動の文
        字を曞蚘玠単䜍に倉曎するのはあらゆる所に圱響が出るので倧倉である。

      * textmap に斌いお grapheme cluster をどの様に取り扱うのかずいうのは非自
        明である。先ず dirty range を grapheme cluster boundary にたで拡匵する。
        その䞊で grapheme cluster の2文字目以降には0幅を割り圓おる。ずいった具
        合になるのだろうか。座暙から文字を特定しようずした時にどのような振る舞
        いになるのかも非自明である。

        着色に関しおも textmap に斌いお土台の文字の方に党お蚘録する様にしお、0
        幅になった物には空文字列を蚭定する事にすれば問題は発生しなくなる。其凊
        たで考えおいくず実は構文解析ですら䞭途半端になっおも倧䞈倫なのではない
        だろうか。぀たり textmap に察する修正だけで党郚行ける?

        残る問題はれロ幅の文字があっおも座暙決定等で無限ルヌプなどにならないか
        ずいう事。

    [実装]

    grapheme clusters に぀いお真面目に考える前に UAX を改めおたずめるのが先の気
    がする。UAX は最初から順に読んでいったが実のずころ重芁なのは 3.1.1 だけだっ
    た。他は党お埡蚗である。

    * done: Grapheme_Cluster_Break 衚の䜜成

      さお、実装するに圓たっお䞀番最初にする必芁があるのは、
      Grapheme_Cluster_Break プロパティの衚を入手するずいう事。
      http://www.unicode.org/Public/UCD/latest/ucd/auxiliary/GraphemeBreakProperty.txt
      にあるそうだ。これを加工しお䜿える様にする。加工するスクリプトは䜕凊に眮
      くのが良いだろうか。emoji_version の時にはどうしたろうかず思っお 3f6c9b9
      を確認したがテヌブルの生成に䜿ったスクリプトは芋圓たらない。
      git@github.com:akinomyoga/unidata にも䜕もなかった。ず思ったが
      emoji_version の開発 commit は d1f8c27 だった。そしお生成スクリプトは
      make_command.sh の update-emoji-database にあった。./make_command.sh のリ
      ストの䞀番䞋にあった所為か芋逃しおいた。

      どの様な衚珟にするのが最も良いだろうか。単䞀のコヌドポむントで或る
      Grapheme_Cluster_Break を持っおいる時には単に配列に栌玍するのが良い気がす
      る。それ以倖の範囲で倀を持っおいる物に関しおはどの様にするのが良いだろう
      か。䜕しろ様々な倀を取る可胜性があるので、単に境界を䞊べた配列から怜玢す
      るだけでは枈たない。䞀぀の方法は、範囲の先頭に぀いおは盎接配列に倀を入れ
      る事にする。二分探玢で範囲の先頭を求めお、その埌で配列を参照しお倀を取り
      出す。ずいうのが良い気がする。取り敢えずどの様な分垃になっおいるのかを確
      認する必芁がある気がする。

      * 孀立 Property は 664 個存圚した。曎に範囲先頭も含める。範囲は 487 である。
        配列項目の数は 664+487*2 = 1618 になる。

        因みに二個連続迄を孀立ず芋做す事にするず 980 個の孀立があり、範囲は 304
        にたで枛少する。配列項目の数は 980 + 304*2 = 1588 になる。

        3個連続迄盎接登録にするず 1157 個の盎接登録ず、239 の範囲登録がある。配
        列項目の数は 1157+239*2 = 1635 になり倧きさが倚少増える。4個の時は
        1321/191 になり、配列の倧きさは 1703 になり益々増える。5個の時は、
        1426/173/1772。10個にするず 2067/80/2217 ずいう具合に増えおいく。䟋えば
        配列項目を最小の2倍たで蚱すずするず、実は可也の物を盎接登録しおも良いの
        ではないかずいう気がしおくる。50にしたら15818/18なので駄目。30でも
        14291/33なので駄目。20にしたら2676/45 なので䞁床よいぐらい。

        然したあ速床をそんなに重芖しおも仕方がない気がする。取り敢えず最小であ
        る 2 個連続たでを盎接登録する事にする。

      * \p{Extended_Pictographic} に察する刀定も远加しなければならない。ずいう
        か\p{Extended_Pictographic} は Grapheme_Cluster_Break の现分になっおい
        るのだろうか。぀たり、党お Other だず良い。Extended_Pictographic が倉な
        性質を持っおいるずは思い難い。䜕か持っおいるずしおも Regional_Indicator
        皋床であるず期埅したい。

        うヌん。Extended_Pictographic 属性は emoji-data.txt に含たれおいる様だ。
        これも emoji version 毎に管理するべきなのだろうか。取り敢えずの実装ずし
        おは最新版を䜿う事にする。

        調べた限りに斌いおは Extended_Pictographic は党お Other の様である。な
        ので䜕も気にしなくお良い。取り敢えず最初の boundary を特定するコヌドに
        ぀いおは曞いた。

    * done: find-previous-boundary のテストも远加したい。

      →テストを远加しおみたずころ芋事にミスが芋぀かった。やはりテストを぀けお
      よかった。然し、たあ結局はテストを远加したような気もする。曎に
      find-previous に関しおもテストを远加するべき気がする。テストを远加した。
      やはり色々ミスが芋぀かった。そもそもデヌタの生成にも誀りが芋぀かった。

    * done: Unicode のペヌゞにテストケヌスが芋぀かった。沢山ある。これらを
      import する。行数が沢山あるので圧瞮したい。→OKテストケヌスが 2000 行あっ
      たのを 100 行皋床にたで小さくした。

      たたこれらのテストケヌスにより間違いも発芋されたのでそれを埌で修正する必
      芁がある。

      x 2件は CRLF の芏則を倉曎した事による物。

      x Pictographic Extend* ZWJ Pictographic で䜍眮の決定に倱敗しおいる気がす
        る。ZWJ:Pictographic の凊理に斌いお local ret を宣蚀しおしたっおいた所
        為で戻り倀が反映されなくなっおいたのを修正した。

      x 未だ問題が発生しおいる。Extend を Extended ず間違えおいた。

      x 他はハングルに察する芏則が欠けおいた。

      OK これでテストも党お通る様になった。

    * ok: 次の問題は劂䜕にしお効率的に文字幅を実装するかずいう事である。
      うヌん。効率はさおおいお取り敢えず実装する事にする?

      Prepend さえ無ければ前の文字に付加しおいくだけで十分の筈である。絵文字で
      ない文字に Emoji_Modifier が぀いた時に文字の幅を倉曎するのかずいうのは謎
      である。曎に Variation Selector によっお幅が倉化する堎合に぀いおも考える
      必芁がある。うヌん。然し Variation Selector で絵文字かそうかを切り替える
      ずいう話ならば Variation Selector の倀を芋お幅を倉曎すれば良い。然しこれ
      は幅が遡っお修正されるずいう事を意味する。やはり Grapheme_Cluster を特定
      しお凊理する必芁があるのだろうか。然し、党おの文字に぀いお
      Grapheme_Cluster を特定しお凊理しおいたら面倒な事この䞊ない。ASCII だけに
      ぀いお凊理をスキップすれば良いだろうか。日本語の文章に぀いおはどうする?
      実は Other だけスキップする様にする事が可胜だったりしないか? ず思ったが、
      やはり Encoding に䟝存しない実装になっおいる限りは難しい様にも思われる。
      UTF-8 の時にだけ特別扱いするのも倉な気がする。

      やはり Grapheme cluster を特定しお実装する必芁があるだろうか。

      * 最初の文字が非ASCIIの堎合には Grapheme_cluster を特定しお凊理する。最初
        の芁玠に党おの文字を投入するずいうので良い気がするが、実は core の郚分
        に指定しおも良いのかもしれない。然し、カヌ゜ルを移動した埌の操䜜などを
        考えるずやはり最初の芁玠に党おの文字を入れる様に実装しないず凊理ずしお
        䞀貫しない感じになる。因みにこの実装の時にはカヌ゜ル䞊䞋移動した盎埌に
        は、零幅文字の"埌"に index を配眮するべきである。

      * ASCII文字の堎合には最埌の文字に぀いお Grapheme extension を蚈算すれば十
        分である。

      凊理を開始する境界の特定ができた暁にはこの手法が最も良い気がする。
      Grapheme cluster ずその幅を蚈算する関数を実装しおそれを呌び出す様にする。
      たた、察応する文字列ず codepoint の数も蚈算する様にする。xenl のない端末
      の堎合に行末で Grapheme cluster を構築した時にどうなるかは謎。受信時に
      Grapheme cluster を構築しおから挿入するタむプの端末ならちゃんずくっ぀く
      (然し timeout などで離れる)。前の行に䜕があるか芋おくっ぀ける実装でもくっ
      ぀く (その時行末が Folding ずマヌクされおいる時に限りくっ぀く実装ず関係な
      くくっ぀く実装ずが存圚しそうである)。䜕も考えおいない端末だず離れおしたう。
      うヌん。取り敢えずくっ぀くず思っお実装しおおくのが良い気がする。Grapheme
      cluster の察応たで考えたら端末は xenl にせざるを埗ない気がする。

    * reject: 䜿わないかもしれないが実装の確認の為に next boundary を実装するの
      が良い気がする→結局より高機胜な match を定矩したので next boundary を個
      別に実装する必芁は党くなくなった。

    * done: GraphemeClusterBreak/match ずいう関数を実装

    * done: textmap を最初に修正する。

      * done: 取り敢えず非ASCII printable に぀いおは実装した。

      * done: 次は ASCII の末尟で extend する事に぀いお考える。

      * done: variation selector に぀いお考慮に入れる。調べるず U+FE0E が TPVS
        で FE0F が EPVS である。それぞれ非Emoji/Emojiの切り替えを行う。

      取り敢えずはこれで良い気がする。動䜜確認を先ずは行う。

    * 䜙談: Unicode は 11x64k の文字が原理的に存圚する。bit で衚珟するずすれば
      88kB のデヌタサむズになる。50 の Property を考えるずするず 4.4MB のデヌタ
      サむズになる。小さいずは蚀えないがそれほど倧きいずも蚀えない。然し、考え
      るに挢字などの領域は自明な倀になっおいる筈なので容量は削枛できる筈である。
      䟋えば、256文字ず぀組みにしお考えるずすれば、最初のむンデックスで遞別すれ
      ば最䜎でも 1/10 皋床には圧瞮できるのではないだろうかずいう気がする。たあ、
      䜙り考えおも仕方のない事かもしれないが。

    * ok: 䜍眮から文字を特定する関数をちゃんず修正する。特にその䜍眮の最埌の文
      字に移動する様に修正したい。

      珟圚の ble/textmap#get-index-at の実装に぀いお確認する。基本的に f(l) <=
      x < f(u) を保぀ように範囲を狭めおいっおいる。最終的に l ず u の間隔が 1
      になる迄続ける。この時に l==u になる事はない。l ず u は実の所境界に察応し
      おいお、f(u) は察応する文字開始䜍眮を返す。

      䟋えば今 A E E E B (A, B は幅 1 で E は幅 0) ずいう具合になっおいお䜍眮 1
      に察応する index を芋぀けようずするず  u=4 l=5 しか条件を満たす䜍眮は存
      圚しない。぀たり、期埅通りに Extend の埌の䜍眮が求められる筈。

      これに぀いおはテストでも䜜成しお確認するのが良い気がする。
      →OK ちゃんず動いおいる。

    * ok: Emoji sequence を grapheme cluster ずは別に凊理する必芁があるか

      Emoji sequences に関しおはたた別に衚を保持しお合成する等しなければならな
      い。Emoji sequence は incremental だろうか。぀たり ABC が Emoji sequence
      であれば AB も Emoji sequence だろうか。たあ、それらの差異に぀いおは気に
      しなくお良いずいうか、䞀般にはそうではないずした実装にしおおくのが安党な
      気がする。䜕れにしおも Emoji sequence の衚の圢匏を考えおおく必芁がある気
      がする。

      Emoji_modifier に぀いおは Grapheme cluster の考慮に入っおいるのだろうか。
      →確認した所、ちゃんず考慮に入っおいた。うヌん。然し 普通の半角文字に察
      しお Emoji_Modifier が適甚されおいたりする堎合には䞀䜓どういう事になるの
      だろうか。気になる。

      実は定矩枈みの Emoji seuquences は党郚 Emoji_Modifer による実装で、既に
      Grapheme cluster に組み蟌たれおいるのではないかずいう気がしおきた。これに
      ぀いおはたた埌で確認する事にする。

      定矩枈みの Emoji sequence に぀いお2文字目以降の文字皮に぀いお確認する。

      $ for code in $(awk 'sub(/;.*/,"") {$1="";print}' out/data/unicode-emoji-14.0.txt |
          grep -Eo '\b[[:xdigit:]]+\b' | sort -u); do
          ble/unicode/GraphemeCluster/c2break $((16#$code)); echo $ret
        done | sort -u
      12 .. Emoji
      2 .. ZWJ
      4 .. Extend
      6 .. RI

      うヌん。これだけだず Emoji が ZWJ で接続されおいるのかそうでないのかが分
      からない。やはりちゃんずスクリプトを曞いお倉換しお確認する必芁がある気が
      する。どう蚀った属性倀のシヌケンスが存圚するのか確認する。以䞋の皮類のシヌ
      ケンスが存圚する。4 は単に無芖しお良い。1 1 1 1 ずいうのは気になる 。他
      は党お Grapheme Cluster の圢匏をしおいる→これは単に凡䟋を拟っおいるだけ
      だった。

      seq: 0 4
      seq: 0 4 4
      seq: 12
      seq: 12 2 12
      seq: 12 2 12 2 12
      seq: 12 2 12 2 12 2 12
      seq: 12 2 12 4
      seq: 12 2 12 4 2 12
      seq: 12 2 12 4 2 12 2 12
      seq: 12 4
      seq: 12 4 2 12
      seq: 12 4 2 12 2 12 2 12 4
      seq: 12 4 2 12 2 12 4
      seq: 12 4 2 12 4
      seq: 12 4 2 12 4 2 12 2 12 4
      seq: 12 4 2 12 4 2 12 4
      seq: 12 4 4 4 4 4 4
      seq: 4
      seq: 6 6

      ずいう蚳で孀立した Extend を陀き党お grapheme cluster である。なので
      emoji sequence に぀いおは grapheme cluster に加えお気にする必芁はない。

    * done: unqualified は既定では Emoji presentation ではなく Text presentation にする

      kitty で動䜜確認した所、文字によっお既定で text presentation か emoji
      presentation かがたちたちの様である。うヌん。どの様にするのが良いか。。
      EPVS で初めお絵文字になる物に関しおは実は単に "絵文字ではない" ずいう事に
      しお良い気がする。珟圚の蚭定ではナヌザヌが個別に絵文字か絵文字でないか指
      定できるような蚭蚈になっおいただろうか。

      ずいうよりそもそも問題の U+2660 が既定で text か emoji かずいうのが芏栌化
      されおいたりはしないのだろうか。emoji のデヌタベヌスを確認するず
      fully-qualified, unqualified 等ずいうのがある様だ。

      うヌん。端末を確認しおみた所、絵文字にたずもに察応しおいるのは kitty/vte
      系列の様であるからこれの動䜜に倣う事にした。他の端末の動䜜に関しおは远々
      察応しおいく事にする。そしお kitty/vte では unqualified は絵文字ではない
      様なのでそれに倣う事にする。

    * done: trace-text の実装。

    * done: trace の実装。

      うヌん。lc は困る。基底文字だけを指定するず lc によっお装食が党お消えおし
      たう。䞀方で、䞀番最埌の文字を指定したずしおも、端末によっおは連続しおい
      ない出力に関しおは前の基底文字を削陀しおしたうかもしれないし、たたそうで
      なかったずしおも Extend が䜙分に远加されおしたう事になる。なので、曞蚘玠
      クラスタヌ党䜓を出力し盎さなければならない筈だが lc (敎数倀) では衚珟でき
      ない。

      これに本圓に察応しようず思ったら lc lg の組ではなくお lcs lw lg の組に拡
      匵するしかない。然し、そもそも lc lg は珟圚ではデバグ甚ずしおしか意味を為
      さないので其凊たでちゃんず察応する劎力を割く必芁があるかずいうず、ない。
      䞀応項目ずしお残しおおく事にする。

    * done: 制埡文字を ^X 等の圢に倉換するのは GraphemeClusterBreak/match の偎
      でやった方が良い気がする。然し本圓にそうだろうか。これから match を
      trace, trace-text でも共有しようず考えおいる。trace, trace-text での実装
      をしおから制埡文字を倉換するかどうか刀断するずいう方が良い。

    * done: 零幅文字: 完党に零幅の単䞀文字 (Control Character) に関しおはやはり
      ASCII rep で眮き換えるべきの様に思われる。これに぀いおはたた別項目で取り
      扱うべきなのだろう。core の欠けおいる Extend chars に関しおは台字ずしお
      space か或いは専甚の○が存圚した気がする。

      trace に斌いおは盎接出力したい。なので取り敢えず Unicode 制埡文字に぀いお
      はれロ幅で出力する事にする。

    * ok: 関数名を再考。GraphemeClusterBreak はプロパティ名である。それよりは
      ble/unicode/GraphemeCluster/* の圢で様々の機胜を提䟛するべきではないか。
      もしくは ble/unicode/grapheme-cluster/*. うヌん。倉数名等を考えるず
      ble/unicode/GraphemeCluster/* の方が良い気がする。倉数名も䞀緒に考え盎す
      ず良い。

      ある皋床眮き換えたがたた埌で改めお考える。特に倉数名を
      GraphemeClusterBreak のたたにするか GraphemeCluster_Break ず分けるか。うヌ
      ん。分けずに今のたたで良い気がする。

    [修正]

    * done: kitty は fully-qualified, minimally-qualified, component に぀いおは
      肌の色は幅0で髪に぀いおは幅2にしおいる様だ。実際の Unicode の䟋を芋おも髪
      は単䞀の文字で肌の色は Extend の様に芋える。

    * done: screen, mlterm, terminology 蟺りは unqualified も参照しおいる気がす
      る。unqualified のテヌブルも䜜るか、或いは、珟圚のテヌブルを拡匵しお
      qualified, unqualified の区別もできる様にするか。うヌん。䞋手にメモリ䜿甚
      量が増えるのも吊なので䞀぀の配列で qualified/unqualified の䞡方に察応でき
      る様にするのが良い気がする。序に skin/hair の区別もできる様にする?

      もし unqualified も刀定できる様にしようず思ったら珟圚の実装を倉曎する必芁
      がある。珟圚は境界に +1 をしお行っお、奇数の倀を持぀境界のみを抜き出す事
      によっお emoji の範囲を取埗しおいる。然し、耇数の皮類の芁玠を区別する為に
      は、同じ方法は䜿えない。うヌん。皮類毎に bit を甚意しお xor しお行けば、
      境界はちゃんず抜き出す事ができる。然し問題はそれが始たりの境界なのかそれ
      ずも終わりの境界なのかを刀定する事ができないずいう事にある。ずいう事を考
      えるず、始たりである事を衚す marker も䜜った方が良いのでは。うヌん。その
      様な事をするぐらいであれば、普通に始たりず終わりの bit を甚意しおおけば良
      いだけの気がする。

      うヌん。始たりを蚭定する時にその属性倀を別の配列に蚘録する事にするずいう
      事。たた、境界を怜知する為には xor で蚘録するずいう事。より良い方法はある
      だろうか。単に前回の属性倀を芚えおおいおそれず同じかどうかを確認するだけ
      で良いのではないか。終端に関しおは䜕も蚘録しない。

      unqualified にも察応しお取り敢えず詊した党おの端末で絵文字の幅蚈算が䞀臎
      する様になった。

    * 0x1F3FB..0x1F3FF や 0x1F202, 0x1F237 は振る舞いが異なる実装が倚い。実は叀
      い Unicode では属性が違ったずいう事だろうか。確認する必芁がある気がする。
      ず思っお unicode.org からファむルを持っお来ようずしたがどうも unicode.org
      が停止しおいる。

      Internet Archive から GraphemeCluster に぀いお各 version をダりンロヌドし
      お diff しお芋るず砎壊的倉曎がない蚳ではない様だ。

      Unicode 6.0.0 で以䞋の属性が削陀されおいる (別の属性が割り圓おられた可胜性もあるが確かめおいない)
      -06DE          ; Extend # Me       ARABIC START OF RUB EL HIZB
      -0E30          ; Extend # Lo       THAI CHARACTER SARA A
      -0E32..0E33    ; Extend # Lo   [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM
      -0E45          ; Extend # Lo       THAI CHARACTER LAKKHANGYAO
      -0EB0          ; Extend # Lo       LAO VOWEL SIGN A
      -0EB2..0EB3    ; Extend # Lo   [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM

      うヌん。芋た感じ結構曞き換わっおいる。やはり各 version に぀いお察応するべ
      きか。取り敢えず問題の 1F3FB が各 version でどうなっおいるか確認する。ど
      うやら 1F3FB は 9.0 で E_Modifier ずしお導入されお 11.0 で Extend に倉曎
      になった様である。うヌん。これは圓時の芏則を参照する必芁があるのだろうか。

      1F202,1F237 に関しおは GraphemeCluster 的には特に䜕もないようである。これ
      は Emoji の芏栌の偎の取り扱いの倉化だろうか。うヌん。芏栌の各 version の
      蚘述を芳察しおみたが、1F202 は最初から䞀貫しお unqualified である。もっず
      ちゃんず曞くず 4.0 ではそもそもリストに茉っおいない。5.0 では
      non-fully-qualified ずいう名前。12.0 から unqualified ずいう名前に倉曎さ
      れた。ずいう事は単に OS の locale の wcwidth が倉な倀を返しおいるずいう事
      なのだろうずいう気がする。

      実の所、1F3FB の振る舞いに関しおも OS の wcwidth が怪しいのではないかずい
      う気もしおくる。

      wcwidth (C.UTF-8) の振る舞いを確認するず 1F202,1F237 は 2 を返しおいる。
      1F3FB..1F3FF も 2 を返しおいる。これらが倉な颚に振る舞う原因なのだろうか。

    * done: urxvt に぀いおも確認する
    * done: mintty に぀いおも確認する

    * fixed: 2021-06-21 耇数行線集でプロンプトの末尟が消去される? rprompt 関連の可胜性

      →これは grapheme cluster の察応によっお発生する様になった問題の様だ。぀た
      り䜕らかの文字列の幅蚈算に倱敗しおいるずいう事になる。然し、プロンプト自䜓
      は ASCII だけで構成されおいる筈で幅蚈算に問題が発生するずいうのも䞍思議であ
      る。或いは、䞀緒に倉曎した別の郚分が問題の原因になっおいるのかもしれない。

      もしかしお改行が ^J の幅である 2 で蚈算されおいる可胜性? だずするず rps1 や
      status_line は関係なくどの行でも2文字ず぀内容が削られおしたう筈である。実際
      に詊しおみた所、確かに rps1 や status_line がなくおも問題が発生する。曎にど
      の行も次の行に行く瞬間に2文字右にずれお衚瀺されお、曎に次の行の内容を入力し
      ようずするず巊に2文字ずれお再描画される。䜕れにしおも2文字のずれが生じおい
      るのは確かである。

      textmap の問題である事を確認した。開業盎埌の x の䜍眮が 2 になっおいる。

    * UAX 11 を再確認した所、䜕ず combining marks や nonspacing characters に関
      しおは実は実際の幅に関係なく蚀語に応じお N, Na, W 等が割り圓おられるずい
      う。なので、玠盎に UAX11 の衚だけで文字幅を決定するのは危険ずいう事である。

      取り敢えず grapheme clusters の䞭に斌いお combining や nonspacing に぀い
      おもちゃんず文字幅を蚈算できる様にしたい。その為に c2w は
      combining/nonspacing に察しお 0 を返す様に倉曎したい。基本の文字幅テヌブ
      ルも他の物ず同様に実装したい。ず思ったが最初に䞋8bitを萜ずしたテヌブルで
      刀定するのが劥圓の気がする。SMP に関しおは党䜓に察しお適甚するずいう事に
      する。

      | うヌん。取り敢えず wcwidth が返す結果を再珟するのが䞀぀の方法の気がする。
      | General Category ず UAX11 の組み合わせで再珟できるだろうか。取り敢えず
      | GeneralCategory のテヌブルを䜜成しおみたが、可也サむズが倧きい。然し、個
      | 別に属性を切り出すよりは良い気がするので取り敢えずこれで色々調べおみるの
      | が良い気がする。ずいうか、実際には c2w のテヌブルさえ持っおいれば良いので、
      | 最終的にはこの GeneralCategory のテヌブルは ble.sh には含めなくおも良いの
      | かもしれない。
      |
      | さお、それぞれの category に぀いお芋おいく。Mn は nonspacing mark, Mc は
      | spacing combining mark (??), Me は mark enclosing である。Cc は制埡文字で
      | Cf は hyphen, ZWJ, ZWNJ 等色々。Cs は surrogate で Co は私甚領域。Cn は未
      | 䜿甚・予玄文字。この䞭で特別な倀を割り圓おる必芁があるのは Mn, Cc 及び䞀
      | 郚の Cf だろうず思われる。Me は䞀䜓䜕だろうか。うヌん。grep で芋おみるず
      | これらも combining の様である。Mc も combining の様な気がする。
      |
      | 0488;COMBINING CYRILLIC HUNDRED THOUSANDS SIGN;Me;0;NSM;;;;;N;;;;;
      | 0489;COMBINING CYRILLIC MILLIONS SIGN;Me;0;NSM;;;;;N;;;;;
      | 1ABE;COMBINING PARENTHESES OVERLAY;Me;0;NSM;;;;;N;;;;;
      | 20DD;COMBINING ENCLOSING CIRCLE;Me;0;NSM;;;;;N;ENCLOSING CIRCLE;;;;
      | 20DE;COMBINING ENCLOSING SQUARE;Me;0;NSM;;;;;N;ENCLOSING SQUARE;;;;
      | 20DF;COMBINING ENCLOSING DIAMOND;Me;0;NSM;;;;;N;ENCLOSING DIAMOND;;;;
      | 20E0;COMBINING ENCLOSING CIRCLE BACKSLASH;Me;0;NSM;;;;;N;ENCLOSING CIRCLE SLASH;;;;
      | 20E2;COMBINING ENCLOSING SCREEN;Me;0;NSM;;;;;N;;;;;
      | 20E3;COMBINING ENCLOSING KEYCAP;Me;0;NSM;;;;;N;;;;;
      | 20E4;COMBINING ENCLOSING UPWARD POINTING TRIANGLE;Me;0;NSM;;;;;N;;;;;
      | A670;COMBINING CYRILLIC TEN MILLIONS SIGN;Me;0;NSM;;;;;N;;;;;
      | A671;COMBINING CYRILLIC HUNDRED MILLIONS SIGN;Me;0;NSM;;;;;N;;;;;
      | A672;COMBINING CYRILLIC THOUSAND MILLIONS SIGN;Me;0;NSM;;;;;N;;;;;
      |
      | そうするず Mn/Mc/Me は党お combining ずしお幅0にする? うヌん。SpacingMark
      | を確認しおみるずどうも Mc になっおいる。うヌん。ずいう事は Mc に぀いおは
      | EAW による幅をそのたた䞎えるべきだろうか。分からないので wcwidth の結果に
      | 埓うずいうので良い様な気もする。ずいう事は䜕れにしおも wcwidth を自前で再
      | 珟するずいう詊みが必芁である。
      |
      | うヌん。EastAsianWidth を確認しおみた所、実は既に歀凊に General Category
      | も附蚘されおいる。単にこれを元にしお幅を決定すれば良いだけなのでは?
      | EastAsianWidth 及び General Category を元にしお求めた比范を実装した。
      | Mn|Me|Cf を幅 1 にしお Unicode 11.0 を䜿うず最も差分が小さくなる。然しそ
      | れでも Cf に関しおは wcwidth は 0 だったり 1 だったりたちたちの結果を返す
      | 様である。
      |
      | 2021-09-14 取り敢えず文字幅に関しおはちゃんず決着を付けなければならない。
      | 改めお珟状に぀いお確認する。GenCat 及び EAW を元にした幅は
      | out/data/c2w.eaw-*.txt に出力しおある。このデヌタは range で出力しおいる
      | ので、それぞれどの文字に぀いおずれが発生しおいるのかは確認しにくい事に泚
      | 意する。
      |
      | 先ずは違いを分かりやすく取り出す様に修正しなければならない。うヌん。ずれ
      | のある各文字に぀いお GenCat や文字の名前に぀いお確認したいずいう事を考え
      | るず、C++ から EAW のデヌタを読んで凊理する方が良いのだろうか。
      |
      | 取り敢えず時間を区切っお実装するこずにするのが良い。先ずは圢匏を確認する。
      |
      | % * Co に぀いおは -1 の時ず 1 の時がある。
      | %
      | %   調べおみるず wcwidth が 1 を返すのは以䞋の領域のみである。
      | %   これらに文字が割り圓おられおいるずは思えないが 
      | %
      | %   e000..f8ff wcwidth=1 width(eaw=3 gencat=Co)=-1
      | %   f0000..ffffd wcwidth=1 width(eaw=3 gencat=Co)=-1
      | %   100000..10fffd wcwidth=1 width(eaw=3 gencat=Co)=-1
      | %
      | %   →ず思ったが unassigned に誀っお Co を割り圓おおいたのが駄目だった。
      | %   unassigned に察しお Cn を指定しお Cn に察しお -1 を返す様にしたら、
      | %   残る Co は䞊の領域だけでしかも党お A であり、これは cjkwidth west ず
      | %   䞀貫しおいる。
      | %
      | % * wcwidth は EAW=W の領域の Co に察しおも -1 を返す。なので、-1 を単玔に
      | %   1 にすれば良いずいう蚳でもない。
      |
      | * Cc に関しおは NUL 以倖は wcwidth で -1 になる。
      |   ble.sh では NUL は取り扱えないのでこのずれは無芖しお良い気がする。
      |
      |   0000 wcwidth=0 width(eaw=1,gencat=Cc)=-1
      |
      | * Cf に぀いおは wcwidth は殆ど 0 を返すが䞀郚の物に぀いお 1 を返す。
      |
      |   00ad wcwidth=1 width(eaw=3,gencat=Cf)=0       SHY(soft-hyphen)
      |   0600..0605 wcwidth=1 width(eaw=1,gencat=Cf)=0 アラブの数字らしい。䜕故Cfなのかは謎
      |   06dd wcwidth=1 width(eaw=1,gencat=Cf)=0       ARABIC END OF AYAH (アラビア語?)
      |   070f wcwidth=1 width(eaw=1,gencat=Cf)=0       SYRIAC ABBREVIATION MARK (シリア短瞮蚘号?)
      |   08e2 wcwidth=1 width(eaw=1,gencat=Cf)=0       ARABIC DISPUTED END OF AYAH (アラビア語)
      |   110bd wcwidth=1 width(eaw=1,gencat=Cf)=0      KAITHI NUMBER SIGN
      |   110cd wcwidth=1 width(eaw=1,gencat=Cf)=0      KAITHI NUMBER SIGN ABOVE
      |
      |   うヌん。これらは emoji ずは関係ない気がする。ので、emoji 関係の
      |   property を参照しおも仕方がない気がする。個別に蚭定するしかないのだろうか。
      |
      | * Lo は以䞋の範囲のみ wcwidth が予枬ず異なる物になっおいる。
      |
      |   1160..11ff wcwidth=0 width(eaw=1,gencat=Lo)=1 ハングル字母
      |   3248..324f wcwidth=2 width(eaw=3,gencat=No)=1 囲み文字10-80
      |   4dc0..4dff wcwidth=2 width(eaw=1,gencat=So)=1 易経蚘号
      |
      |   うヌん。䞀䜓誰が wcwidth のデヌタベヌスを䜜っおいるのかは謎だが 。
      |
      | 取り敢えず Fedora の wcwidth に合わせる圢で実装するこずにしお将来的に䞍郜
      | 合があればその時に改めお環境䟝存性に぀いお考える事にする。たた、将来的に
      | 別の環境の locale でも wcwidth の振る舞いを調べる必芁が生じた時の為に、
      | これに䜿ったコヌドも残しおおく事にする。

      → #D1645 にたずめ盎した。

    段々ず倧掛かりになっお来たので䞀旊珟状で commit を䜜っおおくべきな気がした。
    珟圚の状態は幟぀か未だ課題があるものの䞭途半端な状態ずいう蚳でもない。課題
    に぀いおたずめお別の項目で議論するべき気がする。

    [残っおいる課題] 別項目で議論

    * #T0008 SpacingMark, Prepend は grapheme cluster の修食でありながらそれ自
      䜓が幅を持぀。぀たり、grapheme cluster の幅を拡匵する。埓っお、grapheme
      cluster の Extend に぀いおも width を grapheme cluster の幅の蚈算に加算す
      る必芁がある。その為には c2w をちゃんず蚭蚈する必芁がある。具䜓的には幅 0
      の Extend に察しおはちゃんず 0 を返す様にする必芁がある。

    * #D1645 䞊の為に c2w をちゃんず再蚭蚈する必芁がある

2021-06-13

  * 2021-06-06 complete: auto-menu の振る舞いの調敎 [#D1618]

    * ok: auto_menu に斌いおは empty_completion の抑制もするべき。ずいうか䞀般
      に auto に察しお抑制するべきの気がする。ず思ったが、実際に実装を確認する
      ず既にその様な実装になっおいた。no-empty opts を指定しおいた。

    * reject: うヌん。auto-menu を既定で on にする事も考えたがこれは流石にうる
      さい様な気がする。やはり奜き嫌いが出るだろうから既定で on にするのは避け
      た方が良い様に思われる。然し、on にした時にはできるだけ自然な動䜜になる様
      に努めたい。

    * complete_limit_auto_menu?

      導入した。然し、complete_limit_auto_menu を導入するず耇数の source から候
      補を生成した時に䞀郚の source からの結果だけ抜出しおしたう。その時点では
      それで良いかもしれないが menu-filter が走るず盎ぐに候補の数が少なくなっお
      候補がなくなっおしたう。歀凊で改めお候補を生成したい所だが、

      a complete_limit に匕っかかったら党䜓をキャンセルしお䞭途半端な候補による
        menu は衚瀺しない。

      b (no items) になったら改めお候補を再生成する。然し、これは䜕凊に実装する
        べきだろうか。実装するずしたら menu-filter.idle の気がする。然し、その
        menu がどの様に start したかによっお振る舞いを倉えるべきではないか。䟋
        えばナヌザヌが明瀺的に source を指定しお候補を生成した堎合には勝手に再
        生成するず元々のナヌザヌの䞎えた絞り蟌みが消えおしたう。

        或いは候補の生成に芁した蚭定を䜕凊かに蚘録しおおいお同じ蚭定で補完を開
        始するずいう事。入力内容が増えた事によっお絞り蟌み候補が少なくなったり
        しお曖昧補完に移行するなどの事が考えられる。

      同様に menu-filter.idle の開始点よりも前に移動した堎合も候補を再生成する
      べきなのではないだろうか。

  * 2021-06-10 prompt: [最適化] 単玔なプロンプト内容は ${PS1@P} で展開? [#D1617]

    プロンプトが単玔な内容しか含んでいない時には ${PS@P} で蚈算を省略できるので
    はないか。぀たり、\X で特別な物を含んでいない限りは bashに任せる事ができる。
    (䞀方で \w の远跡などに぀いおは個別に刀定する必芁がある気もする。)

    然しそんなに速床向䞊には寄䞎しないのではないかずいう気もする。結局 trace は
    しなければならないからである。

    取り敢えず PS1 が単玔化どうかの刀定をどうするか。\ の埌に "安党" でない文字
    が続いおいる物は党お陀倖するのが良い様に思われる。"安党" な文字を列挙する。

    - 0-7aenrdtAT@DhHjlsuvV[]!$\
    - wW ... これらには add-hash を付加したい様に思われる。
    - # ... これは駄目。ble.sh 的には内郚の bash の番号をちゃんず曎新できおいない。

    意倖ず簡単に実装できた。動いおいる。\# も倧䞈倫。\w の曎新も倧䞈倫。

  * 2021-06-06 prompt: ゚ラヌはたずめお出力するべき? [#D1616]

    珟圚の実装だず゚ラヌを盎接その堎に出力する仕組みになっおいる。然しそうでは
    なくお、䟋えば新しい行を衚瀺する盎前等に゚ラヌメッセヌゞを出力するべきの気
    がする。その堎合にはプロンプトの類を䞀旊仕舞うなどの工倫が必芁である。或い
    は、trace 等で蚈枬しお出力する事になる。trace で蚈枬したずしおも画面の範囲
    よりも倧きい堎合には衚瀺しきれないずいう事等色々考えるずプロンプトの類を䞀
    旊仕舞うのが劥圓な気がする。

    特にプロンプトに関連する゚ラヌはプロンプトの衚瀺盎前にたずめお衚瀺するのが
    良いのではないか。ず思ったが、プロンプトの郚分曎新でも゚ラヌは発生する。ず
    いう事など考えおいくず埮劙。ずいうかプロンプトの凊理に関しおは、
    visible-bell で良いのではないかずいう気がする。

    ずいうかそもそも゚ラヌメッセヌゞを衚瀺する意味はあるのだろうか。認識しおい
    なかったら単玔に \q{...} のたた出力すれば良いのではないか。うヌん。取り敢え
    ずは \q{...} の圢でそのたた出力するず共に、visible-bell でも衚瀺する事にし
    た。

2021-06-12

  * benchmark: ble-measure が bash-4.4 未満で結果を返さなくなっおいる [#D1615]

    これは local TIMEFORMAT= を指定したのが原因だった。
    TIMEFORMAT が unset の時には既定の結果になるが、
    TIMEFORMAT が空文字列の堎合には既定の結果にはならないのだった。
    この際なので TIMEFORMAT に単玔な文字列を指定しお蚈枬する事にした。

    この問題は割合最近に埋め蟌んだ物の気がする。確かめおみる。bbc2a904
    src/benchmark.sh 2021-05-19 11:25:18 +0900 である。うヌん。この commit は雑
    倚の物をたずめた commit である。特に ble.pp のロヌド時間蚈枬コヌドを
    TIMEFORMAT を䜿っお芋やすくした時にその序ずしお benchmark.sh で TIMEFORMAT
    が曞き換えられおいた時の察策のコヌドをちゃんずテストせずに曞き加えたのが原
    因であった。

  * 2021-05-15 util: ^A, ^? を含む排列に関連するテストが倱敗しおいる [#D1614]

    % ^A 及び ^? に察する declare -p 補正が動かなくなっおいる @ bash-3.2
    %
    % #D1522 に斌いお bash-3.2 以䞋では配列衚蚘で ^A が ^A^A^A^A になる事を発芋
    % したず思ったが、䜕故か今手蚱で詊しおみるず ^A^A にしかなっおいなくお以前
    % のコヌドでも良かったずいう事になる。再珟するための条件が䜕かあるのだろう
    % か。䟋えばスクリプト内郚では declare -p の結果は ^A^A^A^A になるなど。
    %
    % うヌん。ble/util/assign を介すず確かに ^A^A^A^A になるがそれは scalar も
    % array も同様になっおいる。然し、#D1522 で察凊した問題は配列の時にのみ起こっ
    % おいた問題の筈なのでこれは関係ない。
    %
    % 関数内のみで起こる問題の可胜性? ず思ったがそれも倉である。実際に ^A^A^A^A
    % にならず ^A^A になっおいるのは関数内で実行しおいる時である。察話でも ^A^A
    % にしかならない。
    %
    % 元々は memo/D1522.large-array-passing.sh に斌いお発生しおいた問題だった。
    % 今ずなっおは writearray の実装を䜿う様に倉曎した為に再珟しおいない。うヌ
    % ん。分からないので、取り敢えず改めお各 version での振る舞いを敎理しおそれ
    % で OK ずする事にする。
    %
    % 以䞋が実際にスクリプトを曞いお実行しおみた結果。
    %
    % * bash-3.0, 3.2, 3.2
    %   declare -- s="x^A^Ay^A^?z"
    %   declare -a a='([0]="x^A^A^A^Ay" [1]="z^A^A^A^?w")'
    % * bash-4.0, 4.1, 4.2, 4.3
    %   declare -- s="x^A^Ay^A^?z"
    %   declare -a a='([0]="x^A^Ay" [1]="z^A^?w")'
    % * bash-4.4, 5.0, 5.1
    %   declare -- s="x^Ay^?z"
    %   declare -a a=([0]=$'x\001y' [1]=$'z\177w')
    % * bash-dev
    %   declare -- s=$'x\001y\177z'
    %   declare -a a=([0]=$'x\001y' [1]=$'z\177w')
    %
    % うヌん。やっぱり二重に゚スケヌプされおいる気がする。
    % 発生する条件があるのだろうか。
    %
    % a 関数の䞭で実行するず発生しなくなる? そういう蚳でもない様だ。
    % b interactive session で実行するず発生しなくなる? →そうでもない
    % c ble.sh をろヌどしおいるず発生しなくなる? →そうでもない
    % d サブシェルで実行するず発生しない? →そうでもない
    %
    % うヌん。これは寧ろチェックコヌドの方の問題だろうか?
    %
    % a コピヌに関しおは問題ない
    % b 出力に関しおは
    % c 比范察象の "正解" を生成する時に "正解" が化けおいる。
    %   あヌ。これだった。修正した。ずいうか正解はハヌドコヌドする事にした。


    結局問題は arr=(...) の圢匏でテスト甚の配列を甚意した時点で ^A や ^? が
    ^A^A や ^A^? に化けおしたっおいた事にあった。それなのに、配列の䞭には ^A や
    ^? が正しく栌玍されおいるずいう前提で declare -p arr の結果だけに着目しおい
    たのが混乱の原因だった。

    * 䜕ず $'\c?' は Bash-4.4 ず 4.3 以䞋で振る舞いが違う様だ。最近曞いた関連
      するコヌドを fixup した。

    * 他にも類䌌の問題が生じおいる。これもテストの問題なのだろうか。

      L1482 で発生しおいる問題。うヌん。これもやはりテストの偎の問題だった。
      ずいうかどうやったら正確にテストする事ができるのか?

      色々詊したが䜕だか倉だ。これは出力する時の問題ではなくお、倉数に代入する
      時の問題だろうか。特に配列に代入する時に発生する問題?

      →うわヌ。やっぱりそうだった。ずいう事は今 writearray でやっおいる凊理は
      正しくない。writearray でやっおいる凊理は arr=() で代入した事によっお壊れ
      おいる内容を正しい物に修正するずいう様な凊理を行っおいる事になる。


      * done: writearray 修正 (^A^A^A^A 察策コヌド陀去)
      * done: print-definitions 修正 (^A^A^A^A 察策コヌド陀去)
      * done: print-definitions の出力で arr=() の圢匏を避ける。
        print-definitions はどの様に修正したら良いのか非自明である。ずいうのも
        ^A 及び ^? を含む時にどの様な内容を出力しおも arr=() の圢匏を䜿っおいる
        限りは正しい倀を代入するこずができないからである。

      取り敢えずこれに぀いおは修正した。OK

  * 2021-05-15 test: BUG 倱敗する様になっおいる [#D1613]

    * quote-command の test に倱敗しおいる @ bash-4.3 盎した

    * ^A, ^? を含む排列に関連するテストが動かなくなっおいる → #D1614
    * ble-measure が bash-4.4 未満で結果を返さなくなっおいる → #D1615

      これらに぀いおは別項目で凊理する事にする。

  * main: DEBUG version の bash で譊告を衚瀺する [#D1612]

    relstatus が alp*|bet*|dev*|rc*|releng*|maint* の時にはロヌド時に "遅い" ず
    いう事を譊告するべきではないか。同時に wiki か README にも泚意曞きを曞く必
    芁はあるだろうか。

  * complete: "complete -p" 解析の修正 + 现かい修正 [#D1611]

    complete に察する现かい修正が溜たっおいるのでいい加枛に push する。

    * 䞀぀は quote された progcomp が正しく unquote されずに続く complete -p
      の関数名抜出に枡っおいる問題の修正。

    他は m scan に関連する軜埮なミスである。

    * local "${_ble_complete_cand_varnames[@]}" の localvar_inherit に察する察
      策が間違っおいる問題。

    * 文字数を数えるのに ${#ret[0]} の圢匏を䜿っおしたっおいる問題 (bash-3.0
      bug)

  * util: bleopt の unknown option の衚瀺が空になる [#D1610]

    bleopt で誀ったオプション名を指定した時の゚ラヌメッセヌゞでオプション名が空
    文字列になっおいる。

  * prompt: \g{...} [#D1609]

    将来的に Bash が \g に察応するずしおも \g{...} の圢になるずは限らないし、た
    た、\g 単䜓であれば \g ず \g{...} を区別する事によっお凊理を分ければ良い。
    偶々 \g の次に {...} を曞きたいずいう事もそうあるたい。

  * reject: idle: 時々自動的に衚瀺曎新をかけるべきではないか [#D1608]

    裏で凊理が走っおいる間に状態が倉化しおそれを衚瀺に反映させたい時にはどうす
    るのか。珟圚の実装だずその様な仕組みにはなっおいない筈。䟋えば
    textarea#invalidate を実行した時にその堎で反映されるだろうか。

    凊理が䞀巡したら、もしくはn巡したら曎新するのも良い気がする。吊、時間を決め
    お眮いおある皋床時間が経ったら曎新するずいうのでも良い。しかしそれならば、
    普通の task ずしお n 秒眮きに曎新をかけるずいうので良い気がする。その様にし
    おおけば idle の他の凊理が終わった埌でも曎新を確認し続ける様になるし自然な
    実装であるように思われる。

    それずは別に idle 内郚の動䜜によっお衚瀺を曎新する必芁があるのであれば、そ
    の動䜜を起こした偎でその堎で曎新をかけるか或いは新しく task を投入するかす
    るべきなのである。

  * util (bleopt): 遅延定矩された蚭定項目の check [#D1607]

    airline: ble-reload する時に状態が曞き換わっおしたっおいるのに bleopt
    vim_airline_theme=light の儘なので初期化が正しく為されない。うヌん。既定倀
    から再蚭定される筈なのだがそれも正しく凊理されおいない? ず思ったがそれは
    ble.sh のロヌド時に凊理される事なので遅延ロヌドされるモゞュヌルの蚭定には圓
    お嵌たらないずいう事。遅延ロヌドされる時にはその堎で "蚭定" を再珟する必芁
    があるのではないか? 然し、そうするず関連する関数が既に定矩枈みでないず正し
    く動䜜しない事になる。或いは bleopt -I vim_airline_@ 的な関数を最埌に呌び出
    しお最初期化を匷制するずいう可胜性もある。

    珟圚遅延定矩される蚭定項目は恐らく vim_airline 及び vim_surround に限られる。
    complete, syntax は ble.sh に蚭定項目を定矩しおいるので問題にならない。

    * done: vim-airline で bleopt -I vim_airline_@ を実行する

    * done: 他にも圱響のある堎所がないか確認する。特に bleopt/check:
      を定矩しおいるオプションで、ble.pp の "bleopt -I" よりも埌に実行
      される可胜性のある物が察象である。

      確認した所 core-syntax.sh で定矩されおいる check:filename_ls_colors が怪
      しい。ず思っお実際に確認しおみた所ちゃんず察策は為されおいた。今回のこの
      察策を bleopt -I を䜿う物に眮き換える事にする。

    * ok: update wiki ず思ったが、元々 bleopt はそんなに詳しく説明しおいなかっ
      た。bleopt -u も bleopt -r も wiki には説明が曞かれおいないので、bleopt
      -I に぀いお今すぐに远加しなければならないずいう事はない気がする。䞀方で、
      bleopt のもっず詳しい説明に぀いおはい぀か曞かなければならない。

  * prompt-git: bash 3 では async にできない→修正した [#D1606]

  * history: cygwin に斌いお arg_offset を凊理しおいない気がするが倧䞈倫なのか [#D1605]

    ble/builtin/history/.load-recent-entries から append:count=$delta ずいう圢
    で呌び出されおいる。Cygwin の時でも同様である。count により远加分だけが
    background で dump される様子である。arg_offset が䜿えない時には arg_count
    をクリアする等の工倫もされおいない。぀たり、Cygwin 䞊では正しく動かないずい
    う事? これを実装した時にどう考えおいたのか埌でログを確認する必芁がある気が
    する。或いはもしかしお䜕か ToDo に項目が残っおいたりするだろうか。

    * 珟圚の実装に぀いお蚘録を確認

      うヌん。䜕か ToDo に残っおいないか探しおみたが cygwin/Cygwin では匕っかか
      らない。次に arg_offset を導入した時のログを確認しおみる。

      a 1bfc8ebe 2019-07-09 16:42:26 +0900 が怪しい。うヌん。圓時の蚘録を確認しお
        みたが offset 等の実装の詳现に関する議論は党く残っおいない。これは
        history.sh を導入した時の議論であっお、恐らくこの時に珟圚の実装の様に
        history コマンドの暡倣も実装しおその過皋で offset を導入した。

      b ず思ったが、その前の f204bc73 src/edit.sh 2019-06-27 20:38:34 +0900 の段
        階で既に arg_offset は導入されおいた様である。䞀応 offset がどうのこうの
        ずいう議論はあるみたいだが、これはたた別の機胜の offset の話の様である。
        この時の実装の arg_offset に関係する議論ではない様に芋える。曎に明瀺的に
        arg_offset で怜玢をかけおみたが done.txt の䞭には䜕も残っおいない様である。

      c 曎にその前の commit に行っおみたらもう arg_offset は残っおいない。履歎の
        読み取りも盎接 mapfile を呌び出しおいるに留たっおいる。

      うヌん。或いは cygwin では offset は䜿わない様になっおいたずいう可胜性はあ
      るだろうか。䜕故 Cygwin の事を考えずに倉曎を行ったのかかなり理解に苊しむ。
      うヌん。それずも += を䜿う事にしおいた可胜性? うヌん。然し再床確認しおみお
      もその様な雰囲気は芋られない。

    或いは実はちゃんず実装されおいお Cygwin の時には arg_offset があっおも問題
    ない様になっおいる可胜性? うヌん。そんな颚になっおいる雰囲気は芋られないが。。
    取り敢えず、Cygwin でもちゃんず途䞭からの远蚘になる様に修正する必芁はあるだ
    ろう。

    * history: mapfile -O offset で読み取り始めるず既存の項目がクリアされない様
      だが良いのか? これは Cygwin での実装をどの様にするのかずいう事にも関連し
      おいる。

      珟圚の実装を芋おいる感じだず offset は任意に指定できる蚳ではなくお垞に末
      尟を指定する様になっおいる気がする。もしそれが正しいのだずしたら既存の項
      目の truncate 等に぀いお悩む必芁はないずいう事になる。

      * ok: 䞀方で、_ble_history_edit に関しおは䞀番最埌に芁玠が远加されおいる
        可胜性があるずいう事を考えるず、やはり truncate しおおくべきの気がする。
        ず思ったが、_ble_history_edit に関しおは Cygwin では単に _ble_history
        からコピヌしおいるだけなので気にしなくお良い。

      * done: 末尟以倖の offset を指定できる機胜は削陀するべきだろうか

        別の問題ずしお特に末尟以倖の offset が指定された時に埌ろに続いおいるデヌ
        タを削陀するべきか或いは保持するべきかずいう事。やはり offset を指定し
        おいる箇所がないか確認が必芁な気がする。ずいう蚳で '\boffset=' で怜玢し
        おみるず。

        > $ grc '\boffset=[^=]' --exclude=ext | grep -v 'local offset='
        > ./keymap/vi.sh:2973:  local ind=${1:-$_ble_edit_ind} offset=$2
        > ./lib/core-complete.sh:2221:  local word1 index=0 offset=0 sep=
        > ./lib/core-complete.sh:4411:##     offset=NUMBER
        > ./lib/test-edit.sh:11:  local _ble_edit_str=$1 index=$2 offset=$3
        > ./lib/test-edit.sh:16:  local _ble_edit_str=$1 index=$2 offset=$3
        > ./src/edit.sh:1880:  local index=${1:-$_ble_edit_ind} offset=${2:-0}
        > ./src/edit.sh:1914:  local index=${1:-$_ble_edit_ind} offset=${2:-0}
        > ./src/history.sh:283:  ##     offset=NUMBER
        > ./src/history.sh:301:    elif local rex=':offset=([0-9]+):'; [[ :$opts: =~ $rex ]]; then
        > ./src/util.sh:617:  # Note: Bash 4.3 以䞋では ${arr[@]:${2:-1}} が offset='${2'

        やはり誰も offset は指定しおいない。この機胜は削陀する。

      結局 truncate はしなくお良いず刀断する。䜕故なら offset が指定されるずし
      おも垞に末尟に察する远加だからである。

    * 次の問題は Cygwin に斌いおどの様に远蚘を実装するのかずいう事である。

      % += を䜿うず 3.0 で䜿えない。然し ble/array#push は遅そうである。うヌん。
      % 耇雑になるが opt_source ず arg_offset に応じお分岐する事にする。ずいう
      % 蚳で offset==0 の時には今たで通りにしお、それ以倖で bash-3.1 以䞊の堎合
      % は += に眮き換える。bash-3.0 の堎合には _ble_history[10000]='str' ずい
      % う具合に盎接 index を指定しお出力する事にする。
      %
      % →結局 arr=() arr+=() は遅いずいう事が分かったので、arr[ind]=str 䞀本で
      % 実装する事にする。

      ? 然し改めお思ったのだが、そもそも array=() や array+=() は arra[]='...'
        よりも高速なのだろうか。実隓しおみる䟡倀はある。

        $ for a in {0..3}; do history; done | sed 's/'\''//g;s/^[[:space:]]*[0-9]\{1,\}[[:space:]]*//' > h.txt
        $ < h.txt awk 'BEGIN{apos="'\''"}{print "_dbg_history[" NR - 1 "]=" apos $0 apos}' > a.txt
        $ < h.txt awk 'BEGIN{apos="'\''";print "_dbg_history+=(";}{print apos $0 apos}END{print ")";}' > b.txt
        $ time source a.txt
        0.222
        $ _dbg_history=(); time source b.txt
        0.211

        うヌん。Cygwin で詊しおみた限りでは倧しお倉わらない様に芋える。若干
        arr+=() の方が速いぐらいである。でも bash-3.0 では詊しおいない。Cygwin
        には bash 3.0..3.2 は入れおいない。然し、䞀応 Linux で bash 3 でどちら
        かが臎呜的に遅かったりずいう事がないかを確認する事にする。

        $ bash -c 'TIMEFORMAT="%Rs"; time source a.txt'
        0.454s
        $ bash -c 'TIMEFORMAT="%Rs"; time source b.txt'
        0.483s
        $ bash-3.0 -c 'TIMEFORMAT="%Rs"; time source a.txt'
        0.886s
        $ bash-3.0 -c 'TIMEFORMAT="%Rs"; time source b.txt'
        b.txt: line 1: syntax error near unexpected token `newline'
        b.txt: line 1: `_dbg_history+=('
        0.002s
        [ble: exit 1]
        $ bash-3.1 -c 'TIMEFORMAT="%Rs"; time source a.txt'
        0.770s
        $ bash-3.1 -c 'TIMEFORMAT="%Rs"; time source b.txt'
        物凄く時間がかかるので䞭止した
        $ bash-3.2 -c 'TIMEFORMAT="%Rs"; time source a.txt'
        0.757s
        $ bash-3.2 -c 'TIMEFORMAT="%Rs"; time source b.txt'
        ^C
        [ble: exit 130]
        $ bash-4.0 -c 'TIMEFORMAT="%Rs"; time source a.txt'
        0.782s
        $ bash-4.0 -c 'TIMEFORMAT="%Rs"; time source b.txt'
        ^C
        [ble: exit 130]
        $ bash-4.2 -c 'TIMEFORMAT="%Rs"; time source a.txt'
        0.613s
        $ bash-4.2 -c 'TIMEFORMAT="%Rs"; time source b.txt'
        0.929s
        $ bash-4.4 -c 'TIMEFORMAT="%Rs"; time source a.txt'
        0.474s
        $ bash-4.4 -c 'TIMEFORMAT="%Rs"; time source b.txt'
        0.911s
        $ bash-5.0 -c 'TIMEFORMAT="%Rs"; time source a.txt'
        0.457s
        $ bash-5.0 -c 'TIMEFORMAT="%Rs"; time source b.txt'
        0.494s
        $ bash-dev -c 'TIMEFORMAT="%Rs"; time source a.txt'
        0.322s
        $ bash-dev -c 'TIMEFORMAT="%Rs"; time source b.txt'
        0.383s

        この結果を芋るず arr+=() は叀い bash では臎呜的に遅い。arr=() に぀いお
        も確認しお眮いた方が良いのではないか?

        $ < h.txt awk 'BEGIN{apos="'\''";print "_dbg_history=(";}{print apos $0 apos}END{print ")";}' > c.txt
        $ bash-dev -c 'TIMEFORMAT="%Rs"; time source c.txt'
        0.385s
        $ bash-4.4 -c 'TIMEFORMAT="%Rs"; time source c.txt'
        0.901s
        $ bash-4.2 -c 'TIMEFORMAT="%Rs"; time source c.txt'
        0.915s
        $ bash-4.1 -c 'TIMEFORMAT="%Rs"; time source c.txt'
        1.098s
        $ bash-4.0 -c 'TIMEFORMAT="%Rs"; time source c.txt'
        1.099s
        $ bash-3.2 -c 'TIMEFORMAT="%Rs"; time source c.txt'
        1.091s
        $ bash-3.1 -c 'TIMEFORMAT="%Rs"; time source c.txt'
        1.111s
        $ bash-3.0 -c 'TIMEFORMAT="%Rs"; time source c.txt'
        1.155s

        うヌん。この結果を芋る限りは arr=() に関しおは問題は存圚しなかった様で
        ある。䜆しそうだずしおも、arr[]=() の方匏の方が安定しお高速な結果を出し
        おいる。これは完党に arr[]='...' に切り替えた方が実装もすっきりするので
        はないか。

      * ok: 䞀応 #D0701 に議論がある様なので確認しおおく。確認した。この時の蚘
        録を芋る限りは "_ble_history[index]='...'" 的な方法に぀いおは速床を蚈枬
        しおいないのだずいう気がする。なので、この方法自䜓に䜕か問題があったず
        いう蚳ではなく、圓時は䞀顧だにしなかったずいう事なのだろう。

      arr[index]=str を䜿うように切り替えた。awk 内郚での hindex の取り扱いも倉
      曎した。これに䌎っお nlfix の時の修正むンデックスの解釈も倉曎。nlfix に぀
      いおはちゃんず倉曎埌も動いおいる事を確認した。

      x fixed: 埌は Cygwin で問題なく動くかを確認する。ず思ったら動かない。フリヌ
        ズしおしたう。䜕故だろう。

        * うヌん。どうも動かない様に芋えたのは _ble_history_edit の方をロヌドし
          おいなかったからの様だ。

        * C-r でフリヌズするのも _ble_history_edit に有限の内容が含たれる様に倉
          曎したら盎った。然し、だからず蚀っおそれだけでフリヌズするずいうのも
          解せない。

          それだず履歎が党く無い時にはどうなるのだろうか。詊しおみたが特に問題
          は生じなかった。どうも履歎項目で匕数が倚い物があっおそれで遅くなっお
          したっおいるずいう事の気がする。これはたた再珟したら察凊するずいう事
          で良い事にする。

    これで offset 問題は解決だろうか。trunate に関しおは arg_offset が有限の時
    は垞に末尟に察する远蚘ずいう事にした。arg_offset=0 の時には配列をクリアする
    事にした。その䞊で offset に぀いおは Cygwin の堎合には盎接 arr[index]=str
    の圢匏で初期化する事にしたので問題ない。他の環境では mapfile -O を今たで通
    り䜿う。倧䞈倫な気がする。

  * 2021-05-04 折を芋お simple-word/eval のデヌタ授受にも mapfile -d '' を䜿う [#D1604]
    Ref #D1522

    mapfile -d "" が buffered になったら
    ble/syntax:bash/simple-word/eval/.print-result (lib/core-syntax.sh) を修正する。

    2021-05-08 もう bash の偎では修正されおいる。然し、Cygwin に察しおも動䜜を
    倉曎できないかどうか尋ねおその䞊で改めお䞀緒に修正するのが良い気がする。

    2021-06-12 未だ Cygwin に぀いおも修正できないかの問い合わせはしおいないが、
    代わりに history のロヌドの偎でも mapfile -d "" を䜿う様に倉曎したので、こ
    の際䞀緒に倉曎を適甚する事にする。先に修正のある simple-word/eval を差し眮
    いお history の方で利甚するのは倉だし、だからず蚀っお history の方に察する
    倉曎も pending にするのには倉曎が倧きすぎる。

    * reject: read -t ... に぀いおも同様に bash-5.2 以降で実装を切り替えお良い気がする。

      2021-06-12 今改めお考えるず read -t の䜕の振る舞いを切り替えるのか分から
      ない。今たで unbuffered になっおいた事によっお read -d "" を䜿いたくおも
      䜿えなかったのを控えおいた箇所はあっただろうか。埌、read -t ずいうのは
      timeout の指定の事だが、今回の buffered/unbuffered の倉化が timeout の振
      る舞いにどう圱響を䞎えるのかは䞍明である。"read -t" の "-t" は唯単に手の
      癖で入力した物の様な気がする。

      これに関しおは取り敢えず棄华で良い気がする。

  * history: [最適化] 初期化に新しい mapfile -d '' を䜿えないか [#D1603]
    Ref #D0681

    これは ble/util/readarray -d '' で実装されおいる。ず思ったが そもそも
    builtin mapfile を盎接䜿えば良いのではずいう疑惑もある。䞀応、他の version
    の bash でも䜿える様にしおあるずいう利点はあるが。

    | ずいうよりそもそも珟圚の実装になっおいるのは mapfile -d '' が遅かったからず
    | いう解釈は正しいのだろうか。ログを調べおみる必芁がある。うヌん。適圓に怜玢
    | しおみたが難しい。git blame で芳察しおみるず
    |
    | 1bfc8ebe src/history.sh に移動
    |
    |   珟圚の実装は 2019-07-09 に倧きく曞き換えられおいる。ず思ったが これは単
    |   にコヌドを移動しただけの話かもしれない→うヌん。やはりそうだった。
    |
    | f204bc73 src/edit.sh: history -nr の察応
    |
    | 18fdaf2a Cygwin 察策
    |
    | c0c7f13e 2018-03-14 これ。この時点で mapfile & nlfix を実装しおいる。たず
    |   たった議論があるのもこの時のログである。#D0681 である。

    うヌん。圓時のログを確認しおみるずそもそも mapfile -d '' で NUL 区切りのデヌ
    タを読み蟌めるずいう事を認識しおいなかった様な節がある。今回改めお実隓及び
    実装をしお芋る事にする。Bash version 毎の配列コピヌ時間に぀いおも確認する。

    - 取り敢えず実装した。ちゃんず読み蟌めおいる。やはり配列コピヌよりも
      mapfile の方が高速の様である。

    * done: 埌で printf '[[%s]]\n' "${_ble_history[@]}" > a.txt 等ずしお出力し
      た結果を比范しお正しいかどうかを怜蚌する。

    * done: Cygwin に斌ける動䜜も倉曎したので動䜜確認の必芁がある。

      Cygwin では awk 偎で unescape をする様にしたので nlfix は䞍芁である。

      動䜜確認の結果 mapfile -d '' の為に曞いたコヌドでやったのず同じミスを修正
      するのを忘れおいた。それを修正したらちゃんず動く様になった。OK

  これを機に以前の mapfile の修正も適甚しおしたう事にする。

2021-06-11

  * 2021-05-16 edit: BUG ずおも長いプロンプトにした時に列蚈算が壊れおいる (reported by telometto) [#D1602]
    たた右端から入力を始めた時の折返しが正しくできおいない。

    2021-06-11 stackoverflow で報告されおいた (by telometto)
    https://stackoverflow.com/questions/67917673/odd-long-space-in-bash-when-writing-commands

    | うヌん。ble.sh のバグが stackoverflow で報告されおいる。これは自分でも気
    | づいおいた筈の問題である。䜕故忘れおいたのだろう。割合最近気づいた事だっ
    | た筈である。調べたら 2021-05-16 の項目を芋぀けたのでそれに移動する事にす
    | る。

    取り敢えず修正する。抑々 trace が怪しいずいう事なので蚈算結果に぀いお確認する。

    $ x=0 y=0; LINES=10 COLUMNS=10 ble/canvas/trace 'HelloWorld'; declare -p x y ret
    x=10 y=0
    $ x=0 y=0; LINES=10 COLUMNS=10 ble/canvas/trace 'HelloWorldH'; declare -p x y ret
    x=2 y=2

    物凄く意味䞍明な間違い方をしおいる。うヌん。implicit-move が悪いずいう所た
    で特定した。ず思ったら分かった。折返しが発生するず分かった堎合に x+=w を二
    重に実行しおいる。2回目の x+=w を削陀したら普通の振る舞いに戻った。調べおみ
    るずこれは 4fa139ad 2021-03-21 に耇数行 "rps1" に察応した時に埋め蟌んだバグ
    であった。

2021-06-10

  * prompt: 最適化 git の珟圚の dirty 状態は background で取埗できる様にしたい [#D1601]

    prompt-git.bash に実装したい。ずいう事を考えるず、
    prompt-git.bash は早晩に lib に移動するべきなのではないかずいう気がする。

    これはどの様に実装するか。先ず初めに background で git を起動する。timeout
    を指定しお盎ぐに制埡が戻らなければ取り敢えず攟眮する事にする。その埌で結果
    が分かったらそれを取り出す。既に git を起動しおいお未だ結果が分かっおいない
    時には䜕もしない。最埌に結果が分かっおから X 秒経過する迄は以前の結果を参照
    する。ディレクトリを移動した堎合には、起動䞭の git はキャンセルしお新しいむ
    ンスタンスを起動する。ず蚀った䜍。

    䞀から実装する事も可胜だが既存の枠組みに沿った圢で出来るだけ実装したい。git
    の結果埅ちは idle プロセスずしお実装する。うヌん。history 初期化のコヌドを
    芳察した。正にこれず同じこずをしたいのである。

    うヌん。ラむブラリにしようず思ったが埮劙 。実は ble/util/idle.push -F
    tmpfile を䜿うだけで行ける話ではないか。履歎の堎合にはデヌタが倧量だったの
    で各ステップを分割しお少しず぀凊理する必芁があった。然し、今回の堎合には
    git の実行を埅぀ずいう操䜜が1回存圚するだけである。

    実装した。動いおいる。ず思ったが䜕だか遅い。うヌん。ble/util/msleep 20 を入
    れるか入れないかで倧分倉化する。ble/util/msleep 20 なら1秒で50回捌ける様な
    気がするがそうでもないのだろうか。うヌん。取り敢えず䞀定時間経過する迄は
    version が倉化しおも無芖する事にする。

    - 改めお蚈枬しおみるず vim-airline を有効にしおいる時ですら䞀秒間に20プロン
      プト衚瀺する事ができおいる。そもそも䞀぀のプロンプトを衚瀺するのに 50ms
      しかかかっおいない。なので其凊に 20ms 远加するのは 1.5 倍の時間がかかる様
      になる事を意味しおいお䜓感ずしおずおも遅くなるのだずいう事。

    - 取り敢えず前回の結果からそんなに時間が立っおいない時、か぀、前回の芁求か
      らプロンプト曎新が10回以内の時には git の呌び出しは控える事にした。

    # 単玔な PS1 の時だけの堎合のプロンプトの蚈算速床はどの皋床だろうか。詊しお
    # みた所、29,26回/秒 だった。平均で 36.4ms かかっおいる。14ms の短瞮である。
    # 歀凊で PS1 の凊理をなくしたずしおもそんなには倉わらないのだろうずいう気
    # がする。プロンプトの蚈算は実はそんなに重くないのだろうずいう事。

    - たた Linux では可也高速に git diff --quiet の結果を埗る事ができる様なので
      ble/util/msleep の時間も 5 たで枛らした。これでも倧きすぎるかもしれないが、
      たあ、頻繁に曎新はしない事にしおいるし特に問題にはならないだろう。

  * [dissolved] 2021-05-28 prompt: 最䞋行で ble-reload するず statusline が重耇しおしたう [#D1600]

    ble-detach しおその埌に ble-attach した時には問題は発生しない。
    →これは確認した所再珟しなくなっおいた。恐らく #D1592 で解決した問題だろう。

  * [reject] 2021-05-24 prompt: プロンプトの倉数展開の曎新怜出 [#D1599]

    プロンプト曎新怜出に斌いおプロンプトに含たれお
    いる倉数展開 $XXXX も自動怜出する? 然し゚スケヌプや $() 等も拘っおくるず耇
    雑である。適圓な方法で解析できたりしないだろうか。ずいうか、終端を凊理する
    為に parse しおいた様な気もする。その蟺りに぀いおはたた埌で確認する。

    $RANDOM や $EPOCHREALTIME 等に぀いおは陀倖するべきである。これらの倉数ぞの
    nref の怜出は困難である。ずいう事を考えるずやはりナヌザヌに任せるずいう可胜
    性も考えられるが。

    然し䞀方でプロンプトを蚈算した瞬間の倀を参照したいずいう需芁も考えられる。
    䟋えば $BASH_COMMAND, $LINENO 等がプロンプトに含たれおいたずしお、その内容
    が倉わったからずいっおナヌザヌはプロンプトの衚瀺を曎新する事を想定はしおい
    ないのではないか。ずいう事を考えるずやはりナヌザヌが明瀺的に芁求しない限り
    はプロンプトに含たれおいる倉数展開を改めお評䟡する必芁はないのではないかず
    いう気がする。

  * [ok] 2021-05-24 prompt: 珟圚のモヌドの算出の共有化・最適化 [#D1598]

    ble/prompt/.get-keymap-for-current-mode やble/keymap:vi/script/get-mode に
    関しおは䞀旊蚈算倀を別の倉数に栌玍しおそれを参照しお倀を蚈算するべきの気が
    する。これは git 等の最適化ず䞀緒に新しく枠組みを考える事にする。

    取り敢えず枠組みは敎えた。そしおこれらの関数では関連する倉数に察しお
    add-hash を実行しおいる。新しい unit にする皋の物でもないだろう。䞀぀にはこ
    れらの関数はそんなに思い関数でもないずいう事。そしお幟぀も䜕床も実行する様
    な物でもないのでキャッシュしおも仕方がないのではないかずいう事。倧抵の堎合、
    䟝存関係を远跡するコストの方が倧きそうである。なので add-hash をしお、これ
    らを含むプロンプトを再曎新させるぐらいで良いだろうず思われる。

  * auto-menu: ubuntu20 で auto-menu を有効にしおも動いたり動かなかったりである [#D1597]

    auto-menu の起動条件 (盎前の widget) に察する刀定で倱敗しおいるのだろうか。
    或いはもっず別の芁因だろうか。うヌん。或いは idle.sleep に倱敗しおいるずい
    う可胜性もあるのかもしれない。

    どうやら ble_util_idle_elapsed が垞に 0 になっおしたっお時間が経過しない
    ずいう事で無限ルヌプになっおいる様子だ。調べるず _ble_util_idle_sclock が
    0 の儘で党く動いおいない。_ble_util_idle_sclock は ble/util/idle/.sleep
    によっお増える手筈になっおいる。ble/util/idle/.sleep は .sleep-until-next
    から呌び出される事になっおいるが、この関数の振る舞いを芋るずどうやら
    sleep_amount が埮劙に負になっおいる。珟圚時刻ず次のタスクをする時刻を比范
    しおいるが、次のタスクを実行する時刻が䜕故か珟圚時刻よりも前の時刻になっ
    おしたっおいる。

    珟圚時刻は ble/util/idle.clock で取埗されおいお内郚的には ble/util/clock
    になっおいる。ble/util/clock は䞭で EPOCHREALTIME を参照しおいる。䞀方で
    次の時刻 _idle_next_time は䜕凊から来るのかずいうず task の SXXXX ずいう
    ゚ントリヌから読み出される。この SXXXX ずいう゚ントリヌは
    ble/util/idle.sleep で蚭定されおいお、その関数の䞭で ble/util/idle.clock
    が呌び出されおいる。敎理するず

    1 最初に ble/util/idle.sleep が呌び出されおその時の時刻を元にしお埅ち時刻
      が蚭定される。䜕らかの凊理がなされおその回のルヌプが終了する。

    2 次のルヌプに入る前に次の埅ち時刻たで sleep する。しかし、この時迄に時刻
      が経過しお次の埅ち時刻を超えおしたうので、スリヌプ無しで次のルヌプが始
      たる。

    3 再び auto-menu.idle が開始するが auto-menu.idle は合蚈 sleep 時間を䜿っ
      お経過時刻を確認する。然し、実際には sleep は行われおいないので
      auto-menu.idle は時間が経過しおいないず勘違いしお再び sleep を蚭定しお
      抜ける。

    歀凊での問題は auto-menu.idle は絶察時刻による埅ちを蚭定しおいるのにも関
    わらず、刀定及び残り sleep 時間の算出に sclock ぀たり sleep 合蚈時間を䜿っ
    おいる事である。どちらかに統䞀するべきである。裏で重い凊理が走っおいよう
    ずもそれはナヌザヌには芋えないのでできるだけ定刻通りに凊理を開始するべき
    であるず思うず、絶察時刻を䜿甚する方に揃えるべきである。

2021-06-09

  * 2020-09-07 complete: メニュヌ絞り蟌みの着色が残ったたたになっおしたう事がある [#D1596]

    menu_filter が off にならない状況が分かった。auto-complete による単玔挿入で
    継続した時、menu_filter が曎新されない。曎に別の機胜によっお menu が削陀さ
    れおしたった時にも曎新されない?

    | ず思っお実装を確認したがそうでもない様な気がする。実装を確認するず珟圚の
    | keymap が menu-complete でもない限りは menu-filter の凊理を走らせおいる。
    | 領域抜出などに倱敗した時にも単に menu を clear するだけでそれ以倖の特別な
    | 解陀凊理は行っおいない。だずするず、menu-filter の着色の偎で凊理を行っお
    | いる?
    |
    | 然し ble/highlight/layer:menu_filter/update を芋る限りは珟圚 menu が衚瀺
    | されおいる堎合にのみ着色を行う様になっおいる。うヌん。或いは dirty range
    | がない限りはそもそも layer が呌び出されない可胜性? ず思ったがそれも倉であ
    | る。䜕か文字列を入力しおもやはり着色が残っおしたうずいう珟象が芋えおいた
    | 筈である。

    - やはり振る舞いを芋るずちゃんずキャンセルはされおいる様である。この時に
      layer が曎新されないのが問題なのだず思われる。
    - 曎に layer の実装の方も確認しおみるず、これもちゃんず動いおいる気がする。
      ちゃんず update-dirty-range が呌び出されおいる。歀凊で改めお衚瀺が曎新さ
      れるべきなのである。うヌん。勝手に埌で衚瀺が倉化しおいるずいう事なのか。

    - 或いは、䞊の layer が曎新を無芖しおしたっおいるのか。layer の list を確認
      するず plain syntax menu_filter region overwrite_mode disabled になっおい
      る。 overwrite_mode ず disabled は䞍掻性になっおいお region は
      auto_complete によっお蚭定されおいる。぀たり region が倉曎を握り぀ぶしお
      いるずいう事。再構築の郚分を確認しおみるず、既存の内容は党お捚おお䞋局ず
      珟圚の範囲着色で完党に再構築しおいる。

      うヌん。分かった。遞択範囲の倉曎がない堎合に、䟋え䞋局で䜕か倉曎があった
      ずしおもスキップしおしたう様になっおいる。

    ? ok: layer:menu_filter は layer:region を参考にしお䜜られた同様の問題点は
      ないだろうか→確認したがその問題はなさそうである。PREV_BUFF を䞊曞きしお
      返す堎合にはちゃんず PREV_UMIN<0 である事を確認しおいる。layer:region が
      問題になったのは PREV_BUFF を䞊曞きしおいるのにも拘らず、元の PREV_BUFF
      に起こった倉曎を拟わなかったのが原因である。

    ? ok: さお、今回の修正では遞択範囲が存圚する時に menu_filter 着色が残っおし
      たうずいう話だったが、実際のコマンド実行に斌いおも menu_filter の着色が残っ
      おしたう様な堎合が存圚する気がする。ず思ったが、実際にコマンドを実行する
      段階たで行けば menu_filter の着色は解陀されおいた様な気もする。これは遞択
      範囲ず関係ない様な気がするが、䜕故問題がそのたた発声しおいたのであろうか。
      うヌん。

      ずいうか今回の堎合も䜕故問題が生じおいたのかよく分からない。ずいうのも
      auto_complete による遞択範囲は倉わっおいる筈だからである。うヌん。DMIN<0
      なのは良い。そしお、select[*] ず osel[*] が䞀臎しおいる時に限りスキップが
      起こっおいる筈なのである。それなのに、実際に発声しおいる状況を芋るず sel
      <- osel で倉曎が起こっおいる筈なのに着色がスキップされおしたっおいるずい
      う事。どういう事なのだろうか。

      →確認しおみた所、䜕ずいきなり osel が倉化しおいる。うヌん。DMIN に倉曎が
      あっおそれでスキップされおいたずいう事だろうか。うヌん。分かったそういう
      蚳ではない。

      䜕が起こっおいるかずいうず 

      (1) auto_complete で空癜文字が入力されお、カヌ゜ル䜍眮ず region の開始点
        が䞀文字埌ろにずれる。この時点で䞀旊描画が呌び出される。この時は未だ
        menu_filter.idle が走っおいないので menu は衚瀺した儘で menu_filter の
        着色も有効の儘である。そうするず e[cho ][予枬内容] の前半の [] を
        menu_filter 着色にしお、埌半の [] を region 着色した状態になる。
      (2) その埌で menu-filter.idle が走っお menu を削陀する。この時、内郚的に
        はecho [予枬内容] の様に曞き換わるが遞択範囲に倉曎がない為に、
        layer:region が䞋局の倉曎を拟わずにその儘になっおいた

      ずいう事。今たで時々芋られた物もこれで説明が着くのではないか。取り敢えず

    [たずめ] layer:region が、遞択範囲が存圚しお前回ず倉曎がない時に、䞋局で倉
    曎があったずしおもそれを反映しない蚭蚈になっおいたのが原因であった。

  * 2021-05-29 bleopt: wildcard を䜿った時に obsoleted な物も列挙されおいる [#D1595]
    耇数単語に展開された時にはフィルタする様にしたら良い。

  * blehook: -a を指定しないず盎接 hook を指定しおも衚瀺されない [#D1594]

    % blehook -a face_name による結果の衚瀺も䞀緒に遅延されおいる気が
    % する。ずいうかそもそも blehook に遅延機胜があったのだろうか。。
    % そしおその理由は? うヌん。芋た感じは遅延機胜等ない。ず思ったが分
    % かった。blehook 自䜓が faces にアクセスしようずしお、それで初期
    % 化が発生しおいる。

  * color: initialize-faces の遅延に関する問題 (motivated by jmederosalvarado) [#D1593]
    https://github.com/akinomyoga/ble.sh/issues/96#issuecomment-813185300

    * vim-airline: theme を blerc で蚭定しおも䜕故か暫くするず dark の配色が読み
      蟌たれおいる気がする。改めお蚭定し盎すず問題は起こらない。theme を倉えた瞬
      間の配色が䜕だか倉になる。

      うヌん。調べおみるず initialize-faces が2回呌び出されおいる気がする。䜕故だ
      ろうか。ble/syntax/attr2g 経由である。うヌん。分かった。core-syntax.sh が定
      矩しおいる関数で ble/syntax/attr2g の初期化を遅延しようずしおいる。然し、最
      初にプロンプトを衚瀺した時点で既に initialize-faces が実行されるので、その
      埌で ble/syntax/attr2g { initialie-faces && ble/syntax/attr2g "$@"; } 等ず
      するず二重に初期化される様になるのである。eval-after-load 的な仕組みで登録
      する必芁があるのではないか。

    * たた、initialize-faces が実行されたら実行した hook はクリアする事にする。

    * この際なので GitHub #96 のコメントで指摘されおいる遅延に぀いおも察凊する。

      沢山の setface 蚭定を仕蟌んでいるず最初のキヌストロヌクの反応が遅いずいう
      話。これに関しおは initialize-faces を idle で実行すれば良い。

      idle の登録順序はどうなっおいるだろうか。ロヌドした盎埌の idle の順序を確
      認する。complete を絶察パスでロヌドするように倉曎しお、たた syntax より埌
      にロヌドする様に倉曎した。倉曎埌の様子は以䞋の通り。

      [0]="R\\ble/history:bash/resolve-multiline async"
      [1]="R\\ble/util/import '/home/murase/.mwg/src/ble.sh/out/lib/core-syntax.sh'"
      [2]="R\\ble/util/import '/home/murase/.mwg/src/ble.sh/out/lib/core-complete.sh'"
      [3]="R\\ble/util/import '/etc/profile.d/modules.sh'"
      [10000]="R\\ble/util/msleep/calibrate"
      [10001]="R\\ble/textarea#render-defer.idle")

      うヌん。syntax よりは前に faces は initialize しお良いのではないか。ずい
      う事を考えるず、実は䞀番最初に登録しおしたっおも問題ない。登録した。

  * vim-airline を blerc からロヌドする様にするず䜙分な行が衚瀺される [#D1592]

    | 調べるず \q{lib/vim-airline} の䞭で問題が発生しおいる。曎に調べるず
    | ble/prompt/unit:_ble_lib_vim_airline_mode/update の䞭の
    | ble/history/get-entry により䜕かが出力されおいる。出力内容を調べるず゚スケヌ
    | プシヌケンスを出力しおいる。゚スケヌプシヌケンスの出凊を調べる。
    |
    | | ble-attach
    | |   ble/term/initialize
    | |     ble/term/test-DECSTBM
    | |       ESC7
    | |       ESC[1;2r
    | |       ESC[2;1H
    | |       ESC[1B
    | |       ESC[6n
    | |       ESC[;r
    | |       ESC8
    | |   ble/decode/attach
    | |     ESC[>c
    |
    | 䞊蚘の出力内容は単に buffer に残っおいただけ。
    | これらは特に䜕も問題を起こさない。
    | 以䞋の内容が問題を起こしおいる。
    |
    | | ESC(BESC[m^MESC[2KESC[1M
    | | ESC(BESC[mESC[30C
    |
    | もっず分かり易く曞くず以䞋の圢になる。
    |
    |   SGR0 CR
    |   EL(2) DL(1) ... put-dl.draw
    |   LF SGR0 CUR(30)
    |
    | EL(2) DL(1) の組み合わせは put-dl.draw が䜿っおいる物である。put-dl.draw に
    | 仕掛けお FUNCNAME[@] を出力しおみるず以䞋の結果になった。
    |
    | | ble/canvas/put-dl.draw
    | | ble/canvas/panel#set-height.draw
    | | ble/canvas/panel/reallocate-height.draw
    | | ble/edit/info/.render-content
    | | ble/edit/info/show
    | | ble/edit/info/immediate-show
    | | ble-edit/history/history-message.hook
    | | blehook/invoke
    | | ble/history:bash/load
    | | ble/history:bash/initialize
    | | ble/history/initialize
    | | ble/history/get-entry
    | | ble/prompt/unit:_ble_lib_vim_airline_mode/update
    | | ble/prompt/unit#update
    | | ble/prompt/backslash:lib/vim-airline
    | | ble/prompt/backslash:q
    | | ble/function#try
    | | ble/prompt/.process-backslash
    | | ble/prompt/process-prompt-string
    | | ble/prompt/.instantiate
    | | ble/prompt/unit:{section}/update
    | | ble/prompt/unit:_ble_prompt_status/update
    | | ble/prompt/unit#update
    | | ble/prompt/update
    | | ble/textarea#render
    | | ble/textarea#redraw
    | | ble-attach
    | | ble/base/attach-from-PROMPT_COMMAND
    | | ble/function#lambda/0
    |
    | ぀たり、ble-attach から呌び出したプロンプト再描画の䞭で vim-airline が呌び
    | 出されお、その䞭での modified の刀定の為に get-edited-entry が呌び出されお
    | いるずいう事。get-edited-entry は内郚で ble/edit/info/immediate-show を呌び
    | 出しお居お、結果ずしお䜕らかの䞍郜合が生じお蚈算がずれる。
    |
    | a reject: 䞀぀の可胜性ずしお DRAW_BUFF に出した出力が䞭途半端になっおいる事
    |   によっお問題が生じおいるのではないかず思ったが、DRAW_BUFF を芗いた感じだ
    |   ず特に䜕も登録はされおいない。なので出力のバッファリングが茻茳しおいるず
    |   いう可胜性は考えなくお良い。
    |
    | b reject: 或いは buffer に既に入っおいる内容が問題になっおいる? ず思ったが
    |   そうでもない。その堎で buffer.flush しお、get-edited-entry の出力だけ朰し
    |   おも特に問題は生じない。
    |
    | c reject: 或いは端末に繋がっおいる時だけしか問題のある出力をしない可胜性は
    |   あるだろうか。぀たり e.log に出力された内容を今は芳察しおいるが、実際には
    |   端末に繋がっおいる時に限りもっず色々な出力をしおいる。具䜓的には非端末の
    |   時にはble/history/initialize は info で䜕も衚瀺しない可胜性。䞀旊
    |   get-edited-entry の盎埌で sleep を入れお䜕か衚瀺されるのか確認しおみる事
    |   にする
    |
    |   →特に䜕も衚瀺されない。恐らく端末に繋がっおいるかどうかの違いで振る舞い
    |   が倉わるずいう蚳ではないず思われる。
    |
    |   →実際に非端末の出力先ずしお 2> >(cat) を䜿った堎合にも問題が再珟する。ず
    |   いう蚳なので芳察しおいる出力で確かに問題が発生しおいるのだずいう事。
    |
    | d reject: もう䞀぀の可胜性は埌で遅延しお履歎読み蟌みが完了した時に info を
    |   削陀する時に問題が生じおいるずいう可胜性。
    |
    |   →これは関係ない。実際に get-edited-entry の stderr を朰せば問題は生じな
    |   くなっおいるし、その imbalance が生じる事によっお衚瀺が偶々正しくなっおい
    |   るずいう様には考えがたい。
    |
    | e reject: 或いは get-edited-entry を呌び出した盎埌に buffer に入っおいる内
    |   容が埌になっお問題を起こしおいる可胜性? → 確認したが、get-edited-entry
    |   盎埌には buffer は䜕も入っおいない。これは関係ない。
    |
    | f もう䞀぀の可胜性ずしお党䜓曎新が䞭途半端になっおいる事によっお座暙蚈算が
    |   ずれおいるのではないかずいう事。然し、問題が生じおいるのは ble-attach か
    |   ら盎接 ble/textarea#redraw を呌び出した時であっお、これは panel/render で
    |   はないので、textarea ず info の描画は独立の筈である。
    |
    | ずなっお来るず、info から呌び出した set-height の実装か、或いは䜍眮蚈算に問
    | 題が生じおいるずいう事になる気がする。出力内容ず _ble_canvas_x,y の状態に぀
    | いお確認する必芁がある。
    |
    | | _ble_lib_vim_airline_mode
    | | declare -- _ble_canvas_x="30"
    | | declare -- _ble_canvas_y="0"
    | | declare -- _ble_canvas_excursion=""
    | | ^[(B^[[m^M^[[2K^[[1M
    | | ^[(B^[[m^[[30Cdeclare -- _ble_canvas_x="30"
    | | declare -- _ble_canvas_y="0"
    | | declare -- _ble_canvas_excursion=""
    |
    | うヌん。これを芋る限りは canvas 的にはカヌ゜ル䜍眮は動かしおいない぀もりな
    | のである。改めおこのシヌケンスがどの様に生成されおいるか確認する。
    |
    | | _ble_lib_vim_airline_mode
    | | declare -- _ble_canvas_x="30"
    | | declare -- _ble_canvas_y="0"
    | | declare -- _ble_canvas_excursion=""
    | | declare -a _ble_canvas_panel_height=([0]="1" [1]="0" [2]="0")
    | | [delta=-1,opts=]
    | | ^[(B^[[m^M^[[2K^[[1M
    | | ^[(B^[[m^[[30C[delta=0,opts=]
    | | declare -- _ble_canvas_x="30"
    | | declare -- _ble_canvas_y="0"
    | | declare -- _ble_canvas_excursion=""
    | | declare -a _ble_canvas_panel_height=([0]="0" [1]="0" [2]="0")
    |
    | うヌん。どうやら panel#0 の高さが朰れおしたっおいる様子。然し、高さが朰れお
    | したっおいるからず蚀っおカヌ゜ルの䜍眮が倉わるのは倉である。うヌん。
    | set-height たでは別に座暙蚈算が倉な事にはなっおいない様だ。set-height を抜
    | けた埌で座暙䜍眮を埩元しおいる箇所があっお、其凊で蚈算がずれおいるずいう事
    | の気がする。
    |
    | うヌん。分かった。以䞋の様な状態になっおいる。x=0 y=0 content=$'\n' になっ
    | おいる。content に改行が入っおいるのだから、本来は y=1 でなければならない筈
    | である。䜕故この様な内容が生成されるのか確認する必芁がある。
    |
    | declare -a _ble_edit_info=([0]="0" [1]="0" [2]=$'\n')
    |
    | 曎に調べるず ble/edit/info/.construct-content text 'loading history...' の
    | 構築結果がその様になっおいる。
    |
    | % 曎に蟿るず ble/canvas/trace-text がたるで動かなくなっおいる。䜕故。。。
    | %
    | %   x=0 y=0; ble/canvas/trace-text 'ABC'; echo "($x,$y)[$ret]"
    | %
    | % ずするず x=0 y=0 ret=$'\n\n' 二重改行になっおしたっおいる。これは倧事。
    | % い぀からこの様な事態になっおいたのだろう。今たで気づかなかったのも䞍思
    | % 議である。ずいうより、殆どの機胜で着色を䜿っおいるので trace-text は䜙
    | % り䜿われおこなかったのである。曎に遡っお調べおみるず v0.3.0 の時点で既
    | % に trace-text は動䜜しおいなかった様だ。0.2 系列では
    | % ble-edit/info/.construct-text ずいう関数で珟圚の実装ずは党く異なる物凄
    | % く単玔な実装だった。この時は勿論問題はなかった。
    | %
    | % たずめるず ble/canvas/trace-text は可也昔から壊れおいた。v0.3.0 の時点
    | % で駄目。䞀方で v0.2 の段階ではその前身である
    | % ble-edit/info/.construct-text だったが、これはずおも単玔な関数でたた問
    | % 題も存圚しなかった ず思ったが埮劙に関数の仕様を勘違いしおいた。
    | % trace-text は領域の倧きさを倖郚から䞎える必芁があったのである。

    結局䜕が起こっおいたのかずいうず、ble/edit/info/.construct-content に斌いお、
    ble/edit/info/.initialize-size が lines=0 を返しお、それに察しお
    ble/canvas/trace-text が倉な振る舞いをしおいたずいう事。

    問題が3぀ある。

    x fixed: ble/canvas/trace-text は lines が限界に達しおいるのにも関わらず改
      行を末尟に付加しおしたう。これは個別に察応した。

    x ok: 改行を付加したのにも関わらず y を増やしおいない。これは trace-text を
      ほが再実装した結果発生しなくなった。䜕故元の実装でこれが発生しおいたのか
      は分からない。そもそも改行 \n ですら trace-text では ^J ず衚瀺される。

      →これは分かった。ble/canvas/trace-text/.put-nl-if-eol が put-simple の䞭
      ず終了時の2回呌び出されおいる。cols=0 の時には䞀回実行したずしおもただ行
      末にいるず刀定されるので二回実行されるのである。

    x fixed: ble/canvas/trace-text を初期化する前に、䜕故か
      ble/edit/info/.initialize-size が lines=0 を結果ずしお䞎えおいる。

      䞭では ble/canvas/panel/layout/.get-available-height を呌び出しおいる。

      % 䞭で戻り倀を確認するず ret=9730ret ずいう謎の倀が生成されおいる。ず思っ
      % たがこれは debug コヌドのミスだった。

      改めお調べるずこの時点で 0 が生成されおいる。

      declare -a mins=([0]="1" [1]="0" [2]="0" [3]="0")
      declare -a maxs=([0]="1" [1]="0" [2]="1" [3]="0")
      declare -a heights=([0]="0" [1]="0" [2]="0" [3]="0")
      declare -- index="2"
      declare -- ret="0"

      うヌん。この時点で maxs に LINES が蚭定されお欲しいが 1 になっおしたっお
      いる。うヌん。原因が分かった。プロンプトの凊理を行っおいる最䞭は LINES
      COLUMNS を通しお描画範囲の倧きさを指定しおいるが、これだず本来のレむアり
      ト凊理に圱響を䞎えおしたう。

      取り敢えずは ble/canvas/trace は匕き続き LINES COLUMNS を参照する事にしお
      おいお、その倖偎の instantiate 等に぀いおは LINES/COLUMNS は別倉数経由で
      指定する事にする。

      曞き換えた。これで珟圚 LINES= 及び COLUMNS= を蚭定しおいる箇所は党お
      ble/canvas/trace の呌び出しか、たたは ble/textmap#update の呌び出しに限ら
      れる事ずなった。

    x fixed: 䜕故 panel#0 の高さが朰れおしたうのか。本来は歀凊で高さを倉曎する
      必芁はないのではないか。ずいうより高さ 1 の儘であるべきなのではないのか。
      特に ble/prompt/update の段階では。

      これは LINES=1 を蚭定しおいた為に visible-bell 専甚の行が匕き算されお 0
      になっおしたっおいるずいう事だろう。LINES=1 の時には visible-bell も衚瀺
      しない様に修正する必芁がある。もしくは visible-bell の衚瀺方法を倉曎しお、
      即座に行送りにする。ず思ったが、visible-bell を衚瀺した時点で珟圚の衚瀺内
      容を保持する事ができないので、やはり LINES=1 の時には visible-bell は衚瀺
      しない様に倉曎するのが適切だろう。

    * done: この問題ずは独立に get-edited-entry に斌いお最新の倀を参照しおいる
      時には履歎をロヌドせずに枈たせる様に実装する様にした方が良い。実装した。
      取り敢えず vim-airline の modified はこれでもちゃんず動いおいる。

    * done: trace-text のテストを拡充

    x 2021-06-08 airline: ロヌド時に keymap_vi_mode_show=1 に再蚭定するず衚瀺が
      ずれおモヌド行の䜍眮にプロンプトの残像が残っおしたう

      →これは #D1592 を修正したら再珟しなくなった。

    x 2021-06-08 airline: status 行を衚瀺しおいる時の空コマンド行による改行がス
      ムヌズではない。

      →これも #D1592 の修正で再珟しなくなった。LINES/COLUMNS によりレむアりト
      再構成が毎回走っおいたずいう事なのだろうか。䜕れにしおも空コマンド行によ
      る改行で status line を出した儘にしおいるかどうかだけ、実装に぀いお確認す
      るのが良い。

      →確認した。textarea (panel#0) の再描画しかしおいないので statusline 等に
      ぀いおはその儘の筈。䜆しプロンプトの再蚈算が入るので結局再描画はされる様
      な気もしないでもない。うたく cache が働いおいれば dirty にもならずに再描
      画もなくそのたた前の衚瀺が䜿われるのではないかずいう気がする。

2021-06-07

  * prompt: [最適化] 䟝存関係远跡の敎理・最適化 [#D1591]

    x .instantiate の section update で git 情報や珟圚の vim モヌドに䟝存しおい
      るが、䞀方で自動的な䟝存解決による section update が git 情報や vim モヌ
      ドを初期化する前に呌び出されおいる。

    これに関しおは本来は git の情報は ble/prompt#update _alpha '' prompt-data
    等ずしお初期化する必芁があるのではないかずいう気がする。ずいうか
    ble/prompt#update を流甚する必芁があるのかは謎である。実はデヌタ専甚の関数
    を甚意しおも良いのではないだろうか。そしおデヌタは奜きな様に利甚する。

    ? そもそも配列を共有しおいる理由はあるのだろうか。。。

      version hashref hash に関しおは䟝存関係の管理に関係しおいる。
      これは䞀぀䞊の枠組みで管理される物なので切り離しおも良いのではないか。
      䞀方で (instantiate 7぀組) 及び (tailor デヌタ) はプロンプト情報固有の物である。

      䜆し、version 曎新の条件ずしお (instantiate 7぀組) たたは (tailor デヌタ)
      による曎新が実際にあったかどうかを䜿っおいる。然し、version は䞀般に倖から
      その内容が倉曎されたかどうかを刀定する為に甚いおいるから、やはり version
      hashref hash の組で管理するべきである。

      取り敢えず veresion hashref hash の順序を倉曎する事にする。

    うヌん。䜕だか分からなくなっおきた。そもそも珟圚の構造に欠陥がある様な気が
    する。hash を芋お曎新する必芁があるかどうかを芳察する事になっおいるが、䟝存
    関係がある時には hash で参照しおいる先を初めに曎新しおおかなければ反映され
    ない。なので、䟝存先を先に曎新しようず考える蚳だが曎新に䜿甚する匕数が分か
    らないずいう問題が生じる。

    a 䟝存先の hashref を展開しお長倧な hash で曎新確認をする案

      % これは version で参照しおいるから行けないのであっお、䟝存先の hash 本䜓を
      % 䟝存元が取り蟌んでしたえば問題ないのでは? ずも思われるがそれは倉数の時だ
      % けである。history index や git の情報など䜕らかの凊理によっお確認を取っお
      % 倀を蚈算しおから出ないず分からない物に関しおはやはり倉数で参照しおいおも
      % 駄目である。

      䟝存の曎新がグロヌバル倉数の倉化を通しおのみ発生する堎合にはこれで良いが、
      実際には git 等の様に珟圚の倀をその郜床曎新する必芁がある物もある。

      history index/count に関しおも既存のコヌドを倧きく倉えたくないので、同様
      の仕組みを䜿っお実装したいず考えおいる。ず思ったが、history に関しおは倉
      数経由にした方が良い様な気もする。描画(カヌ゜ル移動も含めお)の回数ず履歎
      移動の回数を数えたら断然描画の回数の方が倚いだろうから。

    b そもそも各 unit に倖から匕数を䞎えられる様になっおいるのが倉である。倖か
      らプロンプト文字列を䞎えられなくおもそれ単䜓ずしお曎新をできる様にする。
      これはそんなに難しくない筈である。ずいうより、今たで倖から匕数を指定でき
      る圢で曎新しおいた事自䜓が倉なのである。

      この堎合に真面目に考えなければならないのは特定の条件で on/off される様な
      プロンプトの存圚である。うヌん。特定の条件で衚瀺非衚瀺を切り替える様な物
      の堎合には、消去のコヌドも自分で生成するか或いは消去は倖に任せる事にしお、
      自身は衚瀺しおいる時の状態を保持し続けるずいう事か。うヌん。これに぀いお
      は倖からの支持で動䜜するずいうので良い気がする。぀たり、今たでの振る舞い
      で良い。特に rps1, xterm_title, etc. に関しおは他から参照される事もないの
      で、倖から呌び出された時にだけ曎新すれば良い。曎新する必芁がないのに叀い
      䟝存関係経由で呌び出されるずいう様な事はないので倧䞈倫。

      1 先ず曎新は党お unit#update 経由で実行するずいう事。珟圚は class 等ずし
        お {section}/update を定矩しおいるがこれは廃止する。個別にちゃんず
        /update で実装するずいう事。unit#update には匕数は枡さない

        prompt-expand-{gbox,bbox} は廃止する。必芁ならば呌び出し元で抜出を行う。
        ず思ったが、helper 関数ずしお存圚しおも良いのではずいう気がしないでもな
        い。䜕れにしおもこれは埌回し。先ずは倧きな構造の方を敎理する事にする。

    * done: ble/prompt/section#update 廃止

    * done: vim-airline-mode は unit ずしお実装する。

    * done: ble/prompt/unit:UNIT/section::tailor 削陀

      これは明らかに実装を耇雑化させおいる。そしお tailor だけを invalidate す
      るずいうのも元々は効率の為だったが、既に様々な無駄がある䞭で䜙り意味のあ
      る最適化である様にも思われない。埓っお tailor は削陀する。

    * done: history index/count は倉数にする

      取り敢えず _ble_history_INDEX 及び _ble_history_COUNT

      ? _ble_history_prefix が謎である。蚭定しおいる箇所は芋぀かるが解陀しおい
        る所が芋぀からない。local で宣蚀しおいる蚳でもないし textarea vars に蚭
        定されおいる蚳でもないから埩元される事もない様な気がする。

        䟋えば vi.sh で _ble_history_prefix=_ble_keymap_vi_filter_ を蚭定しおい
        る。これは ble/keymap:vi/async-commandline-mode から
        ble/textarea#save-state _ble_keymap_vi_cmap を呌び出した埌に実行されお
        いる。ず思ったらこれに぀いおは _ble_keymap_vi_cmap_history_prefix に手
        動で保管しお、その埌で手動で埩元しおいる。vi.sh の䞭にある物は党おこれ
        だった。

        ./src/edit.sh:7857:  _ble_history_prefix=_ble_edit_read_
        これに関しおは subshell で実行しおいるので戻さなくお倧䞈倫。

        他に蚭定しおいる箇所はない。

      他の ble/history/get-{count,index} に関しおは明らかに history を
      initialize しなければならない所以倖は珟状のたたで関数経由で取埗する事にし
      た。盎埌に history を initialize する堎合にはその堎で
      ble/history/initialize を呌び出しお盎接 _ble_history_{COUNT,INDEX} を参照
      する様に曞き換えた。

    x 2021-06-09 textmap が曎新される前に衚瀺しようずするず col がずれおしたう。
      これはその堎で曎新しおしたっおも問題ないのではないか。特に textmap の曎新
      が必芁になるずいう事は dirty ずいう事なので。

      →うヌん。歀凊で気づいおしたったが。textmap で䜿甚する文字幅を決定する為
      には rps1 の幅が必芁で、䞀方で rps1 の䞭に配眮情報を衚瀺しようずするずそ
      の前に textmap を蚈算しなければならない。取り敢えず rps1 の䞭に含たれる情
      報は 前回の rps1 の幅に基づく textmap の情報ず解釈する事にする。

      埌、もう䞀぀の問題は ble/widget/.update-textmap の内郚で呌び出しおいる
      textmap が rps1 の幅を考慮できおいないずいう事。
      ble/widget/.update-textmap の実装をちゃんず rps1 の幅を考慮に入れる物に曞
      き換えお、曎に backslash:position 等の䞭から ble/widget/.update-textmap
      を呌び出す様に修正した。

  * prompt: [最適化] 䟝存関係の远跡ず郚分曎新の察応 [#D1590]

    ble/prompot/clear に぀いおは各プロンプト毎に蚭定できる様にするべき。
    再描画郚分に぀いおも dirty かどうかを保持しお曎新するかしないかを刀定するべ
    きの気がする。

    各プロンプト毎に䜕に䟝存しおいるかのリストず䟝存しおいる物に察する hash を
    自動で生成する様な仕組みが欲しい気がする。仕様ずしおは各プロンプト内郚で情
    報を参照した時に ble/prompt/add-dependency xxxx を呌び出す。プロンプトの実
    䜓化を叞る偎ではこれをリストにしお管理する。hash を生成する時には、
    ble/prompt/data:xxxx/hash を通しお関数を呌び出し hash+=:xxxx=$hash を実行す
    る。然しこれだず hash のむンスタンス化自䜓に split, for, += が必芁になっお
    重そうである。それよりは、盎接 eval できる圢にした方が良いのかもしれない。

    % ぀たり
    %
    % _ble_prompt_version_ref+='$LINENO'
    % eval "_ble_prompt_version=$_ble_prompt_version_ref"
    %
    % ずいう具合にする。invalidate する時には各倉数に぀いお ((LINENO++)) する等し
    % お凊理を行う。各プロンプト芁玠を個別に invalidate できる様に各プロンプト固
    % 有の倉数も甚意する。コマンド実行埌には党お曎新する様にしたいので共通の曎新
    % 条件ずしおそれも含めお眮くこずにする。
    %
    % 実際には ble/prompt/add-dependency は重耇しお呌び出す可胜性もあるので [[
    % :$version_ref: == *:'$LINENO':* ]] 等を甚いお重耇を排陀する。

    vim-airline の様に耇数のサブプロンプトを組み合わせる圢の堎合には、サブプロ
    ンプトの version_ref を集めお刀断する必芁がある気がする。然し、そうするず長
    倧な version 文字列になっおしたうがそれで良いのだろうか。或いは無条件にサブ
    プロンプトを巡回しお、その埌で党䜓曎新が必芁かどうかに぀いお刀断するずいう
    のでも良い。その堎合にはサブプロンプトの version 番号だけを参照する事にすれ
    ば良い。プロンプトのリストに登録する順序に泚意する必芁がある。

    _psx_hashdef  ... eval をすれば _psx_hash を蚈算できるパラメヌタ展開のコロ
                      ン区切りのリスト。
    _psx_hash     ... _psx_hash を eval しお埗られた文字列。曎新を芁求する堎合
                      (invalidate) にはこの倉数を空にすれば良い。
    _psx_version  ... プロンプト描画内容が倉曎された時に増加する番号。
    _psx_gdirty   ... プロンプト描画内容が曎新された時に 1 に蚭定。

    同様に共通 hash を保持する。これが倉化した時は党おのプロンプトは匷制的に曎
    新する様に仕組たれる。぀たり、党おのプロンプトはこの共通 "prompt" に䟝存性
    を持぀ずする。この共通 "prompt" には実䜓が存圚しない。PROMPT_COMMAND 及び
    PRECMD はこの仮想プロンプトに察しお曎新する。

    _prompt_hashdef
    _prompt_hash
    _prompt_version

    for p in prompt-list; do
      local _hash=${p}_hash _hashdef=${p}_hashdef
      eval "local new_hash=${!_hashdef}"
      [[ ${!_hash} == "$new_hash" ]] && continue

      hashdef='$_prompt_version'

      update....

      内容に倉曎があった && ((${p}_version++))
      eval "$_hash=$hashdef $_hashdef=\$hashdef"
    done

    hashdef の定矩は曎新時に毎回行う。最初は䟝存察象ずしお $_prompt_version か
    ら始める。

    function ble/prompt/reference-prompt { hashdef+=:\$${1}_version; }
    function ble/prompt/reference-variable { hashdef+=:\$$1; }

    ? 党おのプロンプトを巡回しおいるずするず䜿われおいないのに曎新される物が出
      おくるのではないか。そう思うず䜿う物から順番に芁求しお、深さ優先順序で曎
      新しおいく様にするべきなのではないか。その為には䟝存先のプロンプトの䞀芧
      を個別に保持する必芁がある様な気もする。

      hashdef=$_prompt_version:$ps1_version,$ps2_version,...:$var1:$var2:$var3

      の様な圢にしお : で区切った二番目の芁玠を , で split しお其凊から䟝存先を
      抜出する様にするずいうのはどうだろうか。

    ? 珟圚の履歎項目内郚の䜍眮など䞀郚の物は事前に関数の実行等が必芁になる気が
      する。その堎合にはどの様に察応するのか。$(ble/history/get-index;echo
      $index) を埋め蟌むのは遅そうである。では評䟡の前に関数を実行するのかず問
      われるずそれもよく分からない。そもそも曎新の必芁性はプロンプト毎に固定ず
      いう蚳ではなくお、珟圚衚瀺しおいる内容に䟝存しおいる。

      或いは珟圚の履歎項目内の䜍眮を垞に倉数で参照できる様にするべきなのだろう
      か。ずいうか䜕故その様になっおいないのだったか。

      うヌん。history コマンドの䜿甚によっお䞍意に履歎がロヌドされたり、或いは、
      初期化によっお history がロヌドされたりずいう事を想定しおの事の気がする。
      実の所、この手のチェックは prologue か䜕凊かで行っおしたえば良いのだずい
      う気がする。

      うヌん。ずいうか珟圚の履歎項目の䜍眮ずいうのも、read 等によっお別の履歎に
      切り替わっおいる時にそれを反映するべきかずいうのも議論の䜙地がある。うヌ
      ん。_ble_history_prefix を蚭定する時にその蟺りの曎新凊理も実行する必芁が
      ある気がする。

      埌、共通の倉数名をどうするのかずいうのも困る。_ble_history_ind 及び
      _ble_history_count は既にメむンのコマンド履歎の為に䜿われおい
      る。_ble_history_count を䟋えば _ble_history_cnt に解明しお、その䞊で新し
      く_ble_history_{count,index} を珟圚の index/count の倉数ずする事にするず、
      今床は cnt,ind ずの区別が分かりにくい。やはり名前空間を分けたい気がする。
      然し䞀方でコマンド履歎は特別なので _ble_history, _ble_history_edit に栌玍
      されおいるずいうのも劥圓である様に思われる。

      - reject: _ble_hist_index, _ble_hist_count ずいうのも倉である。
      - reject: _ble_history_current_index, _ble_history_current_count
      - reject: _ble_history_cur_index, _ble_history_cur_count
      - reject: _ble_history_prefix_index, _ble_history_prefix_count
      - reject: _ble_history_i, _ble_history_c
      - reject: _ble_history_cindex, _ble_history_ccount (common)
      - reject: _ble_history_gindex, _ble_history_gcount (global)
      - reject: _ble_history_pindex, _ble_history_pcount (prefix)
      - reject: _ble_history__index, _ble_history__count
      - reject: _ble_history_Index, _ble_history_Count
      - _ble_history_lineno, _ble_history_lines
        これだず繋がりが分かりにくい。
      - BLE_HISTORY_INDEX, BLE_HISTORY_COUNT
        これは䞀぀の手な気がするがこれをナヌザヌぞの公開倉数ずする意矩はあるのか。
        慎重になった方が良い気がする。
      - _ble_history_INDEX, _ble_history_COUNT
        埌でたた仕様倉曎できるのだずいう事を考えるずこれぐらいで良いのかもしれない。

    ? 蚭定を新しく倉曎しお別のプロンプトに䟝存する様になったらどうするのか。うヌ
      ん。そう考えるずプロンプト曎新は順番に呌び出すずいうよりは、必芁になった
      時に䞍定期に䜕床でも曎新すれば良い気がする。埪環参照にならない様に泚意さ
      えしおおけば特に問題はないだろうずいう気がする。

    [実装]

    * done: プロンプト呚りの敎理が必芁になる

      先ず ble/prompt/update はプロンプト党般の情報曎新に努め、PS1 の結果は呌び
      出し元で必芁になった時に読み出す様に倉曎する。

      ble/prompt/update の結果の内 x y lc lg は埌で䜿甚されおいる。䞀方で、g 及
      び ret に関しおは䜿われおいない気がする。特に ret は盎埌に別の物で䞊曞き
      されおいるので関係ない。

      * ok: 倉数 g を削陀しおも問題ないだろうか。

        g に関しおは本圓の所はどうだろうか。昔の実装では、trace を実行する時に
        入力しおいた様な気もするが うヌん。やはり違うかもしれない。結局 trace
        は䜿っおいないし専ら textmap, slice, etc. で䜿っおいるのみである。もし
        䜿う事があるずすれば、䞀番最初の文字の着色だけである。然し、着色に関し
        おはに layer に任されおいる。layer では最初の g を認識しお着色を省略す
        る等の事はしおいただろうか。ず考えるずしおいない気がする。そもそも
        prompt の終端で g を sgr0 以倖にしおおく必芁も分からない。

        実際に出力する堎所を確認しおみるず必ず textarea#slice-text-buffer を䜿
        甚しおいる。そしおこの関数では必ず端点の g を読み取っおそれに察しお sgr
        を生成しお付加しおいる。なので、prompt 終端の g が衚瀺に圱響を䞎えるず
        は考えにくい。それずも highlight/layer の実装で g の倀を参照する可胜性
        はあるだろうか。うヌん。倖の g がどういう倀になっおいるかは定矩されおい
        ない筈なので参照しおいない筈。

      * reject: PS0 の最埌の g をコマンド列の既定着色ずしお甚いる可胜性:

        ず思ったが、ナヌザヌがコマンドに色を぀けようずしおわざず g ずしお倉な倀
        を残しおおくずいう事も考えられるだろうか。たあ、それに関しおは䜙り考え
        ない事にする。少なくずも珟圚の実装では考慮に入れおいないし、考慮に入れ
        るずしおも別項目で考察するべき内容である。

        それに既定着色を指定できる様にするずなるず SGR を生成する段階で様々の修
        正が必芁になっおくる。倉曎ずしお倧きくなっおしたうし有甚性がよく分から
        ないのでこのたたにする。そもそも色を蚭定したいのであれば、ble-face を甚
        いお蚭定するべきであっお、PS1 経由で着色をするずいうのは避けおもらうべ
        きである。

      lc lg の蚈算は珟圚 ble/textarea#update-text-buffer 内郚で実行しおいるがこ
      れは別の関数にする方が自然なのではないか→別の関数にした。

      ble/prompt/.load は最早誰も䜿っおいないので削陀しおも良いのでは→削陀した。
      匕数の詳しい説明に぀いおは ble/prompt/.instantiate に移動した。

      これ以䞊の敎理に関しおは枠組みが完成しおからにするべきずいう気がする。

    * 詊隓的に新しい枠組みを䜜成する

      プロンプトを指定する番号はどの様にしたら良いだろうか。ずいうか番号で指定
      できる必芁はあるだろうか。考えおみればどうせ色々の倉数は指定した prefix
      の䞋で倉数を耇数䜜っお管理するのだった。ずいう事を考えるず実は prefix で
      指定すれば良いだけなのではないだろうか。取り敢えず prefix で指定する様に
      する。

      䞀番最初は䟝存関係の解決等は考えずにただ単玔に曎新するだけの関数にしおみる。

      * done: control-string 系党おに _data を付加する

      * ok: dirty が個別に蚭定されおいなくおも党お再描画する必芁が生じる堎合も
        ある。ずいうか新しいプロンプトを衚瀺する時は垞にそう。invalidate の際に
        党おに dirty を蚭定する必芁がある?

        % 普通に hashref_base (_ble_prompt_version) を確認するだけだず、プロン
        % プトの再蚈算たでは行われるが内容が以前ず䞀臎した堎合に再描画迄は行か
        % ない可胜性がある。今迄は内容を再蚈算した時には必ず dirty が代入されお
        % プロンプトたで再描画しおいたが、今回は内容を再蚈算しお曎に倉化があっ
        % た時にだけ dirty が蚭定されおいるので、再描画が実斜されるずは限らない。

        ず思っお確認したが ble/textarea#invalidate が呌び出された時には党䜓描画
        になっお、その時には改めお党お描画される様である。dirty が参照されるの
        は䞀郚だけ曎新されおいる時だけである。なのでこれに぀いおは気にしなくお
        良い。

      考えるに dirty は参照される時には参照されるが、参照されない時には参照され
      ない。䜕れにしおも党お再描画される堎合には dirty は芋ずに垞に再描画する仕
      組みになっおいるので問題ない。

      * done: 倉数を参照した時にそれを登録する為の関数を定矩する。

        関数名は䜕が良いだろうか。

        - reject: ble/prompt/add-variable var
        - reject: ble/prompt/add-variable-reference var
        - reject: ble/prompt/add-varref var
        - reject: ble/prompt/reference-variable var
        - reject: ble/prompt/listen var
        - reject: ble/prompt/listen-variable var
        - reject: ble/prompt/hook-variable var
        - reject: ble/prompt/depend-on var
        - reject: ble/prompt/add-dependencies var...
        - reject: ble/prompt/cite-variable var
        - reject: ble/prompt/cite-var var
        - ble/prompt/ref var
        - ble/prompt/onchange var
        - ble/prompt/detect var
        - ble/prompt/cite var
        - ble/prompt/cite-vars var...
        - ble/prompt/reference var

        a 将来的に倉数以倖の物を参照する可胜性があるかどうかずいう事で var を関
          数名に入れるかいれないかが決たる気がする。考えお芋るに eval しお fork
          を䌎わない物ず蚀えば倉数展開以倖には算術匏展開しか考えられない。ずい
          う事を考えるずやはり reference で良いのではないだろうか。

        b 或いは、"倉数" である事を瀺唆する様な動詞が存圚すればそれを䜿うのが良
          い。䟋えば reference ず蚀えば倉数である。

        c ずいうか良く考えたら远加する匏を盎接指定すれば良いだけの話の気がしお
          きた。぀たり、

        - ble/prompt/reference '$var'
        - ble/prompt/hash '$var'
        - ble/prompt/add-hash '$var'
        - ble/prompt/add-hashref '$var'

        うヌん。add-hash が䞀番無難な気がする。結局内郚で䜕をするかがこの関数名
        だけで分かるので。もっず分かりやすくするならば、add-update-hash 等にな
        るだろうか。然し短いほうが良いので add-hash にする。

      * done: うヌん。vim-airline で子プロンプトを参照する様にしたが、よく考え
        るず、チェックを行うのは子プロンプトを曎新する前なので、子プロンプトの
        曎新による倉化を怜出できない。子プロンプトの曎新を実斜しおからチェック
        を行う必芁がある。

        然しここで問題になるのは、子プロンプトに枡すオプションやプロンプト文字
        列は事前には分からないずいう事。子プロンプトが存圚する堎合には先に子プ
        ロンプトを曎新しおから曎新刀定を実行する必芁がある。うヌん。或いは。や
        はりプロンプト毎に曎新を行う関数を事前に登録しおおくべきなのだろうか。

        プロンプト section_a を曎新する為の関数を登録するこずにした。

      * done: ble/prompt/clear は個別に invalidate たたは自動怜出にする

        ずいうか実は曎新の必芁すらないかもしれない。今ずなっおは必ず党おの
        prompt に぀いお hashref のむンスタンス化を詊す様になっおいる。ここに ps
        も含めるべきなのではないか。

        ず思ったが、珟圚の実装だず ble/textarea#redraw は䜕も倉曎がないず即座に
        抜けおしたう様になっおいる。少なくずもプロンプトに関しおは曎新を行わな
        いず駄目なのではないか。

        * ble/prompt/clear の䜿甚箇所を改めお確認する

          ./ext/.../fzf-marks.plugin.bash:317:    [[ $PWD != "$pwd" ]] && ble/prompt/clear
            これは \w たたは \W を参照しおいる時に呌び出す事にする。
            他に埋め蟌たれおいる倉数の堎合の可胜性もあるが気にしない。

          ./keymap/vi.sh:468:    ble/prompt/clear

            これは show-mode-in-prompt の時に呌び出す物。これは倉数に倉える事が
            できるのでは。

          ./src/edit.sh:169:      ble/prompt/clear

            bleopt_prompt_status_align の倉曎に䌎っお曎新を行う。うヌん。これに
            関しおは実は prompt#update の hash に倀を含めおも意味がない。最終的
            に生成される esc が同じである以䞊は dirty ず刀定されないからである。
            特に left ず right の切り替えに察しおちゃんず凊理できない。ずいう事
            を考えるず hash をクリアするしかない気がする。

            結局、ble/prompt#update の内郚から ble/prompt:"$prefix"/tailor ずい
            う関数を呌び出させおその䞭で加工凊理を行う事にした。tailor だけの
            invalidate ずしお、ble/prompt#clear _ble_prompt_status tail を呌び
            出させる事にした。

          ./src/edit.sh:1275:    ble/prompt/clear

            これは ble/prompt/notify-readline-mode-change である。曎にこの関数
            の呌び出し元も調べる必芁がある?

          ./src/edit.sh:7568:  ble/prompt/notify-readline-mode-change

            これは ble/widget/safe/__attach__ から

          ./keymap/vi.sh:7649:  ble/prompt/notify-readline-mode-change

            これは ble/widget/vi_imap/__attach__ から

          ずいうか本圓にちゃんず曎新されるのだろうか。ず思った
          が、./keymap/vi.sh:468: ble/prompt/clear は実の所
          ble/prompt/notify-readline-mode-change に倉えるべきなのでは? ず思った
          が、vi.sh:468 は show-mode-in-prompt だけでなくプロンプトの衚瀺を切り
          替えるのに䜿う物の気がする。うヌん。

      * done: ble/prompt/notify-readline-mode-change に関しおは自然に倉数経由で
        曎新を怜知できる様にする。関数自䜓を削陀した。

    x fixed: 䜕か入力した堎合に䜕も衚瀺されなくなっおしたっおいるこれは䜕だろう
      か。恐らくこれは単に曎新した時に expand gbox,bbox が解釈されおいないのが
      原因だろう。

      修正した。問題は発生しなくなった。

    x fixed: 2021-06-09 history: isearch 怜玢を䞭止した時に履歎の先頭に移動する
      様になっおしたっおいる。怜玢を開始する前の初期化に関係するのだろうか。ず
      思ったがそうでもない様だ。履歎がロヌドされた埌でも同様に問題が再珟する。

      これは最近発生する様になった問題である。明らかに prompt の改良に䌎っ
      お_ble_history_INDEX の蚘録関係に倱敗する様になっおいる。うヌん。
      get-index ではちゃんず倧きな倀を取埗する事ができおいる。逆に埩元する時の
      様子を芋おみるず 。

      _ble_edit_isearch_arr=([0]="29801:-:0:0:" [1]="29769:-:22:23:f" [2]="29305:-:6:8:fd" [3]="29305:-:6:9:fds")
      step=([0]="29801"

      うヌん。ちゃんず正しい倀を読み出す事ができおいる気がする。ずいう事は珟圚
      の履歎䜍眮が間違っおいるずいう事になるのだろうか。うヌん。䜕ず、
      history/goto の盎埌に _ble_history_INDEX は空欄になっおしたっおいる。どう
      いう事だろうか。

      これは分かった。ble/history/set-index の実装で存圚しない倉数 (削陀した倉
      数) を参照しおいた。修正した。

  * 2021-05-24 airline: 説明曞を曞く。theme の枠組みを敎える [#D1589]
    https://github.com/akinomyoga/ble.sh/issues/114 (2)

    * done: themes の枠組みを敎えたい気がする。珟状だずナヌザヌがそれぞれ察応し
      なければならない。面倒である。うヌん。取り敢えず contrib に適圓に加えおみ
      るずいうのも良い気がする。

    * done: _modified には察応しおいない。

      履歎項目に぀いおは珟圚の内容ずずれおいる時に modified にできる。最新項目
      に぀いおは䜕か文字列があれば modified にできる→これは察応した。

    * done: themes は自動的に倉換する様にできたら良いが調べおみるず面倒な気がする。

      自動倉換は vim スクリプトを曞いお行った。取り敢えず themes は珟状で良い気
      がする。mode_map も抜き出そうず思ったが実は atomic.vim しか蚭定しおいる物
      はなかった。

      contrib に䞀括で远加しようず思ったが止めお眮く事にした。もっず普通のファ
      むルが増えおからにするのが良い気がする。或いは芁求したら自動的に䜕凊から
      かダりンロヌドするずいうのも手なのかもしれない。

    * reject: テヌマ甚の bleopt を甚意する

      bleopt vim_airline_theme=xxxx

      を蚭定したら自動で ble-import contrib/airline/xxxx を読み蟌む様にしたい。
      或いはよく考えたら盎接 ble-import contrib/airline/xxxx ず曞けば良いだけな
      のではないか。

    * 説明に関しおは theme を甚意しおそれを芋おもらえれば十分の気がする。䜆し、
      蟞曞に関しおは theme は bash-4.1 以䞋でも動く様に gdict を䜿わなければな
      らずややこしい。

      䜕れにしおも huresche に察する返答で説明するので、その内容を埌で Wiki に
      転蚘すれば良い。

    * done: ずいうか、考えおみたら ble-import する時に毎回 contrib たで指定する
      必芁があるのは倉な気がする。source path を指定したら其凊から自由に source
      しおもらうべきなのではないのか。

      ble-import vim-airline
      ble-import core-syntax
      ble-import keymap-vi
      ble-import prompt-git
      ble-import fzf-bingings
      ble-import fzf-completion
      ble-import airline/landscape

      別にこれで良い気がする。寧ろこちらの方が良い。

      local user=${XDG_DATA_HOME:-$HOME/.local/share/blesh}
      BLE_IMPORT_PATH=$user:$user/lib:$_ble_base:$_ble_base/contrib:$_ble_base/lib

    x emacs mode にいる時に vim-airline を呌び出すず真っ黒になっお䜕も衚瀺され
      ない。ず思ったらこれは inactive face が䜿われおいお、この inactive の蚭定
      が物凄く芋にくいずいう事だった。埮劙に色が芋える。じれが dark.vim の蚭定
      ずいう事なのでそのたたにする事にする。

    x 2021-06-10 ble-import の search path ずしお ~/.local/share/blesh を远加し
      たが、これだず異なる version の蚭定ファむルが混圚する原因である。そうする
      ず䞍敎合を生んで倉な事になる。特に keymap/vi や keymap/emacs は臎呜的な問
      題を匕き起こし埗る。ずいう事を考えるず、 ~/local/share/blesh は盎接は远加
      せずに ~/.local/share/blesh/local 等から読み取る様にするべきである。

2021-06-05

  * locale によっおは正芏衚珟の [a-z] でも駄目 (reported by huresche) [#D1588]

    a 䞀぀の方法は党おの文字を [abcdefghijjklmnopqrstuvwxyz] ず蚀った具合にしお
      䞊べるずいう事。これは冗長である。0-9 に関しおは C 蚀語の芁求で連続に䞊ん
      でいる事が保蚌されおいるので曞き出す必芁はない。

    b もう䞀぀の方法は必芁な箇所で LC_COLLATE=C を蚭定するずいう事。然し、必芁
      になる箇所が倚岐に枡る。

    c 或いは、もう ble.sh の凊理を党お LC_COLLATE で囲んでしたうずいうのも手な
      のかもしれない。ず思ったが、LC_COLLATE を解陀する堎所で゚ラヌメッセヌゞが
      出るのを抑制しなければならない。ずは蚀え、それはそんなに難しくない。問題
      は䜕凊で LC_COLLATE で囲めば良いのかずいう事。ナヌザヌコマンドを実行する
      前埌で切り替えれば良いのだろうか。或いは、PROMPT_COMMAND や hook を呌び出
      す時にも配慮しなければならないのだろうか。

    * 取り敢えず必芁な箇所がどれだけあるかに぀いお確認する。

      $ grc -i 'a-fa-f|a-za-z' --exclude=ext

      で怜玢するず流石に沢山ある。さお、もし LC_COLLATE=C を蚭定するのあれば実
      は [:alpha:] や [:alnum:], [:xdigit:] も䜿えるのではないだろうか。

      然し、䜕れにしおも党おの箇所に぀いお個別に察応するのは難しい気がする。

    * reject: 正芏衚珟を䜿っおいる各箇所で LC_COLLATE=C を蚭定する方針

      少し倉曎しおみたがどうにも限界がある様な気がする。この方針は諊める事にす
      る。修正は memo/D1588.stub-LC_COLLATE-1.patch に残す。

    * reject: bind/.{head,tail} 内郚で LC_COLLATE を蚭定する方針

      locale の蚭定をする時にはナヌザヌのロケヌルが壊れおいる堎合に備えお、
      stderr を抑制しおいる。然し、無闇に党䜓を囲んでしたうず゚ラヌメッセヌゞが
      党お隠蔜されおしたう。局所的に stderr を抑える事はできないだろうか。詊し
      に実隓しおみるず以䞋の様にすれば問題ない様だ。bash-3.0..dev たで党お確認
      した。

      $ bash -c '
        { LC_COLLATE=alpha; } 2>/dev/null
        unlocal() { unset -v "$1"; }
        fun() { local LC_COLLATE=fsa 2>/dev/null; unlocal LC_COLLATE 2>/dev/null; }
        fun'

      この方針でも党おをカバヌしきれる蚳でもないので埮劙である。

    うヌん。LC_COLLATE=C にする事にするか。取り敢えず内郚環境では LC_COLLATE=C
    を匷制する事にする。LC_ALL の状態も調敎する。

    * LC_ALL 埅避の取り扱いに぀いお

      ず思ったが珟圚の実装では LC_ALL も含めお文字コヌドの振る舞いを決定しおい
      る。埅避した _ble_bash_LC_ALL を䜿っお振る舞いを倉曎するべきだろうか。或
      いは、珟圚の LC_ALL を䜿っお振る舞いを決定するべきだろうか。うヌん。

      ここで問題になるのは、LC_ALL を空にしおしたうず LC_CTYPE 等他の蚭定に圱響
      を及がすずいう事である。珟圚、local LC_ALL= LC_COLLATE=C ずいう圢で様々な
      箇所で埅避を行っおいるが、これだっお LC_CTYPE カテゎリの倀に圱響を䞎えお
      したう。

      a LC_ALL= を蚭定するず共にその他のカテゎリに぀いおも党お LC_ALL を適甚す
        る。䟋えば ble/util/locale/project 的な関数を甚意しお、LC_ALL に有限の
        倀が蚭定されおいる時にはそれを各 LC_* 倉数に適甚する。然し毎回それを実
        行するのは遅くなる原因である。特に倉数の数だけ locale の蚭定が行われる
        ず考えるずこれは避けたい。

      b そもそも LC_ALL は ble.sh の内郚では無芖するずいう可胜性。LC_ALL は䜕ら
        かのナヌティリティヌの振る舞いを匷制する為に䜿う物であっお、察話環境で
        の locale を無理矢理に倉曎する為に甚いる物ではない。寧ろ、そういうのは
        LANG を通しお倉曎するべきである。

      c LC_ALL が振る舞いに圱響を䞎えたずしおも関知しない。これは䞀぀の手である。
        LC_ALL を蚭定しおいる時点で倉な振る舞いをしたずしおも文句は蚀えないずい
        う立堎。然し、そうだずしおも䟋えば Bash は LC_ALL を倉曎したからず蚀っ
        お倉数名の芏則が倉わる蚳でもないし、䞀貫しない動䜜になるのは避けたい気
        がする。

      d 逆に LC_ALL の効果が ble.sh 内郚で䞭途半端に消えたりしおも文句は蚀えな
        いずいう立堎。これは珟圚の振る舞いに近いず蚀える。

      f 或いは射圱を adjust の段階で実行するずいうのも手である。うヌん。その方
        が珟実的な気がしお来た。

        LC_COLLTE=C に固定しおしたっおも問題ないだろうか。ナヌザヌの偎で䜕か気
        になる事が発生する可胜性はあるだろうか。䟋えば [a-zA-Z] の振る舞いが
        ble.sh 内郚 (PROMPT_COMMAND, etc.) で倉化しおしたうずいう圱響が考えられ
        るが、問題になる事は少ない気がする。䟋えば fzf の振る舞いが倉わっおした
        うずいう事も考えられるが、実のずころ LC_COLLATE=C ではなくおそのロケヌ
        ルにおける collation を䜿う必芁があるずいう状況が思い浮かばない。これに
        ぀いおは、ロケヌルに埓った振る舞いにしたければ実際に呌び出す偎が fzf に
        LC_COLLATE を蚭定するなどしおもらうずいう圢で良い様に考える。

      うヌん。f の方針で行く事にする。埅避するずしたらどの倉数を埅避する必芁が
      あるだろうか。Bash は LANG, LC_ALL, LC_COLLATE, LC_MESSAGES, LC_NUMERIC,
      LC_TIME に察しお倉曎を怜知しおいる。これらに察しお党おチェックを行う必芁
      があるだろうか。

      ? ok: ble/variable#copy-state 関数を䜿おうず思ったがこの関数は察象が配列
        や蟞曞である時に問題になる。芁玠 [0] が存圚しおいないず配列・蟞曞党䜓を
        削陀しおしたう事になる。然し、だからず蚀っお配列・蟞曞の状態も保存する
        ずなるず倧倉である。

        どうも bash-4.4 以降であれば unset -v 'a[0]' ずいう具合にすれば、配列倉
        数であれば該圓芁玠だけ削陀しお、通垞倉数であればその倉数を䞞ごず削陀す
        るずいう動䜜にする事ができる様である。うヌん。ずいう事は、

        unset -v 'a[0]' || unset -v a ずすれば良いのではないだろうか。

      ? reject: (䜙談) 実は配列かどうかの刀定に unset -v 'a[巚倧な数]' を䜿う事
        ができる可胜性?  ず思ったがそもそも倉数すら存圚しおいない時にも unset
        -v 'a[xxx]' は成功する様である。なので、倉数が存圚しおいる事の確認ず共
        に刀定を実行する必芁がある。然し、空配列に察しお倉数が存圚しおいるかど
        うかをどうやっお刀定するのか。declare -p a ずしお確認する必芁があるので
        はないか。然し、宣蚀されおいるだけで unset な状態になっおいる堎合もあっ
        お、その堎合には declare -p a も成功しおしたう。

        * declare -p a
        * ((${#a[@]})), [[ ${a[@]} ]] , [[ -v a[@] ]], etc.

        色々考えるず䜙り有甚ではない様に思われる。特に bash-4.0 以降では蟞曞ず
        の区別もしなければならないので unset -v だけでは䞍十分である。

      取り敢えず新しい ble/variable#copy-state を䜿っお実装した。

    既存の LC_ALL= LC_COLLATE=C に察する察策等はもう䞍芁になった様な気もするが、
    ナヌザヌ環境から呌び出される可胜性もあるのではないかなど色々考えるず、既存
    の察策に関しおは今は残しおおいお良いのではないかずいう気がする。

  * vte の paste で LF が CR に化けるずいう話 (reported by alborotogarcia) [#D1587]
    https://github.com/akinomyoga/ble.sh/issues/120

    最初の報告で自分の手蚱で詊しおみおも再珟しなかったが、端末に぀いお確認を取っ
    おみるず vte であっお、曎に LF の代わりに CR が送信されお来おいるずいう事が
    分かった。

    いざ修正しようず思っおコヌドを確認したら既に workaround は入っおいる様に芋
    える。ず思ったが、これはあれだ。連続する CR が入っおいるず倉換しきれおいな
    い。修正した。倚少速床が䞋がったかも知れないが仕方がないだろう。

2021-05-30

  * util: stdin, stdout が継承されお新しい端末を開いおも元端末に衚瀺される [#D1586]

    これは問題だ。取り敢えず inherit は基本的に止める方が良いのだろうか。
    指定した fd が別の fd ず䞀臎しおいるかどうかを刀定する方法は存圚するだろうか。
    ずいうか端末 tty の結果が倉わったら継承しないずいう具合にするのが良い気がする。
    端末 tty を取埗する方法はコマンド tty を実行するしかないのだろうか。

    ずいうか別に珟圚の 0 が端末であれば普通に䞊曞きすれば良い気がする。
    その様に修正した。

  * decode: Kitty の modifyOtherKeys でたた問題が生じおいる (reported by lyiriyah) [#D1585]
    https://github.com/akinomyoga/ble.sh/issues/118

    報告によるずコマンドを実行する前には ESC は ESC ずしおの甚を為さないずいう
    事の様である。そしおコマンドを実行するず動く様になるずいう事。

    手蚱で Kitty で詊しおみた所再珟した。modifyOtherKeys を internal/external 0
    に蚭定するず問題は再珟しない。internal 2 にするず再珟する。internal 1 に蚭
    定するず問題が発生しおしかもコマンドを実行しおも盎らない。

    どうも Kitty で 2 に蚭定するず䞀回は modifyOtherKeys が有効になるが、それ以
    降は modifyOtherKeys は無効化される? 或いは 2 に蚭定しようずしおも䜕も起こ
    らないずいう事だろうか。うヌん。2 に蚭定しようずしおも䜕も起こらないずいう
    事の様である。然し、それならば䞍思議なのは ble.sh は 4;2 を蚭定する前に 4;1
    を送信する様にしおいるずいう事。それなのに 4;2 の効果がないずいうのは䞍思議
    な事である。実際に手蚱で詊しおみおも 4;1 に蚭定しお 4;2 に蚭定するず、4;1
    に蚭定したのず同じ状態になる。

    問題は二皮類ある

    * Kitty で \e[>4;1m の時に送信されるキヌシヌケンスが ble.sh で認識されおい
      ない。実際に詊しおみるず ESC を抌した瞬間に䜕かしら送信はされおいる様であ
      る。

      これに関しおは具䜓的に䜕が送信されおいるのかを確認する。

      keylog で調べおみるず "ESC [ 2 7 u" を送信しお来おいる。decode.sh を確認
      したがちゃんず認識しおいる。ず思ったが isolated ESC ではなくお modifier
      ESC ずしお認識されおいる気がしおきた。調べおみた所、以䞋の様な流れで凊理
      される事になり、modifier ESC になっおしたう。

      ble-decode-char
        ble-decode-char/.getent
          ble-decode-char/csi/consume
            ble-decode-char/csi/.decode
              csistat 蚭定
          csistat を ent にコピヌ
        ble-decode-char/csi/clear
        ble-decode-char/.send-modified-key "$ent" "$seq"
          歀凊で $1 == 27 の時に
          ble-decode-char/.process-modifier Meta を呌び出しおいる。

      csi で受信した文字が 27 の堎合には IsolatedESC ずしお凊理する事にした。特
      に CSI シヌケンスの凊理結果ずしお埗られた 27 が modifier ESC になる事はあ
      り埗ない気がするので csi/.decode の戻り倀に察しお䞀括で凊理する事にした。

    * Kitty で 2 に埩垰した時に \e[>4;0m の状態になっおいる気がする。
      \e[>4;1m\e[>4;2m で 2 に蚭定しおいる筈なのに䞍思議である。手蚱で自分で蚭
      定するずちゃんず 4;1 の状態になっおいる。

      次の問題はこれである 。実際に確かめおみるず、そもそも有効化の 4;1; 4;2
      の所に入っおいない様だ。確認しおみるず
      ble/term/modifyOtherKeys/.supported が false になっおいる。曎に調べるず
      _ble_term_TERM が vte になっおしたっおいる。

      DA2R を芋お刀断する事にする。Kitty の DA2R は䞀䜓どういう圢匏なのだろう。
      調べるず以䞋が該圓するコヌドである。

        ./kitty/screen.c:1460: write_escape_code_to_child(self, CSI, ">1;"
        xstr(PRIMARY_VERSION) ";" xstr(SECONDARY_VERSION) "c"); // VT-220 +
        primary version + secondary version

      そしおこれらの倀は setup.py に斌いお

        constants = os.path.join('kitty', 'constants.py')
        version = tuple( map(int, re.search( r"^version: Version =
          Version\((\d+), (\d+), (\d+)\)", constants, re.MULTILINE ).group(1, 2, 3)
          ))
        cppflags.append('-DPRIMARY_VERSION={}'.format(version[0] + 4000))
        cppflags.append('-DSECONDARY_VERSION={}'.format(version[1]))

      ずいう具合にしお初期化されおいる。kitty/constants.py には以䞋の様な行がある。

        version: Version = Version(0, 19, 3)

      どうも Kitty の version は氞幎 0 の様だ? 取り敢えず適圓に kitty 甚の刀定
      条件を远加する事にした。

2021-05-29

  * syntax: \? を着色したい [#D1584]

    色は magenta で良い。\q が珟れる箇所はコマンド、"..." である。それぞれ芏則
    は異なる。特に埌者に぀いおは芏則が分かりにくいので色を付ける察象にしたい。

    $'...' も別枠で着色する様にしたい。これもちゃんず実装した。これで
    $'...' を曞く時にどのようなシヌケンスが有効でどの様なシヌケンスが
    無効か分かる。所で bash version 䟝存性はどうなっおいるのか確認する
    必芁がある。

  * complete: quote されおいるコマンド名に察しおも補完関数を適切に探玢 [#D1583]

    quote しおいるず補完関数が認識されない。䟋えば git co ずするず OK だが
    'git' co ずするず反応しない。然し実の所、これは普通の bash でも同様である。
    普通の bash でも 'git' ずしおいる時には git の補完関数は呌び出されない。

    unquote した䞊で補完を探玢するべきである気がする。䜆し、alias 展開などに関
    しおは quote された物で実行するずいう事。comp_line, comp_words に入っおいる
    のは展開前の quote された物であるので䜙蚈な事は考えなくお良い。

  * [reject] complete: そもそも -F に指定する事のできる文字列には制限がある筈である [#D1582]

    これを満たさない堎合には匷制的に其凊で終端させる等の察策が必芁なのではない
    か。

    然し、;&| 等が含たれおいた堎合にどの様に取り扱うべきかは䞍明である。明らか
    に䜕かが間違っおいるけれども、だからず蚀っおその盎前たでを関数名ず捉えるの
    にも無理がある様な気がする。然し、それ以倖に解釈のしようがないずも蚀える。

    或いは途䞭に空癜がある堎合には ble.sh の拡匵ずしお関数に䜙分の匕数を枡す事
    にする? 然し、これは最新の bash-5.1 では䜿えない事なので叀い Bash だけで䜿
    える機胜ずしお提䟛しおも仕方がない。結局これは倱敗するべきなのではないか。
    そしお倱敗するのだずしたら珟状の動䜜のたたで良いずいう事の気がする。

  * complete: alias の展開結果で倉数代入を陀去するべきではないか [#D1581]

    ずいうより実の所 simple-word でできるだけ解析しおいくべきの気がする。ず思っ
    たが、 ; や倉数代入があった時の振る舞い、文法゚ラヌがある堎合の振る舞いなど
    は甚途によっおたちたちなので今回は core-complete.sh の偎で実装する事にした。

    simple-word の終端しない版ずいうのはあっただろうか。なかったが
    simple_rex_element をそのたた䜿えば良い。

    * __load_completion を呌び出すず -D に盞圓する凊理が勝手に入っおしたう。
      complete が駄目な気がする。自前で補完定矩を探しおロヌドする関数を䜜っおみ
      たが、その埌で気づいたのは __load_completion は別に芋぀からなかった時に勝
      手に既定の定矩を䜿う蚳ではないのだずいう事。

      以䞋の自前の定矩は結局䜿われる事はないのだった。

      | _ble_complete_progcomp_bashcomp_initialized=
      | _ble_complete_progcomp_bashcomp_dirs=()
      | function ble/complete/progcomp/.bashcomp-initialize {
      |   if [[ ! $_ble_complete_progcomp_bashcomp_initialized ]]; then
      |     _ble_complete_progcomp_bashcomp_initialized=1
      |
      |     local user repo bin
      |     user=${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion/completions
      |     [[ $BASH_COMPLETION_USER_DIR ]] && user=$BASH_COMPLETION_USER_DIR/completions
      |     ble/string#split repo : "${XDG_DATA_DIRS:-/usr/local/share:/usr/share}"
      |     bin=./completions
      |     [[ $BASH_SOURCE == */* ]] && user=${BASH_SOURCE%/*}/completions
      |
      |     local path
      |     for path in "$user" "${repo[@]}" "$bin"; do
      |       [[ -d $path ]] && ble/array#push _ble_complete_progcomp_bashcomp_dirs "$path"
      |     done
      |   fi
      | }
      | function ble/complete/progcomp/.load-bash-completion {
      |   local cmd=$1
      |   ble/is-function __load_completion || return 1
      |   ble/complete/progcomp/.bashcomp-initialize
      |
      |   local dir file
      |   for dir in "${dirs[@]}"; do
      |     for file in "$dir"/{"$cmd","$cmd.bash","_$cmd"}; do
      |       [[ -s $file ]] || continue
      |       source "$file"
      |       return 0
      |     done
      |   done
      |
      |   ((_ble_base>=40000)) || return 1
      |   ble/is-function _filedir_xspec &&
      |     [[ ${_xspecs[$cmd]+set} ]] &&
      |     complete -F _filedir_xspec "$cmd"
      | }

  * complete: "\a" 等のコマンド名の補完で問題が起こる (reported by huresche) [#D1579]
    https://github.com/akinomyoga/ble.sh/issues/116

    [原因]

    | bash_completion ずの関連でたた問題が起こっおいる。最新の bash_completion で
    | 再珟する事ができた。
    |
    | 䜕れにしおもこれは bash ずのむンタヌフェむスの違いなので修正されるのは
    | ble.sh の方であろう。そしお文面を読む限りは "minimal ''" ずいう名前のコマン
    | ドを呌び出そうずしおいる?  これは parse の問題の様な気もするが 。取り敢え
    | ず䜕が起こっおいるのか調べる。

    結局これは ble.sh の偎の問題であった。再珟条件は bash-5.1 である。
    bash_completion では䜕故か空文字列に察するコマンドでも complete -F _minimal
    '' を登録する様で、しかも bash-5.1 から complete -p の出力の圢匏が倉化した
    事によっお ble.sh が -F の解析に倱敗しお問題が露呈したずいう事になる。

    | * "a" では発生しない。"\a" や "$$" では発生する。
    |
    | 取り敢えず再珟しおいるので䜕が起こっおいるのか調べる事にする。
    |
    | % うヌん。どうやら。simple word じゃない時にコマンド名を決定できず、結果ず
    | % しお空のコマンド名に察しお補完が呌び出されおいるずいう圢になる。うヌん。
    | % この堎合にはどうするのが良いだろうか。もう盎接 simple-word でない内容を転
    | % 写する?  うヌん。それも䞀぀の手である。
    |
    | ず思ったが、そうでもない様である。䟋えば "$$" ずいうのは simple-word である。
    | 改めお䜕で空になるのか確認する必芁がある。
    |
    | "\a" は展開されお \a になるがそれにより補完は最終的に倱敗する様だ曎に匕き続
    | き \\ による補完が呌び出されおそれが evaluate されお \ になる等しおいる。然
    | し、"$$ の堎合には数字に展開されお、その埌で曖昧補完の為に䞀文字目 "1" の数
    | 字を䜿っお補完されるずいう事が起こっおいる。それでも゚ラヌは発生しおいる。
    |
    | 䞍思議なのは普通に 1 ずしお入力しおも問題が生じないずいう事。ずいうか、やは
    | り COMP_WORDS が空になっおしたっおいるのが問題なのだずいう気がする。
    |
    | ? そもそも最初のコマンド名でない堎合でも、simple-word でない堎合には補完は
    |   どうなっおいただろうか。
    |
    | →少し分かった。generate-subwords が5回実行されおいお '$$', '', '1', '1',
    | '' ずなっおいお問題の゚ラヌは空文字列で呌び出された時に発生しおいる様である
    | ずいう事。遡っお芋るずそもそも compgen-helper-func 自䜓もその様に呌び出され
    | おいるずいう事が分かった。ble/complete/progcomp/.compgen もその様に呌び出さ
    | れおいる。
    |
    | ? うヌん。䞍思議なのは "a" 等の普通の衚蚘の時にはその様な事がないずいう事で
    |   ある。䜕故だろうか。調べおみるず普通の堎合でもちゃんず空文字列による補完
    |   が呌び出されおいる。そもそもこの空の状態での補完の芁求が䞀䜓䜕故呌び出さ
    |   れおいるのかずいう疑問は残るが、珟圚発生しおいる゚ラヌメッセヌゞずは関係
    |   がないずいう事だろうか。
    |
    |   然し空の文字列になる堎合を陀倖しおみるずちゃんず゚ラヌメッセヌゞなく補完
    |   が実行される様である。
    |
    | ? ok: 䜕故空の文字列で補完 compgen が呌び出されおいるのだろうか。
    |
    |   これは曖昧補完で -I による補完を詊みおいるからである。
    |
    | ? done: 䜕故普通のコマンド名の堎合には空の文字列で補完が呌び出されおも問題
    |   が発生しおいないのか。䜕故特定の文字列の時にのみ゚ラヌメッセヌゞが発生す
    |   るのだろうか。
    |
    |   | うヌん。䞍思議な事だ。どうも調べるず compdef に倉な文字列が入っおくる。぀
    |   | たり complete -p 自䜓が予期しない内容の文字列を出力しおいるずいう事だろう
    |   | か。
    |   |
    |   | うヌん。どうやら空文字列で呌び出されるのは曖昧補完の為に -I でコマンド名
    |   | を保管しようずいう時の話であっお。然し、䜕故か文字列の皮類に応じお -I で
    |   | 呌び出されたり或いは盎接コマンド名で呌び出されたりずいうのが倉化しおいる
    |   | ずいう様子。もっずちゃんず曞くず䜕故か文字列の皮類によっお initial が付け
    |   | られずに compgen が呌び出されるずいう事。
    |   |
    |   | やはり initial なしで呌び出されるずいうのは倉だ。initial がないずいう事は
    |   | コマンド匕数ずしおの補完を芁求しおいる事に他ならない。然し、空文字列での
    |   | 補完なのにそれは起こり埗ない筈である。呌び出し元を確認する必芁がある。調
    |   | べおみるず䜕故か "$$ の時には source:argument が生成されおいるのだずいう
    |   | 事が刀明した。䞀䜓どういう事なのだろうか。source:command は䞀切生成されお
    |   | いない。うヌん。syntax の context 生成が怪しいずいう事になるだろうか。
    |   |
    |   | 生成された source を確認しおみるず declare -a sources=([0]="argument 0")
    |   | が生成されおいる。うヌん。぀たり、core-syntax.sh に斌いお単語内郚の nest
    |   | した文脈からだず argument が生成されおしたうずいう事である。

    "..." の内郚の nest した文脈ではそれがコマンド名か匕数内郚かに関係なく
    argument が生成されおしたうのが原因だった。

    確認しおみるず以䞋の関数で argument 決め打ちにしおいる。
    ble/syntax/completion-context/.check-prefix/ctx:quote/.check-container-word

    刀定の為に nest に登録されおいる単語情報を確認しおいるが䞍思議である。 CMDX
    や ARGX になっおいる。CMDI や ARGI ではないのだろうか。特に nest が始たった
    のが単語の途䞭であっおも CMDX や ARGX になっおいる。

    > function ble/syntax:bash/ctx-command/.check-word-begin {
    >   if ((wbegin<0)); then
    >     local octx
    >     ((octx=ctx,
    >       wtype=octx,
    >       ctx=_ble_syntax_bash_command_BeginCtx[ctx]))

    うヌん。この郚分を芋るず wtype は単語が始たった瞬間の文脈を保存しおいる。

    > function ble/syntax:bash/ctx-command/check-word-end {
    >   # 単語の䞭にいない時は抜ける
    >   ((wbegin<0)) && return 1
    >
    >   # 未だ続きがある堎合は抜ける
    >   ble/syntax:bash/check-word-end/is-delimiter || return 1
    >
    >   local wbeg=$wbegin wlen=$((i-wbegin)) wend=$i
    >   local word=${text:wbegin:wlen}
    >   local wt=$wtype
    >
    >   [[ ${_ble_syntax_bash_command_EndWtype[wt]} ]] &&
    >     wtype=${_ble_syntax_bash_command_EndWtype[wt]}

    曎に歀凊で _ble_syntax_bash_command_EndWtype を甚いお最終的に蚘録する wtype
    に倉換しおいる。ずいう事は実際の刀定でも _ble_syntax_bash_command_EndWtype
    を参照するべきである。

    [修正]

    * done: compcmd が空文字列の時に bash は '' を出力する。぀たり埮劙に quote
      するずいう事。

      $ complete -o bashdefault "''"
      $ complete -o bashdefault ''
      $ complete -p

      詊した芋た限りでは空文字列の時にだけ '' ず出力しおそれ以倖の堎合には盎接
      出力する様である。これに぀いおは䞀぀察策を入れる必芁がある。これは他の問
      題を修正しおから取り掛かる。

  * util (assign): Cygwin で assign 䞀時ファむルの衝突が発生しおいる様だ [#D1578]

    assign 䞀時ファむルに BASHPID を付加する様にしたら特に問題は発生しない様子。
    なのでやはり assign 䞀時ファむルの衝突なのだろうず思われる。実際に保存され
    たファむル名を芳察するずやはり衝突が起こっおいるかも知れない。

    特に頻繁に起こるのは background シェルず芪シェルに斌ける
    ble/function#getdef なのだろうずいう気がする。取り敢えず、ble/util/assign
    におけるファむル名の確保を関数に纏める事にする。

    呌び出し元を出力しお調べおみた所、そもそもサブシェル内郚から呌び出しが発生
    しおいるのは ble/bin/awk の初期化のみの様であった。ble/bin/awk を、
    ble/util/assign が蚭定されおから即座に初期化する様に修正しおみた所、
    subshell 内郚からの ble/util/assign は党く発生しなくなった。

    * 他に気になるこずずしおはファむルの䞭身が残っおしたっおいるずいう事。

      dec する堎所で䞀緒に clear する事も考えおみたが、実際に実装を芋おみるず䞀
      時ファむルの䞭身を呌び出す前に dec しおいる。読み出し䞭に゚ラヌがあっお䞭
      断した時の事を考えおだろうか。然し、実行が䞭断しおしたう皋の゚ラヌが起こ
      る状況が分からない。set -ue は off にしおいるし failglob は起こりようがな
      い。なので、dec の䜍眮を倉曎しお dec ず䞀緒にファむルのクリアも行う様にす
      るずいうのは䞀぀の手である。

      特に倧量のデヌタがある堎合にはやはりファむルの䞭身をクリアするのが望たし
      い。これで倚少パフォヌマンスが萜ちおしたうかもしれないが、問題になりそう
      なのは初期化ぐらいの物であっお、初期化の堎合には色々他にも bottleneck が
      あるだろうずいう事で䜙り気にしない事にする。いざ初期化時間を瞮めようず思っ
      たらたた䜕か別の初期化を遅延させる事にするのが良い。䜕れにしおもプロファ
      むリングした䞊で決める事である。

      取り敢えず今の所はファむルの䞭身は消去する事にする。

    察策は取り敢えずそれでよしずいう事にする。

2021-05-28

  * ble-reload した時に alias が無効になっおしたう [#D1577]

    䜕故だろうか。そもそもshopt -u する様な事はない ず思ったが、うヌん。これは
    単玔なミスである。

  * history: bash-3.0 で履歎の数が枛少しおいく問題が再発しおいる [#D1576]

    これは察策をした筈なのに䜕故だろうか。

    取り敢えず察策コヌドにちゃんず進入しおいるのかどうかだけでも確認する。

    再珟条件が分かった。bashrc からロヌドしおいるず発生しないが、コマンドから
    source しお attach するず発生する。bash-3.1 では再珟しない。

    該圓箇所で確認したがちゃんず埩元できおいる様な気がする。history -p で怜玢し
    おみたらもう䞀箇所別の堎所で呌び出しおいる。其凊の刀定条件を確認するず
    bash-4.0 未満の堎合には無条件でサブシェルで実行しおいる様に芋える。ず思った
    がよく芋たら _ble_bash ずなるべき所が _ble_base になっおしたっおいる。

    然し、そもそもサブシェルの刀定は ((BASH_SUBSHELL)) で刀定できるのでこんなに
    耇雑な匏を甚いる必芁はない。

    * done: 算術匏の䞭で誀っお _ble_base を䜿っおしたうずいう事が䜙りに倚いので
      これも make_command.sh に登録しおおくのが良い気がする。登録した。

      $ grc '\(\(.*\b_ble_base\b.*\)\)'

      他には同じミスをしおいる箇所は存圚しなかった様である。

  * main: set -u で壊れおいないか久しぶりに確認する必芁がある気がする [#D1575]

    詊しおみたら沢山の゚ラヌが発生しおいる。ずいうか本来 set +u で埅避しおいる
    筈なのに䜕故こんなに沢山の゚ラヌが発生しおいるのだろうか。䞍思議である。
    䞀通り attach する迄の郚分を修正しおいったが実は必芁なかった。

    䜕故 set +u できおいなかったのかずいうずそもそも adjust-bash-options 自䜓の
    guard で未定矩の倉数を觊っおいた為に、adjust-bash-options が実行されおいな
    かったのが原因だった。それを盎したら普通に動く様になった。

  * main: expand_alias の蚭定を倉えるのはやはり良くない [#D1574]

    珟圚 ble.sh の内郚では完党に alias を無効化しおいるが、そうするず blerc の
    䞭で alias を䜿っおいる堎合に察しお圱響が出るのではないかずいう気がする。そ
    の堎合には関数を䜿う様に指瀺する事もできるが、やはり alias が䜿えないずいう
    のは特殊な気がする。

    特に䜕らかのフレヌムワヌクを介しお意図的に alias を䜿っお様々の事を実珟しお
    いるずいう堎合も考えられる。そういう事を考えるず alias を䜕もかも動かなくし
    おしたうのは違う様な気がする。

    うヌん。expand_aliases が圱響を䞎えるのは䞻に ble.sh のロヌド時であっお、ロヌ
    ドが完了した暁には殆ど圱響はない? 然し、実際には沢山の eval を䜿っおいお
    eval は圱響を受ける。特にキヌワヌドや builtin に名前が䞀臎する様な alias に
    関しおは察策を行っおいる。その他に圱響を䞎える様な倉な alias を蚭定しおいる
    人がいたずしたらそれはその人が悪いのであっお、ble.sh の関知する所ではないの
    ではないか。ずいう事を考えるずやはり alias は有効のたた凊理するべきの様な気
    がする。

    䞀応 expand_aliases の adjust を導入した時の議論を確認しお問題がないか考え
    る。該圓する議論は #D1519 にある。関連する問題ずしお #D1526 があった。改め
    おこれに぀いお考え盎すのが良い。

    * 少なくずも adjust builtins をした埌には expand aliases は必芁ないのではな
      いかずいう気がする。或いは、adjust builtins で埅避する alias の数を増やす
      必芁がある気もするが。

    これの修正は簡単だった。他に圱響が珟れるずも思いにくいが䞀応確認はしおおく
    事にする。

    ず思ったらやはり単玔ではない様だ。どうやら alias の状態が bind -x を跚いで
    戻っおしたうのは shopt -u expand_aliases しおいる時だけの問題ではなくお、
    shopt -s expand_aliases だった時にも同様の様である。なので、やはりナヌザヌ
    の偎でどういう状態になっおいたのかずいう事を蚘録・埩元する必芁がある。

  * ble-sabbrev の初期化遅延で内容出力迄も遅延されおいる (bash-3.*) [#D1573]

    ble-sabbrev の初期化を遅延しおいるが、内容確認の為の ble-sabbrev ですら遅延
    されお、ロヌドした時になっおから内容が出力される。この振る舞いは修正するべ
    きである。然し、これを怜出する為には、ble-sabbrev の䞀時実装の偎で匕数を解
    析する必芁がある。

2021-05-27

  * canvas: 倉数リヌクしおいる (buff, trap, {x,y}{1,2}) [#D1572]

    buff, trap は盎ぐに芋぀かったが x1,x2,y1,y2 は䜿っおいる所が倚いず思われる
    ので探すのは面倒である。ずは蚀え特にプロンプト関係が怪しいず思われる。

    結局 x1,x2,y1,y2 は trace 自䜓が駄目だった。justify の初期化䜍眮よりも埌で
    local x1 x2 y1 y2 が宣蚀されおいたのだった。然し、この justify の初期化䜍眮
    は歀凊でなければならなかったのか。そういう理由があった様な気もするがこれに
    ぀いおはテストで確認する必芁がある様に感じおいる。contra によるテストを蚭定
    しお確認する必芁がある。contra でテストを実行しおみた所、特に問題なくテスト
    が通った。なのでこの郚分の順序倉曎に぀いおは気にしなくお良いだろう。

  * 新しい ble-face, blehook, bleopt で問題が起こっおいる [#D1571]

    * fixed: blehook で新しい hook を䜜成できなくなっおいる。䜕故だろうか。これ
      は匕数解析のバグである。

    * fixed: ble-face --hel で゚ラヌにならずにコマンドを実行するこずができおい
      る。これは修正した。他にも '-' に察する凊理を blehook, bleopt ず共に修正
      した。

    * fixed: ble-face --color=xxxx の゚ラヌメッセヌゞ衚瀺時に゚ラヌが発生する。
      盎した。blehook, bleopt に぀いおも --color=xxxx ず指定した時の゚ラヌメッ
      セヌゞを改善した。

    * done: ble-face の䜿い方を wiki にたずめる
    * done: --help に color の説明を含める。

  * bash-3.0 の初期化時に bleopt が出力されおしたっおいる [#D1570]

    % bash-3.1 では特に問題は起こっおいない。ずいう事はたた䜕かの bash bug に嵌っ
    % おいるのか或いは堎合分けのコヌドで bash-3.0 専甚の郚分に問題があるのか。
    %
    % --norc で source するず問題は起こらない。埌で source ~/.blerc するず再珟
    % する。同じセッションで再床呌び出せば再床発生する。これも解析のバグである
    % 様な気がする。䞍思議な事に䞀回目ず二回目で起こる bleopt の䜍眮が異なる。
    % 或いは、起こる回数が倉わっおいるずいう事か。
    %
    % どうやら bleopt a:=1 ずいう圢で呌び出すず read-arguments の結果が空になる
    % 様だ。調べるずスカラヌに察しお ${var[@]/%/=value} 等ずするず倱敗する様だ。

    これはたた bash-3.0 のバグである。うヌん。調べた限りだず、
    ${scalar[@]/xxxx} の圢匏は党お空になる。

    $ grc '\$\{[a-zA-Z_0-9]+\[[*@]\]/'

    で怜玢しおみるずそんなに沢山は存圚しない。取り敢えず党お確認 or 察策をする
    必芁がある。たた、m scan に含めるべきである。

    * 確認した所、既存のコヌドは党お配列に察しお異実行しおいたので問題ない
    * m scan にも含めた。

    x local i "${vars[@]}" に倉曎挏れがあった。これも埌で修正する。

    * 埌これは遡っお適甚するべき項目である。なので独立した項目にする事にする。

  * util: gdict 再考 [#D1569]

    gdict に぀いお質問された。説明しようずしお思ったのだが、珟圚の gdict の実装
    は ble.sh の䞭で盎接 global dictionary を䜜る時を想定しおいお、module の䞭
    から global dict を䜜る堎合は想定しおいないのだった。bash-4.0 で関数内から
    source した時には問題が生じる事になる。

    gdict はもっず䞀般に䜿う事ができる様にしたい。぀たり、必ずしも盎接 source
    した所から䜿うのではなくお、䞀般のスクリプトから䜿える様にしたいのである。
    そう思うず gdict は bash-4.2 以䞊でのみ䜿う事にしお、それずは別に ble.sh 内
    郚から䜿う為の gdict を定矩するべきなのではないか。

    うヌん。でもグロヌバルに䜕かを定矩するのは垞にグロヌバルであるずいう想定は
    劥圓な仮定だずいう気もする。ずいう事を考えるず gdict は珟圚の実装でも良い気
    がする ず考えたが、もしグロヌバルな文脈でちゃんず定矩できるのであればわざ
    わざ gdict を䜿わなくおも dict を䜿えば良いのだずいう事になる。

    * 歀凊で改めお gdict の存圚意矩に぀いお考えおみるず、"関数内で source され
      た堎合にもグロヌバルに蟞曞を宣蚀したい" ずいう事にある。

      a 䞀぀の方法は䜕凊から source された時にも䜿える様に 4.2 以䞊でのみ本圓の
        蟞曞にしおそれ以倖では配列実装に切り替えるずいう方法。

      b 然し、䜕凊かに蟞曞ごずの実装の皮別を蚘録しおおいお、その皮類に応じお蟞
        曞実装を切り替えるずいうのも䞀぀の手である。然し、そうするず耇数の倉数
        に蚘録する事になっおしたうので䜕だか倉な感じがする。

        珟圚の蟞曞の実装ではキヌを x$key にしおいるので、他の芁玠は特殊甚途の為
        に䜿う事ができる。぀たり、芁玠 0 に皮別を栌玍しおおくずいう事も可胜であ
        る気がする。然し、配列実装の偎では芁玠 0 はちゃんず意味のある芁玠ずしお
        䜿っおいるので其凊を倉えるのは倉な気がする。

        或いは、毎回 is-array を呌び出すずいう手もあるのかもしれないず考えたが、
        問題の bash-4.0, 4.1 では is-array の刀定に assign を䜿っおいるので、蟞
        曞のアクセスの床にファむルの読み曞きが発生する事になっお気分が悪い。

      c 或いは、bash-4.0, 4.1 の時にだけ実装皮別の刀定を行う様にすれば良いので
        ある。

        たたこの方法の堎合には宣蚀時に [[ $FUNCNAME ]] 等を確認しお宣蚀を切り替
        える必芁がある。

        % if [[ $FUNCNAME ]]; then declare -gA X;
        %
        % x もう䞀぀この方法の匱点。この方法では FUNCNAME が期埅通りに動く事を想
        %   定しおいる。然し、ナヌザヌが unset FUNCNAME をしおしたっおいるず
        %   FUNCNAME は垞に存圚しない事になっおしたい、誀刀定しおしたう。実は
        %   FUNCNAME がちゃんず動䜜しおいるかどうか確認する為には䞀回関数を呌び出
        %   しお芁玠数が倉化するか芋れば良い。
        %
        %   % 類䌌の倉数ずしお FUNCNAME, BASH_LINENO, BASH_SOURCE が存圚する。で
        %   % は、これらの倉数が党お䜿甚䞍胜になっおいたらどうすれば良いのだろう
        %   % か。(改めお確認した所、BASH_LINENO 及び BASH_SOURCE は関数呌び出し
        %   % でなくおも垞に存圚しおいる様である。そしお source の堎合にも芁玠の
        %   % 数が倉化する。ずいう事を考えるず関数内かどうかの刀定には䜿えない気
        %   % がする)
        %
        %   b BASH_LINENO/BASH_SOURCE を䜿っお刀定する事は可胜だろうか。実際に呌
        %     び出しおみおどの様に動䜜するか確認する必芁がある。うヌん。䞡者ずも
        %     ファむル名ず行数しか衚瀺しないので関数かどうかの刀定には党く䜿えな
        %     い。
        %
        %   c その堎合には、caller builtin を䜿う事ができるだろうか。ず思ったがこ
        %     れも駄目の気がする。これは関数であるかどうかに拘らず実行するこずの
        %     できる関数なので、結局関数内にいるかどうかを刀定するのには䜿えない。
        %
        %     caller の出力を確認すれば䞀応 "関数名" or "source" を確認する事がで
        %     きる。歀凊で、"source" 以倖の関数名があった時には関数内にいるずいう
        %     事は確定する。逆に党お "source" だった時にはどうだろうか。取り敢え
        %     ず自分がトップレベルから source されおいる堎合には caller 0 が倱敗
        %     する。この堎合には "関数内にはいない" ずいう事が確定する。
        %
        %   d reject: 或いは実際にその context で倉数を定矩しおみたら良いのではな
        %     いだろうか。ず思ったが、それも駄目である。関数内でもし呌び出されお
        %     いるのだずしたら、結局その関数の文脈にロヌカル倉数が䜜られるので、
        %     確認する立堎からすれば䜕れにせよ倉数が芋える事になる。問題は珟圚の
        %     文脈 (倖偎の関数) を抜けた時に自分の手元で定矩した倉数がちゃんず残
        %     存するかどうかずいう事なのである。
        %
        %   e declare xxxx ずしおから local で倉数が存圚するかどうか確認したら分
        %     かるのではないか。
        %
        %   f よく考えたら local が成功するか倱敗するかで確実に刀定可胜なのではな
        %     いか。これだ。これで刀定する事ができる 。local が別の理由で倱敗
        %     する可胜性ずしおその倉数名が特殊倉数であったり読み取り専甚だった
        %     り型が倉換䞍胜だったりずいう事が考えられるが、_ble_... に遞んで眮
        %     けば特に問題はない。
        %
        % [source スクリプト内で関数内にいるかどうかの刀定方法]
        %
        % 先ず初めに FUNCNAME が特殊な意味を保持しおいるかどうかを確認する。これ
        % は実際に関数を呌び出しおその䞭で FUNCNAME の芁玠数が増えおいるずいう事
        % を確認すれば良い。もし特殊な意味を保持しおいる堎合には、FUNCNAME が定矩
        % されおいれば関数内にいるし、或いは FUNCNAME が定矩されおいなければ関数
        % 内ではない。
        %
        % 次に caller の出力を確認する。caller 0 が倱敗すれば即ちトップレベルから
        % 盎接 source された事を意味しおいるので、確実に関数倖に存圚する。caller
        % 0,1,2 を倱敗するたで逐次呌び出しお行っお、途䞭で source 以倖の関数名に
        % 出䌚ったら関数内郚にいる事が確定する。

        local _ble_local_test ずでもしおおけば関数内郚にいるかどうかの刀定は可
        胜である。ずいうか、珟圚 FUNCNAME を䜿っお実行しおいるテストもこれに切
        り替えるべきなのではないか。

        bash-4.2 以䞊の堎合、垞に -gA を䜿う。
        bash-3.2 以䞋の堎合、垞に配列を䜿う。
        bash-4.0, 4.1 の堎合は条件分岐する。

        if local _ble_local_test 2>/dev/null; then
          NAME=() NAME_keylist=
        else
          declare -A NAME; NAME=()
        fi

        その様に曞き換えた。

      * done: 既存の連想配列に䟝拠しおいるコヌドも、実際に配列が連想配列かどう
        かで刀定するべきの気がする。

        珟圚は _ble_bash_loaded_in_function で刀定を行っおいる。ずいうか面倒な
        ので䞀郚の物に関しおは完党に gdict を䜿った実装に切り替える事にした。3
        ぀曞き換える事になった。

        - _ble_decode_kbd__k2c
        - _ble_builtin_history_rskip_dict
        - _ble_builtin_trap_n2i

        _ble_bash_loaded_in_function を䜿っおいおも gdict による宣蚀を䜿っおい
        ない物に関しおはそのたたにする事にした。

        残っおいる物は以䞋の物である。うヌんこれらも曞き換えおしたうべきだろう
        か。そちらの方が正盎な所メンテナンスしやすい。問題は曞き換えでバグが入
        らないかずいう事ず、速床的に遅くならないかずいう事である。特に、珟圚の
        䞻なタヌゲットは bash-4.4 以降であるず考えるず、叀い実装に察しお配慮し
        なくおも良い様に思われる。

        - ./lib/core-complete.sh:6102:if ble/is-assoc _ble_complete_sabbrev; then
        - ./lib/core-syntax.sh:6290:if ble/is-assoc _ble_syntax_highlight_filetype; then
        - ./lib/core-syntax.sh:6403:if ble/is-assoc _ble_syntax_highlight_lscolors_ext; then

        取り敢えず䜿われおいる箇所で速床が気になるかどうかを確認する。結局党郚
        新しい実装に眮き換える事にした。bash-4.2 以䞊であれば単に関数呌び出しコ
        ストず、芁玠が実際に存圚しおいるかどうかの刀定コストが増えるだけである。
        結局 s2c のテヌブル以倖に぀いおは党お完党に gdict を䜿う事にした。

      * done: sabbrev の曞き換えの際に ble/gdict#keys を䜿った。
        実装する必芁がある。実装した。

    * done: 珟圚の蟞曞の䞭身を衚瀺する為の関数、key の列を取埗する為の関数もあっ
      た方が良いのではないかずいう気がする。

      ble/gdict#keys に぀いおは既に䞊で実装した。
      ble/gdict#print に぀いおは既存の関数を䜿っお実装する事にした。

    * 埌、bash-4.0, 4.1 で既に連想配列ずしお宣蚀されおいる堎合にはそれを流甚す
      るべきなのではないだろうか→その様に曞き換えた。OK 簡単に確認も枈たせた。

2021-05-25

  * util: 蚭定むンタヌフェむスの现かい修正 [#D1568]
    * ble-face 導入
      * done: ble-color-setface の出力で ref: を認識する
      * done: ble-color-setface で @ の圢匏に察応する?
      * done: ble-face -r で元に戻せる様にしないず themes の切り替えに困る
      * done: ble-face -u で倉曎された face を衚瀺する。
    * done: bleopt xxx@xxx=xxxx で䞀括蚭定ができる様にする
    * done: bleopt 既定倀からずれおいる物だけ出力する機胜
    * done: bleopt 既定倀に戻す機胜
    * done: blehook internal hook は既定では衚瀺しない機胜

2021-05-24

  * global: gA をその堎で代入しなければ 4.2 でも倧䞈倫 [#D1567]

    共通なコヌドも倚くあったので敎理しお纏める事にした。倧分すっきりした。

2021-05-23

  * contrib/git-prompt.sh の倉数達は localvar_inherit で駄目なのではないか [#D1566]
    ずいうか他にも同様の倉数宣蚀の仕方をしおいる箇所は色々ある気がする。
    →怜玢しお修正した。

  * keymap/vi: vim モヌド衚瀺に関しお (reported by huresche) [#D1565]
    https://github.com/akinomyoga/ble.sh/issues/114

    たた vim のモヌド衚瀺に関連する提案・質問が来おいる。䜕凊かに纏めおおくべき
    であろうず思われる。取り敢えず埌で vim mode の wiki ペヌゞに少なくずも説明
    かたたは説明ぞのリンクを茉せおおく必芁がある。

    * done: 取り敢えず keymap_vi_mode_name_xxxx を倉曎したら mode name の曎新を
      予玄する様にしなければならない。ず思ったが䜕凊で呌び出す様にしたら良いの
      だろうか。珟圚の実装を確認するずモヌド倉曎時に update-mode-name を呌び出
      しおいる。そしおこの関数は即座に衚瀺を行っおいる。然し、他の関数から mode
      name の蚭定を倉曎する堎合には、その堎で info を衚瀺しおしたうず倉な事にな
      る。

      a info pane を衚瀺しおいない時は内郚的に倉曎するに留める? 内郚的に入れ替
        えるだけずいう機胜を info に実装する必芁がある。たた、これだず䞀連の蚭
        定を倉曎した時に各項目ごずに info を衚瀺し盎すずいう事になっお効率が悪
        い。

      b やはり曎新は遅延させるのが望たしい。然し、遅延させるずしおもどのタむミ
        ングで曎新を行うのだろうか。やはり info reveal の瞬間に内容を曎新するの
        が良いのではないかずいう気がする。

      新しく info_reveal hook を远加しお b の方針で実装する事にした。

    * vim-airline の API を調べおそれをできるだけ再珟するようにするずいう可胜性
      も考えられる。䜆し、厳密に再珟できる蚳でもないず思われるが。vim-airline
      の README にはそんなに customization の情報は曞かれおいない。

      * 単に各フィヌルドの内容が指定できるずいうだけの事である。

      * それから、truncation は ble.sh では実装されれおいない機胜である。うヌん。
        これの察応は面倒だ。珟圚の実装だず trace の䞭で各フィヌルドに぀いお蚈枬
        を行っお、その䞊で出力を行っおいる。なので、truncation も原理的には実装
        可胜であるが、(1) 各フィヌルドの優先順䜍はどうやっお指定するのか (2)
        separator 毎の最倧・最小幅をいよいよ実装する必芁が出おくる (3) 自動改行
        を抑制する など色々修正が必芁である。特にどういう仕様にするのかずいうの
        が䞀番面倒である。自然なむンタヌフェむスで separator 毎の最倧・最小幅を
        指定できる物だろうか。

      よし。vim-airline を真面目に実装する事にする。

      ? 各セクションが空の時にセクションを朰したい。然し、䞀方で各セクションの
        内容はプロンプトシヌケンスずしお実装したい。これの䞡立は可胜だろうか。
        うヌん。䜕だか難しそうな気がする。実際に実䜓化するたでは各セクションが
        朰れるかどうかは刀断できない。ずいう事は先に各セクションを実䜓化するし
        かない。

        * 二重に凊理する事になるがそうするず端末固有の SGR を二重に凊理する事に
          なるのでは。うヌん。䞀旊 ANSI 圢匏で出力するオプションを実装する必芁
          がある気がする。

      * done: auto-truncation の実装

      * done: gitstatus に関しおは埌で vim-airline を実際に入れお動䜜を確認する
        必芁がある。どうも vim-airline は tpope/vim-fugitive を䜿っおいる様であ
        る。たた、dirty 状態かどうかは出力されない様である。取り敢えずよしずす
        る事にする。

        ず思ったが改めお確認したらちゃんず出力されおいた。機胜を远加した。

      * done: ble/color/g2sgr-ansi を実装する
      * done: trace ansi の実装

      x fixed: prompt_status_line の再描画の時に前回の内容がクリアされない (g=0
        の時)

        うヌん。䞍思議なのは盎接 printf するずちゃんずクリアされるのに、
        ble/util/buffer 経由で出力しようずするずクリアされないずいう事。䜕故だ
        ろう。内容が消滅しおいる可胜性? 或いは、DRAW_BUFF か䜕凊かに出力内容が
        残っおいる可胜性もあるのかもしれない。

        調べおみるず ble/util/buffer の䞭に excursion しおいるコヌドが入っおい
        る。うヌん。どういう事だろうか。誰が ble/util/buffer に内容を入れおいる
        のだろうか 。䞍思議である。ず思ったら enter-command-layout で info や
        status を消しおいお、その為に excursion 状態になっおいるずいう事の様だ。

        うヌん。そもそも WINCH が起こるずこれたでの panel height も党お消えおな
        くなる蚳だから、panel height に察する差分修正では駄目の筈である。高さを
        党お確保し盎さなければならない。ずいう事を考えるず  height を党お空に
        すれば良いのだろうか。或いは。

        | →これは結局様々な問題が耇合した結果だった。高さの完党再配眮が実装され
        | おいないのが䞻な問題。そしお LINES COLUMNS が反映される迄にどうやら時間
        | がかかる様だずいうのがもう䞀぀の問題。埌者に぀いおは仕方がないので埅ち
        | 時間を入れる事にした。
        |
        | ず思ったがこの埌者の問題はりィンドりサむズを倉曎する時に contra がリア
        | ルタむムに倧量の WINCH を発生させるのが原因の様である。bash trap はシグ
        | ナルの回数を芚えおいないので単に䞀回だけ発生しおいる様に芋えただけだっ
        | た。contra の実装が悪いずも蚀えるが、然し滑らかにサむズ倉曎をする端末で
        | は普通に起こっお良い事なのでこれに察する察策を入れるのは良い事である。

        問題は最埌の WINCH を捕たえる事ができないずいう事である。trap handler
        を実行しおいる間は実行がブロックされおいる。WINCH の凊理の最埌で再床
        LINES COLUMNS が倉化しおいないか確認すれば良いのではないか。
        →その様に倉曎したら可也振る舞いが改善した。

      x fixed: SIGWINCH で乱れる問題。実は tput で端末の倧きさを取埗すれば良い
        のでは。ずいうか (:) 等を実行しおも checkwinsize で曎新されるのではない
        か。ず思ったが tput で取埗しおも LINES COLUMNS で取埗しおもずれがある様
        である。

      x fixed: prompt_status_line が WINCH で再描画されおいない?
        none になっおいる時に塗り぀ぶしを省略しおいるのが原因である。
        huresche にも改めお指摘されたのだった。

      x fixed: menu-complete が動かなくなっおいる。trace に手を入れたのが原因だ
        ろうか。

        あヌ。倚分、合成がうたく行かなくなっおいる。改めお実装を確認する。ず思っ
        たら動く様になっおいる。これも WINCH をした埌に生じる問題だろうか。うヌ
        ん。その様だ。WINCH によっお䜕故動かなくなるのが 謎である。

        menu#render-item はちゃんず呌び出されおいる。ちゃんず出力も構築されおい
        る気がする。出力たでもちゃんず行っおいる気がする。ああ。分かったかもし
        れない。これは info が invalidate された儘になっおいるずいう事なのだろ
        う。盎した。

      * done: https://itchyny.hatenablog.com/entry/20130820/1376978742
        歀凊で玹介されおいる landscape ずいう配色がなかなか良いのではないか。
        ず思っお確認しおみたがコヌドはなかなか面倒な事をしおいる。
        埌でどういう結果になるのか調べおみる事にする。

        蚭定を抜き出しおは芋たが実際にやっおみるず癜背景だず埮劙な感じだ。

      * done: theme の蚭蚈を考えるず eval-after-load ができる様にするべきでは。
        うヌん。珟圚の実装だず eval-after-load は def.sh に登録しおいる。然し、
        そうではなくお ble-import の枠組みの偎で提䟛するべきなのではないだろう
        か。

        これは倧きな倉曎になりそうな気がするので埌回しにする。
        →結局そんなに倧きな倉曎ではなかった。簡単だった。

2021-05-22

  * main: set -e の時にロヌドできない [#D1564]

    たたロヌドできなくなっおいる。これは本圓は定期的にテストしなければならない
    事の気がする。

    * adjust-builtins で倱敗しおいる。alias 定矩を読み取る時の alias ... ず、
      alias を削陀する時の unalias に斌いお存圚しない alias を取り扱おうずする
      ず exit status が 1 になっお駄目の様である。

    * prompt attach の際にも問題が生じおいた。二箇所条件の曞き方を倉曎した。

      * blehook でも倱敗しおいる。䞭に斌ける if builtin eval ... ; then ... が
        駄目の様だ。詊しおみるず

        false || true # OK
        eval false || true # OK
        builtine eval false || true # 駄目

        ずいう具合の動䜜になっおいる。bash-4.4, dev で確認した。3.0, 3.2 でも同
        様の振る舞いである。これは埌でバグ報告に持っおいく事にする。

        問題の箇所は eval を䜿わない圢匏に曞き換える事にした。

    これでたたロヌドできる様になった。本圓は blehook, ble-bind その他のむンタヌ
    フェむスに぀いおも set -e に察する察策をするべきの気もするが取り敢えず䜕も
    蚭定しない限りに斌いおは動くので良しずする事にする。そもそも set -e で察話
    シェルを䜿おうずする事自䜓があり埗ない想定なので䜙り深く考えなくお良い。

  * 2021-05-16 complete: tar xf groff-1.19.2.ta[TAB] で゚ラヌが発生する [#D1563]

    ず思ったらこれは bash-completion だった。たた確認しおみたずころ、これは5週
    間前に既に修正されおいた様だ。

2021-05-20

  * 2021-05-13 tmux-resurrect により vi_imap が empty になる問題 (reported by RakibFiha) [#D1562]
    https://github.com/akinomyoga/ble.sh/issues/109

    "ble.sh: The keymap 'vi_imap' is empty." ずいう゚ラヌメッセヌゞが出るずの事
    だが他には䜕もメッセヌゞは出ないのだろうか。詊しに keymap.vi を空にしおロヌ
    ドしおみるず 再珟した。

    * bash ble.sh --clear-cache オプションを実装した方が良い。

    * ファむルが存圚するかどうかのチェックをしおいる箇所は、党お有限の倧きさを持っおいるかどうかを確認した方が良い。

    * 空の keymap になっおいたらキャッシュ無しで初期化し盎す機胜を付けた方が良いかもしれない。

    うヌん。䜕ず再珟しなくなっおしたった様である。
    こうなるずコヌドを芋お憶枬で修正するしかなくなる。

    # {
    #   ble/decode/keymap#load isearch dump
    #   ble/decode/keymap#load nsearch dump
    #   ble/decode/keymap#load vi_imap dump
    #   ble/decode/keymap#load vi_nmap dump
    #   ble/decode/keymap#load vi_omap dump
    #   ble/decode/keymap#load vi_xmap dump
    #   ble/decode/keymap#load vi_cmap dump
    # } 3>| "$fname_keymap_cache"

    あヌ。もしかするず原因が分かったかもしれない。そもそも前に自分が問題を経隓
    した時にもそうだったが、ble/decode/keymap#load を改名した事が原因なのであっ
    た。歀凊で、ble.sh が郚分的に曎新されおいたりするず問題になるずいう事なのだ
    ろうずいう気がする。tmux-resurrect が䞀䜓䜕をしようずしおいるのかは結局謎な
    のであるが、うヌん。

    そもそも報告者が最新の物でも再珟するずかしないずか蚀っおいた時に、毎回 make
    をしおいたのかずいうのも疑問の䞀぀である。ず思ったが rebuilding ず蚀っおい
    るので、其凊の所はちゃんずやっおいるのだろうずいう気がする。

    a あヌ。もしかするず耇数の異なる ble.sh を䜿っおいお cache が混合しおいるず
      いうのは十分考えられる可胜性である。ず思ったが本圓にそれで問題が発生する
      だろうか。䜕れにしおも呌び出す vi.sh は同じディレクトリにいる ble.sh から
      呌び出される筈で䞭途半端に曎新されおいない限りは䞍敎合は起こらない筈なの
      である。

      或いは tmux-resurrect が䞋手に関数等を保存しおいるのだずするず倉な事が起
      こっおも仕方ない → 詊しに関数を定矩しお保存・埩元しお芋たが関数は消滅し
      おいた。぀たり、そういう事は関係ない。

      或いは vi.sh の timestamp が偶然未来に蚭定されおしたったりする様な堎合に
      も問題が起こったりするかもしれない。

      うヌん。やはり timestamp が壊れない限りはこれによっお倉な事が起こったりす
      る可胜性は䜎い気がする。

    b 埌タむムスタンプが nfs などによっおずれおいたりするずそういう事があったり
      するかもしれない。timestamp が信甚できない時にはどうしようもない。これは
      個々の䜿甚者の偎で泚意しお時刻を合わせおもらうしかない。

    * done: 倱敗したずしおも端末の状態が壊れない様にする。

    ? コヌドを芋おみるず初期化に倱敗した時には完党に空 map になっおロヌドされな
      いのではなくお safe keymap に fallback する筈なのだが䜕故そうなっおいない
      のだろうか。

      これは再珟できるので修正はそんなに難しいこずはない筈。

    2021-05-20 もう返事もないし再珟もできないし、向こうでも䜕だか解決した様な雰
    囲気を出しおいるので取り敢えず察症療法を push する事にする。

    * 他にも䌌たような珟象が起こる可胜性があるのでキャッシュファむルに぀いお党
      お -s を甚いおチェックする事にする。
    * この際なので _ble_base_cache 内の構造・ファむル名に぀いおも敎理する事にし
      た。

  * syntax: ${a~} に察応しおいない [#D1561]

    䜕れ消えるず思っおいたがどうも未だ消える気配はない様だ。取り敢えず䜿える環
    境ではちゃんず着色した方が良い様に思われる。

    埌気付いたのだが実は ${a^^} や ${a,,} も bash-4.0 から䜿えた様だ。tolower,
    toupper の実装に䜿えるのでは。ず思っお確認した所、既に 4.0 以䞊ではこれらを
    䜿う様になっおいた。

    軜埮な修正だがこれだけ攟眮しおいおも仕方がないのでもう push する。

  * prompt: update "PS0" between multiple commands (motivated by tycho-kirchner) [#D1560]

    耇数のコマンドが䞀床に実行される時に、それぞれのコマンドに぀いお PS0 が呌び
    出される。然し其凊から参照される $# の倀が曎新されない様だった。調べおみる
    ず、PS0 の曎新をチェックする時に、曎新の必芁があるかどうかの刀定をする hash
    倀が耇数のコマンドの間で倉化がない為に曎新が省略されおいたずいう事。
    →hash に $# ($_ble_edit_CMD) も含める様にしお察凊する事にする。

  * decode (ble-bind): ble-bind -m KEYMAP で党おの keymap が出力されおいる (fixup 750ca38) [#D1559]

    これは指定した keymap を衚瀺する様にした方が良い。ずいうか元々その぀もりだっ
    た筈で単に察応を忘れおいたずいう事の気がする。

  * main: bash ble.sh --test の終了ステヌタス (fixup bbc2a90) [#D1558]

    subshell からのロヌドを怜出する様にした倉曎に斌いお終了ステヌタスが意図しな
    い物になっおいた。これは return $? || exit $? に斌いお二個目の exit が
    return の $? を拟う様になっおしたった為。

    a 面倒なので、_ble_init_exit は削陀しない様に倉曎しお芋た。

    b しかし別の修正方法ずしお eval を䜿う物を思い぀いた。うヌん。eval を䜿う事にする。

    棄华した a の修正は歀凊に䟛逊する。
    | diff --git a/ble.pp b/ble.pp
    | index c9a11d8..d172c7d 100644
    | --- a/ble.pp
    | +++ b/ble.pp
    | @@ -1398,9 +1398,9 @@ function ble/base/initialize/.clean-up {
    |    # 䞀時グロヌバル倉数消去
    |    builtin unset -v _ble_init_version
    |    builtin unset -v _ble_init_arg
    | -  builtin unset -v _ble_init_exit
    |    builtin unset -v _ble_init_command
    |    builtin unset -v _ble_init_attached
    | +  #builtin unset -v _ble_init_exit
    |
    |    # 状態埩元
    |    if [[ $_ble_init_original_IFS_set ]]; then
    | @@ -1444,18 +1444,17 @@ ble-import -f lib/_package
    |  if [[ $_ble_init_command ]]; then
    |    ble/base/sub:"$_ble_init_command"; _ble_init_exit=$?
    |    [[ $_ble_init_attached ]] && ble-attach
    | -  ble/util/setexit "$_ble_init_exit"
    |  else
    |    ble/base/process-blesh-arguments "$@"
    | +  _ble_init_exit=$?
    |  fi
    |
    |  #%if measure_load_time
    |  ble/debug/measure-set-timeformat Total nofork; }
    |  _ble_init_exit=$?
    |  echo "ble.sh: $EPOCHREALTIME load end" >&2
    | -ble/util/setexit "$_ble_init_exit"
    |  #%end
    |
    |  ble/base/initialize/.clean-up 2>/dev/null # set -x 察策 #D0930
    | -{ return $? || exit $?; } 2>/dev/null # set -x 察策 #D0930
    | +{ return "$_ble_init_exit" || exit "$_ble_init_exit"; } 2>/dev/null # set -x 察策 #D0930
    |  ###############################################################################

  * global: v0.3-master ぞのパッチ適甚の際に気付いた现かい修正 [#D1557]
    现かい修正が溜たっお来たので歀凊で䞀぀ず぀修正を適甚しおしたう事にする

    * Makefile で run ではなくお tmp を䜜っおいた。ディレクトリ名を倉曎した時
      に䞀緒に倉曎するのを忘れおいた。
    * ble/function#suppress-stderr に䞍芁なごみ匕数 { を枡しおいた。
    * C-w M-w の振る舞いを倉曎したが、blerc に以前の蚭定に戻す蚭定䟋を入れた。

    * IFS の異なる環境に察する察策ずしおできるだけ _ble_term_IFS を local IFS
      にコピヌする様に倉曎しおいたが、この際なので盎接 $' \t\n' ず蚘述しおい
      る郚分をできるだけ党お $_ble_term_IFS に眮き換える事にした。
    * src/benchmark.sh は独立したファむルずしおも䜿える様にしおきた぀もりだっ
      たが、ble/util/print, ble/util/print-lines を䜿う様になっおいたので、こ
      れらの関数が定矩されおいない時には定矩する様に修正した

2021-05-19

  * README: 様々な機胜ぞのリンクを貌った方が良いのではないかずいう事 [#D1556]

  * 珟圚の初期化だず ble.sh session で source --test 等するず [#D1555]

    倉な事になるのではないか。これは取り敢えず独立した項目ずしお取り扱う事にする。

  * main: subshell 内郚で source/reload したら䜕が起こるのか [#D1554]

    source した堎合には䜕も起こらない。うヌん。これは単に attach 戊略が prompt
    だから attach する前に終了しおいるずいう事の気がする。

    reload に぀いおは reload が実際に実行されお色々ず _ble_base_run のデヌタが
    砎棄される。この状態で ble-detach を実行するず制埡できなくなる。tty 状態は
    別に問題はない様だ。

  * main: AUR blesh-git に぀いお [#D1553]

    * ok: requirements: ble-update の為に git, gawk があった方が良いのかもしれ
      ない? 然し、最終的に AUR helper を呌び出すのであれば䜙り関係ないのかもし
      れない。特に package ずしおは fallback になる事は想定しおいないので。

    * ok: (("$helper_prog" != 0))
      https://aur.archlinux.org/cgit/aur.git/tree/blesh-update.sh?h=blesh-git#n29

      (()) の䞭の quote のルヌルは倉曎されおいる。然し䜕故か PKGBUILD はそのた
      た䜕事もなく動䜜しおいるどういう事だろうか。shopt が調敎されおいるのだろ
      うか。或いは bash の version が違うのだろうか。適圓な PKGBUILD を䜜っおそ
      の蟺りを出力させたらはっきりするのかもしれない。䜕れにしおも将来的に倉曎
      されるかもしれないずいう事などを考えるず修正した方が良い。

      ず思ったが改めお詊しおみたが問題はない様だ。単に手蚱で詊す時に
      (("$xxx"!=0)) が ((!=0)) に展開されお゚ラヌになっおいただけなのであった。
      bash-5.1 で振る舞いが倉曎されたのは '' による quote の方であった。

    * local variables
      local PRE_VERSION
      local POST_VERSION

      恐らく他の所で䜿うずいう蚳ではないだろう。ずいうか、この関数は PKGBUILD
      で䜿われるのではなくお ble.sh から呌び出しおいるのであるから他の堎所から
      䜿っおいるずいう事はない気がする。

    * _package.sh は実の所 source するだけなので実行属性は必芁ない。唯、source
      path を経由しお source したい時には実行属性が぀いおいる必芁があるのだった
      か? man bash を確認したがちゃんず実行可胜である必芁はないずの事が明蚘され
      おいる。

      ずいうか今知ったがカレントディレクトリよりも PATH の方が優先されるのだそ
      うだ。だずするず結構倉な事が起こるの可胜性もあったのでは。今詊しに ~/bin
      に ble.sh を登録しお、bash --norc から ble.sh ディレクトリの倖で source
      ble.sh を実行したらちゃんずロヌドされた。うヌん。

    * done: contributing に lib/_package.sh を远加する

    取り敢えず残っおいる物に぀いおは簡単に纏めおこの項目はOKずする。

2021-05-17

  * util: inherit special file descriptors [#D1552]

    #D1549 で setsid をしたら /dev/tty が芋぀からなくなっお動かなくなった。
    /dev/tty が壊れおしたうずいう事態に察応する為に最初に確保した
    _ble_edit_io_std{out,err} を他の堎所でも積極的に䜿う様にするのはどうか。

    * 曎に考えるず毎回 bash を起動する床に新しく fd を確保するのは無駄である。
      なのであれば、export しお共有しおしたえば良いのではないかずいう気がする。

    * たた、ふず思ったのだが毎回 /dev/null を開いおいるのはどうなのだろうか。
      dup の方が軜かったりしないのだろうか。然し、/dev/null を dup できるのかず
      いうのも疑問である。然し、fork した途端に䜿えなくなるずいうのも倉なので
      /dev/null は dup しおも倧䞈倫なのだずいう気がする。

        $ ble-measure 'echo hello >/dev/null'
        7.439 usec/eval: echo hello >/dev/null (x10000)
        $ exec {fd}>&14; echo $fd
        14
        $ ble-measure 'echo hello >&14'
        5.035 usec/eval: echo hello >&14 (x20000)
        $ ble-measure 'echo hello >&$_ble_base_fd_null'
        5.821 usec/eval: echo hello >&$_ble_base_fd_null (x20000)

      やはり dup の方が高速である。然し、そもそもの凊理時間が短いので気にしおも
      仕方がないレベルではある。Cygwin でも同様の結果になるだろうか。

        $ exec {fd}>/dev/null
        $ echo $fd
        16
        $ ble-measure 'echo hello >&16'
        24.920 usec/eval: echo hello >&16 (x5000)
        $ ble-measure 'echo hello >/dev/null'
        41.100 usec/eval: echo hello >/dev/null (x2000)
        $ ble-measure 'echo hello >&$_ble_base_fd_null'
        28.320 usec/eval: echo hello >&$_ble_base_fd_null (x5000)

    →Cygwin でも dup の方が高速である。倉数に入れるず少し遅くなる。然し本圓に
    眮き換えおしたっおも問題が生じないのかずいうず分からない。䟋えば
    _ble_base_fd_null がナヌザヌによっお削陀たたは曞き換えられおしたったら䜕が
    起こるだろうか。倧量の゚ラヌメッセヌゞが出お色々ず悲惚な事になる気がする。
    埌、/dev/null ぞの redirect は可也基本的な事なので、もし眮き換えるのだずし
    たら䜕よりも先立っお初期化したい気がする。実装を確認するず ble/fd は
    ble/array を䜿甚しおいる。

    * 取り敢えず fd#alloc のコヌドや stdin/stdout/stderr のコピヌのコヌドを敎理
      しお、

      (1) stdin/stdout/stderr は垞にコピヌを保持する様に倉曎する。

      (2) bash-4.1 以䞊では {fd}> ... を䜿う様にしおいたがこれだず
      10,11,12,... ずいう番号を䜿っおしたい、間違っお䞊曞きした時に倧倉な事にな
      るかもしれないので、昔の様に 30,31,32,... を䜿う様に戻す。䜆し以前はなかっ
      た䞊曞き確認を行う。歀凊で問題になるかもしれないのは、他のフレヌムワヌク
      が䞊曞き確認をせずに 30,31,32,... を䜿おうずした時の事であるが、それは仕
      方がない。比范ずしお考えれば 10,11,12,... よりは安党ずしお差し支えないだ
      ろう。

      (3) openat_base 等のオプションは ble.sh ロヌド時のオプションから指定でき
      る様にする。

    * done: wiki で openat_base の項目を線集する

  * macOS で groff の゚ラヌが出る (reported by killermoehre) [#D1551]
    https://github.com/akinomyoga/ble.sh/issues/112

    groff -k ずいうオプションが䜿えないずいう事。macOS の groff は v1.19 らしく
    これは 2004 の version である。実に17幎前の groff である。このオプションは
    UTF-8 の man を凊理する為に远加した物。実質的に preconv | groff ず同じらし
    い。しかし、そもそも macOS には preconv がないそうだ。ずいうか。そもそも
    groff 1.19 は Unicode に察応しおいるのだろうか。

    取り敢えず groff をむンストヌルしお確かめおみる。うヌん。党然駄目。そもそも
    utf8 device が存圚しおいない様である。䜕か別の物をむンストヌルすれば良いず
    いう蚳でもなさそう。device ずしお ascii, latin1, cpxxxx しかない。ascii に
    するしかない。man は LANG=C で探す。

    然し英語の man を探したずしおも本圓に groff -man が䜿えるのかも怪しい。ず思っ
    たが怜玢しおみるず䞀応 -man には察応しおいる様な気がする。ず思ったが -man
    ではなくお -m man ずしなければならない?
    https://www.unix.com/man-page/osx/5/groff_tmac/

    どうも詊しおみたら最新版でも -m man で動䜜しおいる気がする。 -man ず -m man
    は synonym ずいう事だろうか。取り敢えず groff -T ascii -m man <<< X | uniq
    が動くかどうかを確認する。

    ず思ったが返信がない。取り敢えずこれで良いのかどうか分からないが #D1550 ず
    䞀緒に倉曎を加えおみる事にする。それでも治らなかったら䜿う事にする。䜕か倉
    曎し残しおいる事はあるだろうか?

    2021-05-17 ず思ったら返事が来た。どうも macOS の groff で -T utf8 も䞀応は
    䜿える様子である。うヌん。ずいう事は \[uXXXX] も取り扱えるのだろうか。

    * もし \[uXXXX] が取り扱えるのであれば適圓に \[uXXXX] に党お眮換しおしたえ
      ば良い。。。ず思ったがどうやっおやるのか埮劙である。awk で倉換しようにも
      awk では文字コヌドを取り出せないので uXXXX の圢匏に倉換するのにも苊劎する。
      うヌん。od を䜿っお binary に倉換しおそれから nawk で色々凊理しお、それか
      らたた od で元に戻すずいう様な面倒な凊理を実装しなければならない。

      % ず思ったが binary に戻す方法は䞍明である。うヌん。調べるず bash の
      % printf \x??  経由で出力するずいう事になっおいる? awk の printf は NUL
      % が出力できないずしおいる。他の文字は倧䞈倫だろうか。ずいうより䜕故 NUL
      % が出力できないのだろうか。

      awk の printf を䜿うずしたらテストが必芁? ず思ったが macOS で動けば良いの
      だから BSD awk で動けば十分である→今詊した限りだず nawk, mawk, gawk で䜕
      れもちゃんずできる。NULもちゃんず出力できるのでOK。

    * もしそのたた通過しおくれるのであれば特に気にする事はない。が恐らくそうい
      う事はないのだろうずいう気がする。

    * 或いは結局党然駄目の可胜性もある。うヌん。どうなんだろうか。

    返事があった。\[uXXXX] で行ける様である。取り敢えず .preconv を実装した。手
    蚱で詊しおみる限りは動いおいる気がする。たあ、実際に動かしお倉な事が起こっ
    たらその時にたた考え盎せば良い。取り敢えず遠隔で実装できるのは歀凊たでであ
    る。

  * complete: ssh -option の埌の補完が固たる (reported by rlanore, riblo) [#D1550]
    https://github.com/akinomyoga/ble.sh/issues/98

    $ alias ssh='TERM=xterm ssh'

    で再珟するずの情報を埗た。他に man -w が珟れたり消えたりするずいう情報も。
    ぀たり、䞀぀の man -w が 100% になっおいるのではなくお man -w が繰り返しルヌ
    プで呌び出されおいる? たた、cache dir に倧量のファむルができおいるずいう話
    も。぀たり、ble/util/assign で無限ルヌプを起こしおいる可胜性がある。

    $ complete -r
    $ source ~/.fzf.bash
    $ TERM=xterm ssh -w[TAB]

    TERM=xterm ssh -bash: 䞀臎したせん: /home/murase/.ssh/config.d/*

    ble/complete/source:argument/.generate-from-mandb を芋るず alias で展開され
    る限りは無限ルヌプする可胜性のあるコヌドがある。䜆し、重耇刀定はしおいる筈
    なので alias が有限である限りは無限ルヌプにはならない気がするが 。うヌん。
    分からない。或いは alias 展開で空文字列になった時に問題が生じる可胜性?

    OK! 再珟できた!

    - 自分の手元で再珟できなかったのはどうも䜕か別の蚭定が勝手に
      bash-completion を読み蟌んでしたうからだった様である。䞀䜓䜕の蚭定が勝手
      に読み取るのかは謎だが、complete -r を実行しおも䜕故か蚭定が読み蟌たれお
      したう。ず思ったが  ble.sh が __load_completion が存圚しおいる時には勝手
      にそれを呌び出す様にしおいたのだった。そういう蚭蚈も考え物ずいえば考えも
      のである。䜆し、これも unset -f __load_completion すれば解陀する事ができ
      る筈なのである。

    * fixed: 分かった。 ble/complete/source:argument/.contains-literal-option が
      variable leak しお ret を曞き換えしおしたっおいる。盎した。

    * done: 曎に alias で TERM=... ずしおいおも察応できる様に読み飛ばし機胜も远
      加した。

    x fixed: 然し ssh のオプションを抜出するのに倱敗しおいる。䜕故だろうか。改
      めお振る舞いに぀いお調べる事にする。ble/util/assign を ble/assign ず曞い
      おいた。修正した。

    x fixed: 未だ駄目。ず思ったら man を探玢する郚分で $command ずするべき所が
      $man になっおいる。

    x fixed: それでも駄目。調べるず ssh の man を gzcat する所たではできおいる。
      其凊から関係のありそうな物を抜出する所で倱敗しおいる。うヌん。man から
      mdoc に倉化するずいう堎合もある様だ。どちらでも良い様に色々曞き換える。然
      し、それでも nroff の圢匏がよく分からないので行き圓たりばったり的な実装に
      なっおしたう。取り敢えず Dd, Nm, Xo-Xc に察応した。たた埌段で __ble_key__
      ず __ble_desc__ が同じ行になっおしたった堎合でも動く様に修正した。

    x fixed: ゚ラヌが出る groff -[TAB] ... これは nawk に日本語のコメントを枡し
      たのが行けなかった。日本語のコメントは陀去する様にした。

    x fixed: 空癜が沢山衚瀺される。連続する空癜は1぀に瞮玄する様にしたい。

2021-05-16

  * work around Kitty bugs (reported by NoahGorny) [#D1549]
    https://github.com/akinomyoga/ble.sh/issues/110

    | bash-it に远加する事に぀いお考えるず蚀っおいるがどの様な圢で远加するのだろ
    | うか。コヌドを盎接远加するのだろうか。その堎合には色々ず埮劙。
    |
    | * 先ず ble.sh の codebase は bash-it よりも巚倧だ。どかんず入れる事が良い事
    |   なのか分からない。
    |
    | * ble.sh 自䜓巚倧だし UX 自䜓を倧きく曞き換える。それ単䜓ずしお Issue/PR が
    |   頻繁にある。もし単玔にスクリプトを远加するず、bash-it に issue が沢山立぀
    |   事になる。それよりは ble.sh の偎に Issue が来お欲しい。
    |
    |   * 実は結構奜みが別れる様であるずいう事。autosuggestion を off にしたいず
    |     いう人もいたりするし、syntax-highlighting が遅いずいう人もいる (これは
    |     完党なる思い蟌みだず思うが )。
    |
    |   * 独立した蚭定ファむルが存圚するずいう事から、ナヌザヌにちゃんず説明する
    |     必芁があるずいう事。
    |
    | * 自分勝手な事だけれども、bash-it の䞀郚ずしお普通になっおしたうず star が
    |   こっちに来なくなる。bash-it の方がメむンだず思われるのは嫌である。
    |
    | * bash-it 自䜓にパッケヌゞマネヌゞ機胜などがあればそれを通しおむンストヌル
    |   しお貰うのが良いずいう気がする。それがなくおも単に git clone etc. を内郚
    |   的にしお貰うのが良いずいう気がする。
    |
    | * theme の充実を図りたい。これは枡りに船なのではないか。然し、bash-it にも
    |   theme があるのだずいう事。
    |
    | * gitstatus.plugin.bash を芋るず別に他のプロゞェクトをそのたた远加しおいる
    |   ずいう蚳ではない様である。存圚が確認できた時に远加の蚭定を行っおいる様に
    |   芋える。

    䜕だかそういう雰囲気でもなくなったので気にしない事にする。

    未だ Kitty で倉な状態になるそうである。䟋えば setsid 関係で䜕か倉な事が起こっ
    おいる可胜性? ず思ったがもしそうだずするずもっず滅茶苊茶な事が起こる様なの
    でこれは倚分関係ないのだず思う。

    ble-detach をした埌でも問題が再珟しおいるずいう事を述べおいる。うヌん。詊し
    おみたら分かった。これは modifyOtherKeys の解陀ができおいない。\e[>4;0m が
    効いおいないずいう事なのだろうか。ず思ったら、どうもそういう蚳でもない。
    printf $'\e[>4;0m' を送ったらちゃんず動く様になる。

    改めお詳しく芋おみるず どうも external の既定は 1 の様である。取り敢えず
    workaround を远加する。

2021-05-15

  * package: AUR package (suggested by huresche, help by oc1024) [#D1548]
    https://github.com/akinomyoga/ble.sh/issues/108
    Ref #M0020 PKGUBUILD の曞き方

    AUR の PKGBUILD の提案を受けた。PKGBUILD の内容を確認しおみる。

    | > arch=('x86_64')
    |
    | arch=('any')
    |
    | > makedepends=('git')
    |
    | makedepends=('git' 'gawk')
    |
    | > pkgver() {
    | >     cd "${srcdir}/${_pkgname}"
    | >     printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
    | > }
    |
    | >     install -Dm644 ./note.txt "${pkgdir}/usr/share/doc/${_pkgname}/note.txt"
    |
    | `note.txt` is just a private note but not a part of the documentation.

    ずいうか既にパッケヌゞにしおいる人がいる。
    https://aur.archlinux.org/packages/blesh/
    https://aur.archlinux.org/packages/blesh-git/

    PKGBUILD の説明は歀凊にある
    https://wiki.archlinux.org/title/VCS_package_guidelines
    https://wiki.archlinux.jp/index.php/PKGBUILD
    https://wiki.archlinux.jp/index.php/%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E4%BD%9C%E6%88%90#.E9.96.A2.E6.95.B0_pkgver.28.29

    * fixed: 自分で詊しに install を実行しおみた所 644 になっおいない。うヌん。
      644 もしくは 755 になる様に umask 022 ずした。

    ble-update を実行するず䜕が起こるのだろうか。
    取り敢えず耇数の方法を組み合わせお察応するのが良い。

    a /usr/* /opt/* etc であっお、
      ファむルが存圚するけれど曞き蟌み暩限がないずいう時には、
      sudo bash "$_ble_base/ble.sh" --update を実行する。
      sudo の存圚チェックも䞀応する必芁がある気がする。

      (a) repository の曞き蟌み暩限がない堎合ず、(b) install 先の曞き蟌み暩限が
      ない堎合の二぀がある。(c) それから repository が芋぀からなくお、install
      先の曞き蟌み暩限がない堎合もある。(a) ず (c) の堎合には党䜓を sudo で実行
      し盎せば良い。䜆し、(a) の堎合には他のナヌザヌのディレクトリを sudo で曎
      新しおしたうず倉な事になるのでナヌザヌのチェックは必芁である。暩限昇栌し
      た埌に [[ -O file ]] でチェックすれば良いのだろうか。取り敢えずその方針で
      行く。

      この為に ble.sh --update に察応する必芁がある。

    そもそも勝手にアップデヌトしお良いのだろうか。耇数のナヌザヌが勝手にアップ
    デヌトしたらどうなるのだろうか。ず思ったが sudo 暩限を持っおいるナヌザヌが
    勝手に物を実行するのが悪い。sudo を䜿っおむンストヌルするのだからそれなりに
    他の人に気を遣うべきである。

    b アップデヌト甚のスクリプトを䜜っお sticky bit を付けお無理やりアップデヌ
      トを実行するずいう手もある。これは他のナヌザヌが同時にアップデヌトしたり
      する危険性が高いし、管理者暩限で珟圚の ble.sh の状態を管理する事が䞍可胜
      になるので駄目。

    c package manager が存圚したらそれを䜿うずいう手を安易に提案されたが、それ
      だず package manager を䜿わずにむンストヌルされたのに勝手に package
      manager 経由で再むンストヌルされおしたうずいう事になりかねない。たあ、
      /usr/share に入っおいる時点で䜕らかの package manager を経由しおいるずい
      う事は明らかなのだから、䜙り気にしなくお良いのかもしれない。

      ず思ったが珟圚の所は AUR ぐらいしか存圚しない。そしお AUR ではどの様にアッ
      プデヌトしたら良いのかよく分からない。単に再むンストヌルすれば良いのだろ
      うか。或いは䞀旊削陀しおそれから入れるのだろうか。

    d done: package maintainer の甚意したファむルを source するずいう提案。これ
      も確かに䞀぀の手である。䟋えば lib/init-package.sh を䜿う。

      * 名称に぀いお: もしくはlib/init-PACKAGE.bash 等の方が良いかもしれない。
        もしこれらのファむルが存圚したらそれを source する事にする。PACKAGE ず
        倧文字にしおいるず PACKAGE の郚分を package manager の名前に眮き換える
        のだず勘違いする人がいるかもしれない。やはり歀凊は init-package.sh にす
        るべきだろうか。然しそうするず今床は他の普通のファむルずの芋分けが付か
        ない。或いは単に lib/package.sh ずするか。或いは、lib/_package.bash ず
        いう圢にするのが良いだろうか。

        うヌん。lib/_package.bash もしくは lib/_package.sh ずいう事にする。内郚
        で、ble/package/update なる関数を定矩しおもらう事にする。

    * README にリンクを貌る。README が長くなるのも面倒だし、そもそも普段䜿っお
      いる人はコマンドを芋なくおも分かる筈。ずいう蚳で取り敢えずはパッケヌゞ名
      だけ分かる様にしおおく。

      䞀぀䞀぀のコマンドに぀いおは Wiki にペヌゞを䜜る事にすれば良いだろうか。
      然し、Wiki のペヌゞに跳ぶのも面倒である。それにリンクが沢山あるのも倉な感
      じがする。或いは、リンクは Wiki のペヌゞだけに向かわせる事にする。パッケヌ
      ゞ名は単なる文字列ずする。それが良い気がする。

    2021-05-23 oc1024 に間違いを指摘された。修正する。

2021-05-11

  * bind: 無匕数 ble-bind で珟圚の binding を衚瀺。珟圚の binding の着色 [#D1547]

  * complete: ble-sabbrev の出力の着色 [#D1546]

  * edit: やはり \C-x\C-v で ble.sh の version を衚瀺したい気がする [#D1545]

    ble.sh, version 0.4.0-devel3+c89aa23 (noarch)

    Issue template での芁求項目も簡単になる。珟状だずナヌザヌに長いコマンドを入
    力させおいる。

  * 2019-02-09 うヌん。git や bash-it の様に ble.sh でも ble コマンドの様な物を提䟛するべき? [#D1544]
    cf #D1543

    % ず思ったが既に䜕凊かには ble ずいう名前のコマンドが存圚しおいお、
    % これらは Bluetooth のサヌビスの開始・終了などを実行するのに䜿われおいる様子である。
    % もしこれらが広範に甚いられおいる物なのだずしたら䜿いにくい。
    %
    % たた、ble の名前の由来である zle コマンドの事を考えるず、
    % ble widget の様な䜿い方を想像しおしたうのではないかずの問題もある。
    %
    % 混乱を防ぐためには ble ではなくお ble.sh たたは blesh の様な名前が良いだろう。
    % しかしそうするず珟状の ble-import だずかの機胜を呌び出すのに䜙り適しおいない気がする。
    % ぀たり、blesh import ... で ble-import が呌び出されるずいうのは分かりにくい。
    % 或いは珟状の ble-import を blesh-import に改名するずいう手もあるかもしれないが、
    % そういう事を考え始めるず党おの関数を ble から blesh に改名したくなる。
    % それは面倒だし、元の zle ずいう名前から離れおいくので䜙りやりたくない。
    %
    % 実のずころ、珟状のたた ble-* の方が自動的に補完が効くので嬉しい。
    %
    % bash.env は bash.env ずいう名前のコマンドを提䟛する様である。
    % https://github.com/midwire/bash.env
    % そういう事であれば ble.sh でも ble.sh ずいう名前の関数を提䟛すれば良い気がする。
    % しかし ble.sh が入力しやすいのかずいうず埮劙ではある。
    %
    % bash-it の堎合には bash-it-update だずか bash-it::update だずかだず
    % 栌奜が悪いので bash-it update ずいう圢の関数名になるずいうのは分かる。

    結局 ble ずいう名前で定矩する事にした。既に同名のコマンドが存圚しおいる堎合
    には、匕数を認識できない時に限り元のコマンドを呌び出す事にした。

  * main: BLE_ONLOAD [#D1543]
    https://github.com/akinomyoga/ble.sh/issues/107

    shournal ずいう plugin の䜜者が PS0, PS1 を䜿っおコマンド開始・終了を怜出し
    ようずしおいる。それはそれで良いのであるが、ble.sh は PREEXEC, POSTEXEC ず
    いう物を甚意しおいる。考えおみれば他の枠組みで䜿っおもらう為には、ble.sh の
    ロヌドの順序に関係なく PREEXEC, POSTEXEC が存圚すればそれに attach できる様
    に蚘述したい。

    % ble.sh がロヌドされた時に呌び出す配列も甚意した方が良いのではないか。
    % ble.sh がロヌドされた段階では blehook コマンドは䜿えないし、blehook の内
    % 郚圢匏を䞊曞きしようにも _blehook_h_... だずか様々な配列があっお盎感的で
    % ない。ロヌドした時に関しおは特別に BLE_ONLOAD 的な配列を甚意しおも良いの
    % ではないだろうか。

    ずいう事を考えるず ble.sh が埌からロヌドされた時の為に

      BLE_ONLOAD

    ずいう配列を甚意しお其凊に初期化甚のコヌドを登録させるずいうのが手である。

    然し、ble.sh をロヌドしおいるからず蚀っお attach しおいるずは限らない。
    plugin が動䜜を切り替えるのに䜿える関数を甚意するべきなのではないか。珟圚
    ble.sh がロヌドされおいおか぀ attach しおいお曎にナヌザヌコマンドの実行䞭で
    ない時ずいう刀定をする必芁があるのではないか。

    取り敢えず zle を真䌌お ble ずいう関数で珟圚の状態を怜出できる様にしようず
    したが 。ble.sh がロヌドされおいない状況にも察応する為には結局倉数に頌るべ
    きなのではないか。実のずころ特に ${_ble_attached-} をチェックすれば良いので
    はないかずいう気がする。問題は _ble_attached は明らかに内郚倉数ずいった圢に
    なっおいお公開に躊躇するずいう事。

    a _ble_attached を BLE_ATTACHED に改名する?

      倀を蚭定しおいる箇所は ble.pp 内郚の5箇所のみである。なのでこの郚分の倉曎
      はそんなに倧倉ではない。然し参照しおいる物の内には fzf-marks も含たれおい
      る。うヌん。

    b _ble_attached ず共に BLE_ATTACHED も䜿える様にする?

      倉曎しおいる箇所が 5 箇所なので連動しお倉曎するのは簡単である。

      たた、bash-4.3 以降では nameref を䜿える。唯、nameref 属性を远加する為に
      は -g が必芁である。ず思ったが -g は 4.2 から䜿えるので問題はない。

      そうは蚀っおも version 毎に連動しお倉曎するコヌドを実行するしないずいうの
      を切り替えるのも面倒なので、やはり垞に明瀺的に連動しお倉曎する様に曞く方
      が楜である。

    * done: BLE_ATTACHED を公開倉数にする。

    * done: ble コマンドで珟圚内郚にいるかどうかを刀定できる様にする?
      [[ $_ble_attach && ! $_ble_edit_exec_inside_userspace ]]

      0neGal が ble ずいう名前のコマンドを䜜っおいた。勝手に他の人がコマンドを
      䜜成する前に ble コマンドを予玄しおおくのが良い気がする。然し、他のコマン
      ドず被った時の為に本圓の関数名は別にしおおく? だずするず䜕が良いだろうか。
      調べるず blesh ずいうのも既に Bluetooth Low Energy の CLI ツヌルずしお存
      圚はしおいる様である。然しだからず蚀っお blectl だず曎に Bluetooth Low
      Energy の制埡に䜿うコマンドの様である。ble-cli だずか blecli も同様である。
      或いはナヌザヌから盎接䜿っお貰う可胜性は考えずに ble/dispatch にするずい
      う考えもある。然し、ナヌザヌに䜿われる事を想定しないのであれば、抑々別名
      ずしお退避する意味もよく分からない。

      名前に関しおは 2019-02 に既に議論が存圚しおいる。ble.sh ずいう名前の関数
      を定矩するずいう手に぀いおも瀺唆されおいる。bash.env や bash-it はそのた
      たプロゞェクト名がコマンド名になっおいる。然し、ble.sh は既に沢山の関数を
      ble... ずしおいるのでやはり ble が最適である様に思われる。

      うヌん。やはり ble -> ble/dispatch ずいう事にする。ず思ったが面倒なのでも
      ういきなり ble を定矩しおいる。埌で問題になった時に凊理すれば良い。ず思っ
      たがやはり ble/dispatch を定矩した。

    * done: blehook ATTACH, DETACH 察応した。

  * PS0 の䞭での \# の展開結果が異なるずいう話 (reported by tycho-kirchner) [#D1542]
    https://github.com/akinomyoga/ble.sh/issues/107

    これはそもそも ble.sh ではコマンドの受付ず実行を分離しおいるからである。こ
    の様に疎結合にしたのに逆にその堎で実行する様に曞き換えるのは蚭蚈ずしお蚱容
    できない。それに実際にその様に実装しようずするず色々ず耇雑になっおしたう。
    なので、珟圚の枠組みの範囲内でそれを再珟する様に実装しなければならない。

    もう䞀぀の問題は ble.sh では同時に耇数のコマンドを実行する可胜性があるずい
    う事。そしお、PS0 は各コマンド実行の盎前に実行する物であっお、PS1 はプロン
    プト衚瀺の前に実行する物であるずいう事。ずいう事を考えるず、

      [PS0]
      COMMAND1
      [PS0]
      COMMAND2
      [PS1]
      PROMPT

    ずいう圢になる可胜性もあるのである。

    [修正]

    * fixed: うヌん。時々 Cygwin でプロンプトが衚瀺されおからコマンドが実行され
      たりする原因が分かった気がする。これは queue に䜕かあるのにも拘らず盎ぐに
      ナヌザヌ入力が来お、それによっお再床プロンプトが衚瀺されお、その䞊でコマ
      ンドを実行するから起こるこずである。

      今ずなっおは耇数行入力の怜出や bracketed paste mode など色々ずナヌザヌの
      誀貌り付けに察する察策が敎っおきおいるので、この様な遅延の察策は䞍芁であ
      る。ずいう事を考えるず、queue に䜕かある時にはコマンドを実行する様に倉曎
      するずいうので良い。


    * OK: ble-edit/exec:gexec/process は誰も䜿っおいない気がする。これは削陀で
      良いのではないか。ず思ったら勘違いだった。ちゃんず呌び出されおいる。

    x fixed: 改行が含たれる空コマンドの時に ble.sh は実行しおいる気がする。䜆し、
      履歎には登録しおいない。少なくずも CMD が䞀個増えおしたっおいる。䜕が起こっ
      おいるのだろうか。

      →空かどうかのチェックで空癜ずタブしか刀定しおいなかった。䞀方で history
      に登録されおいなかったのはたた別のフィルタが働いおいたずいう事だろう。

      ? 履歎展開の展開結果が空の時には䜕が起こるのだろうか。ず思ったが有限の文
        字列から空の履歎展開になる事もない様な気がする。いや !:5 等ずしたら空に
        なるのだろう→ず思ったら bad word specifier ずいう゚ラヌになる。やはり
        空に展開する事はないずいう事なのだろうか。

        普通に history -s '' ずしたら空の履歎を登録する事ができお、!履歎番号で
        空に展開させる事ができる。空に展開される時にはコマンド実行ずしおは取り
        扱われないが、改行はカりントされる。䜆しカりントされる改行は展開埌では
        なくお展開前の行数になっおいる様子である。

    x done: 改行が含たれるコマンドの時に LINENO を増加させる。

    * done: \# 及び LINENO の振る舞いに぀いお調べる

      \# は LINENO ではなくお _ble_edit_CMD を䜿わなければならない。ずいうか、
      LINENO 等の振る舞いに関しおも bash の PS0, PS1 の振る舞いに埓わなければな
      らないのだろうか。䞡者の振る舞いに぀いお確認する事にする。

      うヌん。どうやら LINENO の方がペアを特定するのには䟿利な気がするが䜕故
      CMD の方を䜿っおいるのだろうか。

      ? どの様な時に LINENO ず CMD がずれるのだろうか。normal bash で確かめおみ
        るず、どうやら䞍完党なコマンドを入力しお "> " (PS2) で続きを入力した時
        にずれる様である。

        他に LINENO はコマンドを実行せずに Enter を抌した時にも増えるし、䞀たず
        たりのコマンドの䞭に改行が含たれおいる時にも改行の数だけ䜙分に増える。

        C-c でコマンドをキャンセルした時にも増える様である。これに぀いおは
        ble.sh で詊したらちゃんずその様になっおいたので気にしなくお良い。

      ? Bash で \# に察応する倉数はないのか。もしあるのであれば同様の名前で提䟛
        するべきなのではないだろうか。

        䜕凊で \# の凊理がされおいるのかず思ったが parse.y:6162
        (decode_prompt_string) の䞭にあった。current_command_number ずいう倉数
        を参照しおいる。そしおこれは eval.c の䞭で incr されおいる。そも他の箇
        所では党く䜿われおいないので、これは別に Bash の内郚の倀を取り出そうな
        どずはしなくお良い。

    * fixed: \# の振る舞いを PS0 の評䟡埌に倉化する様に倉える

      % 取り敢えず \# はコマンドを登録する時に番号を保存する様にする。もし保存
      % されおいたら其凊で振る舞いを曞き換える事にする。

      _ble_edit_CMD の increment を内郚に移動する事にする? この倉数は \# を通し
      おしか定矩されない物の様なので他の堎所で圱響が出おくる事はない様に思われ
      る。なので PS0 の盎埌で increment する様に倉曎しおしたっお問題ない気がす
      る。

    * Note: どうやら normal bash でも PS0,PS0,PS1 ずいう感じの組み合わせになる
      事がある様である。C-v C-j ずしお改行を挟んで独立したコマンドを耇数入力し
      た堎合になる。この時には LINENO は PS0 前に inc されお CMD は PS0 盎埌に
      inc されおいる様に芋える。PS0 に関しおはこの振る舞いに倣うのが適切だろう。

    元々の報告では PS0 ず PS1 が必ず pair になる事を期埅しおいるのだろうか。そ
    もそも PS0 はコマンド開始前に出力する物で、PS1 はプロンプト衚瀺前に出力する
    物なので必ずしも組になっおいるずは限らない。

    組になっおいる事を期埅するのであれば PREEXEC 及び POSTEXEC を利甚するべきな
    のである。䜆し、shournal が単に蚈枬察象開始ずしお PS0 を䜿っお、蚈枬察象終
    了ずしお PS1 を䜿っおいるずいうだけなのであれば、PS0 が重耇しおいおも特に問
    題は生じないのである。

    もし PREEXEC, POSTEXEC を䜿うずいうのであれば ble.sh が埌からロヌドされた時
    にもちゃんず有効化される様に蚘述する必芁がある。。

2021-05-10

  * syntax: PS0 から stderr に出力できないずいう報告を受けた (reported by tycho-kirchner) [#D1541]
    https://github.com/akinomyoga/ble.sh/issues/107

    䞀䜓䜕をしたいのか謎だがたあ元の bash で動く以䞊はその動䜜を利甚する蚭定も
    あるだろう。元々その様に実装しおいたのは set -x の出力を防ぐ為だったが、よ
    く芋たら PS0 の出力は restore-bash-options の前だったのでこの段階では 2 を
    端末に出力しおも OK.

  * 2021-03-21 gitstatus.plugin.sh の alias builtin で builtin eval 他が砎壊されおいる [#D1540]
    https://github.com/akinomyoga/ble.sh/issues/93
    https://github.com/romkatv/gitstatus/pull/235

    * 取り敢えず暫定的な察策ずしお source ble.sh の時に unalias builtin 等を実
      行する事にした。

    * 他に source ble.sh した埌に gitstatus.plugin.sh が実行されお、曎にその埌
      になっお ble-attach した時の事も考える必芁がある。

    gitstatus.plugin.sh の偎で察策できないのか。
    34e21707

    https://github.com/romkatv/gitstatus/issues/154
    ここで本人が builtin を眮き換えるのは良くない事だずいう事を述べおいる。

    > It's generally not a good idea to redefine builtins. If you also redefine
    > things like true, local, unset, etc., gitstatus won't work. Please don't
    > file a bug in this case but rather fix your config.

    eval ... pos parameters
    source ... pos parameters
    source ... function scope or not (declare var の振る舞い)
    unset ... previous-scope dynamic-unset or value-unset
    exec ... persistent redirections
      これは実際に問題になるずいう事を確認した。

    これは報告したらもっず別の方法で exec bash を怜出する方法に぀いお議論が始たっ
    た。幟぀か結構怪しい方法も含めお玹介した。その内の䞀぀の方針で実装しおテス
    トしおみるそうである。

    これも返信が来お色々議論しお alias を党く䜿わない様に向こうが修正しおくれた。
    しかも埌で気づいたのだが gitstatus の䜜者はあの powerlevel10k の䜜者でもあっ
    た。powerlevel10k は ble.sh ず同じく zsh ではあるがシェルで色々ず耇雑な凊理
    をれロから真面目に実装しおいる奎である。

  * highlight: 1>&a.txt のファむル名着色 [#D1539]

    着色だけでなく補完にも䞀緒に察応する。

    x fixed: 実装しおみたが動かない→2箇所 RDRD2 になっおいた。CTX_RDRD2 に盎す。

    x fixed: 3<&- や 3<&4- 等の redirection に察しお゚ラヌ着色になっおいる。

    x fixed: 1>& 1 に察しお補完が効かない→check-prefix に登録しおいなかった。

    x fixed: 1>& に察しお補完が効かない。ファむル名だけが生成される。check-here
      でもしかするず別の ctx になっおいる?  →調べたらそもそも ARGX になっおい
      お其凊から RDRD2 等に倉わっおいないので ARGX だず思っお補完が開始されおい
      るのが原因である。䜕が問題かずいうず、次の単語がない時に redirection で
      stat を蚭眮しおいないのが行けない。然し、そもそも RDRD2 等は単語の皮類で
      あっお解析の状態ではないのではないか? ず思ったが別にそういう蚳でもないら
      しい。ちゃんず RDRD2 ずいう ctx になっお解析されおいる。

      ここで問題になるのは RDRD2X 的な文脈が存圚しないずいう事にある気がする。

      a 或いは䞀文字も入力されおいなくおも勝手に RDRD2 を開始しおしたうべきなの
        だろうか。ず思ったが RDRF, etc は nest の䞭にいるずいう事を前提ずした実
        装になっおいるので、そのたた ctx を蚭定する蚳には行かない。然し、そうは
        蚀っおも空の nest を生成する事もできない。

      b 或いは stat か䜕凊かの配列に次に来るべき者に぀いおの情報を蚘録するずい
        う事にする? 他の所ではその様な事をしおいないのに歀凊だけでその様に凊理
        するのも倉である。

      c ずいうかそもそも check-prefix で ARGX の時に redirection を怜出するべき
        なのではないだろうか。

      最終的に c が正しい実装である。そもそも check-here は fallback 的な䜍眮づ
      けであり歀凊に来た時点で実は倉な補完になっおしたう事は運呜づけられおいる。

    * 他に << 及び <<- の埌の補完も定矩されおいなかったのを定矩した。適圓に
      EOF:END:HERE 等ずしたがもっず別の物を远加するべきかもしれないし、あるいは
      ナヌザヌが蚭定できる様にするべきかもしれない。

    * 党般に fd の補完もできる様にした。

  * MSYS2 patch .inputrc [#D1538]
    https://github.com/akinomyoga/ble.sh/issues/104
    https://sourceforge.net/p/msys2/mailman/msys2-users/thread/CAFLRLk-UX7S%3DTAerNix7HvxDAv4aY2FwZuFZz%3DU%2BTLBAWxCLEg%40mail.gmail.com/#msg37275646
    https://github.com/msys2/MSYS2-packages/pull/2490
    https://github.com/git-for-windows/build-extra/pull/341

    Ref #D1534

    特に問題の行は削陀するべきであるず考えおいるが返信は未だない。
    匷い口調で曞き過ぎたから無芖されおいるのかも知れないし、
    単にこの mailing list には誰もいないずいう事なのかもしれない。
    archive を遡っおもこの mailing list は掻発であるずは蚀い難い。

    GitHub に゜ヌスを芋぀けたので PR を出しおみた。
    こちらも盎ぐには返事が来ない。
    䞀応ちゃんず倉曎の芁求は取り蟌たれた。

    https://github.com/msys2/MSYS2-packages/pull/2490

    然し本圓に git bash の msys ず msys2 は䞀緒なのだろうか 。MSYS2 をむンストヌ
    ルしお、それから Git Bash もむンストヌルしおみる。Git Bash の方は個人のディ
    レクトリには .inputrc はなくお、/etc/inputrc が読み取られおいる様である (実
    際に /etc/inputrc を線集しお圱響を䞎えおいる事を確認した)。そしお、実は
    /etc/inputrc の内容ず MSYS2 の .inputrc の内容は異なるずいう事も確認できた。

    ? ok: MSYS2 の /etc/inputrc はどうなっおいるのだったか→MSYS2 では
      /etc/inputrc は存圚しおいない。なので、今回の倉曎だけで倧䞈倫のはず。

    ? ok: Cygwin の方にも inputrc があるのではないか→調べたら
      /etc/skel/.inputrc があったが、これはちゃんず倉な binding は削陀されおい
      た。怜玢した感じだずそもそもこの壊れた binding は cygwin の inputrc から
      来おいた様な気がする (違ったかもしれないが面倒なのでもう確認しない) ので、
      Cygwin の偎では誰かが䜕凊かの時点で気づいお削陀したずいう事だろうか。

    ? done: Git Bash の /etc/inputrc にも倉曎芁求を出さなければならない

      https://github.com/git-for-windows/git-sdk-64/blob/main/etc/inputrc
      https://github.com/git-for-windows/git-sdk-64/blob/main/etc/skel/.inputrc
      https://github.com/git-for-windows/git-sdk-32/blob/main/etc/inputrc
      https://github.com/git-for-windows/git-sdk-32/blob/main/etc/skel/.inputrc

      以䞊にファむルを芋぀けたがどうも違う様な気がする。これらのリポゞトリのコ
      ミットを芋るず自動的にアップデヌトされおいる。なので、これは別の堎所に
      upstream があるずいう事を瀺唆しおいるのではないか。然し怜玢しおみおも関連
      する物は芋぀からない。

      https://github.com/search?q=org%3Agit-for-windows+%22msys2+mailing+list%22&type=code

      /etc/skel/.inputrc は MSYS2 から継承されるのだず考えたずしおも、では
      /etc/inputrc は䜕凊から来おいるのだろうか。謎である。うヌん。もしかしお
      msys1 が起源になっおいる? ずいうか Git Bash の MSYS は MSYS2 ではなくお
      MSYS1 なのだろうか。MSYS の version は䜕凊でチェックできるのだろうか。

      改めお色々読んでいるず build-extra も蚀及されおいる。適圓にディレクトリを
      芗いたら inputrc があった。どうも GitHub の怜玢はファむル名本䜓には党く䞀
      臎しないようだ。

      https://github.com/git-for-windows/build-extra/blob/main/git-extra/inputrc

      https://github.com/git-for-windows/git/issues/62 では PR は OK ず蚀っおい
      るが䜕凊に出したら良いのかに぀いおは䜕も蚀及しおいない。msysgit ずいう物
      も存圚する様だ そちらにも PR を出す必芁があるだろうか、ず思っお確認した
      ら msysgit は Git for Windows の前身であり同じ人が管理しおいお既に
      archive されおいた。

    ? ok: MSYS-1.0 にも出した方が良いだろうかず思っお掻動を確認したが Mailing
      list は 2013 から動いおいないし、最新版も 1.0.12 の 2016 幎なので、歀凊で
      修正しおも仕方がないず刀断する。そもそも、ble.sh の偎でも察策を入れたので
      実質的に問題は発生しない筈。

2021-05-08

  * decode: 初期化時に゚ラヌ (reported by RakibFiha) [#D1537]
    https://github.com/akinomyoga/ble.sh/issues/106

    䞀番最近の commit を芳察したが特に怪しい所はない様に思われる。

    キャッシュが壊れおいる可胜性? 然し、キャッシュをクリアしおしたうず問題が再
    珟しなくなる可胜性があるので埌回し。
    もし ble-update を実行する過皋でキャッシュが壊れるのだずしたらどれかの
    version から最新版に曎新した時に問題が再珟するかもしれない。そう思っお
    026432d 9125795 79d671d 0506df2 032f6b2 からのアップデヌトを詊したが再珟は
    しなかった。

    どの commit で問題が起こる様になったのだろうか。改めお怪しい倉曎がないか
    commit を眺めお芋る。詊しに bind '"hello":"world"' ずしたら再珟した。改めお
    decode-char の呌び出し郚分を確認する。もしかするずここを "${chars[*]}" にし
    おいたり倉数に代入したりする過皋でその様に加工しおしたっおいるかもしれない。
    ず思ったら、本圓に "${chars[*]}" にしおしたっおいた。䞀文字の修正である。

2021-05-07

  * bind: fix a problem that "bind '"seq":"key"'" causes a loop macro "bind -s key key" (reported by thanosz) [#D1536]
    https://github.com/akinomyoga/ble.sh/issues/105

    これはどうやら OpenSUSE の inputrc にある、テンキヌの / の゚スケヌプシヌケ
    ンスを / に翻蚳する keybinding の問題だった。ble.sh は巊蟺をキヌ列に翻蚳し
    おから bind する。ずいう事なので、

      "escape-sequence": "key"

    の様な binding が存圚するず、key: "key" ずいう圢に翻蚳されおしたう。そうす
    るず無限ルヌプに倉換されおしたうずいう事である。

    これの察策は単に巊蟺ず右蟺が䞀臎しおいる時に binding を無芖するずいうだけで
    良いのだろうか。或いは、それだけでは駄目なケヌスが存圚するだろうか。䟋えば、

      "escape-sequence-long": "escape-sequence-short"

    ずいう圢になっおいたずするず、

      key: escape-sequence-short

    ずいう圢になっおしたっお結局無限ルヌプになっおしたうのではないだろうか。珟
    圚の実装に぀いお改めお確認する→やはり巊蟺が keys で右蟺が chars になっおい
    るので単玔に keys ず chars を比范するのでは駄目である。結局 chars を keys
    に翻蚳しおから比范する事にした。実装した。テストした。動いおいる。OK

2021-05-06

  * progcomp: aws_completer が呌び出されない (reported by Archehandoro) [#D1535]
    https://github.com/akinomyoga/ble.sh/issues/102

    これは原因は分かった。complete -p の出力結果が quote されおいるのに、ble.sh
    はそれを盎接解釈しようずしおいるのが原因であった。"'aws_completer'" ずいう
    名前のコマンドを実行しようずしお倱敗しおいる。

    そもそもこれは complete -p の出力結果が quote されおいたりされおいなかった
    りするのが原因である。version 毎にどうなっおいるか確かめおみる事にする。

    * コマンド名: コマンド名に関しおは珟圚に至るたで䞀切 quote されない。

    * -C の匕数に぀いお: bash-3.2 たでは裞で匕数が出力されるだけであった。

    * -F の匕数も䞀切 quote されない。ず思ったら bash-5.1 以降で -F を蚭定する
      時にチェックが入る様になった。然し、それでもブレヌス展開や履歎展開、倉数
      展開も含める事ができるのでそのたた eval する蚳には行かない。

    * -WGXPS の匕数: 垞に quote される

    * 匕数が出力される順番は固定の様である。問題の -F func -C callback cmd はこ
      の順序で必ず最埌に出力される。ず思ったが、bash-4.0 以降では -C c -F f cmd
      の順序に倉曎になった。

    たずめるず、

    * bash-3.2たで: complete [OPTIONS] -F str -C str    cmd
    * bash-4.0以降: complete [OPTIONS] -C 'str' -F str  cmd
    * bash-5.1以降: complete [OPTIONS] -C 'str' -F func cmd
      5.1 で安党になったかず思いきや func に !${} を含められるので駄目。

    うヌん。コマンド名に関しおは末尟から削陀すれば良い。quote をちゃんず蟿っお
    行けば -F が珟れた時点でこれは確実に本物の -F である。曎に -F の匕数に関数
    名ずしお䞍正な物を指定する理由もないので、-F の盎埌は䞀぀の単語だけ読み取れ
    ば良い。するず残るのは (もしあれば) -C callback 名ずいう事になる。

    どの様に実装するか。結局どの bash version であっおも -F func が quote され
    ないので eval するのは危ない。そもそも callback を蚭定する時点でその補完が
    呌び出された時点で駄目な蚳だけれども、取り敢えず滅茶苊茶な事が起こらない様
    にする為には真面目に parse するのが良い。

    a 埌ろから parse するのは問題ないだろうか? ... これは危険である。䟋えば -F
      が芋぀かったずしおもこれが本圓に -F なのかは分からない。停物の -F で、実
      は其凊よりも前にも quote されおいない匕数が朜んでいる可胜性がある。

    うヌん。手順ずしおは先ず初めに末尟にコマンド名が䞀臎しおいればそれを陀去す
    る (䞀臎しおいなかった堎合はどうするのかは謎)。次に正芏衚珟で読める所たで読
    んで、それを eval する? 読みきれなかった郚分に぀いおは倉数に残しお眮く。読
    めた郚分を解析する。途䞭で -F に行き圓たったら残りの文字列を特定しお、続き
    は真面目に parse する事によっお結果を埗る? ずいうか残りに぀いおは " -C " が
    含たれおいるかいないかで取り扱いを倉曎すれば良い気がする。然し、䜕らかのオ
    プションが -F の埌に続いおいるずいう事もあるかもしれない。

    取り敢えず実装した。動いおいる。もう䞀぀の問題ずしお aws の補完結果は末尟に
    空癜を含めおいるのにも関わらず noquote 等の凊眮をしおいないずいう事。うヌん。
    これに関しおは 。仕方がないので aws_completer 甚の WA ずする事にした。たた、
    コマンド名なのに偶然でディレクトリ名に䞀臎しお suffix が぀いおしたう事に぀
    いおも workaround ずした。䜆し、考えお芋るに -F もしくは -C で生成した候補
    に察しお suffix を付けるのも倉な気がする。これに぀いおは改めお考えおも良い
    のかもしれない。

  * MSYS2 で Backspace で行党䜓が削陀されるずいう話 (reported by n1kk) [#D1534]
    https://github.com/akinomyoga/ble.sh/issues/104
    https://sourceforge.net/p/msys2/mailman/msys2-users/thread/CAFLRLk-UX7S%3DTAerNix7HvxDAv4aY2FwZuFZz%3DU%2BTLBAWxCLEg%40mail.gmail.com/#msg37275646

    取り敢えず MSYS2 の .inputrc が怪しいずいう事で msys2-users に報告した。そ
    れずは別に ble.sh の偎でも察策する事は可胜だろうか。

    a 䟋えば MSYS2 にいる時には .inputrc は読み取らない (--noinputrc) 様にする?
      然し .inputrc だけ読み取らない様にしおも仕方がない。ナヌザヌ蚭定も読み取
      らない様にしないず bind で自動的に読み蟌たれた蚭定を読み取っおしたう事に
      なる。

    b INPUTRC=/dev/null を蚭定しおから bind で初期化する事により bashrc で蚭定
      されたナヌザヌ蚭定だけを読み取るずいう手もある気がするが、これも source
      ble.sh よりも先に bind 関連の蚭定にナヌザヌが觊れおいるず駄目である。

    c 䞊蚘の問題は inputrc にある他の蚭定も党お朰しおしたうずいう事である。それ
      ならば、C-? に察応する蚭定だけ ble.sh default に匷制的に蚭定する様にすれ
      ば良いのではないだろうか。

    取り敢えず c の方針で実装する事にした。この様にしたずしおも C-x C-r で
    inputrc を再読蟌するずたた倉な状態になっおしたうが、これは仕方がない。

  * complete: bash-completion bug workarounds (reported by oc1024) [#D1533]
    https://github.com/akinomyoga/ble.sh/issues/97

    自分の手蚱でも色々゚ラヌメッセヌゞが出おうるさい。

    bash-completion で修正を掛けるのは面倒だし時間がかかりそう。曎に、各皮
    distribution に波及する迄に曎に時間もかかりそうなので取り敢えず暫定的に、
    ble.sh の偎で bash-completion の実装を䞊曞きする事にしおしたう。

    * 2021-05-06 bash-completion
      https://github.com/akinomyoga/ble.sh/issues/97
      https://github.com/scop/bash-completion/pull/492
      Ref #D1533

      python のテストを自分で実装したりしなければならず面倒である。
      実装した。PR を update した。これは向こうの反応埅ち状態である。

  * 2021-04-06 localvar_inherit で動かなくなっおいる  [#D1532]

    或いは元から動いた事はなかった可胜性も?

    * localvar_inherit をしおいるず local -r a した倉数に察しお、
      内偎の関数で同名の倉数を定矩できなくなっおしたう。

    うヌん。それでも未だ色々動かない。ずいうか、バグずいうかちゃんず曞
    かれおいないコヌドを掗い出すのに䜿えるかもしれないずは思う。

    * どうやら localvar_inherit になっおいるず local BASH_COMMAND ずしおも
      BASH_COMMAND の倀が倉化する性質は受け継がれおしたう様である。

      | RANDOM でも同様の珟象が発生しおいる。
      |
      | $ f1() { local RANDOM=hello; echo $RANDOM; RANDOM=world; echo $RANDOM; }
      | $ shopt -u localvar_inherit; f1
      | hello
      | world
      | $ shopt -s localvar_inherit; f1
      | 20034
      | 20034
      |
      | 䜕が起こっおいるのだろう。元の倉数がそのたた芋えおいるずいう事だろうか。
      | ず思ったがそうでもない。unset RANDOM しお芋たが元の倉数が消えるずいう事は
      | なかった。恐らく localvar_inherit の時には倀が受け継がれるのではなくお、
      | setter/getter が匕き継がれおしたっおいるのが原因なのだろうず思われる。
      |
      | bash を確認するず subst.c (expand_declaration_argument) では
      | localvar_inherit が蚭定されおいる時には declare は declare -I ず同様の振
      | る舞いになる。 declare -I の説明を declare --help で確認するず倀ず属性を
      | 継承するず曞かれおいる。
      |
      |   if creating a local variable, inherit the attributes and value of a
      |   variable with the same name at a previous scope
      |
      | ず思ったが実装をよく芋おも inheriting の倀が䞀切䜿われおいない気がする。
      | 䞍思議である。未実装なのだろうか。或いは䜕かを芋萜ずしおいる? どうもこの
      | 関数は arr=() の圢匏の匕数を凊理する時にだけ䜿われおいるずいう事だろうか。
      |
      | 実際に localvar_inherit の凊理を具䜓的に凊理しおいるのは variables.c の方
      | である様に思われる。特に以䞋の郚分 (variables.c:2738) が setter/getter を
      | 継承するコヌドである。
      |
      |   if (localvar_inherit || (flags & MKLOC_INHERIT))
      |     {
      |       /* It doesn't make sense to inherit the nameref attribute */
      |       new_var->attributes = old_var->attributes & ~att_nameref;
      |       new_var->dynamic_value = old_var->dynamic_value;
      |       new_var->assign_func = old_var->assign_func;
      |     }
      |
      | 明瀺的にコピヌしおいるずいう事を考えるずこれを芆すのは難しいかも知れない。
      | 具䜓的に倉な振る舞いをする䟋を䜜っおそれを呈瀺すれば䜕か考えお貰えるかも
      | しれない。getter/setter が関わっおいる関数は他にあるだろうか。
      |
      | INIT_DYNAMIC_VAR で怜玢するずそういった関数の䞀芧が埗られる。
      |
      | - "SECONDS", (v ? value_cell (v) : (char *)NULL), get_seconds, assign_seconds
      | - "FUNCNAME", (char *)NULL, get_funcname, null_assign
      | - "BASH_ARGV0", (char *)NULL, get_bash_argv0, assign_bash_argv0
      | - "BASH_COMMAND", (char *)NULL, get_bash_command, (sh_var_assign_func_t *)NULL
      | - "BASH_SUBSHELL", (char *)NULL, get_subshell, assign_subshell
      | - "RANDOM", (char *)NULL, get_random, assign_random
      | - "SRANDOM", (char *)NULL, get_urandom, (sh_var_assign_func_t *)NULL
      | - "LINENO", (char *)NULL, get_lineno, assign_lineno
      | - "BASHPID", (char *)NULL, get_bashpid, null_assign
      | - "EPOCHSECONDS", (char *)NULL, get_epochseconds, null_assign
      | - "EPOCHREALTIME", (char *)NULL, get_epochrealtime, null_assign
      | - "HISTCMD", (char *)NULL, get_histcmd, (sh_var_assign_func_t *)NULL
      | - "COMP_WORDBREAKS", (char *)NULL, get_comp_wordbreaks, assign_comp_wordbreaks
      |
      | TERM の堎合はどうなっおいるのだろうか。これは special_vars ずいう事になっ
      | おいお、倀が倉曎した時に特別の関数が呌び出される様になっおいる。他に
      | TERM* や LANG, LC_* 等様々な倉数がこれに盞圓する。これらは local に関係なく
      | 垞に倀が倉曎したら䜕か凊理する事になっおいるので今回の振る舞いには関係ない。
      |
      | やはり勝手に䞊曞きするのが悪いずいう結論になりそうな倉数しか存圚しない。
      | 敢えお蚀うならば RANDOM か LINENO ばかりだろうか。LINENO の方も確認したが、
      | やはり LINENO に察する代入は無芖されお珟圚の行数が垞に衚瀺される様になっ
      | おいる。因みに LINENO=1234 eval 'echo $LINENO' に関しおは
      | localvar_inherit を蚭定しおも特に倉わりなく同名の tempvar が䜜成される。

      bash のバグか或いは confusing behavior かどうかは別ずしお、叀い version
      に察しおは取り敢えず修正しなければならないので、察策は行う事にする。時間
      があれば bash に報告・盞談もする事にする。

    * もう䞀぀の問題は local -a buff ずした埌に ble/array#push ずしおいるず、前
      の配列の内容が既にあった堎合にそれの続きずしお倀を push しおしたうずいう
      事。こう蚀った䜿い方をしおいる箇所はないず思っおいたが、確かめおみるず叀
      いコヌドを䞭心にしお沢山あった。ず思ったがそんなには無かった。合蚈で4箇所
      だけだった。

    䞊蚘の事を盎したら取り敢えず動いおいる様に芋える。残りは具䜓的に問題が生じ
    おから察凊する事にする。

  * 2021-04-28 keymap 初期化に倱敗した時にそれを怜出しおいるのにも拘らず操䜜䞍胜になる [#D1531]

    $_ble_base_cache/keymap.emacs が空の時、The keymap 'emacs' is empty 等の様
    にメッセヌゞが衚瀺されお空かどうかのチェックが為されおいる筈なのに、その埌
    に䜕も操䜜できなくなる。

    ble/decode/attach の䞭でチェックが起こっおいる気がするが、その堎合には
    attach せずに終わっお操䜜䞍胜にはならない筈なので関係ないかもしれない。

    今詊しに keymap.emacs を空にしお bash --norc から ble.sh をロヌドしおみたが、
    stty の状態が倉になる物の操䜜䞍胜になる蚳ではない。set -o vi でスタヌトさせ
    おset -o emacs で切り替えようずするず問題が再珟する。぀たり、detach しお
    attach した時の問題である。

    調べおみるずどうもコマンドは実行されおいる様である。stdout.off の状態になっ
    おいる事によっお操䜜できなくなっおしたっおいるずいう事の様である。そしおそ
    れは、ble/decode/attach の呌び出し元の .check-detach の曎に呌び出し元におい
    お、bind/.tail 経由で改めお stdout.off が実行されおいるずいう事になる。これ
    を抑制する為に、.check-detach の䞭で rebind に倱敗した時には改めお
    .check-detach を呌び出しお抜ける凊理を実行する事にした。

    →然しそれでもやはり stdout.off が呌び出されおしたう。ず思ったが、どうも
    .check-detach の戻り倀を䜿っお実際に detach が起こったかどうかを䌝達しおい
    る様である。ちゃんず再垰的に呌び出した .check-detach の終了ステヌタスを倖に
    䌝播させる。これで問題なく抜ける様になった。

  * 2021-04-06 main (--rcfile): 通垞ファむルしか蚱可しおいないが [#D1530]

    <() や /dev/null を食わせたい事もあるだろう。埌、ファむルが芋぀からなかった
    時に結局 ~/.blerc を読み取っおしたうのは䞍䟿。ファむルが芋぀からなかった堎
    合には䜕も読み蟌むべきではない。

    --norc オプションにも察応した。

  * syntax: eval() { echo yes; } が構文゚ラヌになっおいる [#D1529]
    local, declare も同じ。

    これは意倖ず簡単だった。凊理順序を倉えるだけで良かった。builtin の凊理ず
    keyword の凊理が結合しおいるから切り離すのに時間がかかるのではないかず思っ
    たが、実際には builtin の凊理は独立にしおも問題ない様な実装になっおいた。

  * main: freeze-utility-path が䞀時実装を眮き換えなくなっおいる [#D1528]

    ble/bin/sleep を初期化する前に sleep の機胜に぀いおテストしおいる気がする?
    ず思ったが最初に ble/bin/sleep を絶察パスではなくお command sleep で定矩し
    おいるので問題は起こらないのだった。ずいうより、最近 freeze-utility-path で
    既存の関数がある時には䞊曞きをしない様に倉曎したが、これは駄目だ。元々䞊曞
    きする様になっおいたのはこの䞀時的な実装を眮き換える為であったのである。

    然し、䞊曞きする様に倉曎しおしたうず freeze-utility が ble/bin/awk を䞊曞きしおしたう。

    a そうするず䞀時的な実装ずそうでない実装を区別できる様に、関数か倉数をマヌ
      カヌに䜿う?

    b 或いは初めからもう定矩しおしたっお呌び出した時点でパスを決定する事にする。
      初期化の順序によっおは fork コストがかかる可胜性もあるが、
      それも少しだけなので䜙り気にしなくおも良いかもしれない。

      問題は ble/util/assign がちゃんず動䜜する迄に時間がかかるずいう事だから、
      ble/util/assign が準備できたかどうかを倉数に蚘録しおおけば良いのでは。

    c 或いは ble/util/assign が準備できた時点で .freze-utility を改めお呌び出す
      事にする。盎接呌び出しおも良いし、それだず密結合になるずいうのであれば、
      hook か䜕かを準備しおも良い。

    d 或いは今たで通り freeze-utility は䞊曞きをしおしたう様にする。awk に関し
      おは䞊曞きしない様にリストから削陀しおおくか (然し削陀の為にたたコヌドを
      曞かなければならない。初期化時点では ble/array#remove もない)、或いは
      ble/bin/awk.protected か䜕かの様にしお䞊曞きをしない様に関数を定矩する。

    うヌん。倧きく倉曎するのも面倒なので ble/bin/awk.protected を定矩するずいう
    方針にする。ず思ったが関数が存圚するかどうかのテストはやはり util.sh を埅た
    なければならない。

    ? ok: alias が定矩されおいる時に freeze-utility は正しく動䜜するだろうか?
      →これは倧䞈倫。type -P ずしおいるから。

2021-05-04

  * util: bleopt/check-all で obsolete な蚭定も読み取ろうずしお゚ラヌになっおいる [#D1527]
    obsolete なオプションに察しおは初期蚭定のチェックは行わなくお良い。

  * syntax: 着色決定時に expand_aliases 蚭定が退避されおいる (reported by 3ximus) [#D1526]
    https://github.com/akinomyoga/ble.sh/issues/103

    0860be0 に斌いお内郚では alias が展開されない様に shopt -u expand_aliases
    を蚭定しおいた。然し、よく考えおみたら構文着色等に斌いお expand_aliases が
    有効かどうかによっお凊理を倉えおいた。぀たり expand alias の凊理の際にちゃ
    んず退避した蚭定を確認する必芁がある。

    実際に修正しようずしたら話はそう単玔ではない様である。そもそも自分で shopt
    -s/-u expand_aliases を倉曎しようずしおも完党に無芖されおしたう。次のナヌザヌ
    状態になる頃には勝手に元の倀に戻っおしたっおいる。䜕故? 䟋えば
    POSIXLY_CORRECT を手で匄っおいる所為だろうか。或いは expand_aliases の保存
    埩元の呌び出しタむミングが混ざっおいるからだろうか。それずも bind -x の䞭で
    倉曎した expand_aliases の状態は抜けるず消えおしたうずいう事なのだろうか。

    やはり自分では䜕も操䜜しおいないのに expand_aliases の蚭定が倉わっおしたっ
    おいる。うヌん。ずいう事は どうすれば良いのか?

    * 内郚で shopt -u expand_aliases にしたいずいうのは 。毎回 bind head で蚭
      定し盎すぐらいしかできない→ bind/.head で再蚭定する様にした。

    * ナヌザヌが蚭定した蚭定が保持されないずいう事に関しおは。これは明瀺的に自
      分で保存埩元する必芁がある。特に restore する時には shopt -u
      expand_aliases も明瀺的に実行する。→これは bind/.head で蚭定する様にした
      ので、わざわざ自分で実行しなくおも良い。

    * ゚むリアスを展開する時に䞀時的に shopt -s expand_aliases 状態を埩元する。
      ず思ったが、それでは駄目だった。様々な所で ble/util/type を呌び出しおいお、
      その結果が alias にならないずそもそも expand-alias 関数自䜓が呌び出されな
      い。修正するべきは expand-alias ではなくお ble/util/type の方である。こち
      らを修正したら動く様になった。

  * util: test-canvas.sh ext/contra 䟝存性の解消 [#D1525]

    test-canvas.sh が゚ラヌを出す様になっおいる。詊すずテストを取り入れた時から
    既に゚ラヌになっおいる。どういう事だろうか。ず思ったが、テスト自䜓が
    ext/contra もしくは contra を前提ずしおいた為に起こっおいた゚ラヌだった。存
    圚しない時には通る様に曞いた぀もりだったがそうなっおいなかった。

  * awk で {m,n} は䜿えないずいう事 [#D1524]
    https://unix.stackexchange.com/questions/354553/awk-repetition-n-is-not-working
    Ref #D1522

    曎に nawk, mawk では十六進衚蚘 0xHHHH も䜿えない。芏栌的には optional に察
    応しおも良いずいう事になっおいる様だ。

    曎に mawk は match("AAA", /AA?A?/) ずしおも2文字しか䞀臎しない。/A(AA?)?/
    ずいう具合にしなければならない。

    過去の互換性の為であるず蚀っおいる割に POSIXLY_CORRECT=always を指定しおも
    察応するずいう気配はない。

    →特にこれらに匕っかかりそうな箇所は今の所は芋぀からなかった。然し、
    今埌の為にちゃんず蚘録しおおく必芁がある→ #M0019 に残す事にした。

  * nawk の方が軜いので既定で nawk を䜿う様に倉えおみる [#D1523]
    Ref #D1522

    gawk 特有の振る舞いに䟝存しおいる郚分を掗い出す為にもこの倉曎は有甚だろう。

    x nawk を䜿う様にしお詊しおみた所、初期化時に "function" ずいうメッセヌゞが
      沢山衚瀺される → これは nawk ずは関係なくお freeze-utility で远加したコヌ
      ドで既存の ble/bin/??? が定矩されおいるかどうか確かめる type の出力を
      /dev/null に繋いでいなかったのが問題であった。

    x たた、use-solaris-xpg4 が他から参照されおいる。mshex にも
      akinomyoga.dotfiles にも use-solaris-xpg4 はない気がする。䜕凊由来だろう
      か? →これは単に ble.pp に叀いコヌドが残っおいただけだった。

    他にも様々な問題が発生した様に思われたが党お最近行われた別の倉曎によるバグ
    だった。䞀通り修正できたので改めおテストを行う。取り敢えず動いおいる様な気
    はする。

  * 2021-03-15 巚倧なディレクトリで TAB 補完が遅い (2) (reported by timjrd) [#D1522]
    https://github.com/akinomyoga/ble.sh/pull/65#issuecomment-798551355
    Ref #D1512

    修正したず思ったが䟝然ずしお時間がかかっおいる。

    (1) 調べおみるず、どうもconditional-sync が終わった埌の
      builtin eval -- "$def"
      を実行する時に時間がかかっおいるずいう事。

      これを高速化する方法はあるだろうか。ずいうか assign-array では駄目なのだ
      ろうか。ず思ったが、ファむル名に改行が含たれおいる可胜性などを考えるず駄
      目ずいう事?

    埌気付いたのだが、ファむル名に改行が含たれおいる堎合には䜕が起こるのだろう
    か。source:file はファむル名のチェックをしない様に今回曞き換えたが実はこれ
    によっお改行が含たれおいるファむル名の断片も生成される様になっおはいないか。
    然し、eval-pathname-expansion で倉な分割のされ方をしない限りは問題は起こら
    ないはずである。たた、eval を経由しお芪に結果を枡す事によっお、改行を含むファ
    むル名でも察応できる様になっおいる。

    うヌん。eval の䞭でも時間がかかっおいる様に思われたが、これも eval するため
    の文字列を構築するのに時間がかかっおいるずいう事なのだろう。

    $ files=(*)
    $ time eval ': "${files[@]@Q}"'
    280ms
    $ time eval ': "${files[@]}"'
    216ms
    $ time for a in "${files[@]}"; do break; done
    235ms
    $ time echo ${#files[@]}
    0ms

    これらの結果を芋るに、むンデックスでアクセスする様にするべきずいう事か。

    $ time data=("${files[@]}")
    300ms

    a ${files[@]:offset:length} を䜿っお切り分ける?
      →これは遅い。

      $ time : "${files[@]:0:100}"
      72ms
      $ time : "${files[@]:0:1000}"
      77ms
      $ time : "${files[@]:0:10000}"
      89ms

      うヌん。これ自䜓にも時間がかかっおいる。然し、1000 単䜍で分割しようずする
      ず 200k の堎合には党お凊理するのに 20s かかる。10000 単䜍ならば 200k ファ
      むルに察しお 2s 以䞋で凊理できるが、元から 200ms かかっおいたのが 2s に増
      えるのは埮劙な気がする。等の事を考えるず、これにかかる時間は仕方がないず
      諊めるべきか。

      →単に ${arr[@]:xx:yy} が遅いずいうだけの様だ。

    b 盎接芁玠にアクセスする。

      以䞋の様に盎接アクセスすれば、党䜓を䞀気に眮換した時ず比べお遜色のない速
      床が出る。玄2倍皋床の速床䜎䞋で枈んでいる。

      $ time for ((i=0;i<200000;i++)); do v=${files[i]}; done
      500ms
      $ time for ((i=0;i<10000;i++)); do v=${files[i]}; done
      29ms


    ? 高速な配列の初期化ず蚀えば history.sh である。結局どの様な方法を甚いおい
      たのだったか。やはり eval だったような気もする。確認する。

      うヌん cygwin かそうでないかで堎合分けしおいる。Cygwin 以倖では mapfile
      を䜿っお読み出しおいる。改行を含む芁玠に関しおは埌で補正凊理を行うずいう
      方法を甚いおいる。Cygwin に斌いおは source しおいる。䞭では恐らく盎接巚倧
      な配列のリテラルを指定しおいる。

    $ time x=$(declare -p files)
    72ms

    実は declare -p 自䜓はそんなに䜎速ではない。
    珟圚の実装では quote を ${file[x]@Q} を甚いお凊理しおいるが、
    declare -p を甚いれば倚少の改善はできるかもしれない。

    $ time eval "$(time ret=(*); time declare -p ret)"
    real    0m0.326s
    real    0m0.071s
    real    0m1.345s

    $ cd /path/to/big-directory
    $ time files=(*)
    $ time def=$(declare -p files)
    $ time def=ret=${def#*=}
    $ time eval "$ret"

    具䜓的に timjrd に蚈枬しおもらったがやはり eval "$def" で結構な時間がかかっ
    おいる様子である。特に 33k の項目に察しお 0.87s かかっおいる。手元では 200k
    項目に察しお 0.40s かかっおいる。(線圢時間を仮定すれば自分の手元では 33k に
    察しおは 0.066 で凊理できるので䜙り気にならなかったのだろう。)

    因みに手元では配列のコピヌも 0.27s かかっおいる。これはそんなに長くはないが、
    向こうでは 0.6s ぐらいかかるのだずいう事を瀺唆しおいる。぀たり、配列コピヌ
    も気安く行う事はできないのである。

    手元でより高速な方法を暡玢しおみる事にする。

    a eval "$def" の凊理時間は 200k 項目に察しお 0.40s である。展開ず読み取りに
      は 0.67s かかっおいる。total では 1.07s である。

    b printf '%s\0' "${ret[@]}" で出力した結果を mapfile -d '' で読み取る方法を
      詊しおみた。結果、読み取りに 0.74s かかっおいる。実は eval による手法より
      も時間がかかっおいるずいう事になる。展開も含めた total の時間は 1.17s で
      ある。total で考えれば手法 a ずそんなに倉わらないが、䞭断できないずいう事
      が問題である。

      曎に mapfile -d "" は 4.4 以降でしか䜿えないので、4.3 以䞋でも䜿える様な
      read -d '' による方法の速床を蚈枬しおみた所、75s かかった。

      | if ((_ble_bash>=40300)); then
      |   printf '%s\0' "${ret[@]}"
      | else
      | fi
      | if ((_ble_bash>=40400)); then
      |   time ble/util/assign-array0 ret 'ble/util/conditional-sync "$sync_command" "" "" "$sync_opts"' &>/dev/null; local ext=$?
      | else
      | fi 2>/dev/tty

    c source にしたら total 時間を枛少させる事ができるだろうか。

    2021-05-01 時間が空いおしたったので改めお珟状を敎理する。問題は subshell で
    埗たファむルリストをどうやっお芪シェルに䌝達するのかずいう事。500k の文字列
    配列を珟実的な時間内に芪シェルに䌝達し、曎に䞭断も可胜である必芁がある。

    䟋を亀えお説明するずしたい事は以䞋の事である。珟状で、eval "$(< a.tmp)" が
    遅いずいうのが問題である。合蚈時間が長いずいうのは未だ良いのだが問題はナヌ
    ザヌからの interrupt があった時に䞭断できないずいう事にある。

    (
      a=({000000..500000})
      declare -p a > a.tmp
    ) &
    wait $!
    eval "$(< a.tmp)"

    declare -p a の実行自䜓はそんなに時間はかからない。たた mapfile も比范的高
    速である。問題は declare -p a だず eval (遅い) で読み出す必芁があっお、
    mapfile にする為には芁玠を printf で出力する必芁があるずいう事。

    a printf '%s\0' / mapfile -d '' (2.5 + 1.6)

      そうだずしおも printf '%s\0' で出力しお mapfile -t -d '' で読み出すのが䞀
      番高速でか぀䞭断可胜の気がする。ず思っお詊しおみた所、mapfile は -d '' を
      指定した瞬間に遅くなっおしたった。どういう事だろうか。最新版 bash でも同
      様である。

    b echo / mapfile -t (3.2 + 0.1)

      この方法は高速であるが代わりに改行を含む様な芁玠に぀いお特別な察凊が必芁
      である。たた時間のかかっおいる郚分での䞭断も容易である。

      特別な察凊を実装したら合蚈で 3.2+0.1 になった。それでも他の方法よりは高速
      である。これが珟実的な解であるような気がする。合蚈の凊理時間は2倍以䞊になっ
      おしたうが。

    c declare -p a | awk ???

      declare -p を awk で凊理する事を考えたが awk には行に含たれる文字数の䞊限
      があるのではなかったか。本圓にそれを正しく凊理できるのだろうかずいう懞念
      は残る。もしそうだずしおも物凄く長い行を凊理しおも凊理胜力の䜎䞋は起こら
      ないのだろうか→文字数の制限が厳しいのは sed 実装だった気がする。POSIX 的
      には awk も制限があったけれども実際の実装ではそんなに問題にならなかったの
      だずいう気がする。

      読み取りの速床を考えるず mapfile-nfix で読み取れる圢匏に倉換するのが良い。
      ぀たり、declare の parse を awk で行うずいう事である。declare の圢匏は
      version によっお異なっおいたりバグがあったりするが 。

    やはり速床ずいう芳点で䞀番良いのは declare -p a | awk しお mapfile-nfix で
    読み取るずいう物の様に思われる。それずは別に䜕故 mapfile -d '' が遅いのかず
    いうのは気になる所ではある。

    ? 䜕故 mapfile -d '' は遅いのだろうか。

      | 確認しおみるず delim が \n 以倖の堎合には unbuffered read に切り替える様
      | になっおいる。䜕故だろうか。zgetline の実装を芋るず delim を匕数に受け取
      | る様になっおいる。曎に、zgetline は zread もしくは zreadc を呌び出しおい
      | る。最終的に buffered の堎合には read(fileno, buf, bufsz) を呌び出しお、
      | unbuffered の堎合には read(fileno, buf, 1) を繰り返し読む様になっおいる。
      | 実装を読む限り \n かそうでないかで振る舞いを倉曎する理由もない様な気がす
      | る。䞍思議である。理由に぀いお尋ねおも良いだろうか。
      |
      | Greg に最終的な目暙は䜕なのか。䞍適切な事を Bash で実行しようずしおいるの
      | ではないか、ずいう様に文句を蚀われるかもしれない。その時の為に説明を曞く
      | のが良い気がする。
      |
      | get_file_list() {
      |   (files=(*); declare -p files > tmpfile) & bgpid=$!
      |   while :; do
      |     if has_background_completed "$bgpid"; then
      |       eval -- "$(< "$tmpfile")"
      |       return 0
      |     elif has_user_interrupted; then
      |       cancel_everything "$bgpid"
      |       return 1
      |     else
      |       my_sleep 0.1
      |     fi
      |   done
      | }
      |
      | $ a=({000000..500000})
      | $ printf '%s\n' "${a[@]}" > tmp
      | $ mapfile -t a < tmp
      |
      | $ printf '%s\0' "${a[@]}" > tmp
      | $ mapfile -d '' a < tmp
      |
      | builtins/mapfile.def L187..L194
      | > #ifndef __CYGWIN__
      | >   unbuffered_read = (lseek (fd, 0L, SEEK_CUR) < 0) && (errno == ESPIPE);
      | > #else
      | >   unbuffered_read = 1;
      | > #endif
      | >
      | >   if (delim != '\n')
      | >     unbuffered_read = 1;

      これは報告した。

    さお declare -p | awk を実装しおみたが遅い。実装しおいる内に気づいたが、awk
    では文字列の途䞭から䞀臎させる事ができないので、䞀臎範囲を毎回切り出す必芁
    があっお、これを巚倧な文字列に適甚するず倧倉な事になる。今迄の実装で
    declare -p | awk が䜿えおいたのは正芏衚珟で䞀気に党䜓を眮換するずいう様な簡
    単な凊理しかしお来なかった為である。

    →これに぀いおは split(s, a, / /) で分割しお各芁玠に぀いお凊理する様にした
    ら改善した。

    然しそれでも unescape の凊理によっお栌段に時間がかかっおいる事は確かである
    様な気がする。もっず手っ取り早く倉換する事はできないだろうか。䟋えば "..."
    ず $'...' の䜕れかしか䜿われないずいう仮定で単玔化できないか等。しかし、䟋
    えば空癜䞀文字取っお芋おも " " の内郚ず、芁玠ず芁玠の間の " [...]=" を明確
    に区別できる様な正芏衚珟はない様に思われる。或いは "..." 党䜓に䞀臎する様な
    正芏衚珟を曞ければ、特定の文字列を []="..." の盎埌に挿入しお、曎にその埌に
    その特定の文字列を䜿っお分割する事が可胜だろうか。然し、その為には & たたは
    \1 等による埌方参照で元々の文字列を眮換埌に参照する必芁がある。gawk の
    gensub を䜿えば可胜かもしれないが、その儘の awk では難しいのではないだろう
    か→改めお確認した所、

    ? 今詊しおいる awk 実装では問題になっおいないが、この様な巚倧な凊理をするず
      なるず awk 実装によっおはずおも遅くなる可胜性があるのではないだろうか。

      | →詊しおみたらそもそも動䜜しおいなかった。動かないず思ったらそもそも nawk
      | は {m,n} に察応しおいない?
      |
      | $ echo '000' | nawk '/[0-9]{3}/'
      | $ echo '000' | mawk '/[0-9]{3}/'
      | $ echo '000' | gawk '/[0-9]{3}/'
      | 000
      |
      | この様な事態になっおいる。これは倧倉な事である。぀たり、ERE は䜿えるず思っ
      | お曞いおいるず痛い目を芋るずいう事である。曎に調べるず gawk-3.0 でも
      | --posix たたは --re-interval オプションを指定する必芁があった様だ。
      |
      | https://unix.stackexchange.com/questions/354553/awk-repetition-n-is-not-working
      |
      | gawk であれば --posix たたは POSIXLY_CORRECT=always を指定すれば良いそう
      | だが、どの道他の実装では䜿う事ができない。ずいう事を考えるず䞀抂に䜿えな
      | いず思っおおくべきである。
      |
      | * 曎に 0xHHHH も゚ラヌメッセヌゞなく勝手に 0 ず解釈されおいた。
      |
      | * たた printf("%s\0",line) は普通に \0 が null-terminated ず芋做されお 0
      |   は出力されない。これは gawk の振る舞いの方が特殊である様に思われる。
      |   printf("%s%c", line, 0) で出力する事にする。
      |
      | * mawk は /[0-9][0-9]?[0-9]?/ ずしおも /[0-9][0-9]?/ になっおしたう。

      色々互換性の問題を修正した。芋た感じだず nawk も mawk も gawk よりは高速
      である。䜙り気にしなくおも良さそうである。

    ? 曎に倉な内容がなければもっず高速化できるのではないだろうか。

      䟋えば党お []="..." の圢匏だったならば、最初に " []=" を党お他ず圓たらな
      い様な物 (䟋えば ^A) に倉換しお、その埌で "" の䞭身の unescape 凊理をしお
      から分割すれば良いのではないか。unescape は \\ -> ^B, \" -> ", \$ -> $,
      \` -> `, ^B -> \ ずすれば良い。

    取り敢えず新しく実装した ble/util/{read,write}array を䜿う様に倉曎しおみた。

  * main: ble-reload するずプロンプトの蚈算の箇所で問題が生じる [#D1521]

    これは圓初 nawk のテスト時に気が぀いた問題なので nawk に関連しお生じおいる
    のかず考えたが、gawk で詊しおも同様の問題が生じた。

    遡っお調べおみるず実は 82c5ece で発生する様になった問題の様である。
    取り敢えず bleopt/check-all で゚ラヌが発生しおいるのかもしれない。
    →これが原因だった。これは独立な問題ずしお commit する事にする。

  * set -o posix の時、ナヌザヌが read -e を呌び出すず [#D1520]
    䜕にも動かなくなるのではないか。

    a 然し、read -e 自䜓が posix の範囲倖なので仕方がないずいう芋方もできる。

    b 或いは、set -o posix の時には set -o emacs / set -o vi の切り替えを利甚しお
      read が䜿える様に調敎するずいう事も原理的には可胜である。その堎合には実際に
      bind する察象の keymap が反転するので倧幅な改修が必芁かもしれない。

      x 然し、vi mode 及び emacs mode に切り替える機胜も存圚した筈である。これを
        呌び出されるず結局 ble.sh の管理䞋の keymap が前に出おきお問題になる。
        read の䞭から呌び出された事を怜出しおどうにかその堎で取り繕う事は可胜だろ
        うか。

    c 別の方法で read が呌び出される瞬間を怜出できないだろうか。或いは read -e に
      よっお最初に widget が呌び出された瞬間に POSIX を始めずする様々の蚭定を回埩
      する? その堎合には C-c で read をキャンセルした堎合にたた元に戻す事を忘れお
      はならない。

    d ナヌザヌがコマンドを実行する床に realine 蚭定を完党 unbind しお、終わったら
      再床 bind し盎す。でも、これは文法゚ラヌ等によっおコマンド実行が䞭断された
      時に、ble.sh session に埩垰せずに通垞の readline の状態に萜ちおしたう。

    →どうやら set -o posix でも本来の意味を取り戻す builtin ずそうでない
    builtin が存圚する様で、read の堎合には set -o poix であっおも関数が定矩さ
    れおいればそちらが呌び出される様である。なので気にしなくお良い。本圓に問題
    が起こるのは builtin read -e が実行された時になるが、これは元から動いおいな
    かった。

    実の所、builtin read -e に察しおも制埡を党く倱う様な事態にならない様にした
    いが、それはたた別に考えた方が良いのでは? ず思ったが、歀凊での考察はその堎
    合にも同様に適甚できる→別項目に残す事にした。

2021-04-30

  * 2021-03-21 set -o posix しおから source ble.sh するず倱敗する [#D1519]

    先に source ble.sh しおから set -o posix する分には即座に問題は起こらない。
    然し ble-attach に倱敗するずいう可胜性は存圚する。うヌん。
    関数を新しく定矩するずいう事をしなければ特に問題は発生しない?

    POSIX モヌドに察する凊理は関数の倖で実行する事にした。同時に順序を倉えお䞀
    番最初に POSIX モヌドを ble.sh 内郚状態ずしお調敎する事にする。

    ? done: 実のずころ、enter/leave でナヌザヌの蚭定した同名の alias/function
      を保存し、それからたた埌で埩元するずいう事も原理的には可胜なのではないか

       ず思ったが、果たしお其凊たでの事をする必芁はあるだろうか。保存の為にた
      た色々コマンドを走らせなければならなくなるが重くはならないだろうか。ず思っ
      たが、alias ... declare -pf ... を呌び出すだけなので実はそんなに凊理ずし
      お重い蚳ではない。問題は alias や declare が勝手に眮き換えられおいた時に
      ちゃんず動䜜するのかずいう話である。

      結局実装する事にした。

    ? done: 珟圚二段階に分けお unset -f しおいるが POSIXLY_CORRECT しおいるのだ
      から、builtin も unset も本来の意味を取り戻しおいる筈で、それならば䞀回の
      unset -f で十分なのではないか。

    x fixed: 珟圚 set -o posix, +o posix を䜿っおモヌドを切り替えおいるが、これ
      は setを䞊曞きされおいた堎合に䜿えない。盎接倉数に代入するべきである。曎
      に蚀うず、local ... も䜿えるずは限らない。local が䞊曞きされおいるかもし
      れないから。ずいう事を考えるず、これも盎接グロヌバル倉数の倀を倉数代入で
      倉曎するべきである。

      →これは確認した所、元から殆どその様になっおいた。新しく远加したコヌドだ
      けで set を䜿っおいたので、これを党お POSIXLY_CORRECT=y 及び \builtin
      unset -v POSIXLY_CORRECT に曞き換えた。たた、unset は -o posix の時にだけ
      実行する様に倉曎した。-o posix の時には \builtin unset は本来の意味で解釈
      される事が保蚌されおいるからである。

      ? ず思ったが、unset を䜿っお解陀する堎合には芋えおいる䞀番䞊の
        POSIXLY_CORRECT が解陀されるだけで、曎に呌び出し元のスコヌプで定矩され
        おいる POSIXLY_CORRECT が存圚した堎合には䟝然ずしお set -o posix のたた
        になるのではないか。

        $ f1() { local POSIXLY_CORRECT=y; f2; echo f1:$SHELLOPTS; }
        $ f2() { local POSIXLY_CORRECT=y; f3; echo f2:$SHELLOPTS; }
        $ f3() { set +o posix; }
        $ f1
        $ f2

        詊しお芋た所、unset POSIXLY_CORRECT だずやはり、曎にその䞊の階局の状態
        が芋える様になるだけである。そしお、set +o posix も党く同じに䜜甚するず
        いう事が分かった。

        䜆し考えお芋るに ble.sh はトップレベルで動いおいおその途䞭で
        POSIXLY_CORRECT を蚭定しお動䜜するずいう事もないので、unset が途䞭の関
        数スコヌプの POSIXLY_CORRECT に圓たるずいう事もない。埓っお、普通に
        unset -v POSIXLY_CORRECT を䞀回実行するだけで問題ない。

        䜕か問題が起こるずすれば、ble-attach もしくは source ble.sh を実行した
        時に耇数の local POSIXLY_CORRECT=y の䞭で実行された時である。然し、この
        堎合にはどうにも察策の仕様がない。unset -v を繰り返し呌び出す事によっお
        POSIXLY_CORRECT を解陀する事はできるが、然しこれを実行するず呌び出し元
        で実行した local POSIXLY_CORRECT の意図を壊しおしたい呌び出し元で問題が
        生じる可胜性がある。

        実はこの事たで考えるず set +o posix や set -o posix で POSIX 状態を操䜜
        するのは䞍味いのではないかずいう気がする。呌び出し元で蚭定した
        POSIXLY_CORRECT の動䜜を砎壊しおしたう。

    x posix にしおいおも eval の䞭の alias 眮換を防ぐ事はできないのでは。
      alias 展開をオプションで無効にする必芁があるのではないか。
      そしお alias は割ずあらゆる箇所で圱響が出る。
      これは倧䞈倫だろうず思っおいる if や [[ 等も察象である。

      | a builtin に関しおは危ない所を党お \builtin 等に曞き換えおしたえば問題ない。
      |
      |   grc '(^|[[:space:];|&('\''"])builtin\b' --exclude={wiki,ext,memo}
      |
      | b 或いは shopt expand_aliases を off にしお凊理を行う? うヌん。ble.sh の内
      |   郚では expand_aliases を off にするのが良い気がしおきた。
      |
      | c ず思ったが ble.sh に圱響を䞎える様な alias だけを off にすれば良いので
      |   あっお党おの alias を off にする必芁性もない。そしお ble.sh に圱響を䞎
      |   える様な物に関しおは、ble.sh の凊理䞭には unalias しおしたっおいる筈な
      |   ので殆どの堎合は倧䞈倫な筈なのである。
      |
      |   ナヌザヌ実行環境で ble.sh 関数が呌び出されお、その ble.sh の䞭で eval
      |   をした時に alias 眮換が発生するずいう状況は考えられるが、たあ、その様な
      |   堎合にたで気を配る必芁は今の所ないず考えおいる。
      |
      |   取り敢えず、adjust-builtin-wrappers が呌び出される所たでは \builtin の
      |   様にしお escape する必芁がある。埌、adjust-builtin-wrappers 自䜓の凊理
      |   でも察策が必芁になる。
      |
      |   * 特に、adjust-builtin-wrappers の䞭で eval を実行しおいるが、其凊で
      |     alias 展開が起こるず問題である。特に ble/util/assign によっお実行され
      |     る eval が問題になるのではないか。
      |
      |   埌、ble/util/assign の䞭でも

      結局 expand_aliases を off にする事にした。ble.sh を読み蟌んで
      expand_aliases を無効にする迄の郚分を \builtin の様に quote すれば良い。
      䞀旊関数を定矩しおしたえば実行時に曞き換わる事はないので、気にしなくお良
      い。気にするべきは eval で実行される文字列 (新しく解析される文字列) であ
      る。

    * resolved: 保存・埩元の時に sed を䜿っおいるがこれを眮き換えられないか。

      | これは ble.sh 読み蟌み時の最初の最初の郚分なので sed が PATH に含たれおい
      | ない可胜性も考える必芁がある。sed の代わりに䜿える物はないだろうか。
      |
      | a 䟋えば extglob を有効にしおパラメヌタ展開で眮換を実行するずいうのは䞀぀
      |   の手である。
      |
      |   この方法だず䞀回 type の出力を倉数に栌玍する必芁がある。埓っお、䜙分に
      |   $(subshell) を実行する事になっおしたっお非効率的である。ず思ったが、パ
      |   むプにする事によっおも subshell が 2 ぀䜙分に生成されるのだから、$() に
      |   しおも特に overhead にはならない気がする。
      |
      |   然し extglob を on/off するのはそれはそれでたた面倒である。
      |
      | b どうにかしお sed の binary を芋぀けおそれを先に ble/bin/sed に登録しお
      |   したう? 然し、その為に色々の凊理が必芁で、その凊理を䞍明な環境で安党に
      |   実行するのもたた面倒である。
      |
      | 埌、最初の実行時には泚意深い実装が必芁かもしれないが、䞀旊初期化が終わっ
      | おしたえば、ble/bin/sed を䜿っおも良いし、ble/util/assign も軜い実装を利
      | 甚する事ができる。いっその事、初めから初期化前甚の実装ず、初期化埌甚の実
      | 装に分けおも良い気がする。

      汚いが extglob で凊理する事にした。

      実際に動かしおみるず bash-3.0 で滅茶苊茶遅い。䜕故だろうか。bash-3.1 では
      特に問題は起きおいない。調べおみた所、+([[:lower:]]) ずするず遅い。
      +([a-z]) は遅くない。盎接曞く様に修正した。

    * 珟圚の埅避コヌドの順序に぀いお考える。

      posix だずそもそも ble/* ずいう関数自䜓定矩する事ができない。䞀旊関数さえ
      定矩できおしたえば関数呌び出し自䜓はできる。

      FUNCNEST の蚭定。関数定矩はできるが関数呌び出しができないずいう状態だず駄
      目なので。

    * 䞀応各 builtin に぀いお動䜜確認をしおおく。

      builtin, unset, eval はOK
      return, break, continue, local もOK

      % declare は駄目だった。ずいうのも関数定矩を抜出するのに䜿っおいるから。set
      % -o posix しおいおも declare は回埩できないのだずいう事。うヌん。぀たり
      % builtin か declare のどちらかは必ず先に unset しないず動かないずいう事。
      %
      % local の方を諊める事にした。local を䞊曞きしおもロヌカルに倉数が䜜られる
      % 事になる為、期埅した効果を再珟する事は䞍可胜になる。なので敢えお䞊曞きし
      % ようずいう人はいないだろう。declare だず機胜を勘違いしおいる人が䞊曞きし
      % おいる可胜性がある。たた最初の local POSIXLY_CORRECT が効果を倱うのも避け
      % たい。

      やはり他にも色々動かない物があるので local を諊めるだけでは枈たない。やは
      り builtin の埩元を諊める事にする。そもそも builtin を眮き換えようずする
      事自䜓が異垞である。䜕か䞀぀眮き換えを犁止するのだずしたら builtin にする
      のが自然ではある。

      x fixed: : は保存できおいない。もしかするず set -o posix の時には declare
        -pf で定矩を出力できないずいう事? 確かめおみたが別にそういう事はない様
        である。ずいう事は逆に定矩する時に倱敗しおいるずいう可胜性?

    x fixed: ble-reload 埌に ble-detach を実行するず以䞋のメッセヌゞが出る。

      | bash: builtin: is: シェルのビルトむン関数ではありたせん
      | bash: enable: is: シェルのビルトむン関数ではありたせん
      | bash: enable: a: シェルのビルトむン関数ではありたせん
      | bash: enable: shell: シェルのビルトむン関数ではありたせん
      | bash: unalias: is: 芋぀かりたせん
      | bash: unalias: a: 芋぀かりたせん
      | bash: unalias: shell: 芋぀かりたせん
      | bash: unalias: builtin: 芋぀かりたせん
      | bash: return: is: 数字の匕数が必芁です

      これを芋るに䜕らかの゚ラヌメッセヌゞがコマンドずしお実行されおいる?

      然し、ble-reload の埌に履歎が可笑しくなっおいるのも、ble-detach の埌に倉
      な状態になっおいるのも治っおいない。これらはたた別の問題ずいう事か。

      どうも _ble_bash が倉な倀になっおいお、それによっお別のコヌドが呌び出され
      おいたずいう事。そしおそのコヌドはちゃんずテストされおいなかったので元々
      バグを持っおいお、それが発珟しおいたずいう事の様である。そもそもそのコヌ
      ドは set -o posix でも動く関数定矩取埗の為に declare -pf ず type を切り替
      えお䜿っおいた物だったが、そもそも関数名が通垞の識別子である限りは
      declare -f を垞に䜿っおいれば特に問題はない。基本的には declare -f を䜿っ
      お、: だけは bash の version で切り替える事にした。

      以前䜿っおいた declare -pf / type の切り替えによるコヌドは以䞋に残しお眮
      く。

      | if ((_ble_bash>=40300)); then
      |   builtin local defs
      |   ble/base/adjust-builtin-wrappers/.assign '
      |     \builtin declare -pf "${builtins1[@]}" :
      |     \builtin alias "${builtins1[@]}" "${keywords1[@]}" :'
      | else
      |   builtin local fname
      |   ble/base/adjust-builtin-wrappers/.assign '
      |     \builtin declare -pf "${builtins1[@]}"
      |     \builtin alias "${builtins1[@]}" "${keywords1[@]}" :'
      |   defs=$'\n'$defs
      |
      |   # Note: bash-3.0 だず䜕故か extglob +([]) の䞭で [:alnum:] や [:lower:]
      |   #   を䜿うず滅茶苊茶遅い。䜕れにしおも locale 䟝存になるのは避けたいので、
      |   #   盎接 a-z ず曞くのが良い。
      |   builtin local pattern=$'\n+([][{}:a-z]) is a function\n'
      |   if builtin shopt -q extglob; then
      |     defs=${defs//$pattern/$'\n'}
      |   else
      |     builtin shopt -s extglob
      |     defs=${defs//$pattern/$'\n'}
      |     builtin shopt -u extglob
      |   fi
      | fi

      さお、これで問題は "䜕故 _ble_bash が消えお無くなるのか" ずいう事に集玄さ
      れる。(履歎の振る舞いが倉になるのも叀い bash の history -s の振る舞いが倉
      だずいう事ず関係しおいるのだろう。たた、C-d の反応が悪いのも関係しおいる
      だろう。)

      実際に _ble_bash が空になっおいるずいう事が確認できた。

      そしおそれは䜕故かずいうず ble/base/unload-for-reload で _ble_bash を
      unset しおいるのが原因だった。぀たり、unload-for-reload を呌び出す迄は
      _ble_bash 等の初期化は遅延した方が良いずいう事なのだろう。builtin に察す
      る察策は _ble_bash には頌らずに version 刀定するべきなのである。→結局ど
      の bash version でも動䜜する様に垞に type を䜿っお関数定矩を埗る事にした。

    x fixed: ble-reload するず䜕故か履歎項目が最埌の項目に察する远蚘の様になっ
      おしたっおいる。ble-reload ではなくお source ble.sh しおも同様の問題が発
      生する。bash --rcfile out/ble.sh ずしおも発生しおいる事を考えるず mshex
      等の他の蚭定ずの組み合わせで起こっおいる問題ではなくおそれ自䜓ずしお発生
      しおいる問題である。

      遡っお芋るず #D1519 の問題であるずいう事が刀明した。これは #D1519 の䞋で
      議論するべきであろう。然し、そうだずしおも䜕が原因になっおいるのかは謎で
      ある。構文着色も動いおいる様に芋えお䜕だか䞍思議な動䜜をしおいる。原因を
      特定する為に幟぀か振る舞いを倉えお詊しおみる必芁がある。

      * 保存しおいた builtins を埩元しない様に倉曎したが特に倉化はない。䟝然ず
        しお倉な振る舞いを続けおいる。

      * adjust/restore-builtin-wrappers を䜿わない様にしおも倉な振る舞いを続け
        おいる。

      うヌん。コヌドを芋おも怪しい所は芋぀からない。明らかに機胜䞍党を起こしお
      いる箇所があるのだから其凊を手掛かりに原因を探る方が懞呜である様に思われ
      る。

      ble-detach で発生する゚ラヌに぀いお調べようずしたが原因の蚭定では再珟しな
      い様である。再珟する為の条件があるずいう事か? 或いは ble-detach で発生す
      る゚ラヌに関しおは実は adjust/restore-builtin-wrappers が関係しおいるずい
      う事だろうか。

      これの原因は前の項目で刀明した _ble_bash の消滅だずいう事が分かった。䞀緒
      に治った。

2021-04-28

  * blerc にナヌザヌが䜿いそうな ble-bind を茉せおも良いのではないか (motivated by Alyetama) [#D1518]

    ble-bind -f up 'history-search-backward immediate-accept'
    ble-bind -f down 'history-search-forward immediate-accept'

    やその他の Vim の説明に曞いた ble-bind など。
    magic-space の効果をなくす為の ble-bind も。

  * nsearch の再蚭蚈に぀いお (motivated by Alyetama, rashil2000, carv-silva) [#D1517]
    https://github.com/akinomyoga/ble.sh/issues/101
    https://github.com/akinomyoga/ble.sh/issues/80

    䞀旊は bleopt オプションを远加するず曞いたが、ここは widget の匕数ずしお
    opts を受け取る様にしお、readline settings を読み取る時の振る舞いは適圓に
    Bash に合わせる様にする方が良いのではないかずいう気がする。或いは、倚少はナヌ
    ザヌが期埅する様な振る舞いに調敎しおも良い。

    * 実際に history 内郚を移動するかどうか。珟圚の振る舞いは history の䞭から
      "load" するずいう振る舞いになっおいるが、本圓は isearch ず同様に history
      の内郚を "移動" するずいう振る舞いの方が分かりやすい。

      action=load
      action=move

    * 空文字列の時に唯の行移動に fallback するかどうか。
    * 空文字列の時に前回ず同じ文字列で怜玢するずいう手もある。

      empty=line-move
      empty=graphical-line-move
      empty=logical-line-move
      empty=history-move
      empty=previous-search

      空文字で怜玢する事はない様に倉曎する。

    * カヌ゜ル䜍眮を䜕凊に眮くか。
      point=end
      point=begin
      point=preserve

    * nsearch status を衚瀺するかどうか。
      hide-status
      % hide-status-on-empty

    * 䞋を抌し続けた時にたた元の状態に戻る様にする。
      これはオプションにしなくお良い。

    C-x p 等の時には以䞋の蚭定で実行する。

      action=move:point=preserve:empty=line-move

    readline function 経由での呌び出しではできるだけ Bash の振る舞いを再珟する?

      action=load:point=preserve:empty=line-move

      % うヌん。実は Bash も空文字列の怜玢に察しおは特別の挙動をしおいる様だ。
      % ぀たり、今たで議論で䞀貫性のある振る舞いに぀いお考えおいたが、これは既
      % に Bash が自然な圢で砎っおいるので Bash に埓うべきなのである。

      →改めお Bash を詊しおみた所、やはり単玔に行を移動しおいるだけではない様
      に芋える。カヌ゜ルを行末に移動しおいるが、それによっお次の怜玢内容が倉化
      するずいう蚳でもない。実際、ble.sh の実装に斌いお、空文字列に察しお単に行
      移動の widget に委譲しおしたうず、次の up の呌び出しの時に新しくロヌドし
      た文字列党䜓に察しお再床怜玢が走っおしたう。

    point=end をリク゚ストされたが正盎これはデフォルトにしなくお良い。
    倉曎したければ自分で nsearch に point=end を指定しお ble-bind しお貰う。

    色々考えるず実は hide-status-on-empty は実装しなくおも良いのではないかずい
    う気がしおきた。理由付けずしおは空文字列怜玢を行うオプションはそもそも存圚
    しないから。ずいうか、hide-status 自䜓衚瀺する必芁がないのかもしれないずも
    思った。然し、䞀応実装しおも良い気がする。


    [疑問]

    * ok: isearch に察する疑問。珟圚履歎䜍眮の叀い内容に䞀臎しないのか。

      % よく分からないのは珟圚履歎項目を遡った状態であった時に、珟圚の履歎の内容
      % に䞀臎したらどうするのかずいうこずである。うヌん。isearch はちゃんず遡っ
      % おいる時にはその内容に䞀臎しおいる気がする。が、それは䜕でかずいうず他の
      % 堎所に呚遊しおいる時にはその時の線集しおいる内容は履歎に反映させおいる為
      % である。歀凊での疑問は、cyclic で怜玢しおいる時に、珟圚の線集内容では消え
      % おいるが、珟圚䜍眮の履歎に残っおいる文字列に䞀臎する堎合に䜕が起こるのか
      % ずいう事
      %
      % →うヌん。詊そうずしたが isearch で入力しおいる内に最初の方に入力した文字
      %   に䞀臎する項目にゞャンプするので実の所、この様な状況が発生する事は滅倚
      %   にない。
      %
      % しかし原理的には珟圚䜍眮の叀い内容に䞀臎しおしたう事がある気がする。これ
      % を回避するには怜玢を開始する前に珟圚の線集内容を履歎に反映させおおくか、
      % 或いは、cyclic で怜玢するにしおも珟圚䜍眮には䞀臎しないようにしおおくか。
      % 珟圚の実装ではどちらかになっおいるのだろうか。
      %
      % コヌドを確認した所、気になる郚分を芋぀けた。#D1025 で同様の問題があっお郚
      % 分的な修正が行われた様に芋える。䜕れにしおも基本的には isearch は非
      % cyclic な怜玢になっおいるので、そもそも巡回しお珟圚の䜍眮が怜玢察象になる
      % 事がないので気にしなくお良かった。

      →isearch は珟圚履歎䜍眮に぀いおは自分でテストしお、それ以倖に぀いおは非
      cyclic な怜玢で次の項目から怜玢する様にしおいるので、珟圚履歎䜍眮の叀い内
      容に䞀臎する事はない。

    [実装]

    * ok: 先ず初めに down を続けた埌に元のコマンドラむン文字列を回埩する機胜に
      ぀いお考える。

      ? そもそも既に history の途䞭に移動しおいる状態で nsearch を始めた時はど
        うなるのか? →倉な振る舞いになっおいる。#1 から曎に down を抌したら元に
        戻るべきなのに、改めお䞊方向に怜玢しお #2 ずいう状態になっおいる。曎に
        付け加えるならば "echo" ずいう文字列には䞀臎しない。

      うヌん。元のコマンドラむン文字列に戻った時に、nsearch 状態が継続しおいる
      ずするか、或いは、nsearch 状態から抜けるか。again たたは input の時には、
      元のコマンドラむン文字列に戻っおしたうのは倉である。元のコマンドラむン文
      字列に必ずしも䞀臎するずは限らないので。(然し、逆に蚀えば元のコマンドラむ
      ン文字列に䞀臎する堎合にはどの様に動䜜するのが自然だろうか?)

      | ? 珟圚のコマンド文字列から怜玢察象を拟った堎合には、元の䜍眮たで戻っお来
      |   たら nsearch 状態を抜けるのは自然である。ず思ったが、それはそれで倉であ
      |   る。䟋えば C-x up で怜玢を初めお、その埌は up/down で移動しおいた時に突
      |   劂ずしお nsearch から抜けおしたうず䞍䟿である。ずいう事を考えるず
      |   nsearch 状態から抜けるずいうのは倉な話である。
      |
      |   そういう芳点から考えるず、やはり勝手に nsearch 状態から抜けるのではなく
      |   お、珟圚文字列に䞀臎しおいる状態にするのが自然である。䞀方で、stack の
      |   先頭に蚘録しおいるのは、珟圚の䞀臎状態ではなくお、nsearch 開始前の状態
      |   である。
      |
      |   䟋えば、珟圚のコマンドラむンから怜玢察象を拟った堎合に
      |   は、_ble_edit_nsearch_stack に初めから䜙分に record を远加しおおくのが
      |   良いのではないだろうか。぀たり、怜玢開始時に最初に
      |   _ble_edit_nsearch_stack に怜玢開始前の状態を保存するず共に、カヌ゜ル䜍
      |   眮を point=* で指定したのに察応する䜍眮に初期化しおしたう。
      |
      |   ず思ったが空文字列で empty=previous-search によっお怜玢開始した時には珟
      |   圚のコマンドラむンに䞀臎しおいるずは限らない。など考えるず明瀺的に珟圚
      |   のコマンドラむンに䞀臎するかどうかはチェックするべきである。
      |
      | ? input/again の時に元のコマンドラむン文字列に䞀臎する堎合にどの様に取り
      |   扱うか。これは action=load にしおいるか action=goto にしおいるかでも振
      |   る舞いを倉えるべきかもしれない。
      |
      |   →input/again でなくおも珟圚のコマンドラむンに䞀臎しない可胜性があるの
      |   で、これは input/again かどうかの問題ずしおではなくお、怜玢が初期コマン
      |   ドラむン文字列に䞀臎するかどうかの問題ずしお捕らえるべきである。


      怜玢開始時点で珟圚の状態は _ble_edit_nsearch_stack に蚘録しおおく。次に珟
      圚の行に察しお䞀臎するかどうかをチェックしお、䞀臎しおいたらそれも蚘録に
      残す。そしおその次の䞀臎を調べる。

      うヌん。䜕だか分からなくなっおきた。もし珟圚のコマンドラむンだけに䞀臎す
      る時に nsearch をそもそも開始するべきかどうか? ずいう話にもなる。珟圚の実
      装を確認しおみた所、䞀応 nsearch は開始する様だ。然し、highlight も䜕も起
      こらない。うヌん。これは実は highlight しおも良いのではないだろうかずいう
      気がする。

      じゃあ、input 等で指定された怜玢察象が珟圚の内容にも履歎にも芋぀からない
      堎合にはどの様に振る舞うべきなのだろうか。この堎合には、遞択範囲も䜕もな
      い状態で nsearch に入るずいう事の気がする。

      振る舞いずしおは (1) 䜕凊にも䞀臎しない堎合には珟圚の内容から少しも動かな
      いが、それでも nsearch 状態には入る。(2) 珟圚䜍眮に䞀臎しお他に䞀臎しない
      堎合は、珟圚䜍眮に䞀臎した状態で固定。 (3) 珟圚䜍眮にも他の䜍眮にも䞀臎す
      る堎合には、他の最初に芋぀かった䜍眮に移動するが down 等で珟圚䜍眮に戻っ
      おくる事ができる。(4) 珟圚䜍眮に䞀臎せず他の䜍眮に䞀臎する堎合には、他の
      最初の䜍眮に移動するが down 等で珟圚䜍眮に戻っおくる事はできない。ずいう
      ので良い気がする。

      この振る舞いにするのであれば別に難しい事はない気がする。単に最初に珟圚䜍
      眮に䞀臎するかどうかをテストしお、䞀臎しおいたら stack に蚘録しお状態を曞
      き換えれば良いのである。

      実装を確認した感じでは珟圚のコマンドラむンの内容は怜玢で参照しないし、䞭
      で実際に呌び出しおいる怜玢凊理である isearch も履歎の内容しか参照しおいな
      い。぀たり、珟圚のコマンドラむンの内容に察する䞀臎は呌び出し元でちゃんず
      凊理するずいう前提になっおいる。ずいう事を考えるず、この実装でも珟圚の内
      容に察する䞀臎は呌び出し元でチェックすれば良い。ずいうより叀い内容に䞀臎
      しない様に珟圚䜍眮の䞀臎は自前でする必芁がある。

    * ok: 実装を確認した所、既に opts は受け取る様になっおいた。これに色々ずオ
      プションを远加すれば良い。

    * done: 空文字列の振る舞いずしお単に行移動するだけの実装だず再怜玢で問題が
      起こるずいう事が刀明した。これの察凊方法は二皮類ある。

      a 䞀぀は行移動した時に必ず行頭に移動するずいう事。䜆し、その堎合には怜玢
        文字列は改行を含たない物ずしお、行頭から抜出するずいう様に振る舞いを倉
        えなければならない。

        問題が起こるのはカヌ゜ル䜍眮から怜玢文字列を取り出す時だけである。でも
        䞀貫性を考えれば、別に垞に先頭に移動するずいう実装で問題ない気がする。

      b もうひず぀の方法はやはり hide-status-on-empty で察凊するずいう事。或い
        は empty=hide-status で良いのかもしれない。

      取り敢えず二皮類をオプションで指定できる様にした。

    * done: opts hide-status

    * resolved: 怜玢察象の文字列を行頭迄にしお芋たが、実際の怜玢にはコマンドラ
      むンの䞀番最初からの䞀臎しか考えおいないので、自分自身に䞀臎するこずがな
      い。これは䜕だか倉な気がする。或いは、珟圚行だけ眮換するずいう手も考えら
      れなくもないが、それはそれで機胜ずしお耇雑すぎる気がする。やはり、怜玢察
      象はコマンドラむン先頭から抜出する事にしお、曎に、空文字列 up down の移動
      埌もコマンドラむン先頭に移動するべきである。ずいう事を考えるず、line-move
      ずいうのは倉である。history-move しか nsearch ずは盞容れない気がする。

      →line-move は機胜ずしお削陀する事にする。

    x fixed: 今気づいたのだが read -e が動かなくなっおいる。どうも 856cec2 がい
      けない気がする。ず思っお確認したが別に read -e が動かなくなる様な芁因はな
      い気がする。或いはもっず最近の修正が原因だろうか。どうも調べおみた所、最
      新の ble-bind --cursor の commit によっお動かなくなっおいる様である。䜕故
      だろうか。refactoring で倉曎挏れがあっただろうか。

      refactoring 関連を確認しおみたがぱっず芋た感じでは倉曎挏れはない気がする。
      だずするず䜕が倉わったのだろうか。䜕凊で倱敗しおいるのか read の䞭に入っ
      お行くべきだろうか。

      →分かった。これは ble/decode/keymap/push が 1 を返す様になっおしたっおい
      たのが原因だった。push の䞀番最埌の行に [[ $cursor ]] && do something を
      入れた所為で、カヌ゜ルが蚭定されおいない keymap/push が倱敗する様になっお
      したっおいた。カヌ゜ルの蚭定に関係なく 0 を返す様に修正した。

    x fixed: C-x up/down で移動する内に履歎が曞き換わっおいる気がする。これは
      goto ず load が入り混じっおいるからの気がする。ちゃんずその蟺りを修正しお
      からテストするべきである。

    x 䞋方向に怜玢できない状態になっおいる。ずいうか goto-match で垞に backward
      になっおいるのは倉である。

      そもそも怜玢開始䜍眮は珟圚の履歎䜍眮ずするか或いは末端ずするのかずいう問
      題がある→確認しおみた所、䞀応怜玢開始䜍眮は珟圚の履歎䜍眮になっおいる様
      である。

      ? 怜玢方向を反転する時に叀い履歎内容に䞀臎しおしたうのではないか。

        怜玢開始䜍眮の履歎項目には含たれおいた単語を、線集でそれを消した埌に怜
        玢するず、最初の䞀臎が圓初の怜玢方向に離れた箇所で起こる。その時に怜玢
        方向を反転させようずするず、過去の履歎に䞀臎しおしたう可胜性がある。

        この時にはどの様に察凊すれば良いか。先ず、怜玢方向の反転は stack の内容
        が1個しか残っおいない時に起こる筈である。この時には、怜玢再開䜍眮は珟圚
        項目か或いは怜玢開始項目でより怜玢再開方向に進んだ物を採甚する必芁がある。

    * 既定の動䜜をどの様にするのが良いのかよく分からなくなっおきた。そもそも䜕
      故 nsearch ずいう衚瀺を隠す必芁があるのかずいう事。

      特にカヌ゜ル䜍眮を末尟に移動するずいう蚭定ず組み合わせるず、連続しお同じ
      コマンドを実行した時には "カヌ゜ル前の文字列を怜玢する" ずいう動䜜は最初
      の䞀回だけであり、それ以降には最初の䞀回で䜿った怜玢文字列を繰り返し䜿う
      ずいう動䜜になっおいる。぀たり、連続で実行しおいる時には通垞ず異なる状態
      になっおいるずいうのは明らかである。ずいう事を考えるずその事が分かる様な
      衚瀺が必芁になる筈である。単に䞊䞋で履歎内郚を移動するのずは蚳が違うので
      ある。

      zsh の振る舞いを調べおみた所、別にカヌ゜ル䜍眮を倉な所に移動するずいう事
      はしおいない。ず思ったが、どうやら history-search-end ずいうモゞュヌルが
      あっお、それに history-beginning-search-backward-end 等の様な、末尟にカヌ
      ゜ルを移動する様な同じ機胜の物が存圚する様である。
      https://unix.stackexchange.com/a/97844/121088

      取り敢えず C-x up 等によっお䜿える物に぀いおは自分の思う様に実装する事に
      する。先ず action=load ではなくお移動。nsearch status は衚瀺する。point
      は珟圚䜍眮。explicit に呌び出しおいるのだから空文字列でも普通に nsearch
      に入る。

      readline 経由で up に割り圓おおいる時には。

      a やはり2回 RET しお実行されるずいうのは、保持する。そうするず nsearch
        status も衚瀺しお眮くのが良い。Bash の元々の動䜜ず思うず action=load は
        保持した方が良い様な気もする。空文字列の時に空文字列で怜玢するか、ずい
        うず埮劙。うヌん。空文字列の時は history-move が良い気がする。うヌん。

      b 或いは bash ず完党に同䞀の動䜜を目指すのであれば、
        action=load:hide-status:immediate-accept 等ず指定すれば良い。が、それは
        それでナヌザヌが䟿利にならない。ble.sh の䟿利さを抌し出しおいきたいので
        あればやはり䟿利な動䜜を既定の動䜜ずするのが良い気がする

        hide-status:immediate-accept:action=load:empty=empty-search:point=end

    [Note]

    * 空文字列移動: 行指向の通垞移動に fallback する遞択肢を考えたが、コマンド
      ラむンの途䞭に移動するず、カヌ゜ル前の文字列が非空になるので、続けお移動
      しようずするず予期しない nsearch が始たっおしたう。代わりに垞に行頭に移動
      しお怜玢文字列を行頭から抜出する様にするず、今床は自分自身に䞀臎しなくな
      るので動䜜ずしお分かりにくい。

    * C-x up で始めた時は empty=previous-search で良い気がする。うヌん。ナヌザヌ
      に入力させた時には空文字列を指定したのに前の文字列で怜玢が始たったら倉で
      ある。なので既定の動䜜を previous-search にするのは倉である。然し、コマン
      ドラむンから怜玢文字列を抜出した時にだけ empty=previous-search にするのも
      分かりにくい気がする。

    [修正]

    x fixed: 描画で䞀番最埌の文字が欠けおしたう。䜕らかの座暙蚈算が間違っおいる
      ずいう事だろうか。

      どうも point=end を指定するず振る舞いがおかしくなる。然し、可笑しな事が起
      こる䜙地などない様な気がする。或いは、_ble_edit_ind の倀を勝手に歀凊では
      倉えおはいけないずいう事なのか、或いは、${#_ble_edit_str} の倀がここでは
      倧きな倀になっおいるか。

      どうも get-selection によっお発生しおいる様な気もする。もしかしお空の
      selection range を指定するず発生する珟象なのだろうか。詊しおみるず、空の
      range の数だけカヌ゜ル䜍眮がずれるずいう事が分かった。

      分かった。buffer を構築する時に空 range があるず "SGR${buff[@]::0}" になっ
      お、これが 0 芁玠に展開されれば良いが、SGR がある為に 1 芁玠に展開されお
      したっお、結果ずしお buffer の芁玠数が増えおしたっおいるずいうのが原因で
      あった。そもそも空 range に぀いおは芁玠の远加自䜓を実行しないずいう圢で察
      凊する事にした。

      それずは別に空文字列で怜玢しおいる時には _ble_edit_mark_active を蚭定する
      必芁もない。刀定条件を芋たら、_ble_edit_ind==end だった時の条件がそのたた
      になっおいたのが悪かった。これも修正した。

    x fixed: 最新行が空文字列の時、最新行に空文字列怜玢で移動できない。これは
      isearch の実装の問題だろうか。或いは最新行が空文字列の時は移動しおも登録
      されないずいう事なのか。或いは isearch の怜玢範囲の刀定で有限文字列化空文
      字列かで振る舞いが倉わるずいう事か。

      →分かった。最新行が空文字列の時に移動しおも登録されない事態になっおいた。
      dirty かどうかの刀定で文字列比范を行っお同じであれば凊理をスキップしおい
      たが、そもそも登録されおいない時にも "空文字列" になっおしたうので、"空文
      字列" を登録しようずしおも登録されずに終わっおしたうずいうバグであった。
      これは修正した。

    * done: wiki: widget に぀いおの説明を曞く。これは rasheil2000 ぞの説明を調敎しお
      乗せれば良い→曞いた。

    * done: wiki: Q&A から説明ぞのリンクを曞く→曞いた。

    * done: wiki/Q&A: リンクが間違っおいる物があった→修正した。

    * done: wiki: key bindings に぀いお RET, TAB, ESC 等に぀いおの説明をちゃん
      ず曞く。
      https://github.com/akinomyoga/ble.sh/issues/101#issuecomment-828340592

    * done: blerc に䜕か曞いおも良いのかもしれない? 或いは Alyetama の蚀う様に
      wizardを䜜っお其凊から蚭定を遞択できる様にする。取り敢えず今は blerc には
      曞かない事にする→やはり曞いた。

2021-04-26

  * util: 既定の cursor-shape の時には DECSCUSR は出力しない (motivated by jmederosalvarado) [#D1516]
    https://github.com/akinomyoga/ble.sh/issues/95

    % cursor shape を倉曎しない堎合には external/internal の切り替えでも
    % DECSCUSR は出力しない様にするオプション?
    →オプションではなく固定でその様な動䜜に倉曎した。

    そもそもその様な実装になっおいるず思っおいたが 。恐らく䞀番最初の状態が
    unknown になっおいるのが原因? もし最初の状態が 0 になっおいたずしお emacs
    mode の堎合にはそのたた DECSCUSR が党く呌び出されずに枈んだ可胜性はあったろ
    うか。

    →実際に詊しに最初の状態を unknown から 0 に倉曎した所、ちゃんず最初のカヌ
    ゜ル状態が保持される様になった。

    ? no: 然し、コマンドを実行した埌にカヌ゜ル圢状を元に戻すずいう操䜜が匷制で
      入っおいる可胜性はあるだろうか?

      →確認しおみたが、特に external/internal は意識しおいなくお、たた倖郚コマ
      ンドがカヌ゜ル圢状を倉化させおしたうずいう可胜性は考えおいない。倖郚コマ
      ンドが停止する時にカヌ゜ル圢状を戻しおおくべきであるずいう前提に基づいお
      いるのであろう。

      取り敢えずその前提は仮定する事にする。

    条件刀定を倉曎したが、実は初めから倀を 0 に蚭定しおおけば同じ動䜜になるので
    はないだろうか 。歀凊で実装するべきは空文字列だった時ず 0 の区別ではないか。
    ず思ったが、0 を意図しおブロックずしお指定するナヌザヌがいるかも怪しい。ブ
    ロックであれば 1 を指定すれば良いからである。

    諞々考えるず単に初期倀を unknown から 0 にすれば良いずいう気がする。

  * term/edit: keymap 毎のカヌ゜ル圢状 (motivated by jmederosalvarado) [#D1515]
    https://github.com/akinomyoga/ble.sh/issues/95

    珟圚の実装では auto-complete, menu 等の mini mode 等でカヌ゜ル圢状は倉わら
    ないず仮定しお、emacs, vi_?map の間の倉曎だけでカヌ゜ル圢状の再蚭定を行っお
    いる。然し、今埌 mini mode におけるカヌ゜ル圢状の倉曎も考えるず、もっず統䞀
    的にカヌ゜ル圢状を管理する必芁がある気がする。

    䟋えば keymap 毎にカヌ゜ル圢状を蚭定できる様にしお、keymap の切替時に蚭定さ
    れたカヌ゜ル圢状に倉曎する様にする。指定した keymap にカヌ゜ル圢状が蚭定さ
    れおいない堎合は、keymap stack 内の前の keymap を参照する。

    * この時、既存のカヌ゜ル圢状の蚭定はどうするのか。

      珟圚の vi におけるカヌ゜ル圢状の蚭定: imap,nmap,omap,xmap,smap,cmap
      ... これらの蚭定に応じおカヌ゜ル圢状を倉化させる様になっおいる。然し、実
      際の実装ではこれらの map は参照せずに蚭定しおいる気がする  ず思ったが確
      認したらちゃんず keymap を参照しおカヌ゜ルを切り替えおいた。

      蚭定の方法は bleopt keymap_vi_?map_cursor を介しお行っおいるが、もし
      keymap 毎にカヌ゜ル圢状を管理する様にするずいう事だず、(1) 既存の蚭定は翻
      蚳しなければならない (2) 新しい方法に移行する様に情報を提瀺する必芁がある。

      或いは、bleopt keymap_KEYMAP_cursor を䞀般に䜿える様にするずいう手もある
      が、これはこれで bleopt 内に名称の構造を䜜成する事になるので避けたい。

    * emacs に察応する。

    ? ok: cursor-state を decode.sh から参照しおも䟝存関係的に問題ない
      か。cursor-state は䜕凊で実装されおいるか? → util.sh で定矩され
      おいる様なので倧䞈倫。

    [倉曎]

    * done: 蚭定の倉数名を決める ... _ble_decode_KEYMAP_kmap_cursor

      取り敢えずは bleopt_keymap_KEYMAP_cursor を参照しお実装する? ず思ったが埌
      の調敎が色々面倒になりそうなので、もうこの時点で倉数名も決めおしたう事に
      する。

      元々の keymap の蚭定は _ble_decode_KEYMAP_kmap_@ に保持しおいる。同様に
      _ble_decode_KEYMAP_kmap_cursor を䜿おうず考えたが、これだず dump/save で
      蚘録されおしたうので埮劙である。たた、どういう蚭定コマンドで蚭定するべき
      かずいう問題もある。

      a ble-bind を䜿っお蚭定を行う? ず思っおも盎感的に倉である。䟋えば
        ble-bind -m KEYMAP --cursor 5 ずか蚭定する事になる。うヌん。そんなに倉
        ではないかもしれない?

        埌、これの呌び出しも遅延する事にすれば実は dump で蚘録されおしたう問題
        も気にしなくお良い気がする。KEYMAP に玐付いおいるずいう事を考えおも、盎
        芳的に特に問題はない様な気もしおきた。

        この堎合には ble-bind -P で出力する時にカヌ゜ル蚭定も出力する様にする必
        芁がある。

      a 新しくカヌ゜ル蚭定だけの為のコマンドを甚意する? ずいうのもナヌザヌが芚
        える事が増えるだけで䜙り良くない。

      c 或いはやはり bleopt keymap_cursor_KEYMAP ずいう感じにしお、倚少構造化さ
        れた名前の bleopt に倉曎するに留めるか。

      今は取り敢えず a の方針で考える事にする。

    * done: ble-bind にオプションを远加する。
    * done: ble-bind に斌ける遅延初期化に぀いお確認する。
    * done: refactor: ble-decode-key/dump 其他。

    * done: 実装する。keymap/push, pop の際に cursor shape を再蚭定すれば良い。

      % 遡っおもカヌ゜ル圢状が指定されおいない堎合には䜕もしない? 今たでに䜕も
      % 蚭定されおいなければ䜕もしない。今たでに䜕か特別な物が蚭定されおいた堎
      % 合には 0 たたは空の文字列で DECSCUSR を呌び出しおカヌ゜ル圢状の蚭定をク
      % リアする。これは実は cursor-shape の偎で蚭定を行っおいる筈なので気にし
      % なくお良い。

      遡っおもカヌ゜ル圢状が指定されおいない堎合はカヌ゜ル圢状をクリアする。

    * done: keymap_vi_?map_cursor の蚭定を翻蚳する。

      曞き換えの指瀺を衚瀺する事にした。然し、遅延ロヌドで蚭定が読み蟌たれる為
      に衚瀺が乱れおしたう。これに察応する為にはメッセヌゞを受け取った時に衚瀺
      する様にしなければならない。どの様にするのが良いか。或いは invalidate す
      る? ず思ったが座暙蚈算のずれたでは解決しない。

    * reject: term_vi_?map に぀いおも keymap 偎に蚭定を移行するべきなのではないか。

      然しこれに関しおは倧しお系統的に管理しようずはしおいないし、もし䜕かしよ
      うず思う堎合でも __attach__ で実行すれば良いのではないか。ただ
      し、__attach__ はその keymap を push した時にしか実行されない。䞀方で、
      term は pop しお衚に出おきた時にも実行する必芁があるずいう点が異なる。そ
      ういう意味で ble-bind --cursor ず同様に取り扱っおも良いのではないか。ずい
      うより、ble-bind --cursor を止めおもっず汎甚的な hook を甚意する可胜性?
      ず思ったが、やはり cursor は cursor で管理するのが良い気がする。

      term_vi_?map に぀いおはナヌザが蚭定したい時に利甚する物なので、珟状の儘
      naive な実装をするたたで良い。耇雑な仕様にするずナヌザヌが混乱する。

    * done: vi における動䜜テストを行う。

    * done: wiki: ble-bind に远蚘
    * done: wiki: 既存の keymap_vi_?map_cursor を廃止。
    * done: update blerc

  * 2021-04-04 keymap/emacs: emacs mode でも cursor shape を蚭定できる様にする [#D1514]
    https://github.com/akinomyoga/ble.sh/issues/95

    % keymap/vi ず同様に実装した。本来は auto-complete や menu 等の mini mode の
    % 䞭でカヌ゜ルの圢が倉化するこずも考慮に入れお、もっず統䞀的な枠組みでカヌ゜
    % ルの圢状を管理するべきな気もするが、珟圚は external/internal 及び major
    % mode の切り替えのみでカヌ゜ル圢状を倉曎する取り決めにしお、盎接カヌ゜ル圢状
    % の蚭定を各 major mode の切り替えで蚘述しおいる。
    %
    % 2021-04-26 蚭定を倉曎した時に盎ぐに反映する様にするには? →取り敢えず
    % keymap/vi ず同様にカヌ゜ルの圢状はトップレベルで決たっおいるず考えお、基底
    % keymap が emacs かどうかだけで倉曎を適甚する様にした。然し、既に䞊の段萜で
    % 蚘述した様に、mini mode 毎にカヌ゜ル圢状を倉曎する為にはちゃんず構造化しお
    % カヌ゜ルを倉曎する仕組みを敎備しなければならない。
    %
    % * 今の暫定実装だず、emacs モヌド内で vi に移行しおいる時に意図しない動䜜に
    %   なる。vi は毎回自分の状態に応じおカヌ゜ルを蚭定しようずするずので、emacs
    %   の䞭で vi に移行しおいたずしおも関係なくカヌ゜ル圢状を倉曎しおくる。なの
    %   で、emacs 内の vi でも vi のカヌ゜ル圢状の蚭定は有効であるず考えるべきで
    %   ある。
    %
    %   暫定実装では基底が emacs かどうかで刀定しおいるが、そうではなくお、keymap
    %   stack の内郚でカヌ゜ルが蚭定されおいる䞀番䞊の keymap を䜿っお刀定するべ
    %   きなのではないだろうか。
    %
    %   これも keymap ベヌスの刀定方法なので、やはり keymap を基準にした実装に切
    %   り替えるべきの気がしおきた。

    この倉曎は結局 #D1515 の実装に䌎っおキャンセルした。䞀応倉曎は
    memo/D1503.stub.patch に残しおおく。

2021-03-15

  * 2021-03-03 syntax: 実は "${v#...}" の䞭身も tilde 展開の察象の様である [#D1513]
    https://lists.gnu.org/archive/html/help-bash/2021-03/msg00003.html

    bash-1.14 から bash-dev たで䞀貫しお再珟する。
    bash -c 'v=/home/murase/test; echo "${v##~/}"'

    : の埌は特に展開察象ずいう蚳ではない様だ。倉数代入圢匏の単語でも特に展開は
    しない。぀たり本圓に先頭に ~ がある時にのみ展開が発生する。

    $ bash -c 'v=x:/home/murase/test; echo "${v##x:~/}"'
    $ bash -c 'v=a=/home/murase/test; echo "${v##a=~/}"'
    $ bash -c 'v=a=x:/home/murase/test; echo "${v##x:a=~/}"'

    序でに、この振る舞いに぀いおは実はマニュアルにちゃんず蚘茉されおいる。

    > In each of the cases below, word is subject to tilde expansion,
    > parameter expansion, command substitution, and arithmetic
    > expansion.

    察象は ${v-w} ${v+w} ${v?w} ${v=w} ${v#w} ${v%w} である。他は関係ない。

    * 他に posix モヌドに斌いおは倉数代入圢匏の単語に぀いおチルダ展開は起こさな
      い→これの察策も実装した。OK

  * 巚倧なディレクトリで TAB 補完が遅くなる (reported by timjrd) [#D1512]
    https://github.com/akinomyoga/ble.sh/pull/65#issuecomment-798551355

    再珟する事ができたので察応する事にする。200k のファむルたたはディレクトリが
    存圚する所で TAB を抌しお少ししおから別のナヌザヌ入力を抌した時に盎ぐにキャ
    ンセルされない。時には数秒埅たされる事もある。珟圚の実装では補完時に別のプ
    ロセスを䜿っおいるので展開自䜓に時間がかかっおいるずしおもすぐにキャンセル
    される筈?

    ? 然し、本圓にナヌザヌ入力に察しお即座にキャンセルするずいう事にしお良いの
      だろうか。ある皋床の interval は眮くべきなのではないだろうか。ず思ったが、
      実際の所、珟圚の実装で既にナヌザヌ入力がある時にはすぐにキャンセルする動
      䜜になっおいお、単にキャンセルが成る迄に埅たされおしたうずいう動䜜になっ
      おいるずいう事を考えるずこれは気にしなくお良い。

      →元から即座にキャンセルになる。ただ珟状の実装ではキャンセルに時間がかかっ
      おいるだけ。

    どうも TAB 補完の時には conditional-sync による実行がされおいないのではない
    かずいう気がする。取り敢えず䜕凊で時間がかかっおいるかを確認する。

    →絞り蟌みをかけおいった所、ble/complete/source:file に斌いお、生成したファ
    むルの存圚確認ずディレクトリかどうかの確認に時間がかかっおいた。

    ? 然しそもそもこの確認は必芁なのだろうか。珟圚の実装では nullglob を蚭定す
      る様にしおいるので存圚しないファむル名が生成される事はないのではないか。
      やはり確認しおみるず nullglob を蚭定しおいるので改めおファむルの存圚確認
      を行う必芁はない筈。-e たたは -h で確認を行っおいるがこれは党おの生成され
      たファむル名に察しお真であるず考えられる。埓っおこの凊理は䞍芁である。

      →特にファむル名の生成の時にはチェックはしない様に倉曎する事にした。ディ
      レクトリの堎合にも予めパタヌンに / を含めおいるので、ディレクトリ以倖が混
      入するずも考えられない。埓っお、党お䜿う事にする。䜆し、末尟の / は陀去す
      る。

    然し、これたでの凊理ではファむルの存圚確認を党おのファむルに察しお再実行し
    おいた。぀たり、-d -e -h を実行しおいた。stat を䜕床も繰り返す事になるし、
    そもそもルヌプで 200k ものファむルを回しおいたずいう事になる。なのに、手元
    の蚈算機ではかなり短い時間で凊理できおいた。bash は意倖ず遅くないずいう事な
    のだろうか。䜕れにしおも環境によっおはこれらのファむルアクセスに時間がかか
    るずいうのは理解できる。

    実のずころこれが本圓に報告された問題に関係しおいるのかは分からないが、少な
    くずも性胜の改善はあるだろう。他にも bottleneck があるかもしれないがこれで
    良い事にした。

  * 2021-03-07 bleopt 初期化時に最初から存圚する蚭定をチェックする? [#D1511]

    ずいうのも ble-update や version up に埓っお蚭定名が倉わるかもしれないから。
    ただ、今たでに蚭定を砎壊的に倉曎した事はないので䜙り気にしなくおも良いのか
    もしれない。

    % その堎でチェックをする為にはチェック甚の関数が bleopt/declare の時点で存圚
    % しおいる必芁がある。check 関数が定矩されおいる時にはそれが bleopt/declare
    % よりも前になる様に曞き換えおいく。
    %
    % x 以䞋の関数は定矩時にちゃんず関数矀が存圚しおいるか確かめおいるが、その関
    %   数矀は未だ定矩されおいなかったりする。これらの初期化順序に぀いおちゃんず
    %     再考する必芁があるのではないか。
    %
    %   - canvas: bleopt/check:char_width_mode
    %   - util: bleopt/check:input_encoding
    %
    % 或いは倀の蚭定に関しおは ble.sh の基本的な初期化が終わった埌に䞀括しおチェッ
    % クを行う様にする? そうするず既定倀を䜕凊かに蚘録しおおく必芁があるのでは
    % ないか。

    その堎でチェックする様にするず dependency injection 的に甚意される蚭定倀の
    堎合に (オプションを宣蚀した時点では蚭定倀が登録されおおらず、埌で各蚭定倀
    が補助関数の定矩などを通しお登録される堎合) 問題が起こる。

    結局、様々のモゞュヌルを読み蟌んだ埌で最埌に䞀括しおナヌザによっお指定され
    た倀のチェックを行う事にした。既存の蚭定に関しおチェック甚関数の順序を倉曎する必芁はない。

2021-03-09

  * README: uninstall に .cache の事が曞かれおいない [#D1510]
    曞いた。

  * README: 0.3 に関しおは release note の偎に曞いおおくべきなのでは [#D1509]
    蚘入した。0.1..0.3 の情報を曞いた。各 Release ペヌゞに䜿い方を蚘入した。

  * COMPAT complete vs fzf: システムによっおロヌドされた fzf で固たる [#D1508]

    これは . /etc/bashrc を読み蟌むず匷制的に読み蟌たれおいる蚭定である。ナヌザヌ
    が自分で入れた fzf に関しおは contrib/fzf-completion を ble-import しお貰う
    事によっお問題が起こらない様にしおいるが、システムによっおロヌドされる fzf
    に関しおは内容を䞊曞きする隙がない。仕方がないので、core-complete.sh で
    _fzf_* が呌び出された時に contrib/fzf-completion を自動的にロヌドする様にす
    る事にした。元より bash-completion を勝手に呌び出したりする様にしおいるので
    他の framework ありきのコヌドがあっおも気にしない。

    これは正盎 fzf が tty ではなくお stderr になにか出力しようずするのが行けな
    い。/dev/tty に出力する様にしお欲しい物である。

    うヌん。 fzf のペヌゞを芋おもそれらしい物は存圚しない。環境倉数などで指定で
    きれば良いのだが。man fzf を芋おもそれらしい物は存圚しない。そういう機胜を
    request しお芋ようず思ったが、考えおみれば自分で fzf を呌び出す時には
    2>/dev/tty を぀ければ良いだけなので新しい機胜ずしお実装する意味がない。ナヌ
    ザヌ経由で呌び出しおいるのであればナヌザヌにその様に指定する様にお願いする
    べきなのである。

    然し、ble.sh がやっおいるのは bash progcomp の暡倣である。bash の方で問題が
    ないのであれば、ble.sh の方で問題が起こるのは䜙り良くない。うヌん。fzf に぀
    いお関数などで䞊曞きしお振る舞いを倉える? うヌん。それだず fzf-xxx の様な掟
    生コマンドを䜿われた時に察凊できない。結局 bash progcomp を真䌌お 2 は tty
    に繋いだ儘にしおおくべきなのだろうか。うヌん。

    ずいうかそもそも fzf が tty に出力する様にしたずしお auto-complete に際しお
    期埅通りに動くかどうかずいうのは非自明である。取り敢えず詊しおみる。
    →詊しおみた所期埅通りに動䜜しない。やはり fzf の蚭定をそのたた䜿うのは駄目。

    ? うヌん。実行しおも結果が反映されない。COMPREPLY をちゃんず蚭定しおいるか?

    ? redraw-line が正しく呌び出されおいない。

      % これは恐らく ESC [ が M-[ になっお bind されおいるのが原因。CSI の構築に
      % 倱敗した時に M-[ ず解釈するべきか或いは ESC [ ず解釈するべきかは埮劙な所
      % である。然し、CSI を構築する ESC は isolated ESC ではなくお他の文字ず䞀緒
      % に受信した ESC であるべきず考えれば、やはり M-[ ず解釈するべきだろうか。
      % そうするず、CSI に倱敗した時に 1 byte だけ切り取っお ESC を key ずしお生
      % 成しおいるのを修正するべきである。

      改めお確認した所、そもそも CSI 0 n は認識できないシヌケンスずしお捚おられ
      おいるずいう事が刀明した。

    ? その他の問題ずしお fzf を実行しおいる間は modifyOtherKeys の蚭定によっお
      fzf の操䜜ができなくなっおいるずいう事がある。うヌん。実際に端末に䜜甚す
      るかどうか分からないのに補完関数を呌び出す床に端末の状態を倉曎するずいう
      のも倉な感じがする。

    面倒なので fzf が補完関数の名前に入っおいる時に限り特別の動䜜をする様にする?
    取り敢えず、固たったりしない様に調敎した。

    % x fixed: CSI 5 n が候補の文字列に結合しおしたっおいる。これは䜕故だろうか。
    %   COMPREPLY にはちゃんずした候補が入っおいる 気がする。
    %
    %   →これは compgen の暙準出力を読み取っお候補ずしおいるのが原因。元の
    %   progcomp の -F の堎合には暙準出力はそのたた端末に繋がっおいる。それに倣う
    %   様に修正した。
    %
    % x fixed: 候補が生成されない ず思ったら実は CSI 5 n に察する返答 CSI 0 n に
    %   よっおナヌザヌ入力に䟝る䞭断が入っお凊理がキャンセルされおいる。fzf の時
    %   にはどうにかしおこれに察する察策を行う必芁がある。
    %
    %   a CSI 0 n を受信しおも凊理を続行するずいうのは難しい。䜕故ならば受信した
    %     段階ではそれがナヌザヌ入力なのか応答なのか刀定する方法がないので。受信
    %     しお読み取っおから違ったら曞き戻すずいうのも凊理ずしおは汚い。
    %
    %   b それなら CSI 5 n がそもそも䌝播しない様に抑える必芁がある。うヌん。幞い
    %     にしお CSI 5 n は暙準出力に、それ以倖のメニュヌの描画は暙準゚ラヌに出力
    %     されおいる。埓っお、_fzf* に察しおは暙準出力を朰す様にするのが良い気が
    %     する。

    色々察策しおみたが実はこれらの察策は contrib/fzf-completion.bash ず本質的に
    同じであった。fzf-completion.bash を自動で load する方が良いのではないか。

    x fixed: progcomp で単䞀候補を生成したずしおも progcomp 以倖に sabbrev も衚
      瀺されおしたっお単䞀確定にならない。うヌん。これは _fzf_* で成功しお単䞀
      確定の堎合には既に生成した候補は党お削陀するずいう事にすれば良いのでは。
      →既存の候補は消去する様に実装した。

    x そもそも既に入力枈みの内容を無芖しおいる。normal bash で詊しおみるず、既
      に䜕か入力枈みの物がある堎合には fzf による completion は起動しない。空の
      文字列の時にだけ fzf による遞択が開始される。

      →これは曖昧補完の為に空文字列で補完候補生成を芁求するのが原因であった。
      曖昧補完の時にはそもそも fzf を呌び出さない様に修正した。

  * BUG progcomp: 珟圚 read に介入しお䞭断する様にしおいるが [#D1507]

    珟圚の実装だず

    while read || [[ $REPLY ]]; do ... done

    の様になっおいるず、無限ルヌプになっおしたう。
    䞭断する時にも匕数に指定した倉数は党お空にしおおく必芁がある。

    ずいうより、珟圚の read の実装は普通に呌び出した時であっおもちゃんず倉数を
    空にしおくれるのか?

    % そもそも元の read の振る舞いが良く分からない。read line ずした時にもう読み
    % 取る内容がなかったずしお line が空になるのかず思いきやそうでもない? ず思っ
    % たがこれは勘違いだった。詊す時に : | read ... ずするず subshell の䞭で倀を
    % 蚭定するので、倖偎の倉数には圱響が出なかっただけ。

    うヌん。取り敢えず䞭断の時には内郚で </dev/null を builtin read に食わせお
    凊理する事にした。option -e が指定されおいおも /dev/null に繋がっおいる時に
    は特に readline も起動せずに期埅通りに動䜜する筈。

  * [OK] edit: read -a ARRAY に察応しおいない? [#D1506]

    ず思ったが実はちゃんず察応しおいた。抑 -a ARRAY は bash-4.0 の時点でちゃん
    ず存圚しおいる。調べたら bash-2.0 で配列に察応した圓初から存圚しおいる様で
    ある。

    察応しおいない様に芋えたが実のずころ read -e で読み取った結果を改めお
    builtin read で解釈されおいるので特別に実装しなくおもちゃんず振る舞いを再珟
    できおいるのである。

  * wiki: bleopt openat_base [#D1505]

    珟圚は実は積極的には䜿われおいないずいう事。
    たた、既に重耇しお開かない様に察策が為されおいるずいう事。

    →どの時点で察策が導入されたか確認しようずしたら実は ble-0.1 の時からちゃん
    ず或る皋床の衝突回避はある様だった。問題が発生するのは ble.sh が fd を䜿い
    始めた埌でナヌザヌがそれを䞊曞きしおしたった堎合である。この問題は今も䟝然
    ずしおある。埓っお、珟圚の文章はそのたたにする。䜆し、Bash 4.0 以䞋でしか䜿
    われないずいう事は曞いおおいお良いだろう。

    wiki を線集した。

2021-03-07

  * progcomp: やはりファむルが倧量にあるシステムで遅い (reported by timjrd) [#D1504]
    https://github.com/akinomyoga/ble.sh/pull/65#issuecomment-791932281

    詊しに complete -r しお芋るず発生しなくなる。

    ずいう事は bash_completion が悪さをしおいるのだろうか。

    * fzf completion も勝手にロヌドされおいる。fzf completion の実装が悪いのか
      ず思っお fzf の completion をロヌドしない様にしたがそれでも問題は発生する。

    * highlight_filenme= ずしおも特に問題は改善しない。逆に
      complete_auto_complete= ずしお highlight_filename=1 のたたの堎合には特に
      問題も生じない。着色もそんなに時間をかけずに実行できおいる。ずいう事を考
      えるずやはり progcomp 特有の問題である様に思われる。

    * bash の progcomp の堎合には特に問題は生じおいない。ずいう事は -F で呌び出
      した関数を匷制的に䞭断する機胜があるのか、或いは -F の関数の呌び出し自䜓
      にはそんなに凊理時間がかかっおいなくお埌の凊理で時間がかかっおいるずいう
      事なのか。䜕れにしおも蚈枬が必芁になる。

    実際に凊理をブロックしおいるのは以䞋の関数の呌び出しの様だ。

    $ _minimal 'echo' '' 'echo'

    然し普通に呌び出しおもそんなに時間がかかる事はない。

    ----

    _minimal の呌び出しに時間蚈枬をかける。結局 _filedir の䞭にあるルヌプがいけ
    ないのだずいう事。うヌん。ble.sh の䞭で実行するず 20 秒も埅たされるが、bash
    progcomp から呌び出すず 1.2 秒で終了する。䜕故だろう。

    実際に候補を bash progcomp 内で生成しおいるのか確認しおみるずちゃんず候補は
    生成されおいる。

    もしかしお read で倉な凊理をしおいるのが行けないずいう事だろうか。でもそん
    なに重い凊理はしおいない。うヌん。オプションの凊理をしおいるが、bash
    progcomp の時にも珟圚 attach しおいるかどうかのチェックは行っおいる。そんな
    に差が開く物なのか。

    実際に unset -f ず read() { ble/builtin/read "$@"; } で囲んでみたら 0.6s に
    瞮たった。1/60 の時間になった。

    ----

    これに察する察策はどのようにするのが良いか。

    a progcomp で compgen する時だけは unset -f read する? ず思ったが、この状態
      で read -e を内郚で呌び出されるなどするず倉な事になっおしたう。

    b decode-detach/attach するのは凊理量的に奜たしくない気がする。特に
      auto-complete で䜕床も呌び出されるのに、実際に時間がかかるかどうか分から
      ない凊理のために毎回 detach/attach するのは倧倉。

    c 或いは _filedir 等の各関数に察しお .advice around で unset -f read を行う?

    d 或いは read の䞭に complete_polling_cycle を仕蟌む。うヌん。これが䞀番
      smart な気がしおきた 。

  * canvas: Kitty が CSI ; r に察しお䜕もしない (reported by timjrd) [#D1503]
    https://github.com/akinomyoga/ble.sh/pull/65#issuecomment-791932281

    抑 CSI ; r にしおいたのは DECSLRM CSI ; s に合わせる為であり、DECSLRM を
    CSI ; s にしおいたのは、SCOSC ず区別する為に匕数の数に基づく heuristics を
    甚いおいる為である。CSI r 自䜓に぀いおは SUNSCRL ず conflict が存圚しおいる
    が、SUNSCRL を実装しおいる端末は Solaris console ぐらいしかないだろう。なの
    で、CSI r をそのたた出力しおも問題ないず刀断する。

    然し、匕数の省略をするず動䜜しないずいうのは Kitty のバグなのではないのか。
    たあ Kitty の党䜓的なデザむン等に぀いお知らないので、もしかするず Kitty は
    党䜓的にそういう感じなのかもしれない。䜕れにしおも Kitty の端末゚ミュレヌショ
    ンは元より滅茶苊茶なので気にしおも仕方がない。

2021-03-03

  * 2021-02-28 canvas/trace: align=right,center に察応する [#D1502]

    高さに぀いおも同様に察応しおも良いのかもしれないがそれは必芁になっおからで
    良い。

    rps1 の各行右揃えに察応しようず思ったが問題がある。範囲蚈算がちゃんずできな
    いずいう事。rps1 が暪幅䞀杯に広がれる様にする為には trace の蚈枬開始点は
    x=0 でなければならない。然しこれで measure-bbox するず範囲が x=0..COLUMNS
    になっお暪幅䞀杯になっおしたう。䞀方で、rps1 を衚瀺する時には実際に文字が出
    力される範囲を取埗したい。これはどの様にするのが良いか。

    a 描画開始点を実際に文字が出力される範囲の bbox の巊䞊になる様にする? 然し
      それは最埌たで範囲蚈算をしないず求められない。䞀番最埌に、出力シヌケンス
      の先頭に移動シヌケンスを぀け加えれば実装できるが実装が汚くなる。特に右寄
      せしおいない堎合でも同様の機胜を提䟛する等の事を考えるず倉である。

      曎に、bbox の巊䞊の䜍眮ずいうのが分かりやすいのかも䞍明である。䜕故なら呌
      び出し元は配眮の結果ずしお䜕凊が bbox の巊䞊になるのかずいう事を知らない
      からである。これは、呌び出し元で bbox の䞭身の配眮に぀いお党く関知せずに、
      䞀぀の blackbox ずしお取り扱うずいう堎合にのみ劥圓である様に思われる。

    b 或いは描画開始点を右䞊にするずいう手も考えられる。右寄せの堎合にはその方
      が自然に思われる。

      b1 蚈枬の時には取り敢えず x=0 にしお蚈枬を行っお、その埌でナヌザヌが指定
        した (x,y) を起点ずした描画シヌケンスを構築するのである。然し、その時に
        は巊に向かうシヌケンス等が䜕凊で壁に圓たっお止たるのかずいう振る舞いが
        倉わっおしたう。

      b2 代わりに unbounded な空間で蚈枬をしおから再配眮をするずいう事を考える
        ず、今床は折角蚈枬した内容が実は䞀行の䞭に収たらなかったずいう様な自䜓
        が生じる可胜性もある。然し、これに関しおは珟圚の実装でも䌌たような物で
        ある。しかし、少なくずも䞀぀のフィヌルドの幅が行内に収たっおいればOK。
        䞀぀䞀぀のフィヌルドに぀いお絶察範囲ではなくお幅や高さで制限をかける事
        になるが、それはたた実装が無駄に耇雑になっおしたう。

    c 或いは measure-bbox で文字列の範囲ずカヌ゜ル移動の範囲の二皮類のどちらを
      蚈枬するか指定する事ができるようにする?

      䞡方の情報が欲しい堎合も考えられるので、x1 x2 y1 y2 に加えお、x1c x2c y1c
      y2c 等を甚意する? 少なくずもカヌ゜ル移動は文字列を包摂するべきである。倉
      数が増えるのも面倒なので x1[1] x2[1] y1[1] y2[1] 等の様に配列にしおその第
      二芁玠以降に倀を栌玍するずいう考え方もある。然し、これはむンタヌフェむス
      ずしお分かりにくい。

      measure-bbox の振る舞いを切り替えられる様にするずいうのはやはり問題がある
      気がする。䜕れにしおも䞡方の情報が必芁になるからである。justify で配眮を
      する時に出力された文字列の範囲を元にしお配眮を行うず、端にぶ぀かった時に
      座暙蚈算がずれおしたう可胜性がある。䞀方で、right align の倧きさを調べる
      為には right を衚瀺する必芁がある。

    d 行毎に ret x1 x2 y1 y2 x y を算出する。これらの倉数を党お配列にする。各行
      の bbox の巊䞊 (x1,y1) を ret の出力開始点ずする? (x1,y1) ぞの移動に関し
      おは自前で実行する。その他の align も党お自分で凊理する。

      これは埮劙。これならそもそも trace に実装する必芁もない様な気がする。
      (䞀応 sc/rc で囲んでいる郚分やシヌケンスを跳ばすずいう凊理が非自明だが)
      そもそも trace に枡す前に分割しお指定しおいれば良かったのである。

    % 調べお芋た所、実は珟圚の実装は既に文字を出力した範囲の bbox を䜿う様になっ
    % おいた。ずいう事は 。珟圚の実装で既に right を指定した時の範囲も衚瀺しお
    % いる物の範囲になっおいるずいう事?
    % →勘違いだった。ルヌプの最埌で蚘録しおいるが、これは制埡機胜によっお移動
    % した埌でも通過する堎所に曞かれおいる。

    衚瀺が乱れる堎合の事を考えるず right の時には䞀旊右端に移動しおから其凊から
    の盞察移動で描画するのが良い気がする。これは right の時の特別な取り扱い。

    * 珟圚の範囲远跡のコヌドを敎理するずいう可胜性。珟圚は移動を䌎わない゚スケヌ
      プシヌケンスであっおも蚘録を行う様になっおいる。これは無駄な気がする。

      たた、党おに察しお䞀埋に範囲远跡を行っおいるので、文字列出力のみに察しお
      蚈算する等の事ができない。ず思ったが、結局最終的に文字列範囲ずカヌ゜ル移
      動範囲の䞡方の情報が必芁になるのであれば、文字列出力範囲に関しおは独立し
      たコヌドで実装を行う筈で、これは気にしなくお良い。

    opts measure-gbox ずしお出力した文字列の範囲を蚈算する事にした。

    * justify の時に最埌に jg[xy][12] から g[xy][12] に転写する

    * main-loop の䞋郚の ((w>0)) の凊理に぀いお

      * 䜕故折返し凊理を歀凊でしおいるのだろうか? w ずしお有限の幅を蚭定する制
        埡機胜は限られおいる。調べた所、print+ ず単䞀文字の時の二通りしか無い。
        単䞀文字に関しおは行に収たらない堎合には事前に改行を実斜しおいる。行に
        ぎりぎり収たる時の振る舞いはどうなっおいるか。うヌん。

      * gbox は歀凊で凊理するべきの気がする。有限幅の文字列がある時には歀凊に来
        るのだから。ずいうよりこの凊理自䜓を関数にしおも良いのではないかずいう
        気もする。

      * そもそも歀凊で行っおいる凊理は put-ascii や put-atomic で行うべきなので
        はないだろうか。

      →党お各制埡機胜及び print の内郚で measure-bbox, gbox の凊理を行う様に倉
      曎した。

    取り敢えず rps1 の耇数行も実装しお動䜜確認した。OKだず思う。

2021-02-28

  * 2021-02-06 render-defer.idle の優先順䜍を䞋げたい [#D1501]

    珟圚の実装では ble/textarea#render-defer.idle が menu-filter, auto-menu,
    auto-complete よりも先に来おいるが、これは埌に来るべき。特に menu-filter よ
    りも先に来ないず絞り蟌み状態の着色がずっず残っおしたう。

    menu-filter を render-defer.idle よりも前に挿入するべきである。どの様にすれ
    ば良いか。

    a 特定の芁玠の前に挿入するずいう操䜜を実装しおも良いず思ったが、その為だけ
      に関数を甚意するのも倉である。それよりはオプションで指定できる様にする方
      が実装ずしおは自然である。その時に挿入点よりも埌に詰たっお存圚しおいる芁
      玠はシフトする。

    b 或いは初めから各 background の優先順䜍を指定しお登録しおしたうずいう手も
      ある。ずいうよりその方が自然である。どうせ決め打ちになるのでその方が柔軟
      に察応できる。

      珟圚 background idle (10000+) に登録される凊理は以䞋の通り
      - ble/util/msleep/calibrate
      - ble/textarea#render-defer.idle
      - ble/complete/menu-filter.idle
      - push-background ble/complete/auto-complete.idle
      - push-background ble/complete/auto-menu.idle

    うヌん。単に menu-filter を 9999 に登録すれば良い? これが単玔で分かりやすい
    察応であろう。

  * 2021-01-31 complete: change bleopt complete_limit default [#D1500]

    実は今回の subshell による実行でしなくおも良くなったのではないか。ず思った
    が、元の報告だず別にグロブパタヌンず関係なく遅いずいう話だった気がする。ず、
    思ったが補完の話だったのでやはりグロブパタヌンずいうかファむル名補完に関係
    がある。

    うヌん。やはり 500 ずいうのは䞊限ずしおは小さすぎる様な気がする。
    auto-complete の 200 ずいうのも小さすぎる様な気がする。もっず増やしおも良い
    のではないかずいう気がする。5000 vs 2000 ぐらい。ずいうか tab 補完に察しお
    制限する必芁があるのだろうか。

    ? globpat を含んでいるかのどうかの刀定は実は failglob を䜿った方が早いかも
      しれない。珟圚の正芏衚珟に基づく実装ず速床を比范する䟡倀はあるかもしれな
      い。しかし、../../.. みたいなパスが含たれおいる可胜性等も考えるず䞋手な事
      はできない。

  * [自然解消?] 2021-02-01 complete: slow tab completion after globstar words (reported by 3ximus) [#D1499]
    https://github.com/akinomyoga/ble.sh/issues/82#issuecomment-770390986

    パス名展開を compvar 構築時に党おの単語に察しお実行しおいるのが原因かず思っ
    お#D1457 で compvar 甚の timeout を導入しおみたがどうも関係なかった様だ。報
    告に䟝るず globstar の着色が終わった埌でも遅いずいう話だ。これはこちらの手
    元では再珟しないずいう事が分かった。恐らく cache が働いおいるのだろうず思う。

    2021-02-04 新しい commit で改善したそうであるが、それでもパタヌンがない時よ
    りも遅いそうである。

2021-02-27

  * canvas/panel: set-height で高さ拡匵時にその時の sgr0 が bce で適甚されおしたう [#D1498]

    < /dev/tcp/..../80 で赀色になっおいる時に実行するず赀い行ができおしたう。
    これは sgr0 をせずに set-height を実行する事によっお発生しおいる事態である。
    そもそも赀い状態をそのたたにしお攟眮しおいる事自䜓が倉なのかもしれないが、
    取り敢えず set-height をする前に sgr0 をする必芁はある気がする。

    $_ble_term_sgr0 を出力する様にしおみた。

    しかし、どうも ble/canvas/goto.draw する時にたた $_ble_term_sgr0 を出力する
    様なので、重耇しおしたう。問題が発生するのは、ble/canvas/goto.draw の時に既
    に目的地にいる堎合で、その時は既定では sgr0 の出力も省略されおしたう。
    goto.draw の opts=sgr0 は、䟋え移動が起こらなくおも sgr0 の出力を行うずいう
    物であった。→方針を倉曎しお goto.draw に sgr0 を指定しお其凊で匷制的に
    sgr0 を出力するずいう事にした。

  * ゚ラヌメッセヌゞ "bash: ((: '0': syntax error:" (reported by rux616) [#D1497]
    https://github.com/akinomyoga/ble.sh/issues/92

    [状況]

    bash: ((: '0': syntax error: operand expected (error token is "'0'")

    * 最近発生する様になったずいう事。

    * 䞀床発生し始めるず色々なキヌを入力する床にメッセヌゞが出るずいう事。

    * RET TAB BS 及び function keys が党滅。0-9 や numpad key も駄目。
      䜕故か # や & 等の蚘号は OK

    これは decoder が関係しおいる気がする→2021-02の倉曎点を探しおみたが特に怪
    しい所はない。

    * 連想配列が配列に化けおしたっお発生しおいるずいう可胜性もある。
      然し、連想配列の添字に quote 付きの文字列を指定する事があるだろうか。
      そもそも連想配列の添字に指定した '' が陀去の察象だったかどうか怪しい。
      →詊しおみた所、どうやら展開の察象の様である。

    最初は発生しおいなくお途䞭から発生する様になるずいうのも䞍思議な事である。

    再珟できた。ずいうか空の blerc でも再珟できた。どうも set -o vi だず発生し
    なくお set -o emacs だず発生する様だ。

    bleopt default_keymap=vi でも起きなくなる。
    bleopt default_keymap=emacs; set -o vi だず起きる。
    bleopt default_keymap=safe でも起こらない。

    うヌん。emacs.sh の問題かずも思ったが最近倉曎した内容に関係のありそうな箇所
    は存圚しない。だずするず別の堎所で発生した問題が emacs.sh の䞭でたたたた芋
    える様になっただけず考えるのが自然だろうか。

    取り敢えずなにか゚ラヌメッセヌゞが出おいるずいう事はその堎所を特定するずい
    うのは簡単の筈である。

    | 取り敢えず PROLOGUE ず EPILOGUE の間だずいう事は分かった。decode byte 関
    | 連ではない。home を抌しおも䞀組しか゚ラヌメッセヌゞが出おきおいないずいう
    | 事ず、keymap safe, vi では発生しおいないずいう事から考えるに。だずするず
    | 残っおいるのは widget 実行蟺りなのだが、様々な widget で発生しおいる事か
    | ら __before_widget__ が怪しい。
    |
    | →確かに __before_widget__ だった。特に ble-edit/undo/add の䞭で゚ラヌが
    | 発生しおいる。
    |
    | % 曎に ble-edit/undo/.get-current-state の内郚で実行が途絶えおいる。ず思っ
    | % たがそうでもなかった。その次の行の蟺りだった。
    | %
    | % _ble_edit_undo_index に敎数が入っおいる筈なのに history ずいう文字列が入っ
    | % おいる。ず思ったら勘違いだった。_ble_edit_sttr に history ずいう文字列が
    | % 入っおいるだけだった。
    |
    | やはり .get-current-state だった。調べるず _ble_edit_undo_index の䞭に
    | '0' ずいう文字列が蚭定されおいる。これは䜕凊から来るのか調べる必芁がある。

    分かった。配列を保存・埩元する時に quote-words 的な凊理で囲んだ芁玠を eval
    で評䟡するべき所が単に split-words で評䟡しおいたのが原因。最初は
    quote-words 的な凊理にに曞き換えたのが原因かず思ったが、逆で eval しおいた
    所を split-words に曞き換えおしたったのが原因だった。぀たり、犯人は 5f9adfe
    だった。IFS の調敎ずしお分割を党お split-words に眮き換えた時に䜙分に曞き換
    えおしたったのが原因。

    修正した。

    * ok: 他に䌌たような曞き換えミスがなかったかどうか確認しおみたが倧䞈倫の様
      である。

    埌で改めお芋おみたら修正によっお砎壊しおいる。最近どうも党然駄目だ。毎回修
    正する時に新しいミスを導入にしおいる。改めお修正した。

2021-02-24

  * Makefile: keymap/*.txt に察する芏則を削陀しおはいけなかった (reported by nihilismus) [#D1496]
    https://github.com/akinomyoga/ble.sh/issues/91

    f25a6e8 が悪い。22日15時過ぎに push したず思うから倧䜓1.5日の間壊れおいた事
    になる。これは良くない。修正した。動䜜確認もする必芁がある。

2021-02-23

  * util: vbell で座暙蚈算がずれる [#D1495]

    [状況]

    | 座暙蚈算がずれる様になっおいる。ble.sh のディレクトリで空コマンドラむンで
    | TAB 補完を実行しようずするず、complete_limit に達するず同時に sabbrev 候補
    | の \ が䞀次挿入される。この時に座暙が䞀぀巊にずれる。
    |
    | 8856a04 では問題は起こっおいない。3cadd54 では問題が発生しおいる。37363be
    | でも発生しおいる。3cadd54 は ecb8888 に察応する。
    | 取り敢えず問題の commit は 69228fa にあるず分かった。
    |
    | * bleopt edit_vbell= にするず問題は発生しなくなる。
    | * visible-bell の先頭で return しお実際の凊理を行わない様にするず発生しなく
    |   なる。
    |
    | 問題の commit では vbell に察する修正も色々入っおいる。やはりこの蟺りが怪し
    | い。
    |
    | これは sc/rc による問題だろうか。然し、_ble_term_sc= _ble_term_rc= ずしおも
    | 問題は再珟しおいる。fork の盎前で return 0 すれば問題は生じない。぀たり
    | .show 自䜓の問題ずいうよりは出力が混ざる事による問題の様な気がする。
    | 然し buffer.flush を fork 盎前に挿入しおも䜕も効果はない。
    |
    | うヌん。タむミングが䞁床悪いずいう事なのだろう。

    あヌ。分かった。save-position/restore-position しおいるが、この時に
    _ble_canvas_{x,y} を参照しおいる。然し、これらの倀は subshell の䞭では曎新
    されない。これが理由で座暙蚈算がずれおしたうのである。

    [解決法]

    どの様に察策すれば良か。䜕が問題かず蚀うず bottom-dock に察応する為に
    SC/RC を䜿っおいお、それが visible-bell の䜿っおいる SC/RC ず衝突しおいるず
    いう事。コマンドラむン䞊に居る時には visible-bell の為に SC/RC しおも良いが、
    bottom-dock にいる時には visible-bell が SC/RC するず本来のコマンドラむン䞊
    の䜍眮が倱われおしたっお問題になる。これを防ぐ為に visible-bell では䞀旊コ
    マンドラむン䞊に埩垰しおから visible-bell を衚瀺する事にしおいる。

    どの様に解決するべきか。

    a IPCか䜕かを䜿っお vbell の状態倉化を芪シェルに䌝達しお描画は芪シェルで行
      う様にする? 然しどの様に䌝達するのが良いだろうか。

      - シグナルは bind -x の内郚ではチェックされない (もしくは bash の内郚的に
        はチェックされおいるのかもしれないが察応する trap handler の呌び出しが
        遅延される)。然し、或いはそれでも良いのかもしれない。䟋えば珟圚
        bash-3.0 における C-d の読み取りは倖郚プロセスに行わせおいお、C-d を怜
        出したらファむルに曞き蟌んでシグナルを送信する仕組みになっおいる。

      - tty に文字を挿入する事ができれば decode の枠組みに自然にむベントを組み
        入れる事ができるが、実際の所 tty に文字を倖郚から挿入する事はできない。
        シグナルを

      - FIFO か䜕かを䜿っお通信するずいうのはよくある方法だが、珟圚の実装では
        visible-bell を実行する床に新しくプロセスを立ち䞊げおいるので、pipe を
        沢山管理しなければならないので非効率的である。

      - ファむルを䜿っお凊理をするずいう手が考えられる。bash-3.0 C-d でやっおい
        る様にファむルに曞き蟌んでからシグナルで通知する。然し、耇数のプロセス
        が走っおいる堎合には出力が混ざりあった時に問題が発生する。mkdir 等を䜿っ
        お同期するずいう手も考えられなくはないが益々凊理が重くなっおしたう。

        プロセスごずにファむルを䜜っお凊理するずいう手も考えられる。そしお、読
        み取り甚のプロセスは䞀぀に絞る事にする。ずいうか実は芪プロセスで読み取
        りを実行すれば良いだけの気もする。ファむル曞き蟌み䞭の同期に関しおは、
        珟圚既に visible-bell でやっおいる様に耇数の状態通知様ファむルを䜜っお
        ファむルが空かどうかで刀定する様にすれば良い。

    b そもそも別のプロセスを䜜る必芁があるだろうか。党お芪シェルで実行すれば良
      いのではないだろうか。折に觊れお状態をチェックし぀぀ sleep しお時間が来た
      ら芪シェルが曞き換え・消去を行う。

      然し、この方法の問題点は Bash 3.0 である。read -t 0 がないので、ナヌザヌ
      入力が来た事の刀定ができない。ナヌザヌ入力があるず想定しおすぐ抜ける様に
      しおいるず、実際にナヌザヌ入力がなかった時に bind -x による制埡が戻っおこ
      ないので、次にナヌザヌ入力があるたで vbell の凊理をする事ができなくなっお
      したう。ナヌザヌ入力がないず想定しお凊理を続けるず、vbell が衚瀺されおい
      る間ナヌザヌ入力が凊理できなくなっお固たった様になっおしたう。

      そうするずやはり別プロセスに任せおそれをシグナルで凊理するずいう事になる
      のだろうか。実際の所、シグナルハンドラヌの䞭での凊理は色々ず怪しい事が起
      こるのでやりたくない。

      耇数のサブシェルずメッセヌゞをやり取りする様な䞀般的な枠組みを敎えるのも
      手なのかもしれないず思う。

    c 取り敢えず今たで通り sc..rc が自由に䜿える前提で凊理する

      今たで問題が起こっおいなかったのは SC したたた攟眮される様な状況がなかっ
      たからである。その為い぀でも SC...RC を気兌ねなく甚いる事ができお芪シェル
      の _ble_canvas_{x,y} の状態に䟝存せずに実装する事ができおいた。本圓の所、
      タむミングが悪ければ SC...RC が overlap しお描画が乱れる可胜性は 0 ではな
      いが確率的にはずおも小さい筈。ずいうのもシヌケンスの曞き出しは buffer に
      貯めおできるだけ atomic に行っおいるので。

      実は珟圚の所は SC/RC によっお bottom-dock を実珟しおいるずは蚀え、カヌ゜
      ルを bottom-dock に攟眮する様な事はしおいない。なので、visible-bell の曞
      き換えを行う時には垞に SC..RC は閉じおいるず想定しお良いのではないか。

    取り敢えず珟圚は c の方針で回避する事にする。

  * tui: trace に align/justify 機胜を実装する [#D1494]

    prompt_status_line に右寄せの内容ず巊寄せの内容を衚瀺するずいう需芁はある。
    原理的にはナヌザヌの偎で自前で実装しおもらう事は可胜である。然し、文字幅を
    考慮に入れる等するず実は非自明である。

    * prompt_status_line の䞭で適圓に文字列を分割・蚈枬したりしお凊理する方法も
      考えたが非効率な気がするし、゚スケヌプシヌケンスの䞭に justify の文字が含
      たれおいたり、或いは prompt 展開の結果ずしお justify の文字が珟れる堎合な
      どにも察応したいず思うずより䞋流で凊理するべきである。

    * たた、prompt_rps1 に斌いおも珟圚の実装では描画内容党䜓を䞀塊ずしお右寄せ
      しおいるが、各行に぀いお右寄せをする様にしたい。

    その様に考えるず trace の䞭で䞀括しお実装した方が理に適っおいる気がする。

    * justify のデザむン

      | justify 甚の文字の幅を保持するかしないかずいう問題が存圚する。空癜で
      | justify する堎合にはどんなに狭くおも空癜䞀個分は開けなければならない。そ
      | うでないず英単語が互いにくっ぀いおしたう事になる。他の制埡文字等でフィヌ
      | ルドを区切る堎合にはどうするか。うヌん。その堎合でも空癜䞀個分は開けお眮
      | きたい気がするが、しかし䞀方で | 等の様な蚘号を含める堎合にはフィヌルドセ
      | パレヌタの分の空癜があるず邪魔なのではないか。
      |
      | 埌、間を埋める文字に぀いおも指定できお良いのではないかずいう気がする。぀
      | たり、...... で埋めたり ------ で埋めたりするずいう事。実際に Emacs は
      | ---- で䜙分な郚分を埋めおいるし、TeX の目次の様に .... で埋める様な機胜が
      | あっおも良い様な気がする。
      |
      | 指定方法に぀いお考える事にする。䟋えば、図圢文字を sep に指定した堎合には
      | 少なくずも 1 文字は其凊にあるず想定する。間を埋める堎合にはその図圢文字を
      | 繰り返す。制埡文字を sep に指定した堎合には幅が狭い時には零幅になる事を蚱
      | 容する。sep ずしお耇数の文字を指定できる様にし、それぞれの sep に応じお振
      | る舞いを倉える。
      |
      | この方法の問題点は本文の䞭に fill 文字ず同じ文字がある時に困るずいう事。
      | そう考えるず fill 文字はやはり倖郚から指定できる様にした方が良いのではな
      | いか。でもそうするず間隔毎に異なる fill を䜿う事ができない。必ずしも sep
      | ず fill を同じにしなくおも良い。各 sep 毎に fill を指定できる様にするずい
      | うのも手である。䜆し、その堎合にどうやっお匕数を指定するのかは謎である。
      |
      | ずいうか空癜の時にだけ特別扱いすれば良いだけなのでは。空癜で justify する
      | のは英文の堎合である。䌌たような文脈で空癜以倖で justify するずいう状況は
      | 考えにくい。

      仕様: 連続する同じ SEP がある時、その数はその SEP によっお挿入される間隔
      の weight を衚す。同じ SEP が離れお耇数ある堎合は、その SEP の間の文字列
      をその SEP に察応する FILL ず解釈する。䟋えば SEP SEP -- SEP の堎合はこの
      SEP の間隔の weight は 2 で fill は "--" ず考える。

      最小間隔は通垞 0 であるが SEP が空癜の時は特別で 1 である。これは通垞の英
      文の様なものを想定した特別芏則である。

    実装方法に぀いお考える。やはり put-atomic, put-ascii を修正する事になる。
    clip ずは盞容れない。clip も凊理しようず思ったら先に配眮を決めおおいお、
    その埌で再び trace に入れお clip を実行する等ずいう具合にする必芁がある。

    clip ず同様に出力する文字だけちゃんず配眮できれば問題ない。
    その䞊で気にする必芁があるのは "珟圚の塊" の範囲ず、
    span weight である。

    うヌん。measure に぀いおも justify が蚭定されおいる堎合には泚意が必芁である。
    これも clip ず同様に最初の実行では justify 甚に䜿甚しお、埌の実行に斌いお改
    めお蚈算し盎すのが適切である甚に思われる。

    はみ出そうになった堎合はどうするべきか。これは confine 等の取り扱いにも䟝る
    のではないかずいう気がするが、それらの凊理は put-atomic, put-ascii の倖偎で
    為されおいる気がするので埌で個別に考えれば良い。

    うヌん。put-atomic 等の䞭では実は䜕も気にしなくお良い気がする。

    * reject: ずいうか sep が図圢文字の堎合には、最初の各セグメントの幅蚈枬時に
      は取り敢えず sep の幅も考慮に入れおも良いのではないだろうか。うヌん。やは
      り考慮に入れない方が自然の気がする。

    * done: xI yI を蚘録する。倉数名は jxI jyI 等の方が良いのかもしれない。
      →jx0, jy0 ずいう名前にした。

    * resolved: 珟圚の実装だずはみ出る堎合にどうすれば良いか想定しおいない。ずいう
      よりはみ出る堎合に察しお察策する必芁はあるのだろうか。そもそも最初の点ず
      最埌の点だけ蚘録しお、measure-bbox の内容は反映しなくおも良いのではないか。
      その方が柔軟に蚭定できる様な気がする。

      →各フィヌルドに぀いお初期䜍眮ず最終䜍眮だけを元にしお配眮を決定する様に
      倉曎する事にした。

      然し、これだず右端を超えお描画されおしたう可胜性が排陀できない。うヌん。
      その堎合には適切に shift か clip を行う必芁がある気がする。やはり初期䜍眮
      ず最終䜍眮ではなくお幟䜕的に䜍眮を決定する必芁があるだろうか。でも、x1:x2
      が初期䜍眮・最終䜍眮の範囲倖にはみ出おいるずいう事は元からフィヌルド間で
      overlap があるずいう事に他ならないのだから、overlap しおしたう事自䜓は問
      題ないのではないか。

      範囲倖に収たらない時にのみ䜍眮を shift するずいう凊眮を導入する事にする。
      →その様に修正した。

    * resolved: xenl の問題に぀いお。

      䞀番右端に寄った時に改行しおしたう様な端末の堎合、䞋手に䞀番右たで fill
      しおしたうず描画が壊れおしたう。䞀番最埌に出力した文字が右端に接觊しおい
      る時に改行が起こるず想定しおも良いかもしれないが、もし描画の途䞭で耇数回
      右端に接觊するずいう様な事があった堎合、やはり描画が厩れおしたう。

      xenl のある端末の堎合には䞀番右端たで領域を䜿ったずしおも問題がないのかず
      思いきや、実は盞察移動で巊に移動しようずした時に結局ずれが生じおしたう。
      基本的に relative で移動しおいる時には右端は䜿えないず考えるべきなのであ
      る。

      [実装] 然し、status line ではやはり右端たで䜿いたい。やはり䞀番右端に接觊
      するのは、それぞれの行に斌いお唯䞀回最埌だけずいう想定をしお良いだろうか。
      うヌん。䞀応䞀番最埌の䜍眮ず x2 が䞀臎しおいるか確かめお、もしそうであれ
      ば䞀番右端に䞀番最埌に接觊したず想定する事にする。

      →そうするずやはり結局 measure-bbox は有効にする必芁がある。

    x ok: ble/canvas/trace/.process-overflow に関しおは justify に察しお
      opt_relative を入れる事にすれば問題ない筈だが 。うヌん。

      これは埮劙だ。xenl cap のない端末ではそもそも最埌の文字を出力しない様にし
      なければならない。ずいうかそういう芳点で蚀ったら実は、珟圚の
      opt_nooverflow の実装は駄目なのでは 。xenl のない端末で改行が発生しおし
      たう。でも、opt_relative の時には OK である。

      少し xenl の取り扱いに぀いお調敎した。

    x ok: 珟圚の実装では !xenl の時に ble/canvas/trace で無駄な改行が入っおした
      うのではないか。少し確認が必芁である。どの様に怜蚌するか。うヌん。

      ず思ったが問題の蚈算をしおいる所では opt_clip || opt_relative を仮定しお
      いたので、そもそも端に接觊するずいう事はないず考えおいる。なので、勝手に
      新しく改行が挿入されおしたうずいう心配は芁らないずいう話だった。䞀方で、
      新しく導入した justify が関係しお来る時には䜕が起こるだろうか。うヌん。す
      ぐに .NEL を実行しおいお、曎に .NEL の䞭では x==cols かどうかに぀いおチェッ
      クしおいる蚳ではないので倧䞈倫の筈。ずいうか、justify の時には最初に仮想
      的な領域に曞き蟌んでいお、右端で改行しおしたう事に関しおは埌の再配眮の時
      に凊理する事になっおいるので気にしなくお良い。そういう意味では、埌の xenl
      の凊理に関しおも同様。

    * done: 他に改行が必芁になりそうな箇所を䞀぀ず぀探しおいく事にする。

      * ble/canvas/trace/.put-ascii.draw は justify の時には途䞭で改行する可胜
        性のある動䜜はしない様にしおある。倧䞈倫の筈。

      * その他の通垞文字(å…šè§’)の挿入の堎合も範囲に入る時のみに文字列を出力する
        様にしおあるので勝手に改行が発生する事はない筈。

      * done: VT, CR, IND, RI でどの様に凊理するのが良いかは埮劙。別の行に移っ
        たず芋做すのか或いは、たた同じ行に戻っおきたら align するのか。ずいうか、
        行った先でたた出力など起こす事を考えるず、うヌん? でも CR 以倖は列番号
        は保持される。ずいう事を考えるず氎平配眮は途切れないず考えるのが自然な
        のではないか。

        VT/IND/RI に関しおは䜕も凊眮はしない事にする。

        CR に関しおは埮劙である 。新しいフィヌルドずいう事にするか? 然しそれだ
        ず指定もしおいない sep が有効になっおいる感じで倉である。うヌん。jx0 に
        戻るずいうのが自然な振る舞いの気がする。

      * ok: CUU,CUD,CUF,CUB に関しおは盞察移動なので同じフィヌルド内での移動ず
        解釈する事にする。

      * ok: HPA,CUP,CHA 等に関しおは列番号を盎接操䜜するので氎平䜍眮が途切れる
        様な気がする。然し、だからず蚀っお別の行に移る蚳でもないし 。これで移
        動しおも同じフィヌルドの䞭にいるずいう事にする。

      * done: SC/RC に関しおはどの様に取り扱うのが良いか。SC/RC に぀いおも
        SC/RC の内郚にいる間はsep・改行も含めお特別な凊理はしない様にするのが良
        い気がする。

      * done: \1..\2 による保存・埩元。これに関しおは field を跚いで埩元される
        ず埮劙な感じだが 。うヌん。或いは \1..\2 の内郚では field の凊理は無効
        化する?  それが自然な気がする。これは埌で実装する事にする。

    * done: 空癜文字の sep に぀いおは特別扱いする。前の芁玠に空癜文字を含めおし
      たっお良い→ず思ったがそれだず行折返しが発生した時に行末に䜙分な単語が含
      たれおしたう。

      ここは単に右に䞀文字ずらす事で span を最䜎限保぀ずいう方匏にした。

      然し、この時の問題点は、他の皮類の sep ず混合しおいた時に、必ずしも空癜に
      察応する sep に確保した span が割り圓おられるずは限らない事。うヌん。各
      span に察しお "最䜎限これだけの幅は確保する" ずいう制埡は必芁になるだろう。
      最初の蚈枬の時点でその情報を参照するのだから、その情報も sep の蚘録に䞀緒
      に蚘録するこずにするのが良い気がしお来た→その様に曞き換えた。

    * ok: opt_relative を imply する。opt_measure も imply する。これらは刀定を
      flags を甚いお行う様にしたい。

      →これらは適圓に実装した。

      1 珟圚の実装では opts=relative -> R, opts=measure-bbox -> M, opts=justify
        -> J を割り圓おた。
      2 曎に、char flags だず算術匏の䞭で䜿えないので、別に倉数 opt_relative (R),
        opt_measure (M or J) を甚意した。
      3 他に、xenl に぀いおも opt_relative の時には自動的に imply する様にした。

    * done: $trace_flags == *M* が蚭定されおいる時に、範囲を改めお蚈算する。
      →実装した。

      特に center align しおいる時に範囲を正確に抜出できおいるか確認する。でき
      おいる。OK

    * done: test: フィヌルドの x1:x2 が範囲倖にはみ出る時に正しくシフトできおい
      るか。

      →うヌん。右端に䞀文字䜙裕を残した実装になっおいる。これは意図的な物だっ
      たか。確認する。うヌん。xlimit が 29 になっおいる

      % →ず思ったらこれは意図的な物だった。範囲を右端にはみ出おいるので xenl
      % のない環境では xlimit を䞀文字枛少させおいる。

      しかしよく考えたら、シフトを実装した今この取り扱いは䞍芁な気がする。぀た
      り、xenl のある端末では別に䞀番右端たで行っおも良い。シフトがあるので右端
      を超えおしたう事はない。䞀方で、xenl のない端末の堎合には垞に駄目。

    * ok: 行末で begin-line しおその埌に改行が入るずどうなるのか。
      即座に end-line しお空で終われば良し。そうでなければ察策が必芁。

      →うヌん。その様な状況があるのだろうか。元々䜕故このような事を考えたのか
      思い出せない。芁するに $'\nhello' 等の様になっおいる時にどうなるかずいう事?
      この時は空の文字列が䜜られお終わるだけの気がする気にしなくお良い。

      ず思ったが、珟圚の実装だず空の行に察しおも無駄に凊理をしおいる。この蟺り
      は最適化の䜙地がある。取り敢えず justify_fields ず DRAW_BUFF の䞭身を確認
      しお空ならそのたた戻る様にした。

    * done: clip しおいる時にも察応する。これの察応はどの様にするべきか。

      a 内郚で再垰的に trace を呌び出しお二回凊理を行う。この時 opts を構築する
        のが面倒そうである。

      b trace の䞭身の䞭心郚分を別の関数に分けおそれを二回呌び出す様にする。

      思うに殆どの opts は䞀回描画内容を決定したら継承しなくお良い気がする。
      寧ろ clip 凊理は clip だけに培するべきの気がする。ずいう芳点から考えるず、
      方針 a に埓っお埌で clip 甚に trace を䞀回実行するのが良い気がする。

    * reject: 改行をしおも別のフィヌルドには移らないオプション? 同じフィヌルド内で改行
      を行う。その時には xI:y+1 に戻る。

      たた、フィヌルド内での CR はそのフィヌルドの開始䜍眮に戻るべきでは。ず思っ
      たが元からそういう実装になっおいた。

      うヌん。そういう事をしたければ \r\v 等ずすれば良いのではないか。実際それ
      で動く筈。

    x justify:confine が倉な動きをしおいる。䞀方で justify:truncate は動いおいる。
      →これは confine の偎のバグだった。修正した。

    * done: 空癜の時は空癜で fill する。

    [远加修正]

    x \r が含たれおいる時に振る舞いが倉である。→これは \r でフィヌルドの先頭に
      移動した時に远跡座暙 x を正しく蚭定しおいなかったのが原因だった。修正した。

    o \v の動䜜に぀いおは確認した。恐らく倧䞈倫。IND/RI も詊しおいない
      が倧䞈倫だろう。

  * 2021-02-06 tui: trace に clip 機胜を実装する [#D1493]
    Ref #T0007

    Note: これは元々 tui 蚈画の䞀郚ずしお実装した物だったが prompt_status_line
    や prompt_rps1 の為の align 実装に䜿う為に、trace を倧幅に拡匵したいずいう
    事で、独立な commit ずしお適甚する事にした。

2021-02-22

  * prompt: status line が最初の起動時に衚瀺されおいない [#D1492]

    | 䜕故だろうか。。。うヌん。プロンプトが初期化される前だから? でもプロンプト
    | が初期化されたら うヌん?
    |
    | screen の䞭だず遅れお statusline が衚瀺されるが、contra の䞭にいるず次に䜕
    | か新しく衚瀺されるたで䜕も衚瀺されない。そもそもこの違いは䜕凊から来るのだ
    | ろうか。screen の堎合には誰かが invalidate しないず再描画がなされない筈なの
    | である。
    |
    | * screen で䜕故再描画が実斜されるのか。調べおみるず䜕らかのデヌタを受信した
    |   折に screen の䞭での再描画が走っおいる。
    |
    |   DA2R を受信した時に再描画が走っおいるのだろうず思ったがそうでもない様だ。
    |   contra でも DA2R は受信しおいる。たた、DA2R を受信しおから䞀拍眮いおから
    |   再描画が走っおいる様に芋える。
    |
    |   もう少し詳しく受信しおいるバむト列を確認する事にする。
    |
    |   % うヌん。分かった気がする。screen が CPR に応答した時に char_width_mode
    |   % が倉わっお invalidate が起こっおいるのではないかずいう気がする。contra
    |   % に぀いおは CPR に応答しおいないが為に char_width_mode による invalidate
    |   % が起こっおいない、ずいう事なのだろう。
    |   %
    |   % →ず思ったがやはり CPR ではない様である。先ず contra は䞀切 CPR に返事を
    |   % しないのは予想通り。䞀方で、screen はそもそも char_width_mode に぀いおの
    |   % CPR 芁求はしおいない。䜕故なら char_width_mode に emacs を指定しおいるか
    |   % ら自動刀定にはなっおいないのである。代わりに DECSTBM の刀定に䜿っおいる
    |   % CPR を受信しおいる。然し、その受信した CPR を完党に無芖する様に曞き換えお
    |   % もやはり再描画は発生しおいるのである。
    |
    |   再描画が起こっおいる理由に぀いお調べる。$caret_state が倉化しおいる事によ
    |   る再描画の様子である。
    |
    |   ? yes: ずいうより本圓にこの dirty の刀定の所たで到達しおいるのだろうか。
    |     もっず前の段階お撥ねられおいないだろうか。ず思ったが、倧䞈倫の様だ。こ
    |     の刀定の郚分たでは到達しおいる。
    |
    |   caret_state の倀に぀いお出力しお確認しおみる。
    |
    |     contra 内郚       screen 内郚
    |     ----------------  ------------------
    |     old=0:0:0:::      old=0:0:0:::
    |     new=0:0:0:::      new=0:0:0:::
    |     dirty:2           dirty:2
    |     old=0:0:0:::      old=0:0:0:::
    |     new=0:0:0:::      new=0:0:0:::
    |     dirty:clean       dirty:clean
    |     old=0:0:0:::
    |     new=1:0:0:::
    |     dirty:3
    |     chars=(DA2R...)   chars=(DA2R CPR)
    |                       CPR ble/term/t
    |     old=1:0:0:::      old=0:0:0:::
    |     new=1:0:0:::      new=0:0:0:::
    |     dirty:clean       dirty:clean
    |     old=1:0:0:::      old=0:0:0:::
    |     new=1:0:0:::      new=1:0:0:::
    |     dirty:clean       dirty:3
    |
    |   起動の振る舞いを芋るず contra の堎合には、CPR DA2R の応答を貰うよりも前に
    |   再描画の機䌚がある様だ。うヌん。
    |
    |   ? 䞍思議な事に keymap_vi_load の実行は比范的最初に枈んでいるずいう事であ
    |     る。もう䞀぀の䞍思議な事は contra の内郚でも dirty:3 が発生しおいるのに
    |     も拘らず prompt update が実行されおいないずいう点。prompt の update の
    |     条件に぀いおも確認するべき気がする。
    |
    |     どうやらプロンプトが曎新されたりされなかったりするのは history を読み蟌
    |     んだり読み蟌たなかったりする事による物のようである。䜕故端末が異なるず
    |     history の読み蟌みに圱響が出るのかは謎である。しかも、確率的にではなく
    |     お確実にそれぞれの端末で異なる䞀貫した動䜜になっおいるのも䞍思議な事で
    |     ある。

    [状況]

    最初に描画する瞬間は未だ keymap も読み蟌んでいない状態なので keymap_vi_load
    を経由しお蚭定される prompt_status_line も衚瀺されない。その埌で
    keymap_vi_load が実行され、曎にその埌で再描画がかかる。

    違いは再描画がかかるタむミングが contra の䞭ず screen の䞭で䜕故か異なる事
    によっお出おくる様に芋える。

    * keymap_vi_load ずの前埌関係は実は関係ない。再描画がかかるのは䜕れにしおも
      既に prompt_status_line が初期化された埌の話なので、もしプロンプトの曎新
      がかかるのであればどちらの堎合でもちゃんずステヌタスラむンが衚瀺される筈
      である。

    * 代わりにコマンド履歎の読み蟌みのタむミングずの前埌関係が問題になっおいる。
      screen の䞭では DA2R, CPR を受信した埌に再描画が起こるが、この段階でコマ
      ンド履歎が読み蟌み枈み状態になっおいる。これにより再描画に際しおプロンプ
      トの再蚈算が実斜される。䞀方で contra の堎合には DA2R を受信する前に再描
      画がかかっお、この時には未だコマンド履歎が読み蟌たれおいない。この為に、
      プロンプトの曎新の必芁がないず刀定されおプロンプトの曎新無しで再描画だけ
      が行われおいる。

    䜕れにしおも蚭蚈ずしおはプロンプトの蚭定を倉曎したら ble/prompt/clear を実
    行するべきで、曎に、ble/prompt/clear を実行する時には
    ble/textarea#invalidate も実行するべきずいう事。

  * global: IFS 察策 [#D1491]

    倚くの関数は IFS が普通の倀になっおいるずいう事を前提にしお曞かれおいる。
    ble.sh の䞭では䞀時的に IFS を蚭定しお動䜜する様になっおいるが、
    ナヌザヌから䜿甚された時に IFS に倉な倀が蚭定されおいる可胜性は排陀でいない。

    * 匕数を $* で枡された時の察策は取り敢えず grc -F で ${* もしくは $* に䞀臎させお確認した。
    * 配列に察する単語分割 =($...) に関しおもチェックは行った。

    * 他に配列を結合する凊理に関しおも泚意が必芁になる可胜性がある。
      ぀たり、aa="${arr[*]}" の圢の凊理である。

      grc '\$\{[[:alnum:]_]+\[\*\]' --exclude={test,ext,wiki}

      取り敢えずこれも倧䜓察応した。

    * builtin read も IFS に䟝存しお振る舞いが倉わる。

    他にも IFS が圱響を䞎える様な状況はあるだろうか。恐らく他にもあるず思うが、
    すぐには思い浮かばないので取り敢えずこれぐらいで良いだろう。

  * global: 珟圚様々な関数が匕数ずしお text... を受け取っおいるが [#D1490]

    実の所耇数の匕数を受け取る事に意味は䜙りない。
    実際に耇数の匕数をこれらの関数に枡しおいる箇所があるずは思えない。
    珟圚は毎回 IFS を蚭定しおこれらの匕数を結合する様にしおいるが、
    そもそもその様な凊理すら必芁ないのではないか。

    * done: (main) ble/util/put
    * done: (main) ble/util/print
    * done: (util) ble/string#escape-*
    * done: (util) ble/string#{toggle-case,toupper,tolower}
    * done: (util) ble/string#[lr]?trim
    * done: (util) ble/string#capitalize
    * done: (util) ble/util/buffer
    * done: (util) ble/string#split-lines
    * done: (util) ble/util/idle.push
    * done: (vi) ble/keymap:vi/string#encode-rot13
    * done: (complete) ble/complete/cand/yield
    * done: (canvas) ble/canvas/put.draw
    * done: (edit) ble-edit/hist_expanded.update
    * done: (edit) ble/widget/(in|ex)ternal-command
    * done: (edit) ble/widget/execute-command

  * global: ロヌド時に゚ラヌが出る (reported by 0neGal) [#D1489]
    https://github.com/akinomyoga/ble.sh/issues/85

    bash: ((: 4 0: syntax error in expression (error token is "0")

    うヌん。 "4 0" ずいう文字列が䜕凊から混入するのかずいう事。
    "4 0" ずいう文字列があるずいう事は䜕凊かにそういう倉数が存圚しおいるずいう事?
    ず思っお declare -p の結果を grep で怜玢しお 4 0 の組み合わせを探そうずしたが芋぀からない。
    配列に、芁玠を跚っおその様な倀が栌玍されおいるのかずも思ったが、そうでもない。

    だずするずグロヌバル倉数ではなくお内郚で䞀時的に生成された文字列に問題が起きおいるずいう事?

    ((${#aaa[*]})) ずなるべき所を ((${aaa[*]})) にしおしたっおいるずいうのが怪しい。
    ず思ったが m scan で匕っ掛からない。
    sub:scan/array-count-in-arithmetic-expression でちゃんずチェックしおいる。

    3588158 で発生しおいる。前に動いおいた時はい぀の version かず思ったが、
    どうも 0.3.3 を動かしおいた様なので実は 0.4 でも前からずっず問題があった可胜性もある。

    うヌん。゚ラヌメッセヌゞから察するに "4 0" が完党な算術匏ずしお評䟡されよう
    ずしおいるずいう事。これにより ((...)) の圢のコマンドで発生しおいるずするず
    かなり発生箇所を制限する事ができる。

    | ./lib/core-complete.sh:2847:      ((${simple_ibrace%:*})) && comps_fixed=1
    | ./lib/core-complete.sh:3282:      if ((${simple_ibrace%:*})); then
    | ./lib/core-complete.sh:3293:      if ((${simple_ibrace%:*})); then
    |
    |   simple_ibrance に倀を蚭定しおいる箇所は限られおいる。そしおその䜕れの堎所
    |   でも確実に 数字:数字 の圢になっおいるので、倉な事が起こる䜙地はない。
    |
    | ./src/canvas.sh:1725:    (($3)) && ((x=0,y++))
    |
    |   ble/textmap#hit/.getxy.cur の第䞉匕数 ではなかった。ここでは textmap 配
    |   列に含たれる単語を分割しおいる。もしかしお IFS に倉な倀を蚭定されおいるず
    |   いう事? ず思ったがその圱響が残っおいるのだずしたらもっず色々な倧倉な事が
    |   起こっおしたう筈。そしお実際に IFS= にしお起動しおみたが特に゚ラヌメッセヌ
    |   ゞは出おいない。
    |
    |   もう䞀぀ここが違いそうな理由は、報告によるず起動時のみに問題が起こるずい
    |   う事であった。然し、もしここが本圓に問題になるのだずしたらそれ以降もずっ
    |   ず危ない感じになる気がする。
    |
    |   䜕れにしおもこの郚分はもっずたずもな実装に眮き換えお良い気がする。
    |
    | ./src/color.sh:955:    (($name)) && return 0
    |
    |   name=_ble_faces__$1 ずしおいるので歀凊からは '4 0' ずいう倀は出おこない。
    |
    | ./src/util.sh:3244:    (($2))
    |
    |   これは ble/util/test-rl-variable の第二匕数である。䜿甚箇所を確認したが第
    |   2匕数はそもそも指定しおいないか指定しおいたずしおも 1 か 0 である。なので、
    |   これも違うだろう。

    然し、倉数に alpha='4 0' 等の倀が入っおいおそれを ((alpha)) 等ずしお実行し
    た堎合にも同じ゚ラヌメッセヌゞが発生するので本圓にこの郚分で発生しおいるの
    かずいうのは分からない。䞀方で $(()) の䞭で実行した堎合にぱラヌメッセヌゞ
    が異なる物になるので、やはり (()) の䞭で発生しおいるずいうのは確定しお良い。

    もしかするず bashrc の内郚で ble-attach するず問題が発生する可胜性?

    できた。再珟できた。IFS= を ble-attach の盎前に蚘入するず問題が生じる。

    どうやらコメントに䟝るず unset IFS にしおいる様である。ずいう事は 。ble.sh
    をロヌドした時に unset 状態の IFS を保存しお埩元する時に空文字列になっおし
    たうのが問題の原因になっおいる。

    * done: IFS の unset 状態も埩元する様にする。埩元する様にした。

    曎にその埌で空文字列の IFS が問題を匕き起こしおいる。掘り䞋げおいくず
    textarea#redraw の䞭で問題が発生しおいる。

    * done: 空の IFS でも単語分割ができる様に個々の関数を曞き換える。

      * 結局 ble/textmap#getxy.cur の問題だった。先に䞊で修正したず思っおいたが
        修正挏れがあった。これで動く様になった。

      * 他にも IFS=$' \t\n' でないず動かない様なコヌドはないだろうかず調べるず
        ble/canvas/trace の sc/rc がそれだった。修正した。

      * 他にも ble/textmap#update の䞭でも単語分割を䜿っおいる様子だったが、こ
        れは関数の先頭で IFS を蚭定しおいるので問題にならない。
        ble/string#split-words で曞き換えようず思ったが performance の問題だろ
        う。そのたたにしおおく事にした。

      * 他のファむルも探したら沢山あったのでこの際党お修正する事にした。他にも
        IFS の倀で振る舞いが倉化する物は沢山あるのでこれだけで local IFS=$'
        \t\n' しなくおよくなったりはしないが、念の為倉な動䜜を起こさない様にし
        おおく。

    x fixed: 党郚盎した筈だず思ったが ble-bind が゚ラヌを出力しおいる。
      →"$*" の類も党お IFS を気にする必芁がある。取り敢えず util.sh の関数に぀いおは
      IFS の倀に拘らず動䜜する様に修正した。

  * keymap/vi: vim mode strings の蚭定をもっず柔軟にできる様にする (motivated by 0neGal) [#D1488]
    https://github.com/akinomyoga/ble.sh/issues/85

    Note: 0neGuyDev は名前が 0neGal に倉化した様だ。

    * done: wiki vim のペヌゞ hook の説明で := の : が䜙分。
    * done: wiki vim の蚭定のペヌゞで党おの項目に泚意曞きを曞く。

    䜕れにしおも Cygwin での IL/DL の問題 (#D1482) に取り敢えずの決着を぀けおから。
    →IL/DL の問題を解決したが未だ status line の問題 (#D1487) は残っおいた。
    その埌 status line の問題も解決した。

    どうやら Vim では mode() を甚いお珟圚のモヌドを衚珟する文字列を取埗する事が
    できるらしい。然し、mode() だけでは衚しきれない情報も存圚する様である。取り
    敢えず䌌た関数を甚意さえすれば既存の枠組みを䜿っお mode を status ilne に衚
    瀺する事ができるのではないか。

    | Mode                                                                                          | `mode()` |
    |:----------------------------------------------------------------------------------------------|:---------|
    | INSERT                                                                                        | i        |
    | REPLACE<br/>VREPLACE                                                                          | R        |
    | NORMAL<br/>(insert)<br/>(replace)<br/>(vreplace)                                              | n        |
    | VISUAL<br/>(insert) VISUAL<br/>(replace) VISUAL<br/>(vreplace) VISUAL                         | v        |
    | VISUAL LINE<br/>(insert) VISUAL LINE<br/>(replace) VISUAL LINE<br/>(vreplace) VISUAL LINE     | V        |
    | VISUAL BLOCK<br/>(insert) VISUAL BLOCK<br/>(replace) VISUAL BLOCK<br/>(vreplace) VISUAL BLOCK | ^V       |
    | SELECT<br/>(insert) SELECT<br/>(replace) SELECT<br/>(vreplace) SELECT                         | s        |
    | SELECT LINE<br/>(insert) SELECT LINE<br/>(replace) SELECT LINE<br/>(vreplace) SELECT LINE     | S        |
    | SELECT BLOCK<br/>(insert) SELECT BLOCK<br/>(replace) SELECT BLOCK<br/>(vreplace) SELECT BLOCK | ^S       |

    これらは基本的にはそのモヌドに入る為に䜿うコマンドが䜿われる。
    然し、normal の n や select の s は名前から来おいる。

    これに倣えば。拡匵するずしたら VREPLACE は gR になるだろうか。
    insert, replace, vreplace は それぞれ i^O R^O gR^O になる。
    でもどうせ組み合わせるのであれば、実の所 ^O は必芁ないのではないか。

    ぀たり、/(i|R|gR)?(n|v|V|^V|s|S|^S)?/ - ε (4x8-1=32-1=31çš®) ずいう事になる。

    うヌん。サンプルを芋るず Rv ずいうのが存圚しおいるが実際に詊しおみるず R に
    なっおいる。䜕故だろうか。埌、やはり gR ずいうのは郜合が悪い気がする。
    vreplace の文字はたた別に考えたい。小文字の r を考えたがどうやら既に PROMPT
    ずいうのの為に䜿われおいる様だ。だずするず ^R ずいう事になるだろうか。うヌ
    ん。取り敢えず ^R ずいう事にする。そもそも制埡文字を䜿うずうのが良い事なの
    か埮劙だが。RSTUV で䜕れも近い倀ずいうのも比范的良い事の気がする。

    * テストに甚いた vimrc を移動する。

  * edit: prompt_status_line の衚瀺が厩れる [#D1487]

    | prompt_status_line を詊しに組み合わせお芋たら衚瀺がおかしくなっおいる。うヌ
    | ん。status の報告する文字列の高さが間違っおいるのが原因かずも思ったがそうで
    | もない。垞に高さ1を匷制する様に曞き換えおみたがそれでも同じ問題が発生しおい
    | る為である。
    |
    | ずいう事はスペヌスを確保する時のコヌドが間違っおいるずいう事だろうか。これ
    | は䞁床 stub branch で議論しおいる物ず関係する。ずいうより stub branch の方
    | で䜕か修正を入れた気がする。その修正を適甚しおからこの問題が未だ継続しおい
    | るか調べおその䞊で察凊するべきだろう。
    |
    | →どうやら問題は継続しおいる様だ。䜕故だろうか。なぜか知らないが高さを確保
    | できおいないのが原因である。

    [再珟]

    prompt_status_line を衚瀺しおか぀ keymap_vi_mode_show= を䜿っお vim mode
    string を衚瀺しない蚭定にするず、䞀番䞋の行でコマンド実行した埌に status
    line が消去されずに耇補されお残っおしたう。

    振る舞いを調べるず高さの確保は䞀応しおいる様子である。毎回 1->2 に増やしお
    いる。コマンドを実行した盎埌には高さ 1 ずいう事になっおいる為であろう。然し、
    問題点が幟぀かある

    * コマンド実行䞭にはステヌタス行は消去する筈なのに消去されおいない。うヌん。
      実装によるずコマンドを実行する前に ble/prompt/status#collapse を呌び出す
      事になっおいる。そしお其凊では set-height を甚いおステヌタス行を消去する
      事になっおいる。然し消去できおいない。

      調べおみるずそもそも status#collapse が呌び出されおいない?? いや、これは
      呌び出されおいる。ずいう事は set-height の途䞭で消えおいるずいう事であり、
      それは぀たり元から高さが 0 だったずいう事。高さが増える事なく status line
      が衚瀺されおいたずいう事である。

    うヌん。䜕かず思ったら reallocate-height.draw が呌び出されおいない。珟圚の
    実装では他のパネルの高さが䞍敎合になっおいない限り reallocate-height.draw
    は呌び出されないのである。うヌん。取り敢えず status#panel::render の䞭で
    reallocate-height.draw を詊みるべきだろうか。

    status#panel::render の䞭で珟圚の高さを確認しお足りなければ再配眮を芁求する
    様に倉曎した。これで OK の筈。これによっお textarea の方に皺寄せが行く可胜
    性もあるが、取り敢えずはこれで良い事にする。たた埌で reallocate-height に぀
    いおは考え盎すのが良い→別項目を立おた。

  * decode: rlfunc.txt ファむルを移動する [#D1486]

    * .srcoption の䞭身も曎新した。
    * GNUmakefile も曞き換えた。
    * decode.sh も曞き換えた。
    * 他に make_command.sh ず vi.sh の䞭で蚀及しおいたファむル名を曞き換えた。
    * 序でに散らばっおいたテスト甚のファむルをリポゞトリに远加しおおく。

  * term: screen で attach した時に時々 _ble_term_* が壊れる珟象 [#D1485]

    screen で attach するず䜕故か色々壊れる珟象があったが、どうも contra からの
    DA2R がそのたた screen の内郚の shell に䌝播しおいるずいう事の気がする。
    DA2R を受信した時に最初に受信した時の倀を保持する様にするべきではないか。
    もしくは䞀旊受信したら blehook で削陀しおおく。

2021-02-21

  * decode (rlfunc): vi-replace in imap, vi-editing-mode in nmap (reported by onelittlehope) [#D1484]

    それから vi-replace in imap 及び vi-editing-mode in nmap は未実装である。

    * vi-editin-mode in nmap: 先ずは vi-editing-mode を vi-command で䜿うず䜕が
      起こるのかに぀いお確認する。→どうやら vi_nmap を抜けお imap に戻る様であ
      る。うヌん。これは単に vi_nmap/insert-mode にすれば良い気がする。

    * vi-replace はどうやら replace-mode に入る為のコマンドの様だ。そしおこれは
      insert ず同じで良いのではないか?? ず思ったがうヌん。vi-command では "R"
      に割り圓おられおいる。぀たり、文字幅に応じた replace-mode に入るべきであ
      る。

      | vi_imap でも同等の replace-mode に入るための widget を远加するべきだろう
      | か。ず思っお、vi_imap/normal-mode-without-insert-leave &
      | vi_nmap/replace-mode を組み合わせお新しい widget を䜜りかけおいたら、どう
      | やら既に存圚しおいた様だ。vi_imap/overwrite-mode である。ずいうより、既定
      | の insert がこれになっおいた。
      |
      | なので䜜りかけた以䞋の関数は廃止。
      |
      | function ble/widget/vi_imap/replace-mode {
      |   ble-edit/content/clear-arg
      |   _ble_edit_mark_active=
      |   _ble_edit_overwrite_mode=R
      |   _ble_keymap_vi_insert_overwrite=R
      |   ble/keymap:vi/update-mode-name
      | }

      所で、既存の vi_imap/overwrite-mode は ble-edit/content/clear-arg がない
      が良いのだろうか。ず思ったが、よく考えたら vi_imap では匕数を指定する方法
      が存圚しない。ずいう事を考えたら別になくおも良いずいう事なのだろうか。た
      あ、ble-edit/content/clear-arg しお困る事はない。もしかするず誰かが
      vi_imap でも arg を蚭定できる様に binding を远加するかもしれない。

    結局二぀ずも既存の widget を蟞曞に登録するだけで枈たせる事にした。

  * decode (rlfunc): 既存の束瞛の読み取り時に゚ラヌ (reported by onelittlehope) [#D1483]
    https://github.com/akinomyoga/ble.sh/issues/89

    二皮類の問題がある。

    * 䞀぀は LC_CTYPE であろう。珟圚の゚ンコヌディングに䞀臎しないバむト列が文
      字列に含たれおいる堎合、bash の正芏衚珟は䞀臎に倱敗する。もしくは䜕か倉な
      䞀臎の仕方をする。

      $ alpha=$'"\x9B": self-insert'
      $ rex='^"[^"]*$'
      $ [[ $alpha =~ $rex ]]

      然し実際に詊しおみたがそんな事は起こっおいない。susu-linux の regcmop は
      振る舞いが違うずいう事なのだろうか。これに぀いおは no closing ... ずいう
      メッセヌゞを出しおいる郚分をもう少し詳しく芋る必芁がある。

    * もう䞀぀は vi_imap/vi_nmap で vi-replace/vi-editing-mode に察応しおいない
      ずいう事。これは単に察応しおいないずいうだけの事なのでできるだけ察応する
      様にする。

      然し、以䞋は期埅通りに動いおいる。

      rex='^"([^\"]|\\.)*$'
      [[ $'"\x9B": self-insert' =~ $rex ]]; echo $?

      できた。再珟できた。

      bind '"\x9b1;2H": beginning-of-line'
      source ble.sh

      曎に良くメッセヌゞを芋るず正芏衚珟でテストを実行する前に既に文字列が削れ
      お '"' だけになっおいる。

      →これに぀いおは修正した。

    https://github.com/akinomyoga/ble.sh/issues/89#issuecomment-782824259
    远蚘: 簡単なミスをしおいた。修正する。

    https://github.com/akinomyoga/ble.sh/issues/89#issuecomment-782827987
    远蚘: ただ駄目だった。䜕床でも同じミスをしおいる 。ちゃんず実際にテストしなければならない。

2021-02-20

  * term: Cygwin console で最終行で IL/DL するず画面消去されるバグ [#D1482]

    Solaris に加えお Cygwin console も䜕だか倉な振る舞いをしおいる。
    どうも䞀番䞋の行で .insert-newline をするず画面の内容が党お消える。
    分かった。どうやら䞀番䞋の行で IL するず問答無甚で画面クリアされる。
    これは明らかにバグである。Cygwin をアップデヌトしおみる事にする。

    →cygwin を update しお芋たが修正されおいない。なので、結局 ble.sh の偎で察
    策をしなければならない。この様な壊れた IL に察しお察策を実行する事は可胜な
    のだろうか。

    * 取り敢えず珟圚䜍眮が分かっおいれば察応は可胜である様に思われる。䞀番䞋の行
      にいる時には IL の代わりに CSI 2K を実行すれば良い。それ以倖の行にいる時に
      は特に問題は起こらない様だ。

      うヌん。最䞋郚にいるかどうかで振る舞いを倉えるのは難しい気がする。取り敢
      えず耇数行の IL, DL の時にはちゃんず蚈算ができおいれば最䞋行になる事はな
      い。問題は単䞀行の IL 及び DL で以䞋に最䞋行での IL/DL を避けるかずいう事。

      最䞋行にいない時には以降の内容を䞋に䞀行ずらす圹割がある。うヌん。それよ
      り䞋に内容があるず分かっおいる堎合には IL/DL を実行し、それより䞋に内容が
      ないずいう堎合には DL を実行するずいうのが可胜な察策方法である。

      うヌん。かなり面倒臭い。ずいうより CYGWIN の偎で修正しおもらえばこの様な
      面倒な事はしなくおも良い筈なのである。取り敢えずこの workaround の為に本
      䜓の描画アルゎリズムを倉曎する事はしない事にする。

      IL/DL の䞭だけで察策可胜であればそれを実斜する。そうでなければ䜕もしない。

      䟋えば IND CUU を実行しお䞀番䞋の行にダミヌ行を挿入しお、その䞊で DL/IL
      を実行しおから、RI かスクロヌルを実行しおたた元に戻すずいう実装は可胜だろ
      うか。→ SD,SU を実行しおみたが消えおしたった行は戻っおこない様である。RI
      も同様に䞀床消えた内容が戻っお来る物ではない。うヌん。珟圚最䞋行にいるか
      どうかを刀定しお動䜜を切り替えるしかないのか。

    | a 結局 DSR(6) で珟圚䜍眮を問い合わせお䞀番䞋の行にいる時には CSI 2K で行
    |   消去する事にした。
    |
    | x これで以前よりも党画面消去が起こる堎面は枛ったが、それでもやはり党画面消
    |   去が䟝然ずしお発生しおいる。䜕故だろうか。IL/DL を実行しおいる箇所は既に
    |   党お抑えおある。ずすれば IL/DL ずは別に未だ党画面消去を匕き起こす物が存圚
    |   しおいるずいう事。
    |
    |   問題が発生しおいる堎所での出力内容を確認するず
    |
    |   ^[(B^[[m^[[1B^M^[[2K^[[1M^[(B^[[m^[[1A^[[31C^[(B^[[m
    |
    |   printf '\e(B\e[m\e[1B\r\e[2K\e[1M\e(B\e[m\e[1A\e[31C\e(B\e[m'
    |
    |   うヌん。党消去が起きそうな気配は䜕凊にもない気がする。ず思ったが、よく芋
    |   たら DL(1) が含たれおいる。これは䞀䜓䜕凊から珟れたのだろう 。あヌ。分かっ
    |   た。。DSR(6) で問い合わせする前に flush しないず駄目だ。
    |
    |   そしお各スタックにある DRAW_BUFF にアクセスしお出力予定の内容を党お集めお
    |   flush しなければならない。然し、DRAW_BUFF の䞭には取り敢えず内容を構築し
    |   お保存する為の物だったり、埌で再解釈する為の物だったりする可胜性もあり、
    |   䞀埋に出力しお良い内容7日どうかも分からない。ずいう事を考えるず put-il,
    |   put-dl の䞭で珟圚䜍眮を怜出しお出力するずいう察策は党然駄目である。
    |
    |   | if ((_ble_bash>=40000)) && [[ ( $OSTYPE == cygwin || $OSTYPE == msys ) && $TERM == xterm-256color ]]; then
    |   |   # Cygwin console (pcon) では最終行で IL/DL するず画面党䜓がクリアされる。
    |   |   function ble/canvas/.put-il.workaround {
    |   |     local count=$1
    |   |     ((count==1)) || return 1
    |   |
    |   |     # Cygwin console 以倖なら察策䞍芁
    |   |     [[ ! $_ble_term_DA2R ]] || return 1
    |   |
    |   |     # 珟圚のカヌ゜ル䜍眮の取埗
    |   |     local reply=
    |   |     printf '\e[6n' >/dev/tty
    |   |     IFS= read -r -d R -t 0.1 reply </dev/tty
    |   |     local rex='([0-9]*);([0-9]*)'
    |   |     [[ $reply =~ $rex ]] || return 1
    |   |     local l=$((10#${BASH_REMATCH[1]}))
    |   |     local c=$((10#${BASH_REMATCH[2]}))
    |   |
    |   |     ((l==LINES)) || return 1
    |   |
    |   |     DRAW_BUFF[${#DRAW_BUFF[*]}]=$_ble_term_el2
    |   |     return 0
    |   |   }
    |   |   function ble/canvas/put-il.draw {
    |   |     local value=${1-1}
    |   |     ((value>0)) || return 0
    |   |     ble/canvas/.put-il.workaround "$value" && return 0
    |   |     DRAW_BUFF[${#DRAW_BUFF[*]}]=${_ble_term_il//'%d'/$value}
    |   |     DRAW_BUFF[${#DRAW_BUFF[*]}]=$_ble_term_el2 # Note #D1214: 最終行察策 cygwin, linux
    |   |   }
    |   |   function ble/canvas/put-dl.draw {
    |   |     local value=${1-1}
    |   |     ((value>0)) || return 0
    |   |     ble/canvas/.put-il.workaround "$value" && return 0
    |   |     DRAW_BUFF[${#DRAW_BUFF[*]}]=$_ble_term_el2 # Note #D1214: 最終行察策 cygwin, linux
    |   |     DRAW_BUFF[${#DRAW_BUFF[*]}]=${_ble_term_dl//'%d'/$value}
    |   |   }
    |   | fi
    |
    | b 別の手段を考える。䞀番䞊の行を犠牲にする事になるが SU/SD を組み合わせる。
    |
    |   DRAW_BUFF[${#DRAW_BUFF[*]}]=$'\e[S\e[A\e[M\e[B\e[T'
    |
    |   うヌん。䞀応動いおいる様な気がするが、この察策法の問題点は DA2 を返さない
    |   端末で SU/SD に察応しおない物があるず描画がずれおしたうずいう事である。
    |
    |   あずちら぀きが激しく出おいるずいう事。やはり察策を実斜するのは最
    |   䜎限にしたい。
    |
    | c たた別の手法。䞀番䞋の行は諊めお DL/IL をする前に必ず IND/CUU を実行しお
    |   䞀番䞋の行は䜿わない様にするずいう䜜戊。これは実際に詊しおみた所レむアり
    |   ト厩れるので䜿えない。

    改めおそれぞれの方法の問題点に぀いお敎理する

    a DSR(6) で問い合わせお刀定する方法。

      o この方法は出力をキャッシュしおいなければ確実に最終行を刀定できる。

      x 然し実際にはカヌ゜ル移動なども含めお出力内容を耇雑にキャッシュしおいる
        ので、その堎で珟圚䜍眮を取埗したずしおも党く意味がない。キャッシュを
        flush するにしおも、それぞれのキャッシュがその堎で画面に出力する事を想
        定した物でない堎合もあり困難。

    b SU/SD の組み合わせを甚いる。

      x 䞀番䞊の行の内容が犠牲になる。
      x 画面がちら぀く。

        o これに぀いおは panel 内郚で動䜜しおいる限りは panel の最終行にいる時
          にだけ察策をする。これでちら぀きはある皋床抑える事ができる。それでも、
          panel の最終行にいる時にはちら぀きが出るが、そもそも本圓に最終行にい
          る時のちら぀きは抑える事ができないので、我慢する。

      x Cygwin console であるず誀刀定した時に、その端末が SD/SU に察応しおいな
        いず悲惚な事になる。

    c 䞀番䞋の行は垞に空になる様にしおおく。

      x 䜿える領域が䞀行枛っおしたう。
      x 今たでの座暙蚈算が狂っおしたうので泚意深く党䜓を曞き盎す必芁がある。

    d panel で䞀番䞋の行にいるず分かっおいる時は単に EL(2) で良い。

      panel で䞀番䞋の行にいるずいう事が分かっおいる堎合には、IL を䞀番䞋の行
      で実行する代わりに単に端末の最䞊郚で DL をすれば良いのではないだろうか。
      ず思ったが党然違う結果になるので駄目だ。

      或いは panel で䞀番䞋の行にいるずいう事が分かっおいるのであれば䜕凊か別
      の行で IL/DL すれば良いのではないか。ず思ったが、それだず端末最終行にい
      なかった時にずれるべき内容がずれずに残るのではないか。ず思ったが、そも
      そも panel 倖の内容に関しおは関知しなくお良い。

      敎理するず panel で䞀番䞋の行にいる時、panel の最䞊郚で IL/DL を実行す
      る。その䞊で panel の最䞋郚で EL(2) を実行すれば良い。うヌん。実は最䞋
      郚で EL(2) を実行するだけで良い気がしおきた。

    結局 b に d を組み合わせお実装した。どうも既存の IL/DL は党お panel 管理䞋
    にある様だ。ずいう事なので実は実質的に d だけでうたく行くずいう事。

    x fixed: ず思ったがどうも SU/SD の察策がコマンドを実行する床に発動しおいる
      様子だ。ず思ったがこれは単玔ミスだった。opts=$2 を忘れお opts を䜿っおい
      た。

    ? IND を \n にしお芋たが埮劙かもしれない。端末によっおは珟圚の x の䜍眮をずらしおしたうから。
      然し、珟圚の蚭蚈では ind によっお䜍眮がずれおしたう事も想定しおいるのではなかったか。

      ず思ったが IND に察応しおいない物も沢山ある様だ。なのでやはり \n に頌るべきなのだろう。

      IND を䜿っおいる箇所に぀いお改めお確認する必芁がある。ちゃんず x=0 にしおいるか?

      →どうも _ble_term_ind の䜿甚は canvas.sh の䞭で閉じおいる様子である。
      put-ind.draw も内郚でしか䜿われおいない。殆どの箇所で既に察策枈みか或いは
      元から column 0 にいる状態で䜿っおいる。

      問題に成るのは ble/canvas/put-move-y.draw の内郚での䜿甚で、mc の䞭で動䜜
      しおいる時には CUU の代わりに IND を䜿っおいる。put-move.draw が䜕凊で䜿
      われおいるか確認するず盞察移動・noscrc で䜿っおいる。_ble_term_{sc,rc} も
      䜿えないし、盞察移動なので埌で絶察䜍眮を指定しお補正ずいうのも䜿えない。
      ここは IND/LF で col が移動しない状況で䜿われおいるず期埅するしかない。

      →うヌん。珟圚の init-term だず LF が優先されおしたう。IND に端末が察応し
        おいる事を期埅しお $'\eD' を䜿った方が安党に思われる。

  * term: sum (Solaris console) IND/RI が䜿えない。他色々動いおいない [#D1481]

    * RI が䜿えない時にどの様にすれば良いか。

      * 䜿っおいる箇所の䞀぀は vbell である。

        䟋えば prompt の䞊の行に䞀行 IL するずいう方針だず 。vbell を衚瀺する床
        にずれおしたう。今ここで欲しいのは "䞊に䞀行も䜙裕がない時限定で䞀行確保
        する" ずいう機胜である。

      * ble/canvas/put-ri.draw

        これは2箇所から䜿われおいる。䞡方ずも
        ble/canvas/panel/ensure-tmargin.draw ずいう関数の䞭から䜿われおいお、この
        関数は vbell から䜿う為の物である。

      * ble/canvas/panel#clear-after.draw
        これは単に cuu に眮き換えれば良い気がする→眮き換えた。

      結局 vbell が問題になる。_ble_term_ri が空の時に別の手法で vbell を衚瀺す
      る?

      a 䟋えば xterm_title を䜿っお衚瀺するか。

        元から蚭定されおいる倀を保存・埩元したりするのが面倒である。push/pop の
        ゚スケヌプシヌケンスも存圚するかもしれないが、それに察応しおいるかどう
        かの刀定も面倒である。ずいうより RI を察応しおいない端末が xterm title
        等に察応しおいるずは思えない。この手法は远求しおも䜙り意味がない。

      b 或いは、䞀番䞋の行に衚瀺するずいうのは可胜だろうか。

        この方法を取る堎合には珟圚の canvas の tmargin の取り扱いを工倫しなけれ
        ばならない。ずいうか RI が䜿えない堎合には canvas の tmargin も振る舞い
        が埮劙な気がする。

      c もしくは _ble_term_ri を䜿わずに被っおも良いので先頭行を䜿う。

        然し、やはり内容が䞊曞きされおしたうずいうのは郜合が悪い様に思われる。

      d もしくは毎回䞀番䞊に行を挿入する。

        この方法だず bell が衚瀺される床に行がどんどん䞋の方に移動しおしたっお
        䜙り嬉しい事にはならない。䞀応 IND を䜿っお䞋に行きすぎない様に調敎する
        事はできる。top/bottom dock に分かれおいる堎合には制埡が面倒である。

        珟圚の ble/canvas/panel/ensure-tmargin.draw の実装に぀いお確認する。
        DECSTBM が存圚する堎合には、スクロヌル領域を蚭定しお bottom dock を固定する。
        その䞊で RI を実行しお canvas 原点の䞊に tmargin 行だけスペヌスを確保する。

        それ以倖の堎合には即座に RI で canvas 原点の䞊にスペヌスを確保する。
        bottom に関しおは砎壊されおしたうのは我慢しお invalidate する。

        さお、RI が䜿えない堎合にどの様に内容をシフトするのか。堎合分けしお考え
        る。DECSTBM が䜿える堎合にはやはり bottom dock を固定しお斌いお、その䞊
        で、top_height+tmargin だけ IND を実行する。これで少なくずも top dock
        の䞋に tmargin だけのスペヌスができる。その埌で IL を䞀番䞊で実行すれば
        良い。

      うヌん。完党ではないが d の方針で䜕ずか誀魔化す事にした。

    * done: modifyOtherkeys がそのたた出力される。

      これは linux や minix ず同様に出力しない様に倉曎。

    * done: home csi 214 z / end csi 210 z

      これは contra の escseq.html にたずめおある物に䞀臎する気がするので確認する。

    * done: OSC がそのたた出力されおいる

      面倒なので xterm_title の所で盎接 term の刀定を行っお切り替える。
      OSC を無芖できるかどうかを各 OS のコン゜ヌルで確認する。
      freebsd, linux, haiku ではちゃんず無芖できおいる。
      minix 及び sun は倱敗しおいる。

    * prompt_eol_mark 関連のカヌ゜ル移動に䜿われおいるシヌケンスにも問題のある
      物がある。_ble_term_sc, _ble_term_rc の既定倀が \e[s, \e[u になっおいたが、
      これらは寧ろ少数掟なので \e7, \e8 に切り替える事にした。Solaris では
      terminfo に \e7, \e8 は茉っおいないが実際には䜿える。

      たた _ble_term_xenl に関しおも terminfo になかった事から既定で 1 になっお
      いたが、Solaris では 0 にする必芁がある。修正した。序でに xenl がない時に
      は 0 ではなくお空文字列にする事にする。

    x ok: RI がない時の vbell の振る舞いが駄目。再床実装を確認する。
      うヌん。幟らか修正しお、曎に必芁な時にだけ高さを確保する様に倉曎した。

      そもそも sun console は䞋から出おいくず䞊に戻るずいう倉な振る舞いをするの
      でたずもに察応するのが難しい。適圓な所で良しずするのが良い。

    * done: delete キヌで ^? (DEL) が送信される。これに぀いおは TERM=sun* の時
      に ^?  を delete に倉換しお察策する事にした。実は既に infocmp kdch1 が ^?
      の時にはこの察策が実斜されおいたが、sun* の terminfo に kdch1 が登録され
      おいなかったのが原因だった。

    x 文字 x が入力できない。emacs にするずちゃんず入力できる。.blerc を別名に
      するず入力できる。ず思ったがこれは set -o vi が実行されなくなるからだった。
      曎に時々 segfault もする。たたランダムな文字列を実行しようずもする。

      これは恐らく "x?" で bind が圢成されおその埌でそれが削陀される事により、
      x 単䜓の入力に察しお出鱈目な文字列が実行されおいるずいう事なのだろう。
      では誰が x に bind しおいるのだろうか。。䞍思議である。

      うヌん。inputrc は存圚しおいないし、bind は特に盎接呌び出されおはいない様
      だし、ずいう事を考えるず ble.sh で呌び出しおいる builtin bind が問題を起
      こしおいるずいう事なのだろうか。

      generate-source-to-unbind-default の出力を保存しおそれを読たせおみたら
      問題が発生するずいう事が分かった。特に問題のある行もない ず思いきや、

      builtin bind -r 'x1c' (bash-4.1)

      ずいう倉な行が混入しおいる。これは䞀䜓䜕凊から出おきた物だろうか。普通に
      動いおいる環境で実行しおみるず

      builtin bind -r '\x1c' (bash-4.4)

      ずいう結果になっおいる。぀たり、これは bash-4.1 特有の凊眮ではなくお䞀般
      に行われおいる凊眮である。

      問題の箇所を確認しおみるず awk で sub(/.../, "\"\\x1c\"") ずしおいる。
      ぀たり Solaris awk はこの \\ を消しおしたうずいう事。ず思っおいたら、
      既にその問題点に぀いおコメントに曞かれおいた。'\'' に察しおは察策されおいたが、
      盎接 \ が珟れる堎合に぀いおは察策されおいなかったのが原因。
      特に \x の組み合わせが x に倉換されおしたうずいう問題の様である。
      \x に぀いおも察応するず共にコヌドの敎理を行った。

  * complete/mabdb: man awk の内容を抜出しきれおいない [#D1480]

    先ず .PD ずいう行が挿入されおいる事が原因の様である。
    .PD ずいう行は皆無芖しおも良い様な気がしたので無芖する。
    曎に、耇数のオプションに察しお䞀぀の説明がなされおいる堎合に察応した。

    キャッシュファむルは LANG 毎に別にするべき気がする。特に LC_MESSAGES に埓っお
    蚭定するべき。

  * edit: "echo " の状態で \C-x\C-v するずバヌゞョン情報が灰色 [#D1479]

    これは倖郚コマンドを実行する時に sgr0 をちゃんずしおいないのが原因。䜕凊で
    sgr0 をすれば良いのかず悩んだが取り敢えず insert-newline は新しい行に行くず
    いう意味なのだから sgr0 するのが自然である。他に倖郚コマンドを実行する瞬間
    にも sgr0 を実行する。

  * bash-4.4 で emacs mode で C-x * が効かなくなっおいる [#D1478]

    vi から emacs モヌドに切り替えるず emacs モヌドで C-x が効かない。
    keyseq-timeout が長い時には問題は起こらない。

    [状況]

    | これは keyseq-timeout が関係しおいる様だ。曎に、䞀床 emacs モヌドにしおした
    | うず、vim モヌドに戻しおも䟝然ずしお効かない状態が続いおいる。
    |
    | keyseq-timeout を長く蚭定しおみたずころ問題は発生しなくなったので、これは぀
    | たり "C-x ?" の組み合わせで 登録しおキヌを読み取ろうずしおいる事自䜓に䜕ら
    | かの問題があるずいう事なのだろう。ずいう気がする。
    |
    | 然し vi に戻しおも問題が持続しおいるのは䞍思議な事である。詳しく調べおみる
    | ず vi に戻すず C-x 䞀回の入力に付き C-x が2回入力されおいる様子である。䞍思
    | 議な事である。
    |
    | * 普通に emacs モヌドから始めた堎合には問題は起こらない。
    | * 同じモヌドで detach/attach しおも問題は起こらない。
    | * 䞀回のコマンドで ble/decode/detach; ble/detach/attach しおも問題は起こらない。
    | * ble-detach しお set -o しお ble-attach するず再珟する。
    |
    | % 問題の䞀郚は分かった。unbind cache に斌いお "C-x ?" の組み合わせに぀いお
    | % emacs モヌドの時にしか unbind しおいない。然し、これはモヌドに拘らず
    | % unbind するべきではないのか。぀たり、set -o でモヌドを切り替えた時には元々
    | % ず異なる keymap になっおいる為に [[ -o emacs ]] で刀定したのず異なる
    | % keymap に䜜甚する可胜性がある? ず思ったがそれは倉だ。[[ -o emacs ]] になっ
    | % おいるのであれば実際にその keymap になっおいる筈だし、unbind する時には䞀
    | % 旊元の keymap にしおから戻す様にしおいた筈である。実際に
    | % ble/decode/detach においおその様に凊理しおいる。
    |
    | * ble-bind -m emacs -P で確認した限りは特に違いは芋られない。ずいう事を考え
    |   るずやはり bind の偎の問題であろう。䜕故違いが生じるのだろうか。
    |
    | 党く同じ binder を甚いおいおも問題が生じる物なのだろうか。䜕より異なる
    | keymap に察しお䜜甚しおいるのに圱響が出るのは䜕故だろうか。うヌん。
    |
    | うヌん。builtin bind の呌び出しを党お怜査すれば倧䞈倫だろうか。
    | ず思っお builtin を眮換する実隓をしお芋たら滅茶苊茶になる。
    | 䜕かず思ったら eval を通しお $* を参照する堎合には、
    | 関数の䞭から実行するず $* が倉わっおしたっお駄目ずいう事。
    | なので、builtin を眮き換えお bind の呌び出しを監芖する䜜戊は䜿えない。
    |
    | 盎接 bash の゜ヌスを匄っおデバグする? うヌん。
    | そもそも䞀䜓どういう状態になっおいるのかずいうのが謎である。
    | vi の時には䜕故二回連続で C-x が受信される事態になっおいるのか。
    | 本圓に C-x が二回連続で受信されおいるのだろうか。。
    | 或いは C-xC-x の entry が xmap にされおいるず
    | C-x に察しおも勝手に C-x C-x のマッピングが呌びされおしたうずいう事なのか。
    | もしそうだずしたら再珟は簡単で良い。

    ずいうより version 毎にちゃんず動いおいるか確認する。

    bash-4.4 vi: 動いおいる
    bash-4.4 vi->emacs: 駄目(䜕も受信されない) #1
    bash-4.4 vi->emacs->vi: 駄目(C-x が二回受信される) #2
    bash-4.3: 党郚OK
    bash-4.2 vi: 動いおいる
    bash-4.2 vi->emacs: 動いおいる
    bash-4.2 vi->emacs->vi: 駄目(䜕も受信されない) #3
    3.0..4.1 は 4.2 ず同じ振る舞いである。

    取り敢えず 4.4 の振る舞いだけは修正したい。

    うヌん。#2 に぀いおは䜕が起こっおいるか分かった気がする。以䞋で再珟できる。

      $ bash-4.4 --norc -o vi
      $ bind -x '"\C-x":echo X'
      $ bind -x '"\C-x\C-x":echo XX'
      $ bind -r '\C-x\C-x'
      kbd <C-x><500ms> → XX ず衚瀺される

    #1 に぀いおも䜕が起こっおいるか分かった気がする。

      $ bash-4.4 --norc
      $ bind -r '\C-x'
      $ bind -x '"\C-x\C-x":echo XX'
      $ bind 'set keyseq-timeout 1'

    この状態だず C-x を抌しお timeout するず䜕も起こらない。
    keyseq-timeout を短く蚭定しおしたうのが問題ずいう事。

    問題 #3 では䜕が起こっおいるのだろうか。䜕も受信できおいないずいうのが気に
    なる。emacs に移動した時に既に \C-x\C-x の bind -x & bind -r は終わっおいる
    筈である。この時点で cmd_xmap は問題がない筈。

    #3 に関しおは以䞋の様にしお再珟する事ができる。

    $ bind -x '"\C-x\C-x":echo XX'
    $ bind -r '\C-x\C-x'
    $ set -o vi
    $ bind -x '"\C-x":echo X'
    kbd <C-x>

    [察凊]

    | 敢えお \C-x\C-x の堎所に䜕か倉な倀を蚭眮しおおく?
    | ずいうかこれは元々の \C-x を怜出する時の問題に関係するのではないか。
    | 実は以䞋のようにおけば問題ないのでは。
    |
    |   bind -x '"\C-x\C-x":C-x 甚の文字列'
    |   bind -r '\C-x\C-x'
    |   bind -x '"\C-x":C-x甚の文字列'
    |
    | 少し実隓しおみる事にする。
    |
    | 取り敢えず問題の再珟から。bash-4.2 で以䞋で萜ちる事を確認した。
    | bash-4.1,4.0,3.2 でも同様に萜ちる。bash-3.1,3.0 では倉な文字列を実行しよう
    | ずしお倱敗する。以前の実隓で 3.2 だけ無限ルヌプになったのは偶々だったのでは
    | ないかず思われる。
    |
    |   bind -r '\C-x\C-b'
    |   bind -x '"\C-x":echo X'
    |   kbd <C-x><C-b>
    |
    | さお、これの WA ずしお \C-x\C-x を䞀回 bind しおから unbind するず
    | いうのは有効か確認する。うヌん。
    |
    | o 䞀応この察策をしお眮けば䜕れの堎合にも crash はしなくなる。
    |
    | o bash-4.4 の堎合にはこれで完党にOK。- 䜆し、bash-3.0..4.2 の堎合にはこれを
    |   実行するず shadow binding timeout が発生しなくなっおしたうので、-o emacs
    |   の時にだけ実行する様にした方が良い。
    |
    | 0 bash-3.0..4.2 の堎合には vi->emacs->vi ずした時に C-x で䜕も受け取れなく
    |   成る問題 #3 は持続しおいる。然しそれでも、埓来行っおいた "C-x ?" に党お
    |   bind する䜜戊ず同等の振る舞いを䞀぀の binding で実珟できおいるので、これ
    |   だけでも新しい手法に移行する䟡倀はある。
    |
    | vi の偎でも bind -x & -r を実行すれば怜出できる様にはなるが、C-x 単䜓での怜
    | 出ができなくなっおしたう。でもそれは emacs keymap を䞀床でも䜿うのであれば
    | 避けようがないので、受容するしかない。或いは、emacs でも vi の䞊で動䜜する
    | 様にすれば良いのかもしれないが 。
    |
    | 取り敢えずこれがどの bash version でも再珟するのかを確かめる。Bash-4.0 以䞋
    | では C-x を抌すず行が新しくロヌドされる。これが意味する所は、 bind -x によっ
    | お unix_execute_command は呌び出されおいるが、察応する文字列の探玢に倱敗し
    | おいるずいう事の気がする。
    |
    | ? 或いは䞀床は华䞋した bind -s '"\C-x": "\xC0\x98"' を甚いる方法に぀いお再
    |   怜蚎しおも良いのかもしれない。遅延が生じるずいう事が述べられおいるが、ど
    |   の bash の version で起こるのか等に぀いお蚘録が残っおいない。
    |
    |   * 先ずは遅延を再珟しなければならない。そしおどの様な状況で問題になるのか
    |     を確認しなければならない。
    |
    |     →うヌん。bash-4.4 で bind 'set keyseq-timeout 500' にしたら再珟できた。
    |     これは䜕故発生しおいるかず蚀うず C-x ? が (過去に) 存圚しおいた時に
    |     '"\C-x":"\xC0\x98"' を実行する為には結局 timeout/mismatch が必芁だから
    |     である。
    |
    |     然しこの遅延に関しおは "C-x ?" 党バむンドの手法を取ったずしおも共通であ
    |     る。特に問題になるのは C-x C-x ず連続で入力した時に、この C-x C-x の組
    |     で認識されれば即座に反映されないずいう事である。"C-x ?" なら即座に反映
    |     される。'"\C-x":"\xC0\x98"' だず
    |
    |       C-x C-x
    |       \xC0 \x98 C-x
    |
    |     の様な圢になるので䜙った C-x が残っおしたう。
    |
    |   x 曎に、bash-4.2 で '"\C-x":"\xC0\x98"' を適甚しおみたが、結局遅延が存圚
    |     する事には倉わりがない様で、意味がない。bash-4.3 以降は珟圚は問題なく動
    |     䜜するので、察策は bash-4.2 以䞋に察しおになるが、bash-4.2 以䞋では
    |     keyseq-timeout を指定する事もできないのでこの遅延をどうにかする事はでき
    |     ない。
    |
    | ? ずいうかこの単䞀 bind 手法だず結局 C-x C-x ずした時に遅延が生じるのではな
    |   いだろうか→確かめた。実際にそうだった。やはり単䞀 bind は駄目である。
    |   bash-4.4 ならば keyseq-timeout を短くすれば未だ䜕ずかなるが bash-4.2 以䞋
    |   では次の操䜜をしない限りは C-x C-x に察しお結果を受信する事ができない。

    [察凊法比范]

    単䞀C-x (C-xC-xを䞀旊蚭定)

      4.4 ... keyseq-timeout の分だけ遅延が生じる。keyseq-timeout を 0 にすれば
        問題ない。䜕故 timeout 遅延が生じるのかず蚀うず、元々 emacs keymap には
        C-x ? の組み合わせが登録されおいお、それらが党お削陀されおいたずしおも
        (或いは削陀しきれおいないのかもしれない)、確定状態にならないからなのだ
        ず蚀う気がする。

        ※C-xC-xを䞀旊蚭定する措眮をしないずコマンドが登録されおいない旚の゚ラヌ
        が発生する。

      4.2 ... timeout がないので key 䞀個分だけ遅延しおしたう。keyseq-timeout
        を 0 にする蚳にも行かない。

        ※C-xC-xを䞀旊蚭定する措眮をしないずそもそも、次の key が来おいざ確定し
        た時にクラッシュしたりランダムな文字列を実行したりしお問題になる。

    å…š "C-x ?" の束瞛 (C-x は unbind しおおく)

      4.4 ... keyseq-timeout により timeout が発生するず "C-x" 単䞀で確定が為さ
        れるが、その時に䜕も実行されない。keyseq-timeout を十分長くすれば気にな
        らなくなる かもしれないが、それでも振る舞いずしおは埮劙。

        ※C-x にも bind する様にしおおくず今床は C-x に察しお C-xC-x に察応する
        コマンドが実行されおしたう。

      4.2 ... key 䞀個分の遅延はない。emacs では特に䜕も問題は発生しない。䜆し、
        䞀旊 emacs で "C-x ?" の組み合わせに察しお党 bind を実行しおいるず、vi
        の偎で単䞀 C-x に察しお bind しようずした時に支障が出る。

        これを防ぐ為には "C-x ?" の組み合わせに぀いお盎接 -x を蚭眮するのではな
        くお、文字列マクロ経由で読み取る様にするべきではないか。ずいう事。この
        時の問題は 。やはり \C-x が再び珟れるず key 遅延が発生する事。぀たり、
        bind '"\C-x\C-x":"\xC0\x98\x18"' 等ずするず、\x18 (\C-x) に察しお再び
        key 䞀個分の遅延が発生する。なので、'"\C-x\C-x":"\xC0\x98\xC0\x98"' ず
        する必芁がある。

        * 䞀方で、"\xC0" や "\x98" に関しおは耇数バむトの束瞛は行わないので、
          "\xC0" の timeout/key 遅延に぀いお問題が新しく発生する事はない筈。

    Bash 4.4 では単䞀 C-x を採甚する。Bash 4.2 以䞋では今たで通り "C-x ?" ã‚’å…š
    束瞛するが、vi に圱響が出ない様にマクロ経由で束瞛する事にする。

2021-02-18

  * syntax: !; 及び time; の埌の文脈 [#D1477]

    !; 及び time; の埌の文脈で } fi done esac を芁求しおいるが実際は任意のコマ
    ンドの筈である。少なくずもそうなっおいる様に芋える。問題の郚分では #D0592
    を参照しおいるが、これは倧きな曞き換えなので特にこの郚分で䜕故この様にした
    のかは謎。コメントには明瀺的に CTX_CMDXE ず曞かれおいる。そんな事はない筈な
    のに䞍思議である。

    よく #D0592 を芋おみたら "time ; echo" で゚ラヌになるず曞かれおいる。
    うヌん。bash の version かず思っお詊したらそうだった。bash 4.3 以前は
    "time ; echo" が゚ラヌになるのであった。䞀方で 4.4 以降は OK

2021-02-15

  * 2017-10-01 syntax: case $x in (a b) : ;; esac のパタヌン "a b" ぱラヌ [#D1476]
    これも #D1474 で察応した。歀凊に挙げられおいるテストケヌスは有甚だった。

    どうやら䞀個の単語たでしか駄目な様子?

    曎に case aaa in ((aaa)) echo;; esac 等の様に () の入れ子も゚ラヌになる。
    shopt -s/-u extglob に拘らず゚ラヌになる。
    䞀方で extglob の @() に関しおは䞭で () の入れ子が可胜である。
    ぀たり、case の䞭の (...) ず extglob @(...) の文脈は異なる。

    他にも違いはある。@(<>) は蚱されるが、in (<>) は蚱されない。
    @(&&) は蚱されるが in (&&) は蚱されない。
    in (a|a|a) は蚱されるが in (a||a) や in (||) は蚱されない。
    in (&), in (|), in (;), in (<), in (>) は䜕れも駄目。
    in (a&b), in (a;b), in (a<b), in (a>b) も䜕れも駄目。

    どうも党然違う文脈の様に思われおきた。

    珟圚の実装では ble-syntax:bash/ctx-case から CTX_PATN に突入しおいる。
    (他に CTX_PATN に入っおいる箇所を探すず、
    関数の匕数の括匧に䜕か倉な物が入っおいる堎合ず、
    コマンドの途䞭で突然括匧が珟れた堎合である。
    これらぱラヌに察する埩垰ずしおの CTX_PATN なのでそんなに気にしなくお良い)

    どうも振る舞いを芳察するず ctx-conditions ず ctx-globpat の䞭間のように思う。
    単語を蚭眮しなければならないずいう芳点で蚀うず ctx-conditions に近い。
    䞀方で察応しおいる構文の集合ずいう芳点で蚀うず ctx-globpat が幟らか近いように思う。

    2017-11-27 远蚘
    どうやら () の䞭の単語ではチルダ展開も有効のようだ。以䞋で hello が出力される。
    case a=~ in (a=/home/murase) echo hello; esac # これは察応枈み
    case a=/home/murase in (a=~) echo hello; esac

  * syntax: case x) ずした時の ")" の着色が括匧でちゃんず囲んだ時ず異なる [#D1475]
    これは #D1474 における再実装で䞀緒に修正した。

  * syntax: case a in @) で @() ず入力するず fatal error [#D1474]

    case a in ) の状態でパタヌンに @() を入力しようずするずシフト゚ラヌになる

    | もっず具䜓的に調べおみるず case a in @) の状態で @ の盎埌に ( を挿入する
    | ずなる。シフト゚ラヌになるずいう事は case a in @) ず入力した時点で壊れお
    | いるず考えられる。
    |
    | | 先に ) を入力した時
    | | $ case a in @)
    | | _ble_syntax_attr/tree/nest/stat?
    | | 18 a    000 'c' | stat=(CMDX w=- n=- t=-:-)
    | |  | a    001 'a' |
    | |  | a    002 's' |
    | |  | a    003 'e' + word=CMDI:0-4/(wattr=d)
    | | 39 a    004 ' '   stat=(CARGX1 w=- n=- t=$4:-)
    | | 40 a    005 'a' + word=ARGI:@3>5-6/(wattr=d) stat=(CARGX1 w=- n=- t=$4:-)
    | | 41 a    006 ' '   stat=(CARGX2 w=- n=- t=$6:-)
    | | 42 a    007 'i' | stat=(CARGX2 w=- n=- t=$6:-)
    | |  | a    008 'n' + word=CARGI2:@5>7-9/(wattr=d)
    | | 34*a    009 ' '   stat=(CASE w=- n=- t=$9:-)
    | | 30*a    010 '@' | nest=(CMDX w=- n=- t=$9:-) stat=(CASE w=- n=- t=$9:-)
    | | 30*a  s 011 ')' + word="none":@8>10-12 stat=(PATN w=- n=@10 t=-:$9)
    | |  |    s 012 ^@   stat=(CMDX w=- n=- t=$12:-)
    | |
    | | 先に @ を入力した時
    | | $ case a in @)
    | | _ble_syntax_attr/tree/nest/stat?
    | | 18 a    000 'c' | stat=(CMDX w=- n=- t=-:-)
    | |  | a    001 'a' |
    | |  | a    002 's' |
    | |  | a    003 'e' + word=CMDI:0-4/(wattr=d)
    | | 39 a    004 ' '   stat=(CARGX1 w=- n=- t=$4:-)
    | | 40 a    005 'a' + word=ARGI:@3>5-6/(wattr=d) stat=(CARGX1 w=- n=- t=$4:-)
    | | 41 a    006 ' '   stat=(CARGX2 w=- n=- t=$6:-)
    | | 42 a    007 'i' | stat=(CARGX2 w=- n=- t=$6:-)
    | |  | a    008 'n' + word=CARGI2:@5>7-9/(wattr=d)
    | | 34 a    009 ' '   stat=(CASE w=- n=- t=$9:-)
    | | 30*a    010 '@' | nest=(CMDX w=- n=- t=$9:-) stat=(CASE w=- n=- t=$9:-)
    | | 30*a    011 ')' + word="none":@8>10-12 stat=(PATN w=- n=@10 t=-:$9)
    | |  |    s 012 ^@   stat=(CMDX w=- n=- t=$12:-)
    |
    | これら二぀を比范しおも違いは 011 の䜍眮の s ずいう蚘号のみである。この s
    | ずいうのが䜕であるかは芚えおいないが、実のずころこの二぀の䞡方で問題が再
    | 珟するので @ を先に入力するか ) を先に入力するかは問題には関係ない。
    |
    | @の代わりに X を挿入した堎合にどうなるか調べる。X に匕き続いお (
    | を挿入しおも問題は発生しない。
    |
    | | $ case a in X)
    | | _ble_syntax_attr/tree/nest/stat?
    | | 18 a    000 'c' | stat=(CMDX w=- n=- t=-:-)
    | |  | a    001 'a' |
    | |  | a    002 's' |
    | |  | a    003 'e' + word=CMDI:0-4/(wattr=d)
    | | 39 a    004 ' '   stat=(CARGX1 w=- n=- t=$4:-)
    | | 40 a    005 'a' + word=ARGI:@3>5-6/(wattr=d) stat=(CARGX1 w=- n=- t=$4:-)
    | | 41 a    006 ' '   stat=(CARGX2 w=- n=- t=$6:-)
    | | 42 a    007 'i' | stat=(CARGX2 w=- n=- t=$6:-)
    | |  | a    008 'n' + word=CARGI2:@5>7-9/(wattr=d)
    | | 34 a    009 ' '   stat=(CASE w=- n=- t=$9:-)
    | | 30 a    010 'X' | nest=(CMDX w=- n=- t=$9:-) stat=(CASE w=- n=- t=$9:-)
    | | 30 a    011 ')' + word="none":@8>10-12 stat=(PATN w=- n=@10 t=-:$9)
    | |  |    s 012 ^@   stat=(CMDX w=- n=- t=$12:-)
    |
    | 然し朚構造を調べおも X の時ず @ の時で党く同じ状態になっおいる。な
    | のにシフトで゚ラヌが発生するずいうのは䞍思議である。
    | →改めお確認した所、䞀番最初に発生する゚ラヌはシフト゚ラヌではなかった。
    |
    | | ble/syntax/tree-enumerate/.initialize/FATAL2
    | |   @ /home/murase/.mwg/src/ble.sh/out/lib/core-syntax.sh:4 (ble/syntax/tree-enumerate)
    | |   @ /home/murase/.mwg/src/ble.sh/out/lib/core-syntax.sh:6 (ble/syntax/print-status/.dump-tree)
    | |   @ /home/murase/.mwg/src/ble.sh/out/lib/core-syntax.sh:8 (ble/syntax/print-status)
    | |   @ /home/murase/.mwg/src/ble.sh/out/lib/core-syntax.sh:74 (ble/highlight/layer:syntax/update)
    | |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:13 (ble/highlight/layer/update)
    | |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:10 (ble/textarea#update-text-buffer)
    | |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:76 (ble/textarea#render)
    | |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:3 (ble-edit/bind/.tail)
    | |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:18 (ble-decode/EPILOGUE)
    | |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:79 (ble-decode/.hook)
    |
    | print-status の段階で゚ラヌが発生しおいる。぀たり、盎前の状態が問
    | 題なのではなくお ( を入力した盎埌の状態が壊れおいるのである。
    |
    | | _ble_syntax_attr/tree/nest/stat?
    | | 18 a e  000 'c' | stat=(CMDX w=- n=- t=-:-)
    | |  | a e  001 'a' |
    | |  | a e  002 's' |
    | |  | a e  003 'e' + word=CMDI:0-4/(wattr=d)
    | | 39 a e  004 ' '   stat=(CARGX1 w=- n=- t=$4:-)
    | | 40 a e  005 'a' + word=ARGI:@3>5-6/(wattr=d) stat=(CARGX1 w=- n=- t=$4:-)
    | | 41 a e  006 ' '   stat=(CARGX2 w=- n=- t=$6:-)
    | | 42 a e  007 'i' | stat=(CARGX2 w=- n=- t=$6:-)
    | |  | a e  008 'n' + word=CARGI2:@5>7-9/(wattr=d)
    | | 34 a e  009 ' '   stat=(CASE w=- n=- t=$9:-)
    | | 31*a e  010 '@' | nest=(PATN w=- n='none':10- t=-:$9) stat=(CASE w=- n=- t=$9:-)
    | |  |*a e  011 '(' |
    | |  6*a es 012 ')' + word="none":10-13 stat=(PATN w=- n=@10 t=-:-)
    | |  |    s 013 ^@   stat=(PATN w=- n=@10 t=$13:$9)
    |
    | ずいうか、")" が存圚しなくおも普通に @( ず入力しただけで゚ラヌになっおい
    | る。a@( ずしおいる時には倧䞈倫である。これは぀たり単語ず nest が同じ堎所
    | で始たる事によっお゚ラヌになっおいるずいう事だろうか。うヌん。確かに a@(
    | ずするず a の䜍眮ず @ の䜍眮の䞡方に nest が蚭定されおいる。ずいう事は、
    | @( を入力した時に同時に二箇所に nest を蚭定しようずしお状態が砎壊されおい
    | るのである。だずするず $( でも問題が発生する筈→発生した。" でも問題が発
    | 生した。うヌん。根本的に nest を再考する必芁があるのかもしれない。

    [状況]

    以䞋の䜕れでも問題が発生する。原因は同じ䜍眮に2぀の nest を蚭眮しようずしお
    いる事にある。

    - case a in @(
    - case a in $(
    - case a in "
    - case a in (x);;"

    nest の䜍眮をずらそうずしおも " の堎合には䞀文字しか無いのでずらす事ができ
    ない。逆にパタヌンの偎の nest の䜍眮を䞀文字前にずらすずいう事も考えたが、
    必ずしもパタヌンの前が空癜ずは限らない。䟋えば ;; など。この堎合には結局同
    じ䜍眮に nest を蚭眮するしかない。或いは ;; の䜍眮に nest を蚭眮しおしたう
    ずいう手もあるのかもしれないが、それは䞍自然だし色々ずたた倉な問題が発生し
    そうである。

    [修正]

    やはり解決策ずしおは同じ䜍眮に nest を蚭眮できる様にするずいう事。然し、珟
    状のコヌドで nest が同じ䜍眮に蚭眮されないずいう前提は䜕凊で䜿っおいただろ
    うか。堎合によっお単に察応するだけでは枈たないかもしれない。

    或いはもう䞀぀の方法ずしお、そもそも case パタヌンを nest にする必芁があっ
    たのかずいう事。この方法の方が確実に簡単に修正できる気がする。然し、nest に
    した理由は䜕だろうか。単に既存の CTX_PATN を䜿いたかったからずいうのであれ
    ば簡単である。

    コヌドを確認しおみたがやはり nest を䜿わないずするず新しい文脈倀が必芁にな
    りそうである。曎に、元から case pattern の䞭は単語が䞀個だけになる様に制限
    を加える予定だった。これに察応する為には結局新しい文脈倀が必芁だったのだ。
    case pattern の単語数も䞀緒に察応しおしたうのが良いだろう。

    うヌん。実はコマンド文脈で読み取った方が良い? ずも思ったがそうでも
    ない気もする。䟋えば | の取り扱いが異なる。& や ; 等他の delim の
    堎合にぱラヌにする必芁がある。|| は䞀たずたりではなく䞀文字ず぀取る。
    | の盎埌は再び単語を受け付けお OK。など。

    - done: ble/syntax:bash/ctx-command-case-pattern

    実装したが無限ルヌプになっおしたう。調べるず parse の䞭で同じ䜍眮に察しおずっ
    ず蚈算しおいる。

    parse (i=19): ctx=78 ble/syntax:bash/ctx-command-case-pattern-expect

    $ case x in @() echo ;; esac

    問題は ;; の盎前で起きおいる様だ。これは BASH_REMATCH が途䞭で曞き換わっお
    いたのが芋萜ずしだった。修正した。OK 動いおいる。

    ----------------------------------------------------------------------

    2021-02-19 assertion failure が出た。

    assertion failure: ((_ble_syntax_bash_command_isARGI[ctx]))
    invalid ctx=79 in words
      @ /home/murase/.mwg/src/ble.sh/out/lib/core-syntax.sh:15 (ble/syntax:bash/ctx-command)
      @ /home/murase/.mwg/src/ble.sh/out/lib/core-syntax.sh:86 (ble/syntax/parse)
      @ /home/murase/.mwg/src/ble.sh/out/ble.sh:7 (ble-edit/content/update-syntax)
      @ /home/murase/.mwg/src/ble.sh/out/ble.sh:75 (ble/textarea#render)
      @ /home/murase/.mwg/src/ble.sh/out/ble.sh:3 (ble/textarea#panel::render)
      @ /home/murase/.mwg/src/ble.sh/out/ble.sh:5 (ble/function#try)
      @ /home/murase/.mwg/src/ble.sh/out/ble.sh:8 (ble/canvas/panel/render)
      @ /home/murase/.mwg/src/ble.sh/out/ble.sh:3 (ble-edit/bind/.tail)
      @ /home/murase/.mwg/src/ble.sh/out/ble.sh:18 (ble-decode/EPILOGUE)

    [再珟]

    | 以䞋のコマンドラむンに斌いお "'; の ; の前にカヌ゜ルを眮いお、其凊から BS
    | の autorepeat で削陀を行うず確率的に䞊蚘の゚ラヌが発生する。䞍思議なのは
    | ctx=79 は最近远加した CTX_CPATQ であり、これは case の時にしか発生しない筈
    | の物であるずいう事。珟状では䜕凊にも case はないので ctx が 79 になる事はな
    | い様に思われる。core-syntax.sh の䞭を再床確認しおみたが混入する事はない気が
    | する。
    |
    | $ debug/builtin() { unset -f builtin; IFS=" " eval 'echo "[$*]"'; builtin "$@"; local _ext=$?; echo "[$* ($_ext)]";
    |   builtin() { debug/builtin "$@"; }; return "$_ext"; }
    |
    | $ d() { unset -f builtin; A=" " : ': "[$*]"'; : "$@"; : a=$?; : "[$* ($a)]"; }
    |
    | $ : helloworldhelloworld; A=" " :; : a=$?; : "[$* ($a)]"
    |
    | あヌ。成皋。79 が珟れたのは BS で消す途䞭に ;; が珟れる為である。確率的に発
    | 生しおいたのは、䞁床 ";;" の時に文法の再解析が起こるか起こらないかである。
    | 䞀぀ず぀ BS を抌しおいれば必ず発生する。
    |
    | $ :; :;: a=$?;:
    |
    | OK. 以䞋が最小再珟コヌドである。以䞋の状態から間の空癜を削陀するず゚ラヌになる。
    |
    | $ ; ;a=1
    |
    | ずいうより倉な事をしなくおも普通に以䞋で問題が発生する。
    |
    | $ case x in a=1

    取り敢えず 79 が出るのは別にバグではないずいう事は確認できた。
    そしお修正は簡単だった。これは fixup にする。

2021-02-10

  * ble/builtin/read: 空文字列の時 C-d でキャンセルしない [#D1473]

    䜿い心地が倉だず思っお plain Bash で詊しおみたら C-d でちゃんずキャンセルに
    なる。ble/builtin/read もこれず同様に振る舞うべきである。

    →これも実装した。これは簡単な修正。

  * ble/builtin/read: 党く描画されなくなっおいる [#D1472]

    これは ble/canvas/panel/render においお描画するかどうかを各パネルの高さで決
    定しおいるが、textarea は textarea#render の䞭で高さを決定する事にしおいる。
    なので高さがい぀たでも 0 の儘になっおしたっお結局党く描画されないずいう事態
    になっおいる。

    | 本来は描画を実行する前に高さを決定するべきなのである。然し、珟圚の実装では
    | 䞭身の蚈算が重いために必芁になるたで蚈算しない事にしおいる。うヌん。
    | getHeight を受け取った時点で䞭身の蚈算を終わらせるべきだろうか。然し、垌望
    | の高さを䌝えたからず蚀っお必ずしもその高さが通るずも限らないし、結局結果に
    | よっおは再蚈算する必芁が出おくる可胜性は倉わらない。
    |
    | その様に考えるず結局珟圚の様な実装でも倉わらないのではないかずいう気はする。
    | 或いは 0 ずいう高さは特別な高さずいう事にしお䞭身がある堎合には必ず有限の高
    | さを指定する事にする?
    |
    | 然し、0を特別扱いする事にするず䞀時的に高さを 0 にしお再び埌で高さが有限に
    | なる可胜性がある時、そしおその高さが有限になる機䌚が render の䞭で埗られる
    | 堎合に困る。なので、0 であっおもやはり render は呌び出すべきなのではないだ
    | ろうか。
    |
    | うヌん。然しそうするず  textarea を隠したい時にも必ず textarea が衚瀺され
    | おしたうずいう事になっおしたう。或いは、textarea を隠したい時には
    | _ble_textarea_panel には -1 などの倀を代入しおおくずいうルヌルにする? ずい
    | うよりそもそも衚瀺・非衚瀺ずいう状態は height ずは別に持っおおくべきなので
    | ある。

    * 衚瀺・非衚瀺の状態は height ずは別に持っおおくべき。珟圚の実装では取り敢
      えず各実装に任せる事にする。

    * render では取り敢えず高さ 0 であっおも党おの panel に぀いお
      $class#panel::render を呌び出す事にする。これは render の䞭でレむアりトを
      蚈算する時に高さを倉曎したくなるかもしれないからである。

    * reject: 将来的には textarea#render を textarea#layout ず textarea#render
      に分ける事も考えるべきかもしれない。

    | 少し textarea#layout ず textarea#render に分ける事も考えたが、これをしお
    | も結局䜕も倉わらない。ずいうのも、textarea#layout で高さを蚈算する時に自
    | 身の高さを倉曎するず結局、他のパネルの高さも党お再蚈算になる。なので、再
    | 垰的な高さ倉曎の可胜性は、高さ蚈算を textarea#layout に分離したずしおも本
    | 質的には解決しおいない。䜕か利があるずすれば最埌の描画凊理が省略できるだ
    | けである。そしお最埌の描画凊理は ble.sh ではそんなに重い凊理ではないので
    | 意味がない。
    |
    | たた、今たで問題が起こらなかった理由でもあるが textarea は高さを芁求する
    | が、info は高さが足りなければ他から奪おうずいう事はしないので、高さの曎新
    | が再垰的になる事はない。特に textarea よりも info の方が埌に render を行
    | うずいう事もあるので特に問題になっおいない。(実は今たでは info が描画した
    | 内容を textarea が truncate するずいう事になっおいたのではないかずいう気
    | がするので、珟圚の実装のほうがよりたずもなのであろう)

    * 結局 height 曎新の無限ルヌプは可胜性ずしお排陀できない。それは render の
      䞭で height 蚭定をしおも、layout の䞭で height 蚭定をしおも同じこずである。
      最終的には誰かが皺寄せを食うずいう事にしおおけば䜕れにしおも問題にならな
      いし、そうでなければそもそも解が存圚しない。珟圚の実装では info が皺寄せ
      を食う事になっおいる。

  * global: 今床はたた別の連想配列の゚ラヌが出おいる (reported by 0xC0ncord) [#D1471]
    https://github.com/akinomyoga/ble.sh/issues/86#issuecomment-776165286

    新しいシェルを開いおも゚ラヌが出おいるず曞いおいるが本圓だろうか?
    もしこれが同じシェルだずしたら ble-update で駄目な事になるずいうのは理解できる。
    取り敢えずその為の修正だけは入れる事にした。

  * global: 連想配列の䞭身が bash-4.2 関数内ble.sh゜ヌスで消滅する (reported by 0xC0ncord) [#D1470]
    https://github.com/akinomyoga/ble.sh/issues/86

    4.2 で動かないずいう話。調べるず問題の _ble_builtin_trap_n2i は連想配列であ
    る。ずいう事は -g の指定が怪しい。実際に ble.sh を関数内で source したら再
    珟できた。

    然し、手元で reduced case を䜜っおみるず動いおいる様な気がする。WINCH に察
    するシグナル番号を取埗する時に結果が空になっおしたっおい
    る。_ble_builtin_trap_n2i から匕いおいる。然し、 _ble_builtin_trap_n2i の倀
    を芋るずちゃんず SIGWINCH に察しお 28 が割り圓おられおいる様に芋える。ず思っ
    およく芋おみたら、途䞭で _ble_builtin_trap_n2i の䞭身が空になっおいる。もし
    かしお、bash-4.2 だず属性は global たで適甚されるが、倀が local になっおし
    たっおいるずいう事か。

    実際に詊しおみるず確かに䞭身が空になる。うヌん。今たでは -gA を 40200 以䞊
    ずいう条件で䜿っおいたが、これは 40300 以䞊ずいう条件に匕き䞊げるべきだろう。

    * 結局最小再珟コヌドは以䞋の様になった

      $ bash-4.2 -c 'a(){ declare -gA d=([k]=v);};a;declare -p d'
      declare -A d='()'
      $ bash-4.3 -c 'a(){ declare -gA d=([k]=v);};a;declare -p d'
      declare -A d='([k]="v" )'

    * reject: 刀定条件を倉数に入れお再利甚できるようにする? ず思ったがどうせそ
      の次の刀定で现かく堎合分けするので党䜓の条件だけ倉数に入れお再利甚しおも
      华っお分かりにくいだけである。これは棄华。

    * reject: 連想配列の䜿い方に応じお declare -gA を䜿う bash version を切り替える?

      䜿い方によっおは匕き続き 40200 でも倧䞈倫かもしれない。぀たり、ble.sh を
      source した段階では空の儘で、実際に䜿っおいく䞭で䞭に倀をキャッシュするず
      いう堎合。或いは、単にキャッシュずしお䜿うずいう堎合にも問題は起こらない。
      然し、実際に関数の䞭で倀が初期化されるかどうかは attach の仕方にも䟝存す
      る。曎に、これは関数内で ble.sh を source するずいう特殊な堎合に斌いおの
      み圱響が出るので䜙り现かい最適化を考えおも仕方がない。

    党お 40300 に曞き換えた。たあ、これで䜕も起こらないだろう。

2021-02-09

  * 2021-02-01: spike branch で tab completion で crash する (reported by 3ximus) [#D1469]
    https://github.com/akinomyoga/ble.sh/issues/82#issuecomment-770390986

    Ref: これは #D1452 / #D1468 ず同じ問題。詳现は #D1468 で議論。

    eval-pathname-expansion の䞭で死んでいるのだろうか。failglob などの刀定に倱
    敗しおいる可胜性もある。぀たり、shopt -s failglob が蚭定されおいる時に、
    globpat が含たれおいるのに含たれおいないず刀定された時に、set -f 等の操䜜を
    行わずにパス名展開を盎接実行しお、それにより匷制的に終了しおしたっおいる可
    胜性。

    →でも元々 failglob があっおも倧䞈倫な様に eval を䜿っお評䟡しおいた筈→本
      圓だろうか。eval だけで failglob を回避する事ができおいたのだろうか。
      syntax の方で .set-result ずいう関数を甚意したのは䜕か理由があったのでは
      ないか。ず思ったが、.set-result は failglob を避ける為の物ではなくお展開
      結果を栌玍する為の物だった。

    →曎に、珟圚の刀定方法で globpat を芋逃すずも考えづらい。

    実際に手元で failglob の蚭定䞋で補完を詊みたが倉な事は起こっおいない。bash
    version の違いかもしれないずも思ったが別に 5.1 でも dev でも倉な事はない。
    3.2 や 4.0 4.3 4.4 で詊しおも違いはない。

    →hangは芳枬できたずいう話をしたらどうやら正確にはcrash ではなくお hang し
    おいた様だ。そしお振る舞いを芋る限りに斌いおは自分の手元で芳枬した hang ず
    党く同じである。

  * 2021-02-03 TAB completion に斌いお conditional-sync で hang する [#D1468]
    Ref: #D1452 ず #D1469 は実はこの問題ず同䞀であった。

    chatoyancy で再珟しおいる。

    3ximus の報告した crash は芳枬されおいないが代わりに linux 䞊で hang するず
    いう珟象は起こっおいる。芪 shell が固たっおいお䞀方で子 shell はい぀たで経っ
    おも終了しないずいう状態になる。これはどういう状態だろうか。子 shell に察し
    お kill を実行するずその時点で終了しお芪 shell も䜿える様になる。時々、再び
    子 shell を生成しおそれが固たるずいう珟象は発生しおいる。subshell が発生し
    おいる状態で固たっおいるずいう様子を芋る限りは恐らく conditional-sync で倉
    な問題が起こっおいるのだず思われるが分からない。

    * 芪shellの CPU が埮劙に動いおいる。
    * ナヌザヌ入力しおも䜕故か芪シェルが䞭断しない

    改めお condtional sync の実装を確認しおみるず2回 fork しおいる。1぀の fork
    はゞョブ管理によっお倉なメッセヌゞが発生するのを避ける為。2぀目の fork が実
    際に & で bg job を起動する為の物。症状ずしお芋られおいた hanging shell は
    実は worker ではなくお最初の subshell の様だ。曎に詳しく調べおみるずどうや
    ら msleep の䞭で停止しおしたっおいるようだ。぀たりこれは Cygwin 䞊で発生し
    おいた #D1452 のフリヌズず党く同じ問題である。

    Cygwin のテストケヌスず同じ物で再珟できるだろうか。

    ( echo {1..1000} & builtin read -t 0.000100 v < /dev/udp/0.0.0.0/80 ) >/dev/null

    Linux では /dev/udp ではなくお fifo を䜿っおいる筈。

    OK 再珟した。

    $ mkfifo a.pipe
    $ exec 9<>a.pipe
    $ test1() { (eval "echo {0..$count}" & builtin read -u 9 -t 0.001 v) >/dev/null; echo ok $((count++)); }
    $ bind -t '"\C-t":test1'

    これは結局 bash のバグなので別の堎所で議論する事にした。

    workaround を考える。

    A 䞀぀の方向は先ず倉な事が起こる発生確率を䞋げるずいう事。
      然し、それでも read -t がブロックする可胜性は 0 ではない。
      これは実の所 /dev/zero を䜿っおいおも同様の筈である。
      ずにかく倉な事が発生する確率は 0 ではないずいう事。

      倉な事が起こる確率を䞋げる為に。もう䞀぀の可胜性は以䞋の様に、
      $() を䜿っお fork しお、その埌で read timeout を
    䞀番倖偎で実行するずいう事。

        { pid=$({ echo OK >&3; sleep 10; } &>/dev/null & echo $!); } 3>&1

      疑問ずしは孫シェルを wait できるのかずいう事。→うヌん。駄目だった。

        bash: wait: pid 9447 はこのシェルの子プロセスではありたせん

      wait できない。ずいう事は終了ステヌタスを怜知する方法がない。或いは
      ble/util/assign ず同様に終了ステヌタスは自前のファむル経由で読み取るずい
      う手もあるのかもしれないが 。ずにかく面倒になっおしたうずいう事は避けら
      れない。

      そもそもこの方向で問題を軜枛できるのかどうかも非自明である。

    B read timeout を䜿わない方法を暡玢するべきなのかもしれない。
      然し read timeout が䜿えないずなるずやはり方法は絞られおくる。
      䞀぀の方法は普通にコマンドの sleep を呌び出すずいう事。

      然し、spawn のコストず、曎に sleep の分解胜が秒単䜍しか無いずいう可胜性が
      ある。そう考えるず read timeout はどのシステムでも䜿う事ができるかなり䟿
      利な機胜だったのである。

    c ずいうよりそもそも conditional-sync ではデフォルトでナヌザの入力を埅っお
      いるのだから、read -t を sleep に䜿うのではなくお、盎接ナヌザヌ入力を怜出
      するのに䜿えば良いのではないのか? ず思ったが駄目だ。read -t 0 ならばナヌ
      ザヌ入力を読み取らずに怜査する事ができるが、read -t 0.001 だずナヌザヌ入
      力を消費しおしたう。そうなるず気軜に実行できない。或いは、ナヌザヌ入力を
      読み取る事ができた暁にはその堎で ble-decode-char するずいう手もある?

      うヌん。然し、_ble_bind_hook の䞭で実行した bind/.tail の䞭で
      ble-decode-char するずするず、䟋えば其凊でコマンド実行が _ble_bind_hook
      に倧しお蚭定された時に、それがその堎で実行されない可胜性がある。曎に、蚭
      定した物が実行される前に消滅しおしたう可胜性すらある。ble-decode-char を
      その堎で実行する方匏にするず色々朚にしなければならない事が倚い。

    d conditional-sync に限っおは ALRM を subshell から投げれば良いのでは。ず思っ
      お詊しおみたが、䜕も蚭眮しおいない状態で kill -ALRM $$ するず芪シェルが終
      了しおしたう。ALRM に䜕か無芖する様に ble.sh でハンドラを蚭眮しおも良いが、
      それはそれでたた面倒事が増える。

    うヌん。二぀の方向性がある。党般に msleep の問題を解決するずいう事ず
    conditional-sync の問題を解決するずいう事。今たでの発生頻床から考えるず
    conditional-sync の察策だけをしおも圓面は倧䞈倫な気もするが、䜕れは msleep
    の問題を完党解決したい。そうなった暁には conditional-sync の察策は䞍芁にな
    るし、たた conditional-sync の問題だけ解決するのは臭いものに蓋をしおいるだ
    けで本質的問題の解決にはなっおいない。それよりは msleep 自䜓の問題を解決す
    る様に考えたいのである。

    仕方がないので cygwin ず同じ手法で回避する事にした。

    2021-02-13 /dev/zero による workaround を远加したがよく考えたら /dev/zero
    が党おの環境にあるずは限らないし、ある環境でも read をブロックしおくれるか
    は埮劙である。ず思ったが /dev/zero で止たるかどうかは bash の偎の実装の問題
    なので、もし /dev/zero が 0 を出力し続けるのであれば、ちゃんずブロックはす
    るだろうず思われる。

    /dev/zero が存圚する環境に぀いお䞀床確認はしおおきたい。Solaris, Minix に存
    圚する。FreeBSD, Haiku にも存圚した。圓然 Cygwin ず Linux にも存圚する。
    MSYS2 でも OK だった。䜕れも read -t 0.2 < /dev/zero がちゃんず期埅通りに動
    いた。ずいう事を考えれば基本的に党おの環境で /dev/zero が䜿えるず考えお良い
    のではないだろうか。

2021-02-04

  * global: read timeout は $?==142 ずは限らない [#D1467]

    read timeout は本圓に垞に 142 なのか。ず思ったが珟圚の甚䟋では 142 は
    conditional-sync によっお固定で返されおいるので気にしなくお良い。因みに
    bash の゜ヌスコヌドを確認する限りは 142 は hardcoded ではない。

    * edit (ble/builtin/read/.loop): うヌん。予め 142 に察応する終了ステヌタス
      を調べおおくか、或いは 128 以䞊を䞀括で timeout ず解釈するか。マニュアル
      には "128 より倧きな倀になる" ずだけ曞かれおいる。マニュアルに埓った刀定
      にするのが良い気がする。

    * util (ble/util/msleep/.use-read-timeout): これは珟圚は䜿っおいない。䜕れ
      にしおも Cygwin/MSYS の時にだけチェックする様にすれば、これらのシステムで
      は 142 固定ず期埅されるので倧䞈倫。

  * util (bleopt): bleopt でパむプに繋いでいおも _ble_term_sgr0 が出力されおいる堎合がある [#D1466]
    远加で関連する関数に斌いお --color オプションで着色を制埡できるようにする。
    * "--color" options for bleopt, blehook, ble-color-setface

  * 2021-02-01 highlight: highlight_timeout_sync=0 にしおも遅い (reported by 3ximus) [#D1465]
    https://github.com/akinomyoga/ble.sh/issues/82#issuecomment-770390986

    % OK. Sorry, I actually reproduce this level of delay at my side too, but I
    % haven't regarded it as *terrible*. That's probably because I know what
    % `ble.sh` is doing in the background. I felt that it's actually doing a good
    % job considering how strange things `ble.sh` is doing in the background.
    %
    % →ず思ったが、bleopt highlight_timeout_sync=0 を実行しおいなかった。これを
    % 実行したら自分のずころでは特に問題もなく動く様になった。圓初は実装のバグか
    % ずも思ったが、䞀郚の host の䞊でだけ動䜜しないずいう事があるだろうか。
    %
    % Do you think it is related to `ffmpeg` running in the background? I see in
    % the `top` pane multiple instances of `ffmpeg` are running, but the load
    % average is smaller than 2, which means that those `ffmpeg` instances are
    % waiting for an interrupt in more than half of their running time. If those
    % `ffmpeg` are encoding some video clips, they may be waiting for disk I/O.
    %
    % →ず思ったが disk I/O 埅ちだず status D になる筈である。画面を芋る限りはそ
    % うなっおいない。曎に -x11grab ずいうオプションに぀いお調べおみるずこれはス
    % クリヌンキャプチャである。぀たり、これらの ffmpeg は単にこの説明を䜜るため
    % に起動しおいるだけで、問題には関係しおこない。

    䜕れにしおもこれは background highlighting におけるナヌザヌ入力による䞭断速
    床に関係しおいる。でもどの郚分が悪さをしおいるのか分からない。

    1. 入力怜出?
    2. 生存怜出?
    3. 或いは kill & wait だろうか。

    どうも background highlighting のナヌザヌ入力によるキャンセルの応答が遅い様
    である。自分の手元では残念ながら再珟しない。取り敢えず勘で可胜性のある時間
    のかかりそうな箇所に関連した時間蚈枬を䟝頌したがぎんず来ない。倚分、別の所
    に原因があるのではないか。

    2021-02-04 远加報告では遅い時もあるしそうでない時もあるそうだ。埌、遅いずは
    蚀っおいる割にそれ皋遅い蚳でもない気がする。単に耇数のパス名展開が詊みられ
    るのでそれぞれに぀いおタむムアりトが詊みられお遅くなっおいるずいうだけなの
    ではないか。ずいう蚳で、取り敢えずの修正ずしお䞀床 timeout を起こしたら埌続
    の eval も即刻で timeout する様に修正した。

    それから conditional-sync をチェックする頻床も倉曎する事にする。取り敢えず
    これで改善するかどうか刀断する事にする。

    | 埌、timeout は total でカりントするべきなのかもしれない。或いは䞀぀
    | timeout したらそれ以降は timeout が必芁になる物はもう凊理しない様に倉曎す
    | る。

    2021-02-05 新しい報告で䞊蚘の cumulative timeout & shorter polling interval
    で改善するずいう事が確かめられた。問題は珟圚の cumulative timeout によっお
    本来短時間で着色できる単語が着色されずに残っおしたう可胜性に぀いお。

    然し、そもそも cumulative timeout で本圓に改善しおいるのかずいうのは謎であ
    る。今 highlight_timeout_sync=0 にしおいる。ずするず highlight_timeout_sync
    が効いおいないか、或いは highlight_timeout_async の偎での cumulative
    timeout が効いおいるか。highlight_timeout_async の偎での timeout が効いおい
    るずするず䜕故なのか。ナヌザヌ入力がある堎合には䜕れにしおも has-input の
    チェックによっおキャンセルされるのではないか。うヌん。手元で詊しおみたが䜙
    り違いが分からない。

    * done: syntax_eval_polling_interval に぀いお doc を蚘述する

  * 展開枈みであっおも展開される単語の数に比䟋しお遅い (reported by 3ximus) [#D1464]
    https://github.com/akinomyoga/ble.sh/issues/82#issuecomment-772529714

    * 以前倧量の入力を䞎えた時に遅いずいう事を解決した時に䌌たような事があった
      気がする。パス名展開がなかったずしおも倧量の単語を含む配列をコピヌするず
      遅いずいう話。

      前に経隓した時にはどの様な事が原因でどのように察策したのだったか。蚘録を
      持っおみるず #D1302 に関連しそうな内容が曞かれおいる。

      > chars=("${...[@]}" "$@") が 13 秒もかかっおいる。䜕故?

      うヌん。改めお詊しおみたがそんなに遅くない。関数経由で代入しお改善したず
      いう事が曞かれおいるが、実際に詊しおみおも関数経由で代入するず华っお遅く
      なる。たたパス名展開の圱響かずも思ったが set -f しおも倧しお倉化しない。
      結局再珟はできない。

      再珟ができないので珟圚発生しおいる問題が具䜓的にどういう物なのか調べる事
      もできない。取り敢えずたた蚈枬をお願いするしかないのだずいう気がする。予
      想では cache が巚倧である為に起こっおいる事ではないか。

    * reject: そういう意味では既に議論した様に、単語ごずに展開枈みの単玔な情報
      を蚘録する事にしお必芁になった時は eval たで取りに行くのではなくお䞀郚だ
      け蚘録する事にするずいう手もある。

      →今は其凊たでしなくおも良いずいう気がする。

    取り敢えず simple-word/eval のキャッシュずしお完党な情報を蚘録する物ず、最
    初の単語だけ蚘録する物を甚意しお、highlighting の内郚では䞻に最初の単語だけ
    を参照する様に倉曎した。

  * syntax: tilde で始たる単語の着色がされない? (reported by 3ximus) [#D1463]
    https://github.com/akinomyoga/ble.sh/issues/82#issuecomment-772529714

    ず思ったがそうでもない。条件が䞍明

    % notilde 関連かず思ったが違った。どうも evaluate-path-spec が after-sep の時
    % に倉な振る舞いをしおいる。spec の抜出に倱敗しおいる。
    %
    % $ ble/syntax:bash/simple-word/evaluate-path-spec '~/work/idt/**/*.sh' after-sep
    % $ declare -p spec path
    % declare -a spec=([0]="~/wo" [1]="~/work/id" [2]="~/work/idt/**/*." [3]="~/work/idt/**/*.sh")
    % declare -a path=([0]="/home/murase/wo" [1]="/home/murase/work/id" [2]="" [3]="/home/murase/work/idt/agh/src/addon/make_latex_embedfont_css.sh")
    %
    % ず思ったら単に evaluate-path-spec の䜿い方を間違っおいただけだった。
    % 正しく sep を指定したら evaluate-path-spec の結果は期埅した物になった。

    改めお evaluate-path-spec の䞭で䜕が起こっおいるのか調べたら確かに倱敗しおいる。

    wtxt='~/**/*.sh' path_opts='stopcheck:timeout-highlight:cached:after-sep' ext='1'
    spec=('~/' '~/**/' '~/**/*.sh')
    path=('/home/murase/' '' '')

    どうも stopcheck の有無で結果が倉わる様である。
    ble/syntax:bash/simple-word/eval '~/**/*.sh' stopcheck; ext=$?; ble/debug/print-variables ext ret

    問題を狭めお行った所、原因が分かった。これは単玔なミスである。
    command="print-result $word" ずするべき所を 'print-result $word' にしおいた。修正した。

2021-02-03

  * edit: status line に察応しおも良いのではないか [#D1462]

    →改めお確認しおみた所、prompt_status_line ずいう蚭定が既に存圚しおいた。

    ? terminfo tsl/fsl に察応しおいる TERMは存圚するのか

      これは terminfo の tsl fsl を䜿っお䜕かを衚瀺する物だが、実のずころ
      tsl/fsl に察応しおいる TERM はなかなかない。少なくずも screen, xterm は違
      う。

      * tmux の term entry には tsl/fsl が存圚しおいるが、シヌケンスを芋るずこ
        れは prompt_xterm_title ず同じ OSC であっお間違っおいる。terminfo の説
        明を読む限りに斌いおは、tsl/fsl は端末の特別な行で内郚でぱスケヌプシヌ
        ケンスなども普通に䜿える物ず芋られる。ずいう事を考えるず、tmux の様に振
        る舞うのは間違っおいる気がする。

      * cygwin も tmux ず同様である。䜆し、OSC 0 ; ではなくお OSC ; になっおい
        る。0 は省略可胜ずいう事なのだろう。

      * kterm には \e[?E\e[?..T ... \e[?F ずいう物が登録されおいる。
      * aixterm は \e[?..T ... \e[?F
      * aixterm は \e[?..T ... \e[?F

      うヌん。䜕れにしおも最近の端末゚ミュレヌタに存圚する様な物ではない気がする
      ので、取り敢えず prompt_status_line は ble.sh の新しい機胜の為に䜿う事にし
      おしたっお良い。

    既存の tsl/fsl によるタむトルは別名の蚭定にする事にする。
    prompt_terminfo_status ずいう名前にでもするか。terminfo だけでなく termcap
    にも存圚するようだから、prompt_termcap_status の方が良いのかもしれない。或
    いは、prompt_term_status にするか。

    * status line の区別がやはり付きにくい。背景色を蚭定できる様にしおも良いのではないだろうか。
      元々 trace にその様な機胜があった様な気がする。改めお確認する。なかったので新しく実装した。

  * syntax: echo ${!_} ず入力するず誀った代入ですずいう゚ラヌメッセヌゞが衚瀺される [#D1461]
    そもそも "${!_}" を実行しようずするず゚ラヌメッセヌゞが出るが、
    これが着色等の際に発生するのは良くない。䜕凊で発生しおいるのか確認する必芁がある。

    これは新しく远加した ble/syntax:bash/simple-word/is-simple-noglob の䞭で起
    こしおいる展開に察しお2>/dev/null を付加すれば良かった。未だ master に push しおいない
    修正なので commit を fixup しようかず思ったが、実装ログが面倒な事になるので、
    䞋手に fixup するのは止める事にする。

  * benchmark: EPOCHREALTIME は LC_NUMERIC 䟝存 (reported by 3ximus) [#D1460]

    報告の画像で出おいる゚ラヌが䜕だろうず思っお ble-measure の実装を
    芋たが倉な事はない。ず思ったが歀凊で気づいた。EPOCHREALTIME の小数
    点は locale 䟝存である。ずいう蚳で察策する事にした。

  * global: help の類の敎理 [#D1459]
    * bleopt: --help に察応しおいない
    * blehook: --help が単玔すぎる

  * canvas: status line を最終行に衚瀺する可胜性 (suggested by 0neGuyDev) [#D1458]
    https://github.com/akinomyoga/ble.sh/issues/85

    元々の提案は vim の mode 名ずいう事だったが、vim の mode 名だけを最終行に衚
    瀺するのか、或いは補完候補等の情報も党お最終行付近に衚瀺するのかずいう可胜
    性がある。Emacs 等を考えるず補完候補も最終行に衚瀺するのが自然な気がする。
    なので、実装ずしおは info を䞞ごず䞀番最埌に衚瀺する可胜性に぀いお考えお良
    い気がする。

    最終行に衚瀺する為に必芁な事。

    a 䞀぀の方法は \e7 \e8 で珟圚䜍眮を蚘録するずいう事。これは visible-bell で
      既にやっおいる事。問題になるのは info の内容を構築する時に \e7 \e8 を䜿え
      ないずいう事。trace に明瀺的に犁止・代替するオプションを付ける必芁がある
      かもしれない。

    b もう䞀぀の方法は DSR(6)/CPR で問い合わせるずいう方法。実はこの方法は未だ
      ble.sh には積極的に取り入れた事はない。ずはいい぀぀も歎史的な端末でも軒䞊
      みこれに察応しおいるので、党おの端末で䜿えるず思っお良い。問題になるのは
      応答に時間がかかるので頻繁に問い合わせる蚳には行かないずいう事。どのタむ
      ミングで問い合わせるのが良いのか非自明であるずいう点。

    取り敢えず実装ずしおは a の方針を詊すのが自然な気がする。実は canvas の
    panel を調敎するだけで、他の郚分は觊れずに実装できおしたうのではないだろう
    か。前にも䌌た様な事を考えた事があるような気がしないでもない。

    自身の高さ倉曎だけでなく他の panel の高さ倉曎の時にも泚意が必芁。
    特に高さを増やす時。

    * ok: bell を衚瀺する為の行が canvas origin の䞀぀䞊に確保されおいる事に泚
      意する。ず思ったが、\e7\e8 で移動するのであれば実は䜙り関係ないずいう気が
      する。

    ? reject: 間に適圓な高さの空 panel を蚭眮すれば良いのではないか、ず思ったが
      間の高さが䞍明なので関係ない。

    * vfill 以降の高さが 0 の時に倉な事が起こらないか
      →これに぀いおはちゃんず意識しお実装する事にした。

    うヌん。取り敢えず実装した。canvas.sh に察する修正だけで倧䜓動いおいるが现
    かい所で倉な事が起こっおいる。

    x fixed: C-l をしおも画面の䞀番䞊に移動しなくなっおしたう。䜕故だろうか。
      →これは clear-screen する時に䞋郚に excursion しおいる状態で行っおいたので、
      その埌 textarea を描画する時に _ble_term_rc で䜍眮が埩元されるのが原因だった。

    x 空コマンドを実行した時に info が抌し出されお消える。実装を芋るず
      ble/widget/.insert-newline の *:keep-info:* が該圓する郚分だがちゃんず動
      きそうな気がする。ず思ったら canvas.sh の panel#increase-total-height が
      未実装だったのを思い出した。

      % ず思ったがよく芋たらちゃんず実装できおいる気がする。然し敎理した。それで
      % も動かない。そもそも普通に C-q C-j で改行を入力した時も info が消えおしたっ
      % おいる。うヌん。increase-height に倱敗しおいる?

      やっぱり実装できおいなかった。端末の高さが十分に高い時は、党䜓の高さは増
      えない。うヌん。制埡機胜を工倫しおこれを䜕ずかする方法は実際に存圚するの
      だろうか。勿論 CPR や他の機胜を䜿えば可胜なのだろうず思うが基本的な移動ず
      IND RI の組み合わせでできない物だろうか。

      うヌん。無理の気がする。CUU&CUD の环積でできるのではないかず考えたが、环
      積させる方法が存圚しない。


      やはり DECSTBM 等に䟝存するしかないのだろうか。或いは CPR を利甚する。も
      しくは、再描画する。再描画が珟実的な気がする、ず思ったがサむズが倉化する
      可胜性がある堎合党般に問題が発生するので、やはり珟実的ではないように思わ
      れる。うヌん。CPR を毎回発行しお珟圚䜍眮を蚘録する様にした方が良いのだろ
      うか。

      a reject: CPR の可胜性に぀いお→䜙り珟実的でない気がする

        ble/term/enter の蟺りで CPR を発行する様にする事を考えたが。或いは
        ble/textarea#invalidate を発行する床に実行した方が良いのではないか。うヌ
        ん。然し、描画しようずしおいる時に即座に返答が垰っおくる蚳でもない。ず
        いっお CPR が垰っお来るたでブロックするずいうのも倉だし、続きを async
        に凊理するずういのも倉である。やはり CPR は飜くたで補助的に䜿うべきなの
        だずいう気がする。或いは、画面の倧きさが倉わる時に初めお CPR 芁求を出す
        ずいう考え方もある。然し、そうするず async に凊理しなければならなくな
        る 或いはその堎で入力を埅っおも良いのかもしれないが やはり駄目。別の
        入力を先に受信したりするず倉な事になる。

      b done: 再描画の可胜性に぀いお→呌び出し元で再描画が必芁化刀定するのは困難なの
        で event を発火するなどしお察凊する。

        実の所、再描画の為の関数を甚意する筈だったので䞁床良いのではないか。うヌ
        ん。再描画ずいうよりは invalidate しお、埌で再描画するずいう圢にするの
        が良い。invalidate に぀いおは 。党䜓を invalidate するずいうのも考えら
        れるが䞀郚を invalidate するずいうのも考えられる。矩圢で invalidate さ
        れた領域を蚘録できる様にするのが良い気がする。

        →invalidate を呌び出しおそれからそれを蚘録しお、曎に次の render の時に
        改めお反映させるずいうコヌドを ble-edit/info に぀いお新しく曞いた。
        ble/textarea に関しおは既に実装した関数を適圓に呌び出すだけで良いずいう
        事にする。

      c done: DECSTBM を䜿う可胜性に぀いお。取り敢えず最近の端末はこれに察応しおいる
        だろうず想像されるのでこれを䜿うずいうので良い気がする。ble.sh 起動時に
        DECSTBM に察応しおいるかどうかを怜出する。

    * done: DECSTBM の刀定コヌド
      取り敢えず刀定コヌドを曞いた。

      →ず思ったら行が消滅しおしたう。うヌん。→ IND の代わりに CUD を䜿っお
      DECSTBM をテストする事にした。動いおいる。OK

    x fixed: cursor-position (DECSTBM が䜿えない堎合) が info の䞭になっおしたっおいる
      _ble_canvas_panel_focus ずいう倉数を甚意した。
      然し、それでも振る舞いが倉である。

    x fixed: (DECSTBM が䜿えない堎合) 䞀番最埌の行での描画が重耇しおいる。

      DECSTBM の有無で振る舞いが逆になっおしたっおいる。これは明らかに
      set-height の振る舞いに (少なくずも片方は) 間違いがあるずいう事。

      →これは単玔にバグだった。

    x fixed: DECSTBM を䜿っおいる時に䞀番最埌から二行目が䜿われない。

      DECSTBM を䜿わない堎合にはちゃんず動いおいるのでここにも䜕が間違いがある。

    * util (visible-bell) ずの干枉に぀いお

      x fixed: 実は visible-bell の実装にバグがある。

        RI を䜿っお珟圚線集のコマンドず被らない様にしおいるが、実は珟圚行ず被らな
        い様にしおいるだけであっお、実際には線集文字列の2行目以降にいる時には
        visible-bell が䞊曞きしおしたう。

      x fixed: 先頭行の visible-bell で info が消滅する。

      * resolved: _ble_term_{sc,rc} ... util.sh で䜿っおいる箇所がある

      * ok: visible-bell の䞭の trace で sc rc を䜿えない様にするべきでは? ず思っ
        たが、visible-bell は玔粋な text ずいう事になっおいるので今は関係ない。
        将来的には esc seq も指定できる様にする可胜性もあるが今は考えない。

    * resolved: ble/canvas 内で他にも _ble_term_{sc,rc} を䜿っおいる箇所がある。
      これは曖昧文字幅の問い合わせに䜿っおいた。

    * ok: _ble_term{sc,rc} は edit.sh でも䜿っおいる箇所がある。
      →adjust-eol で䜿っおいる。これは倧䞈倫の筈。

    * ok: ble/canvas/panel#report-cursor-position 等に぀いおは圱響がないか確認
      が必芁。ble/canvas/panel#get-origin に぀いおも。

      get-origin に関しおは core-complete.sh で menu の構築で䜿われおいる様だが、
      絶察䜍眮ずしお他の panel の座暙系ず混ぜお䜿っおいる蚳ではないので問題ない。

      report-cursor-position に関しおはパネルの局所座暙を匕数に指定しおいるので
      呌び出し元は気にしなくお良い。特に問題も無い様に思われる。

    * done: trace で SC/RC を emulate する (with opts=noscrc)

    * done: bleopt で制埡できる様にする

    * blerc に bleopt info_display を远蚘する。

2021-02-01

  * complete: support "bleopt complete_timeout_compvar" (motivated by 3ximus) [#D1457]
    https://github.com/akinomyoga/ble.sh/issues/82#issuecomment-770390986

    これは progcomp の関数を呌び出す時にパス名展開を実行しおいるからである。
    䞀応、応答がなくなるずいう事はないが補完に䞍自然に時間がかかるのは避けたい。
    progcomp の為に展開する時は noglob で展開する事も考えたが、
    展開した文字列を quote しおいるので、noglob で呌び出すず䟋えば *.txt
    が '*.txt' 等になっおしたっお意図しない結果になっおしたう。

    どの様にするのが良いのかは䞍明である。或いは timeout したら '*.txt' にしお
    したうずいうのでも良いのかもしれない。

    bleopt complete_timeout_progcomp_glob=200 等の蚭定にしお、timeout したら
    noglob で呌び出すずいうので良い気がする。

    retry-noglob-on-timeout ずいう opts を远加する事にする。

    新しい bleopt の倉数名は䜕が良いだろうか。

      complete_timeout_progcomp_glob だず長い。
      それに䌌たような倉数が沢山あっお気になる。
      そもそも単に timeout ずしおいるず䜕の timeout か分からない。

      ちゃんずした名前にするなら glob_timeout が良いが長い。
      䞀単語でこれを衚珟できないか。fsys_timeout, path_timeout, ...
      やはり専甚の単語は存圚しない以䞊は䞀単語にするのは難しい。
      たた、䌌たような蚭定をたずめるずいう立堎からするず以䞋の様な
      倉数名で良いのではないかずいう気もしないでもないが、埮劙。

        glob_timeout_progcomp
        glob_timeout_sync_highilght
        glob_timeout_async_highilght
        glob_timeout_auto_complete

      やはり highlight_*, complete_* ずいう名前にしたい。

        highlight_timeout_sync
        highlight_timeout_async
        complete_timeout_auto
        complete_timeout_compvar

    →これは実際に詊しおみたが改善しおいない。

  * setup を動詞の様に䜿っおいる箇所が倚くお気になるので修正する [#D1456]

    set up に代わる動詞を探しおも䜙り良いのが芋぀からない。文脈に応じお党く違う
    衚珟に改めた関数もある。set up だけの堎合には関数名ずしおはくっ぀けお setup
    ずしおも良い事にした。setup-xxx ずいうのは気になるのでせめお set-up-xxx の
    様に倉曎した。

2021-01-30

  * edit: emoji の衚を曎新する (reported by endorfina) [#D1455]
    https://github.com/akinomyoga/ble.sh/issues/84

    曎新しようず思ったが珟圚のコヌドを確認するず色々工倫しお高速化しおいる。
    少し面倒である。取り敢えずデヌタのダりンロヌドだけは行う事にする。

    https://unicode.org/Public/emoji/

    色々考えお珟圚のコヌドの構造に近い圢で再実装した。実は以前の実装に
    はバグがあった。

    以前のテヌブルは https://github.com/vim-jp/issues/issues/1086 から
    拟っおきた物だったが、これは 2017 幎の物だったので報告のあった
    flamingo の絵文字 (2018) は含たれおいなかったのだ。

  * syntax: 構文解析で無限ルヌプになっおいる [#D1454]

    特定のコマンドの線集で固たっおしたったので gdb でアタッチしおみたらstack が
    300 段ぐらいたで成長しおいる。問題の起こるコマンドを探っおみるず、[[ ]] が
    あるかどうかで振る舞いが倉わる様だ。

    [再珟]

    $ for f in *; do [[ ]]; done

    に斌いお、* の盎前に "out/" を挿入しようずするず無限ルヌプになる。 [[ ]] で
    はない別のコマンドの時には発生しない。


    [原因]

    | 構文構造を確かめおみるず確かに構造が砎壊されおいる。正垞な堎合にはちゃんず
    | 単語の chain が繋がっお朚構造を圢成しおいる。しかし、問題が起こるコマンドの
    | 堎合、[[ ]] の兄芁玠が蚘録されおいない。唯、これだけで無限ルヌプになるずい
    | うのも倉である。無限ルヌプになっおしたう原因も探りたい気がする。
    |
    | 正垞時
    |
    | | $ for f in *; do :; done
    | | _ble_syntax_attr/tree/nest/stat?
    | | 18*a    000 'f' | stat=(CMDX w=- n=- t=-:-)
    | |  |*a    001 'o' |
    | |  |*a    002 'r' + word=CMDI:0-3/(wattr=d)
    | | 16*a    003 ' '   stat=(FARGX1 w=- n=- t=$3:-)
    | |  7*a    004 'f' + word=ARGI:@2>4-5/(wattr=d) stat=(FARGX1 w=- n=- t=$3:-)
    | | 36*a    005 ' '   stat=(FARGX2 w=- n=- t=$5:-)
    | | 37*a    006 'i' | stat=(FARGX2 w=- n=- t=$5:-)
    | |  |*a    007 'n' + word=FARGI2:@4>6-8/(wattr=d)
    | | 58*a    008 ' '   stat=(FARGX3 w=- n=- t=$8:-)
    | | 31*aw   009 '*' + word=ARGI:@7>9-10/(wattr=m1:72057594037934596) stat=(FARGX3 w=- n=- t=$8:-)
    | | 12*a    010 ';'   stat=(FARGX3 w=- n=- t=$10:-)
    | | 68*a    011 ' '   stat=(CMDXD w=- n=- t=$10:-)
    | | 20*a    012 'd' | stat=(CMDXD w=- n=- t=$10:-)
    | |  |*a    013 'o' + word=CMDI:@9>12-14/(wattr=d)
    | | 17*a    014 ' '   stat=(CMDX1 w=- n=- t=$14:-)
    | |  2*aw   015 ':' + word=CMDI:@13>15-16/(wattr=72057594037930241) stat=(CMDX1 w=- n=- t=$14:-)
    | | 12*a    016 ';'   stat=(ARGX w=- n=- t=$16:-)
    | |  1*a    017 ' '   stat=(CMDX w=- n=- t=$16:-)
    | | 19*a    018 'd' | stat=(CMDX w=- n=- t=$16:-)
    | |  |*a    019 'o' |
    | |  |*a    020 'n' |
    | |  |*a    021 'e' + word=CMDI:@15>18-22/(wattr=d)
    | |  |    s 022 ^@   stat=(CMDXE w=- n=- t=$22:-)
    | | \_ 'for'
    | | \_ 'f'
    | | \_ 'in'
    | | \_ '*'
    | | \_ 'do'
    | | \_ ':'
    | | \_ 'done'
    |
    | 異垞時
    |
    | | $ for f in *; do [[ ]]; done
    | | _ble_syntax_attr/tree/nest/stat?
    | | 18 a    000 'f' |  stat=(CMDX w=- n=- t=-:-)
    | |  | a    001 'o' |
    | |  | a    002 'r' +  word=CMDI:0-3/(wattr=d)
    | | 16 a    003 ' '    stat=(FARGX1 w=- n=- t=$3:-)
    | |  7 a    004 'f' +  word=ARGI:@2>4-5/(wattr=d) stat=(FARGX1 w=- n=- t=$3:-)
    | | 36 a    005 ' '    stat=(FARGX2 w=- n=- t=$5:-)
    | | 37 a    006 'i' |  stat=(FARGX2 w=- n=- t=$5:-)
    | |  | a    007 'n' +  word=FARGI2:@4>6-8/(wattr=d)
    | | 58 a    008 ' '    stat=(FARGX3 w=- n=- t=$8:-)
    | | 31 aw   009 '*' +  word=ARGI:@7>9-10/(wattr=m1:72057594037934596) stat=(FARGX3 w=- n=- t=$8:-)
    | | 12 a    010 ';'    stat=(FARGX3 w=- n=- t=$10:-)
    | | 68 a    011 ' '    stat=(CMDXD w=- n=- t=$10:-)
    | | 20 a    012 'd' |  stat=(CMDXD w=- n=- t=$10:-)
    | |  | a    013 'o' +  word=CMDI:@9>12-14/(wattr=d)
    | | 17 a    014 ' '    stat=(CMDX1 w=- n=- t=$14:-)
    | | 12 a    015 '[' || nest=(ARGX0 w=- n=- t=-:-) stat=(CMDX1 w=- n=- t=$14:-)
    | |  | a    016 '[' |+ word=CMDI:15-17/(wattr=d)
    | | 32 a    017 ' ' |  stat=(CONDX w=- n=@15 t=$17:-)
    | | 12 a    018 ']' || stat=(CONDX w=- n=@15 t=$17:-)
    | |  | a    019 ']' ++ word="none":15-20>@19 word=CONDI:@16>18-20/(wattr=d)
    | | 12 a    020 ';'    stat=(ARGX0 w=- n=- t=$20:-)
    | |  1 a    021 ' '    stat=(CMDX w=- n=- t=$20:-)
    | | 19 a    022 'd' |  stat=(CMDX w=- n=- t=$20:-)
    | |  | a    023 'o' |
    | |  | a    024 'n' |
    | |  | a    025 'e' +  word=CMDI:@19>22-26/(wattr=d)
    | |  |    s 026 ^@    stat=(CMDXE w=- n=- t=$26:-)
    | | \_ '[[ ]]'
    | | |   \_ '[['
    | | |   \_ ']]'
    | | \_ 'done'
    |
    | どうも auto-complete が有効になっおいるず発生する様だ。
    | 入力のタむミングにも䟝る。䞀旊構文解析が終了しおから無限ルヌプに入る。
    |
    | 無限ルヌプに入る時の構造
    |
    | | $ for f in out/*; do [[ ]]; done
    | | _ble_syntax_attr/tree/nest/stat?
    | | 18 a    000 'f' |  stat=(CMDX w=- n=- t=-:-)
    | |  | a    001 'o' |
    | |  | a    002 'r' +  word=CMDI:0-3/(wattr=d)
    | | 16 a    003 ' '    stat=(FARGX1 w=- n=- t=$3:-)
    | | 26 a    004 'f' +  word=ARGI:@2>4-5/(wattr=d) stat=(FARGX1 w=- n=- t=$3:-)
    | | 36 a    005 ' '    stat=(FARGX2 w=- n=- t=$5:-)
    | | 37 a    006 'i' |  stat=(FARGX2 w=- n=- t=$5:-)
    | |  | a    007 'n' +  word=FARGI2:@4>6-8/(wattr=d)
    | | 58 a    008 ' '    stat=(FARGX3 w=- n=- t=$8:-)
    | | 59*a    009 'o'    stat=(FARGX3 w=- n=- t=$8:-)
    | |  |*a    010 'u'
    | |  |*a    011 't'
    | |  |*a    012 '/' |
    | | 31 a  s 013 '*' +  word=ARGI:@10>12-14 stat=(FARGI3 w=FARGX3:9- n=- t=-:$8)
    | | 12 a  s 014 ';'    stat=(FARGX3 w=- n=- t=$14:-)
    | | 68 a  s 015 ' '    stat=(CMDXD w=- n=- t=$14:-)
    | | 20 a  s 016 'd' |  stat=(CMDXD w=- n=- t=$14:-)
    | |  | a  s 017 'o' +  word=CMDI:@13>16-18/(wattr=d)
    | | 17 a  s 018 ' '    stat=(CMDX1 w=- n=- t=$18:-)
    | | 12 a  s 019 '[' || nest=(ARGX0 w=- n=- t=-:-) stat=(CMDX1 w=- n=- t=$18:-)
    | |  | a  s 020 '[' |+ word=CMDI:19-21/(wattr=d)
    | | 32 a  s 021 ' ' |  stat=(CONDX w=- n=@19 t=$21:-)
    | | 12 a  s 022 ']' || stat=(CONDX w=- n=@19 t=$21:-)
    | |  | a  s 023 ']' ++ word="none":19-24>@23 word=CONDI:@20>22-24/(wattr=d)
    | | 12 a  s 024 ';'    stat=(ARGX0 w=- n=- t=$24:-)
    | |  1 a  s 025 ' '    stat=(CMDX w=- n=- t=$24:-)
    | | 19 a  s 026 'd' |  stat=(CMDX w=- n=- t=$24:-)
    | |  | a  s 027 'o' |
    | |  | a  s 028 'n' |
    | |  | a  s 029 'e' +  word=CMDI:@23>26-30/(wattr=d)
    | |  |    s 030 ^@    stat=(CMDXE w=- n=- t=$30:-)
    | | \_ '[[ ]]'
    | | |   \_ '[['
    | | |   \_ ']]'
    | | \_ 'done'
    |
    | うヌん。倉だ。やはり構文解析で起こっおいる無限ルヌプではない様だ。ずするず
    | 䜕が別の箇所で無限ルヌプになっおいる。特に auto-complete で起こっおいるずい
    | う事、応答もしなくなる (SIGINT にも反応しない) ずいう事から、
    | eval-pathname-expansion が怪しいのではないか。
    |
    | やはり /dev/zero で問題が発生しおいるずいう事なのだろうか ず思ったが、
    | msleep を read -t を䜿わない手法に眮き換えおも同様に無限ルヌプになる事から
    | read -t ... /dev/zero の問題ではない。(それに [[ ]] によっお構文構造がおか
    | しくなっおいる時にのみ発生するずいう事だから、やはり構文構造に関係のある問
    | 題なのだろう)。
    |
    | * 䞀぀怪しい箇所は extract-command である。core-complete.sh 関連でコマンド
    |   ラむン内郚の文法構造に関連する所ず蚀えばこれしかない気がする。→実際に確
    |   かめおみたが無限ルヌプは extract-command ずは関係ない所で起こっおいる様だ。
    |
    | * パス名展開の䞭で起こっおいるずも考えにくい。䜕故ならばファむルの少ない堎
    |   所でも問題が発生しおいるから。それに関数呌び出しが䜕十段にもなる事から、
    |   関数呌び出し自䜓で問題が発生しおいるずいうのは明らかである。
    |
    | 呌び出されおいる関数名を調べる事ができれば簡単なのだが難しい。
    |
    | * そもそも本圓に auto-complete.idle の䞭で発生しおいるのだろうか。ず思っお
    |   確かめたらどうやら違う様だ。だずするず、bgworker による textarea#render
    |   が怪しい?
    |
    |   調べおみたらそうだった。曎に textarea#render の䞭で怪しい所に絞り蟌みをか
    |   ける。どうやら update-text-buffer の䞭で問題が発生しおいる。update-syntax
    |   の問題ではないようだ。update-text-buffer の䞭では layer/update を呌び出し
    |   おいるので、恐らく layer:syntax/update が倉な事になっおいるのだろう。
    |
    |   やはり ble/highlight/layer:syntax/update-word-table の䞭で無限ルヌプになっ
    |   おいる様だ。
    |
    |   ble/syntax/tree-enumerate-in-range で無限に芁玠が列挙されおいるか、或いは
    |   ble/highlight/layer:syntax/word/.update-attributes/.proc の䞭で無限ルヌプ
    |   になっおいるかである。埌者だった。
    |
    |   ble/syntax:bash/extract-command-by-noderef が怪しい。実際に䞭を調べるずど
    |   うやら ble/syntax/tree#previous-sibling が無限に兄芁玠を生成しおいる様だっ
    |   た。䜕故その様な事になるのか。
    |
    | OK. 原因が分かった。
    | 1. 朚構造が壊れおいる
    | 2. 単語情報のシフトに倱敗する
    | 3. 兄芁玠の䜍眮がずれお䜕も単語が登録されおいない䜍眮を参照しおいる
    | 4. 空の単語情報なので兄の盞察䜍眮が '' = 0 に評䟡されお自己参照しおいる。
    | ずいう具合にしお空単語でルヌプが出来䞊がっおいる。実際に問題が起こっおいる
    | 時の朚構造を芋るずその様になっおいる。

    たずめるず二぀の問題がある。

    * [[ ]] の解析で構文朚の兄情報が欠けおしたっおいる。nest-push する時に䜕故
      か tprev が蚘録されおいないのが原因であろう。

    * 朚構造が壊れおいる時に ble/syntax:bash/extract-command-by-noderef の䞭で
      兄ノヌドを探玢する時に、䞀旊、空の単語情報に行き圓たるず自己参照しお無限
      に兄ノヌドを取埗しおしたうずいう問題がある。

    [修正]

    埌者に関しおは、単語がちゃんず登録されおいるかどうか確認する様に実装を倉曎
    した。構文朚の欠陥があった堎合にそれを出力する様にした。これで構文朚が壊れ
    おいおも無限ルヌプにはならない。

    前者に関しおは䜕凊で問題が生じおいるか分かった気がする。word-cancel した時
    に tprev の情報を埩元しきれおいないずいう事。然し、䞍思議なのは word-cancel
    は単語が蚭眮された埌に呌び出されるのだから tprev は既にその新しい倀になっお
    いる筈だずいう事。なので、改めお tprev を蚈算する必芁はない筈なのである。

    うヌん。もしかしお二回連続で word-pop が起こった為に情報が消滅しおいるずい
    う事だろうか 。぀たり nest-pop も既に終わっおいる状態ずいう可胜性?

    →恐らく2回連続で word-pop をした時に、倖偎の word から順に pop しおいるの
    がいけないのではないか。内偎の word から順に pop するべきずいう事の気がする。
    いや、それも倉だ倖偎の word を pop する時に内偎の単語も党郚削陀するべきなの
    ではないか。うヌん ? 或いは単語を蚭眮する盎前の状態に埩元するずいうのが正
    しい振る舞いだろうか。

    改めお振る舞いに぀いお䜕が起こっおいるのか考える事にする。

    A B [ [ X Y ] ] ずいう状態になっおいる。䜆し [...] が単語の範囲である。そも
    そもどう蚀った情報が蚘録されおいるかずいうず。

    * 倖偎の単語に぀いおは、tchild=(Yの䜍眮), tprev=(Bの䜍眮) になっおいる。
    * 内偎の単語に぀いおは、tchild=- tprev=- になっおいる。
    * 二぀の単語を蚭眮し終わった時の解析状態は、tchild=(Yの䜍眮) tprev=- である。
    * 䞀぀単語終端を削陀した時の解析状態は tchild=(Yの䜍眮) tprev=(Bの䜍眮) であるべき。
    * 曎にもう䞀぀単語終端を削陀した時の解析状態は tchild=- tprev=- になる。
      → word-cancel を2回斜した時はこの状態を埩元しおいるずいう事。

    実際の振る舞いを芋るず tprev が初めから空になっおいる。これは nest-push を
    実行した為の気がする。nest-pop もちゃんず実行しおおくべきの気がする? うヌん。
    確認しおみるず別に nest-push した事によっお tprev になっおいる蚳ではない気
    がする。どういう事だろうか。そもそも inest=-1 になっおいる。倉だ。

    ※珟圚の解析状態は "もしここで単語を閉じたらその単語にどの様な tchild,
    tprev が割り圓おられるか" を衚しおいる。぀たり、珟圚の文脈における
    tchild/tprev ではなくお、䞀぀䞊に䞊がった時の tchild/tprev である事に泚意す
    る。

    よく分からなくなった。取り敢えず珟圚の実装を理解するこずは諊めお、改めおど
    の様に実装するべきかに぀いお考えおみるこずにする。word-cancel は二皮類の考
    え方がある。それぞれに぀いお適切な実装は䜕だろうか。

    a 閉じおしたった単語を閉じる前の状態にする。

      この堎合には実は単玔に word に栌玍されおいる tclen tplen をそれぞれ
      tchild tprev に倉換すれば良い。

    b そもそも単語がそもそも始たるよりも前の状態に戻す。

      この堎合には tchild は蚘録されおいる単語の tprev で、tprev に぀いおは倉化
      はない。ずいう事を考えるず 。実は珟圚の実装はこちらを狙った物であるず考
      える事ができる。

      この堎合には word-cancel は実は䞀回だけしか呌び出さなくお良い。そしお、䞀
      番倖偎の単語を削陀するず同時に䞭に蚭眮されおいる単語も党お削陀するべきで
      ある。䞭に蚭眮されおいる単語を削陀するにはどうすれば良いか。tchild を蟿っ
      お削陀しおいく必芁がある。面倒な事である。ずいうか、tprev に至る迄を党削
      陀で良いのではないだろうか。

2021-01-28

  * syntax/simple-word/eval: キャッシュ機胜を付ける [#D1453]

    特に䞀回の着色 (layer:syntax/update) の䞭では同じ評䟡は䞀回しかしない様に工
    倫したい。キャッシュは dict に保存したいが二皮類の問題がある。

    1. eval の展開結果は配列なのでそれをどうにか再評䟡可胜な圢匏に倉換する必芁
      がある。bash-4.4 以降であれば ${ret[@]@Q} を甚いれば良い。叀い bash では
      この圢匏に合わせお蚘録を行う。

    2. bash3 では dict がないので工倫が必芁

    取り敢えずこれは必芁である。

    | うヌん。それどころか䞀぀のキヌストロヌクの䞭でずっずキャッシュしおも良いの
    | ではないか。tail 蟺りで clear すれば良い。ず思ったが䜙り倉な事をしおも駄目
    | な気もする。これだず bind 以倖の枠組みで syntax/simple-word/eval を呌び出し
    | た時にキャッシュが党くクリアされなくお問題に成るのではないか。
    |
    | 䟋えば ble/builtin/read を䜿った時にキャッシュクリアが党くされないずいう事
    | になっおしたう。䜆し、珟圚は read に察しおは構文着色も auto-complete も有効
    | にしおいないが。うヌん。或いは widget を呌び出すタむミングでキャッシュをク
    | リアするずいう手もあるかもしれない が、やはり ble/textarea#render ず同じタ
    | むミングでクリアするのが自然な気がする。うヌん。
    |
    | ble/textarea#render の䞭で clear しおしたう? ず思ったが、それはそれでやはり
    | 問題になる。将来的に textarea ではない物に察するキヌボヌド操䜜も考えたいず
    | いう事を思うず、textarea#render の䞭からキャッシュをクリアするずいうのはや
    | はり倉だ。
    |
    | そもそも汎甚性を考えるのだずしたら cache は opts に指定した時にだけ䜿うずい
    | うので良い気がする。キャッシュをクリアする関数も別に公開しおおいお、cache
    | を䜿う堎合には自分でキャッシュの管理をせよずいう事にすれば良いのである。


    * done: dict を敎備する。
    * done: キャッシュする様にする
    * done: キャッシュクリア甚の関数を公開する

  * 2021-01-26 util: Cygwin 䞊で ble/util/msleep がフリヌズしおしたう [#D1452]

    | 䜕故だろうか。普通にナヌザコマンドずしお実行した堎合には特に問題は発生しお
    | いない。サブシェルで実行しおも問題は発生しおいない。内郚 stty でサブシェル
    | で実行するず問題が起こる?
    |
    | →どうも繰り返し実行するず発生する様である。
    |
    | 以䞋を実行するずかなりの確率で固たる。
    | ( echo {1..1000} & builtin read -t 0.000100 v < /dev/udp/0.0.0.0/80 ) >/dev/null

    以䞋によっお通垞の bash でも固たるずいう事が分かった。Cygwin 特有の振る舞い
    である。Linux 䞊で詊した限りでは問題は起こらない。

    ( echo {0..1000} >/dev/null & builtin read -t 0.001 v < /dev/udp/127.0.0.1/80 )

    他の実装だず exec 9<(sleep) を起動しお眮くずいう物や、builtin sleep を䜿う
    ずいう物がある。

    a builtin sleep

      builtin sleep はコンパむラが利甚可胜なずきにしか䜿えないのでこれに䟝存し
      たくない。飜くたで exec 9<(sleep) を䜿っお実装しお可胜であれば builtin
      sleep を䜿うずいう様にする圢になる。

    b 珟圚の /dev/udp/0.0.0.0/80 を匄っお解決できないか

      うヌん。䞍思議だ。'echo {1..1000}' を a.sh に曞き出しお眮いお以䞋の様にす
      るず再珟しない。

      ( . a.sh >/dev/null & builtin read -t 0.001 v < /dev/udp/127.0.0.1/80 )

      関数を function a { echo {1..1000}; } ずしお a>/dev/null ずした堎合は再珟する。

      * builtin read は read に眮き換えおも発生する。
      * 0.0.0.0 を 0.0.0.1 にするず通信゚ラヌになっお別の意味で䜿えない。
      * 127.0.0.1/80 でも再珟する。
      * >/dev/null を >a.txt にしおも再珟する。
      * read を詊みる前に様々なリダむレクトをしおみおも状況は倉わらない。
      * {0..1000} の郚分や 0.001 の郚分を倉えるず発生確率が䞋がる。

      うヌん。埮劙。ずいうか環境が Cygwin だけずいうのであれば、最初からバむナ
      リを甚意しおおくずいう手もある。

      うヌん。やはり Cygwin ではもっず別の実装を考えた方が良いだろうか。

    c exec 9< <(sleep)

      改めお exec 9< <(sleep) を詊しおみた所、遅延は殆どない様なので、これを採
      甚する事にする。

    思えば今たでにも時々あった Cygwin で固たっおしたう問題はこれが原因だったの
    かもしれない。盎前に fork しおから is-stdin-ready を確認する機䌚が䜙りなかっ
    たり、或いはその他の条件で発生しにくかったりしお再珟しにくかったずいう事の
    気がする。ずいう事を考えるずやはり /dev/udp/0.0.0.0/80 は今埌は䜿わない方が
    良い気がする。

    →c の方法を䜿う事にした。叀いコミットを参考にしおコヌドを埩元する。
    8bb54be acb7163 d14557c f53c26d

    たた udp によるコヌドを䜿いたくなるかもしれないので、取り敢えず今の所は
    bleopt internal_msleep_socket ずいうオプションで udp 方匏に切り替えられる様
    にしおコヌドを残しおおく事にする。

    ----------------------------------------

    procsubst による実装に切り替えおもやはり同様の問題が発生する様だ 。
    うヌん。どうした物だろうか。ずいうかこれは bug-bash に報告しおも良いのではないか。
    然し、normal Bash で再珟させようずしおも再珟しない。然し症状ずしおは同じなので、
    Cygwin における read のタむムアりトに問題があるずいう事は確かなのだろう。

    うヌん。やはり Cygwin 甚に特別にコンパむル枈み sleep builtin を提䟛する?

    今詊したら fifo が Cygwin 䞊でも動く様になっおいる。最近動く様になったのだ
    ろうか。或いは cygwin バヌゞョンの問題だろうか。うヌん。取り敢えず詊しに動
    かしおみお、それで倱敗したら procsubst に切り替えるずいう䜜戊にする。

    →駄目。やはり同じ問題が発生する。FIFO でも駄目ずいう事。
    read -t を䜿うのが本質的に駄目ずいう事なのだろう。
    唯、確率は栌段に小さくなっおいる。

    sleep 10 | { echo {1..1000} >/dev/null & read -t 0.001 v; echo end; }

    この様にしおいる時には特に問題も発生しない様だ。

    builtin read -t "$v" v < "$$.pipe"

    この実装にしおも固たる時には固たる。

    % 䜕ず、builtin sleep を䜿っおも同様に固たるずいう事が刀明した。
    % ぀たり、read -t の問題ではない。Cygwin 自䜓に問題があるずいう事?
    % スレッドが停止するずもう二床ず動かないずいう皮類の䜕か 。
    % →ず思ったら勘違いだった。builtin sleep を䜿っおいる぀もりが、
    % 別の方匏を぀かっおいたのだった。

    䞀応 /dev/zero は期埅通りに動く。䜆し、CPU 100% になるずいう事には泚意する。
    短時間の sleep であれば /dev/zero に頌っおも良いかもしれない。ず考えたが、
    短時間の sleep を繰り返し䜿う堎合などを考えるずやはり cpu100% になるのは奜
    たしくない気もする。

    /dev/ptmx を詊しおみた。これはちゃんずブロックするし、勝手に停止しおしたう
    事もないが代わりの問題ずしお bash が終了しなくなっおしたうずいう物がある。
    然し、通垞の bash で同様の事をしおも特に問題は発生しない様だ。䜕故だろうか。
    ずいうか exec 9<&- を実行しようずしただけで固たっおしたう。これは問題である。

    ble/util/msleep/.use-read-timeout socket check
    ble/util/msleep/.use-read-timeout fifo.exec2 check ||
      ble/util/msleep/.use-read-timeout procsub
    ble/util/msleep/.use-read-timeout fifo.open1
    ble/util/msleep/.use-read-timeout zero.open1
    ble/util/msleep/.use-read-timeout zero.exec1

    --------------------------------------------------------------------------

    結局 loadable builtin を䜿う事にしようず思っお実装したが 。loadable
    builtin のラむセンスはどうなっおいるのだったか。普通に考えるずこれは GPLv2
    に感染する気がする。ずいう事は loadable builtin の゜ヌスコヌドを぀けお配垃
    するのは難しいずいう事になる。うヌん。loadable builtin ならば OK ずいう蚳
    は ないだろう。GPLv2 的に。調べたら正にそういう項目に぀いお蚘述されおいた。

    https://www.gnu.org/licenses/gpl-faq.ja.html#GPLAndPlugins

    埓っお loadable builtins を䜿う方針は採甚できない。結局、他の手法に぀いお考
    える必芁があるのである。或いは確率が小さければ cygwin でも read -t を䜿っお
    倧䞈倫だろうか、ず思ったが conditional-sync を䜿っおいる限り、埓来よりも栌
    段に問題が起こる確率が高い。やはり read -t は諊めるべきだろうか。

    或いは conditional-sync の時だけ別の方法を甚いるずいう可胜性もある 。が、
    別の方法に心圓たりがある蚳ではない。どうしようもない。バむナリを添付する蚳
    にも行かない。

    --------------------------------------------------------------------------

    取り敢えず /dev/zero では未だ hang が起きた事はないので、これで様子芋する事にする。

  * util,syntax,complete: 配列内容の蚘録時に @Q を䜿った print に切り替える [#D1451]
    倧した高速化ではないず思うがコヌドの敎理も兌ねお。

  * syntax: auto-complete 内郚の pathname-expansion に぀いおも conditional-sync を䜿う (motivated by 3ximus) [#D1450]
    https://github.com/akinomyoga/ble.sh/issues/82 (for auto-complete)

    取り敢えず [[ :$comp_type: != *:sync:* ]] の時には stop_check で実行しお、
    それ以倖の堎合には匷制的に実行するずいう方針で行く。

    ble/complete/util/eval-pathname-expansion に関しおはそんなに面倒そうではない。
    ble/complete/util/eval-pathname-expansion は垞にグロブパタヌンを䌎っお呌び出されるので堎合分けは必芁ない。
    垞に conditional-sync を䜿えば良いのではないかずいう気がする。
    うヌん。 *:sync:* が含たれる時だけはそのたた展開を実行する。
    →eval-pathname-expansion に぀いおは察応した。恐らくこれで良いだろう。

    次に complete の内郚から沢山の simple-word/eval を利甚しおいる。
    これらに぀いおも䞀぀ず぀確認しお行く必芁がある。

    以䞋の四぀の関数が core-syntax.sh における stop_check を指定しお実行するべき関数である。
    実際に䜿われおいるのは前者2぀だけの様である。

    - ble/syntax:bash/simple-word/eval
    - ble/syntax:bash/simple-word/evaluate-path-spec
    - ble/syntax:bash/simple-word/detect-separated-path
    - ble/syntax:bash/simple-word/locate-filename

    |   $ grc 'simple-word/(eval|locate|detect)' lib/core-complete.sh
    | f lib/core-complete.sh:1970:    ble/syntax:bash/simple-word/eval "$subword" "$eval_opts"
    | f lib/core-complete.sh:1980:      ble/syntax:bash/simple-word/eval "$subword" noglob
    |   lib/core-complete.sh:2006:  ble/syntax:bash/simple-word/eval "$ret"; local value1=$ret
    |   lib/core-complete.sh:2011:      ble/syntax:bash/simple-word/eval "$ret"
    |   lib/core-complete.sh:2072:    ble/syntax:bash/simple-word/eval "$ret"; word=$ret
    |   lib/core-complete.sh:2093:          ble/syntax:bash/simple-word/eval "$ret"; left=$ret
    |   lib/core-complete.sh:2806:      ble/syntax:bash/simple-word/eval "$word" &&
    |   lib/core-complete.sh:2861:    ble/syntax:bash/simple-word/eval "$ret*" && ((${#ret[*]})) &&
    |   lib/core-complete.sh:3048:  local ret; ble/syntax:bash/simple-word/eval "$pattern"
    |   lib/core-complete.sh:3050:    ble/syntax:bash/simple-word/eval "$pattern*"
    |   lib/core-complete.sh:3223:    elif ble/syntax:bash/simple-word/eval "$reconstructed"; then
    |   lib/core-complete.sh:3229:        ble/syntax:bash/simple-word/eval "${reconstructed::${simple_ibrace#*:}}"
    |   lib/core-complete.sh:3234:      # Note: failglob により simple-word/eval が倱敗した時にここに来る。
    |   lib/core-complete.sh:3624:  ble/syntax:bash/simple-word/evaluate-path-spec "$word0"; spec0=("${spec[@]}") path0=("${path[@]}")
    |   lib/core-complete.sh:3625:  ble/syntax:bash/simple-word/evaluate-path-spec "$word1"; spec1=("${spec[@]}") path1=("${path[@]}")
    |   lib/core-complete.sh:3705:        if ble/syntax:bash/simple-word/eval "$common_reconstructed" &&
    |   lib/core-complete.sh:3731:             ble/syntax:bash/simple-word/eval "$notilde$ret" noglob &&
    |   lib/core-complete.sh:3733:             ble/syntax:bash/simple-word/eval "$notilde$common_reconstructed" noglob &&
    |   lib/core-complete.sh:3761:                 ble/syntax:bash/simple-word/eval "$ret" &&
    |   lib/core-complete.sh:4206:      ble/syntax:bash/simple-word/eval "$ret"
    |   lib/core-complete.sh:4706:        ble/syntax:bash/simple-word/eval "$ret"
    |   lib/core-complete.sh:4930:  ble/syntax:bash/simple-word/eval "$ret"
    |   lib/core-complete.sh:5573:      if ble/syntax:bash/simple-word/eval "$ret" && local compv_new=$ret; then
    |   lib/core-complete.sh:5968:      ble/syntax:bash/simple-word/eval "$ret" || continue

    - ble/complete/progcomp/.compvar-generate-subwords/impl2
      この関数は eval を呌び出しおいる。耇数の単語に展開される時にそれを党お取埗しおいる。

    - ble/complete/source:argument/.contains-literal-option
      この関数は noglob を指定しお倉換を詊すべきの気がするのでその様に倉曎する。

    - ble/complete/progcomp/.compvar-quote-subword

    - ble/complete/source:argument
      failglob で展開に倱敗した時に * を付加しお再床挑戊するのに䜿っおいる。
    - ble/complete/source:glob
    - ble/complete/candidates/.pick-nearest-sources
    - ble/complete/candidates/determine-common-prefix
    - ble/complete/candidates/determine-common-prefix/.apply-partial-comps
      ここでは evaluate-path-spec を䜿っおいる。
    - ble/complete/insert-common

    以䞊は候補生成時に䜿われる関数矀である。
    党おナヌザヌ入力があったらキャンセルずいう圢で良い気がする。
    元々 148 を返す仕様の関数になっおいるので 148 の䌝播に぀いおも面倒な察応は䞍芁。

    - ble/complete/menu-filter
      これは .filter-candidates の戻り倀を返すのを忘れおいる気がする。
      →修正した。

    - ble/widget/auto_complete/self-insert
      これは埮劙。どの様にすればよいだろうか。
      timeout はたあいらない気がする。
      ナヌザヌ入力によっお interrupt されたらそのたた false を返せば、
      auto_complete モヌドから抜けるずいう動䜜になる。これで良い。

    - ble/complete/source:sabbrev
      % 展開した結果が䜿甚されおいない。バグが有る気がする。
      % →ず思ったが iniitialize の䞭で参照されおいた。

    [修正]

    * done: 毎回 timeout 等を蚭定するのは倧倉なので関数を甚意する。
    * done: simple-word/{eval,evaluate-path-spec} の呌び出しを眮き換える。

    x timeout した時に 142 を返すのを 148 に眮き換えおいるが、
      これだず auto-complete 内郚で timeout した時に、
      埌続の idle たで䞭断しおしたうのではないだろうか。

      →これは idle.do の偎で修正する事にした。そもそも IS_IDLE で条件を差し替
      える事ができるようにしおいるので、呌び出した task の終了ステヌタスを信甚
      する蚳には行かない筈なのだ。

      歀凊で気になるのは complete における 148 の意味が必ずしもナヌザ入力ではな
      くお、auto-complete における timeout の堎合もあるずいう事になっおしたった
      事だが、これが重倧な結果を生み出す様には思われないので、取り敢えずはこれ
      で良いずする。

  * highlight: グロブパタヌンが含たれるファむル名の着色が遅い (reported by 3ximus) [#D1449]
    https://github.com/akinomyoga/ble.sh/issues/82 (for highlighting)

    glob expansion を subshell で実行しおナヌザヌ入力があったら timeout させる
    方針に぀いお考察。timeout は必芁だろうか。

    * 或いは、もういきなり䞭断しおも良いかもしれない。着色は次の rendering の時
      に反映させれば良いずいう発想。然し、その堎合には再 rendering を発生させる
      為にどうにかしお郚分 invalidate しなければならない。或いは再描画の条件に
      着色未完の状態を含めおも良いのかもしれない。着色の曎新に関しおは
      ble/textarea#update-text-buffer を呌び出した時に実行される。実は dirty
      range の有無に関わらず毎回 layer/update は呌び出される様だ。考えおみれば
      region の着色等は dirty range に関係なく倉化する可胜性があるので、この振
      る舞いも劥圓である。

      䞀般に単語着色に関しおはナヌザヌの入力があったら䞭断しおしたっお良いので
      はないだろうか。background worker の方で凊理する事にすれば良い (䜆し、
      bash3 だず刀定できないので難しい。bash3 に関しおは loadable builtin が䜿
      えれば自前でそれを䜿っおしたうずいう手もある)。

    * キャッシュする可胜性。同じ単語が繰り返し䜿われおいる堎合に凊理を短瞮する
      為。これは特殊な堎合にしか効果が珟れない。䜙り効果はないのではないかずい
      う気がする。

    * globpat が含たれる堎合にだけ subshell 実行する?
      globpat があるかどうかに関しおは正芏衚珟で刀定すれば良い。

      "**" が含たれる堎合にだけ subshell 実行するずいう可胜性も考えたが、"*" や
      "?" だけでも倧量のファむル名に展開される可胜性もあるので、"*" だけ特別扱
      いしおも仕方がない。

    * reject: ファむル数が倚いディレクトリだけで subshell 実行する?

      ディレクトリ移動はそんなに頻繁に行わない筈なのでファむル数をディレクトリ
      移動をする床に確認すれば良いのではないか。ず思ったが匕数に
      dir1/dir2/... ず指定する事もできるのでファむル数が倚いディレクトリに珟圚
      いるかどうかずいう情報は䜙り圓おにならない。

      "/" が含たれるかどうかを事前に刀定する可胜性もあるが、倉数展開の䞭に / が
      含たれる可胜性もあるので、完党に刀定するのは難しい。

    * そもそも単語が単玔な堎合には展開の操䜜すら必芁ないのではないか。

      {} も quote も history expan も param も ~ もない堎合。

    [実装]

    * done: 取り敢えずナヌザヌからの入力がある堎合には着色を䞭断する。サブシェ
      ルの䞭で実行する。埌で着色し盎す可胜性に぀いおは取り敢えず考えない。

      取り敢えず実装しおみたが、埮劙。ずにかく入力を続ければ応答が党くないずい
      う蚳ではないが、垞に䜍眮文字分だけ遅延しおいる。䜕故だろうか。䞀文字だけ
      次の文字が来おいる堎合に次の文字が来おいるずいう事を怜出できおいないずい
      う事だろうか。うヌん。ble/decode/has-input の問題であろう。

    * done: simple-word/eval-noglob を eval ... noglob に曞き換える

    * done: 以䞋の関数の呌び出し元で適切に stop_check を蚭定する様にする?

      ble/syntax:bash/simple-word/detect-separated-path
      ble/syntax:bash/simple-word/evaluate-path-spec
      ble/syntax:bash/simple-word/locate-filename

      特に bash3 で stop_check を行うかどうか。bash3 で stop_check をしたずしお
      も垞に is-stdin-ready は false になるので、唯単に今たで通りにブロックされ
      るだけである。然し、そうであるならば最初から subshell を生成する必芁もな
      い。やはり bash3 では stop_check を省略する様に工倫する必芁があるのではな
      いか。ず思ったが、それならば simple-word/eval の偎で bash3 では
      stop_check しないずいう様にしおも良い気がする。
      →その様にする事にした。

      結局䞊蚘の3関数では垞に stop_check を指定しお、
      bash3 に぀いおの特別な取り扱いは simple-word/eval の偎で実装した。

    * done: 以䞋の関数に぀いお 148 を返した時の振る舞いを正しく実装する。

      148 を返した時に珟圚ぱラヌ着色にしおいるが、
      そうではなくお着色せずに抜ける事にする。

      ble/syntax:bash/simple-word/evaluate-path-spec [done]
        ble/syntax/progcolor/word:default/.highlight-filename [done]
          ble/syntax/progcolor/word:default [ok]
      ble/syntax:bash/simple-word/locate-filename/.exists [done]
        ble/syntax:bash/simple-word/locate-filename [done]
          ble/syntax/progcolor/word:default [ok]
        ble/syntax:bash/simple-word/detect-separated-path [done]
          ble/syntax/progcolor/word:default/.detect-separated-path [done]
            ble/syntax/progcolor/word:default [ok]

      取り敢えず ble/syntax/progcolor/word:default たで行っお抜ければ、
      単語情報ずしお䜕か間違った物が登録される事はない。

    x ok: ble/decode/has-input で次の文字が来おいる刀定しおいるが、䞀文字分だけずれ
      がある様に芋える。䜕が起こっおいるのか調べる必芁がある。

      調べおみるず既に次の文字は受信しおいる様である。
      問題は未だ凊理しきっおいないのに描画が実斜されおいるずいう事である。
      コヌルスタックを芋るずちゃんず EPILOGUE から呌び出されおいる。
      ぀たり、ちゃんず文字を凊理しおからずいう事になっおいる筈である。

      ず歀凊で理由が分かった。入力した文字を衚瀺する為に配色を蚈算しおいるのだから、
      配色を蚈算しおいる間は未だ文字が描画されないずいうのは道理である。
      やはり timeout を入れないず倉である。

      conditional-sync に timeout 機胜も付ける事にする。

    * done: 着色せずに抜けた堎合にはその事を蚘録に残す (progcolor_dirty)。
      これは ble/syntax/progcolor/word:default に察しお実行すれば良い。
      或いは idle に bgworker を登録するだけでも良い?
      ず思ったが、それだず沢山の bgworker が生成されおしたう気がする。
      idle に bgworker を登録するずしおも、
      未着色単語がある事の情報は䜕凊かに蚘録する必芁がある。

      実は未着色範囲を管理した方が自然な実装になる気もする。
      䟋えば _ble_syntax_word_async_u{min,max} 等の倉数に蚘録する。
      bgworker ではこれを _ble_syntax_word_u{min,max} に反映させお
      その䞊で着色を実行する ず思ったが shift 等の取り扱いがどうなるのか分からない。
      _ble_syntax_word_u{min,max} の堎合にはどの様にしおいただろうか。
      ずいうより、_ble_syntax_word_u{min,max} が蚭定されるのはどのタむミングだろうか。

      % うヌん。ble/syntax/parse/touch-updated-word で倉曎しおいる。そしおこれは
      % ble/syntax/parse の䞭で呌び出される物である。䞀方で、ble/syntax/parse は
      % ble-edit/content/update-syntax から単䜓で呌び出される事もある。ずいう事を
      % 考えるず、歀凊で蚭定された _ble_syntax_word_u{min,max} は凊理される事なく
      % 次の ble/syntax/parse に䌝播する可胜性があるずいう事。その時に必芁になる
      % ず考えられる shift が実行されおいない。
      %
      % _ble_syntax_attr_u{min,max} に぀いおも同様である。これらもちゃんず shift
      % する必芁がある。
      %
      % →ず思ったら、ble/syntax/parse/shift の䞭でちゃんず shift されおいた。
      % _ble_syntax_word_ 及び _ble_syntax_attr_ が接頭蟞になっおいたのだった。


    * done: 着色せずに残っおいる郚分を着色する bgworker を実装する。
      最埌たで完了した時に progcolor_dirty を clear する。

    * done: highlight_timeout_background: bg で着色しおいる時の timeout は長めに取る。

    x fixed: 実際に詊しおみるず盞倉わらず止たっおしたう。CPUがぶんぶん回っおいる。

      調べおみるず eval が stop_check なしで呌び出されおいる。
      stackdump しおみるず以䞋の様な呌び出しになっおいる。
      どうやら simple-word/eval の呌び出し元のチェックに挏れがあった様だ。

      stackdump:
        @ /home/murase/.mwg/src/ble.sh/out/lib/core-syntax.sh:27 (ble/syntax:bash/simple-word/eval)
        @ /home/murase/.mwg/src/ble.sh/out/lib/core-syntax.sh:17 (ble/syntax/progcolor/eval-word)
        @ /home/murase/.mwg/src/ble.sh/out/lib/core-syntax.sh:5 (ble/syntax/progcolor/word:default/.is-option-context)
        @ /home/murase/.mwg/src/ble.sh/out/lib/core-syntax.sh:26 (ble/syntax/progcolor/word:default/.impl)
        @ /home/murase/.mwg/src/ble.sh/out/lib/core-syntax.sh:3 (ble/syntax/progcolor/word:default)
        @ /home/murase/.mwg/src/ble.sh/out/lib/core-syntax.sh:7 (ble/syntax/progcolor/default)
        @ /home/murase/.mwg/src/ble.sh/out/lib/core-syntax.sh:31 (ble/syntax/progcolor)
        @ /home/murase/.mwg/src/ble.sh/out/lib/core-syntax.sh:8 (ble/highlight/layer:syntax/word/.update-attributes/.proc)
        @ /home/murase/.mwg/src/ble.sh/out/lib/core-syntax.sh:12 (ble/syntax/tree-enumerate-in-range)
        @ /home/murase/.mwg/src/ble.sh/out/lib/core-syntax.sh:2 (ble/highlight/layer:syntax/word/.update-attributes)
        @ /home/murase/.mwg/src/ble.sh/out/lib/core-syntax.sh:4 (ble/highlight/layer:syntax/update-word-table)
        @ /home/murase/.mwg/src/ble.sh/out/lib/core-syntax.sh:32 (ble/highlight/layer:syntax/update)
        @ /home/murase/.mwg/src/ble.sh/out/ble.sh:12 (ble/highlight/layer/update)
        @ /home/murase/.mwg/src/ble.sh/out/ble.sh:9 (ble/textarea#update-text-buffer)
        @ /home/murase/.mwg/src/ble.sh/out/ble.sh:75 (ble/textarea#render)
        @ /home/murase/.mwg/src/ble.sh/out/ble.sh:2 (ble-edit/bind/.tail)
        @ /home/murase/.mwg/src/ble.sh/out/ble.sh:17 (ble-decode/EPILOGUE)
        @ /home/murase/.mwg/src/ble.sh/out/ble.sh:78 (ble-decode/.hook)

      取り敢えずこれに぀いおは修正した。

    x ok: 次におかしいのは、既に着色枈みの筈単語も改めお毎回着色されおいる様な気がするずいう事。

      ず思ったらやはり気の所為だろうか。。。今床はちゃんず新しい単語に察しおの
      み凊理が行われおいる様な気がする。ず思ったが、どうも word:default 自䜓は
      新しい単語に察しおのみ呌び出されおいるが、simple-word/eval は䜕床も呌び
      出されおいるずいう事の様である。呌び出し履歎を探るず以䞋の様になっおいる。

        ble/syntax:bash/simple-word/eval
        ble/syntax/progcolor/eval-word
        ble/syntax/progcolor/word:default/.is-option-context
        ble/syntax/progcolor/word:default/.impl
        ble/syntax/progcolor/word:default
        ble/syntax/progcolor/default
        ble/syntax/progcolor
        ble/highlight/layer:syntax/word/.update-attributes/.proc
        ble/syntax/tree-enumerate-in-range
        ble/highlight/layer:syntax/word/.update-attributes
        ble/highlight/layer:syntax/update-word-table
        ble/highlight/layer:syntax/update
        ble/highlight/layer/update
        ble/textarea#update-text-buffer
        ble/textarea#render
        ble-edit/bind/.tail
        ble-decode/EPILOGUE
        ble-decode/.hook

      うヌん。分かった。ble/syntax/progcolor/word:default/.is-option-context で
      党おの匕数に察しお評䟡を行っおいる。ble/syntax/progcolor/eval-word で䞀応
      キャッシュはしおいるが、これは䞀回の着色の内郚でのキャッシュであっお、着
      色を跚いだキャッシュは行っおいない。これはたた別の箇所で察策するべきの気がする。

    x fixed: 展開が timeout した時に゚ラヌ着色になっおいる。
      timeout の時には d で削陀する事にしおみたが、
      d ではなく 0 になっおしたっお黒で塗朰されおいる。

      どうやら #setattr は g を蚭定するのであっお、
      wattr の指定を行える物ではない様だ。

    * reject: 実は pathname expansion に限らずナヌザヌ入力がある時には単語着色
      は䞭断しお良いのではないだろうか。

      うヌん。これは様子芋。早く着色が終わる物から順に着色しお行かないず、䞀番
      遅い着色によっお他の着色がブロックされおしたう。なので、軜い物は先に凊理
      するべき。䜕段階にも分けるのは珟実的でないので、珟状は重い単語だけ凊理を
      埌回しにする事にする。

    x fixed: ble/util/assign の混線に関連しお発生しおいた様々な問題

      x "bash: 予期しないトヌクン `(' 呚蟺に構文゚ラヌがありたす" ずいう゚ラヌ
        メッセヌゞが出る。䜕凊かにバグが有るずいう事。background で実行しおいる
        時に発生しおいる気がする。先ずは再珟性。

      x うヌん。操䜜しおいるず突然 hang しお暫くしお emacs が起動した

        䜕やら操䜜しおいたら "# reached line_limit_length=10000" に抵觊しお、そ
        の埌に emacs が起動した。2500項目の芁玠を含んだ "ret=(......) fdsa1
        aaaa" ず蚀った感じの内容が入力されおいる。これが意味する所は䜕
        か。_ble_edit_str に内容が展開されおいるのが原因ず考えられるが䜕が起こっ
        おいるのだろうか。

        a ble-decode-char に玛れ蟌むずは考えにくい。

        b terminal の echo back に匕っかかっおいるずも考えにくい。そもそもその為
          にはそれ専甚の escape sequence で囲たなければならないし、それを出力する
          ような事が起こるずも思えない。

        c _ble_edit_str を盎接線集しおいる箇所もないだろうし、

        d 䞀぀の可胜性は ble/util/assign の混線である。然し、そうだずしおも
          ble/util/assign で挿入内容を決定する様な機䌚があるだろうか。

        TAB は入力しおいなかったず思う。埓っお補完が関係しおいる可胜性は取り敢
        えず陀倖する事にする。

        →あヌ。分かった。ble/util/assign の混線である。conditional-sync で
        timeout した時に動かしおいたプロセスを kill するのを忘れおいた為に、遅
        延しお ble/util/assign の䞀時ファむルに様々な情報が曞き蟌たれお倉な事が
        起こっおいたずいう事。䞀぀前の問題もこれに関連しお発生しおいた珟象であ
        ろうず掚枬される。取り敢えず再びいろいろ詊しお問題が再珟しないか確認す
        る必芁がある。

      x fixed: failglob が発生する様な状況で failglob にならなくなっおいる。䜕
        故だろうか。これは瞬間的に timeout になっおいる所為で、failglob で倱敗
        するよりも先に timeout 142 を返しお、その為に着色が無効化されおいるのが
        原因だった。

    * done: glob が有効な堎合でも実は最初に noglob で展開を行っお、其凊に
      rex='[*?]|\[.*\]|[@+!]\(.*\)' が含たれおいる時に限り改めお
      subshell で実行するずいう圢匏にしおも良いのではないだろうか。

      これに関しおはわざわざ noglob で展開を行わなくおも、
      倉数代入を実行すれば良いのではないだろうか。
      builtin eval -- "tmp=$word"

    * done: bash3 では globstar を䞀時的に off にする事も考える。

      然し、そうするずナヌザに察しお嘘の情報を提䟛する事になる。本来は䞀臎する
      筈なのに failglob しお赀色に着色される等の可胜性。そういう事を考えるずや
      はり時間がかかっおも良いから着色するか、或いは着色自䜓を諊めるか。簡単な
      内容の堎合には着色を諊めおも良いのではずいう気がする。

      或いは、** が含たれる堎合に限っお着色を諊めるずいう手もある。即座に 142
      を出力する様にすれば良い。これで OK

    * done: 倉数展開の䞭たで参照しお noglob かどうかを刀定する前に、
      先に extract-parameter-names & 倉数内容の埩元をするべき。

      再び eval の構造を倧きく曞き換えたが取り敢えずは動䜜しおいる暡様である。
      取り敢えず conditional-sync を経由した展開も動いおいる様子だ。OK

    x 別項目: 党く同じ内容で eval を連続しお2回詊すずいう事が頻繁に起こっおいる。
      これは䜕だろうか。やはり eval-word による呌び出しず、それから本圓の着色甚
      の呌び出しが混ざっおいるずいう事だろうか。これに関しおは、eval の呌び出し
      をキャッシュする事で察応できる気がする。

      䜆し呌び出しをキャッシュするず蚀っおも、bash3 でどの様に察凊するべきかは
      埮劙である。やはり汎甚の hash 蟞曞のむンタヌフェむスを準備するべきかもし
      れない。

      これは調べおみた所、ble/syntax:bash/simple-word/detect-separated-path ず
      ble/syntax:bash/simple-word/evaluate-path-spec の二箇所で発生しおいれう事
      の様である。これは eval の内容をキャッシュする様にすれば解決する話である。
      独立項目で取り扱う事にする。

2021-01-25

  * edit: change default behavior of "C-w" and "M-w" to operate on backward words (reported by 3ximus) [#D1448]

    ? done: C-w の振る舞いを readline に合わせる?

      埌、やはりここたで来るず普通の bash ずの振る舞いの違いが俄然気になっおくる。
      やはり C-w は kill-uword ではなくお kill-backward-uword であるべきなのではないか。
      やはり既定で kill-backward-uword にする様に倉曎する。
      M-w による copy-backward-word に぀いおはどうするか。
      どうも readline の copy-backward-word は widget copy-uword ず同じ振る舞いの様である。
      しかし、M-w は元の readline では䜿われおいないし、
      ble.sh の M-w でどの様に振る舞っおも問題はない気がする。

    ? ok: C-w で kill-uword する珟圚の振る舞いに䜕か理由があっただろうか。
      䜕か理由があっお敢えお珟圚の振る舞いにしおいる可胜性もある。

      bbbd155f src/edit.sh (Koichi Murase     2019-03-22 07:28:24 +0900 6763)   ble-decode/keymap:safe/.bind 'C-w'       'kill-region-or kill-uword'
      1fc7cbaf ble-edit.sh (Koichi Murase 2017-12-04 20:48:17 +0900 6185)   ble-decode/keymap:safe/.bind 'C-w'       'kill-region-or uword'
      f18485f0 (Koichi Murase 2017-12-04 14:36:52 +0900 4442)   ble-bind -f 'C-w'       'kill-region-or uword'
      3aa7fa66 (Koichi Murase 2017-12-03 18:31:00 +0900 4461)   ble-bind -f 'C-w'      'kill-region-or uword'
      6ca737d2 (Koichi Murase 2015-02-28 12:48:55 +0900  54)   ble-bind -f 'C-w'      'kill-region-or uword'
      ^c68412b (Koichi Murase 2015-02-09 03:13:19 +0900 3381)   ble-bind -f 'C-w'      'kill-region-or uword'

      どうやら䞀番最初に commit した時から珟圚の振る舞いだった様だ。
      ここから分かる事は珟圚の振る舞いに根拠はないずいう事。
      実装初期に kill-backward-uword がなかったか䞍完党だった時からこうである可胜性がある。
      なので、振る舞いを珟時点で倉曎しおも䜕の問題もない。

      copy-uword vs copy-backward-uword に぀いおも党く同じだった。
      最初から M-w は copy-uword になっおいた。

    これは他の ble versions にも適甚した方が良いず思われるので独立した commit にする事にした。

  * edit ({kill,copy}-region-or): fix unconditionally combined kills/copies (reported by 3ximus) [#D1447]
    https://github.com/akinomyoga/ble.sh/issues/83#issuecomment-766831785

    C-w で無限に文字列が远加されおしたうずいう事を指摘された。

    % 䜕故だろう。手蚱で確認した時には動いおいる様に芋えたのに。ず思ったが手蚱で
    % 詊した時は C-k や C-u を䜿っおいたために気づかなかったずいう事の気がする。
    % →ず思ったら分かった。テストのために自分で ble-bind しおいたが、
    %   その時に kill-region-or を䜿っおいなかった。

    kill-region-or たたは copy-region-or の䞭で
    ble/decode/widget/call を甚いお widget を呌び出した時に
    LASTWIDGET が {kill,copy}-region-or に曞き換わる為に、
    無条件に前回のコマンドが切り取りコマンドであったず刀定されおしたうのが原因。
    取り敢えず修正した。ble/decode/widget/* の関数がたた増えおしたったが仕方がない。

  * mandb: man のオプションの情報が文字化けしおいる [#D1446]

    % キャッシュが党然䜿われおいない。毎回再生成されおいる様に芋える
    % ず思ったが、これは単に core-complete.sh が曎新されたから、
    % それに応じお曎新されおいるずいうだけの事だった。

    デヌタを再生成しおもやはり同様に文字化けしおしたう。

    調べるず nroff は UTF-8 には察応しおいない様だ。groff は groff -k にお
    UTF-8 に察応する様だ。曎に -k に加えお -Tutf8 も必芁だった。

    groff ではなくお nroff の時にはどうするのかずいう問題は残るが、たあ groff
    のないシステムでは UTF-8 の man は存圚しないず思っお良い気がする。なので取
    り敢えずは気にしない事にする。

  * 2020-11-02 complete: support complete_limit{,_auto} (contributed by timjrd) [#D1445]
    https://github.com/akinomyoga/ble.sh/issues/64
    https://github.com/akinomyoga/ble.sh/issues/65

    これは時間はかかったが無事に merge たで行った。

    * done: source:file においお substr を実装する。
    * done: filter を自前で実行する堎合には cand/yield 内郚での filter は䞍芁。
      これは flag_source_filter=1 を蚭定しお実行する事にした。
    * done: timjrd を README/acknowledgement に远加する。
    * done: complete_limit_reached にリヌクが存圚しおいる。
      ちゃんず source:* や candidates/generate などのコメントに䜿う倉数を蚘述しお、
      それから auto-complete の䞭で candidates/generate を呌び出す前に local で宣蚀する。

  * main: nfs の䞊に _ble_base_run があるず問題になるのでは [#D1444]
    取り敢えずロヌカルに runtime directory を䜜る時には $HOSTNAME も含める事にした。
    XDG_RUNTIME_DIR 及び /tmp を䜿う堎合には host specific であるず期埅しおその儘にする。

2021-01-22

  * edit: C-w で kill-ring ぞの远加を実装するずいう事 (suggested by 3ximus) [#D1443]
    https://github.com/akinomyoga/ble.sh/issues/83#issuecomment-764893198

    これに぀いおは先ず初めに仕様を確定しなければならない。

    䟋えば前方を切り取るコマンドの堎合には必ず巊に挿入する事にする? ず思ったが、
    そうするず C-k を連続で䜿甚した時に、切り取られる行の順序が逆になっおしたう。

    ? ずいうよりどの様なコマンドが存圚しおいるだろうか。

      | 調べるず C-k, C-u, C-w, M-d, M-h で kill-... を実行しおいる。
      |
      | widget 名で蚀うず
      | - kill-{forward,backward}-{?word,{graphical-,logical-,}line,text}
      |   これの察応は簡単。backward に削陀する堎合には prepend し、
      |   forward に削陀する堎合には append すれば良い。
      | - kill-{?word,{graphical-,logical-,}line}
      |   これは埮劙。emacs でどの様に振る舞っおいるだろうかず考えたが、
      |   よく考えおみたらその様に振る舞う物は存圚しない気がする。
      |
      |   emacs.rlfunc.txt で察応衚を芋おみたが、kill-line に察応する
      |   rlfunc kill-whole-line しか振る舞いを確認できる物が存圚しない。そしお、
      |   この rlfunc kill-whole-line は kill-line ず違っお、
      |   コマンドラむン党䜓を切り取っおしたうのでやはり振る舞いずしお異なる。
      |
      |   ず思ったが、実際に readline で実行しおみるず kill-whole-line は
      |   前回の内容に append する様である。取り敢えず ble.sh でもその様に振る舞う事にする。
      |
      | - kill-region
      |   これは前回の内容は完党に忘れるずいう振る舞いで良い。
      |
      | - vi_imap/delete-backward-word
      |   これは実は kill-ring には䜕も圱響を䞎えない様だ。取り敢えず無芖する事にする。
      |   readline の vi mode の時には kill するが combine はしない様だ。

      →結論ずしおは、kill-region,kill-region-or 以倖の kill-* は党お察象ずいう事。
      kill-backward-* に関しおは prepend で、それ以倖に぀いおは append ずいう事。

    ? ok: append/prepend をした時に元々あった内容を䞊曞きするのか、
      新しく項目が远加されるのか。
      →詊しお芋た所、䞊曞きする様である。

    ? done: /.*-range の allow_empty ずいう匕数は必芁なのだろうか。
      kill,copy,delete に関しおは決しお指定される事はない。
      replace に関しおは倧䜓指定されおいる。
      指定されおいない物は意図的な物かどうか確認する必芁がある。

      - ./keymap/vi.sh:3995:    ble/widget/.replace-range "$eol1" "$eol2" "$text"
      - ./keymap/vi.sh:4016:    ble/widget/.replace-range "$eol1" "$bol2" "$text"
        䞊蚘二぀に関しおは eol1<eol2 が保蚌されおいるのでどちらでも良い。
      - ./lib/core-complete.sh:5832:    ble/widget/.replace-range "$pos" "$comp_index" "$value"
      - ./lib/core-complete.sh:5865:      ble/widget/.replace-range "$pos" "$comp_index" "$value"
      - ./lib/core-complete.sh:5871:    ble/widget/.replace-range "$pos" "$comp_index" ''
        䞊蚘3぀に関しおも同様に pos<comp_index が保蚌されおいる。
      - ./lib/vim-surround.sh:509:  ble/widget/.replace-range "$beg" "$end" "$content"
        operator なので幅0になる事は䜙りない気がするが、䟋えば線集文字列が空の時?
        →うヌん。その様な堎合であっおも cs 経由でしかこの operator は呌び出されないので、
        結局、delimiter を䜿っお範囲を切り出そうずする段階で倱敗しおしたう。
        結局、この operator が空文字列に察しお呌び出される事はない気がする。

        もし仮に呌び出される事があったずしおも、allow_empty を指定する方が自然。

      replace-range に぀いおは垞に allow_empty ずいう事にする。
      kill,copy,delete に぀いおは垞に not allow_empty ずいう事にする。
      →曞き換えた。

    ? done: copy でも同様に振る舞う必芁があるだろうか。
      →実際に詊しおみた所、同様に振る舞う様である。。。

    動かしおいお気づいたが、C-k で行末の改行を削陀できおいない 。
    これは別 commit での bugfix にする事にする。

  * edit: support "bleopt edit_line_type" (motivated by 3ximus) [#D1442]
    https://github.com/akinomyoga/ble.sh/issues/83

    手で䞀぀䞀぀ logical-line を明瀺的に指定するよりは、
    䞀぀のオプションで䞀括で切り替えられる様にした方が良い。
    曎に、今たで既定で graphical line を䜿っおいたのを、
    logical line を䜿う様に倉曎する事にする。

  * edit (sword): fix definition of sword (motivated by 3ximus) [#D1441]
    https://github.com/akinomyoga/ble.sh/issues/83#issuecomment-764893198

    この質問で具䜓的に各単語がどのような定矩になっおいるのか説明しようずしお
    コヌドを参照した時に気づいた。sed によっお & が眮換前の文字列に展開されお、
    倉な事になっおいたのが原因。

2021-01-17

  * LC_CTYPE の切り替え゚ラヌが出る (reported by 3ximus) [#D1440]
    https://github.com/akinomyoga/ble.sh/issues/81

    実際に確かめおみたら確かに゚ラヌメッセヌゞが出る。
    過去に察策した぀もりだったが察策の仕方が間違っおいた。
    色々実隓した所、結局䜙蚈に䞀぀関数呌び出しをしなければ駄目な様だ。
    自動で stderr を抑制するように曞き換える汎関数を䜜っお察応する事にした。

2021-01-01

  * decode (ble-decode-kbd): support various keyseq specifications [#D1439]
    https://github.com/urbainvaes/fzf-marks/pull/41
    https://github.com/urbainvaes/fzf-marks/pull/43

    䞊蚘で ble.sh 特有の binding を远加しおもらったが、ble-bind がナヌザヌが自
    由に察応キヌを指定できる様に公開されおいる倉数 FZF_MARKS_JUMP の圢匏に合わ
    ない為に C-g 決め打ちになっおしたっおいる。ble-bind でも bind ず同様の圢匏
    で keyseq を指定できる様にしたい。


2020-12-25

  * edit: f1 で関数定矩を衚瀺する時に LESS=-r が効いおいない [#D1438]
    これは bash のバグの様である。バグ報告は bug-report でする事にしお、
    ここでは簡単に修正しおしたう。

  * edit: 2020-12-09 READLINE_MARK, etc. の倀が残っおしたっおいる [#D1437]

    これは ble/textarea#adjust-for-bash-bind によっお蚭定されおいる倀である。
    コマンドを実行する時に埩元・保存する様にするのが良いのではないだろうか。

    * 䜕故か READLINE_LINE, READLINE_POINT が export されおいる。
      ず思ったが、これは ble.sh を bind -x の内郚で動かしおいるからであった。
      READLINE_LINE 及び READLINE_POINT が

    * 普通の bash で実行するずどうなるのかず思ったが、どうやら自分で蚭定した
      READLINE_LINE 及び READILNE_POINT があっおも bind -x の実行ず共に削陀され
      おしたう様である。

    取り敢えず adjust/restore する様にした。コマンドの実行の間で倀が保存される
    様にした。bind -x が実行されおも倀がクリアされる事はない。

2020-12-20

  * [解消] 2020-09-27 SIGWINCH で job メッセヌゞが出る [#D1436]
    2020-12-20 これは #D1435 ず同䞀の問題であろう。盎ったず芋お良い。

    SIGWINCH に察しお次の様な job メッセヌゞが衚瀺される様になっおいる。
    [1] 終了 [[ -n $_dotfiles_blesh_manual_attach ]] | [[ -n $_dotfiles_blesh_manual_attach ]]
    これは .bashrc で蚭定されおいる関数の䞀郚である。䜕故?

    調べおみるずそもそも関数ですらなくお、
    これは ble-attach を呌び出す条件の䞭に含たれおいるコマンドだず分かった。
    ぀たり SIGWINCH に際しお ble-attach 関連の䜕かが呌び出されお、
    そしお最埌に呌び出された ble-attach の呌び出し時のコマンド文字列が䜕凊かに保持されおいる?
    もしくは再び .bashrc が source されおいる可胜性もあるがやはりそれは倉だ。

    2020-10-10 今詊しおみるず再珟しない。


  * edit: WINCH 埌に停のゞョブ情報が衚瀺される (reported by 3ximus) [#D1435]
    https://github.com/akinomyoga/ble.sh/issues/78

    前回報告を受けおいた謎のゞョブ終了メッセヌゞに぀いお。
    これは端末のサむズを倉えた盎埌に起こるずいう新情報を埗た。
    3ximus/dotfiles の .bashrc を確認しお再珟を詊みた所、
    git-prompt.sh, prompt_7.sh, ble.sh の組み合わせで再珟できた。

    曎に蚭定を最小化しおいく。どうやら fork があるず
    jobs にメッセヌゞが乗る様になっおしたうらしい。

    これの回避方法ずしおどの様な方法があるか。

    a jobs で埗た新しいむベントを陀去する?
      然し、これの問題点は唯の fork ず、
      本圓にゞョブずしお起動したコマンドの区別が付かないずいう事。

      振る舞いの違いずしおは trap handler の䞭で発生したfork に察応するゞョブの
      情報は trap handler を抜けた時に消滅しおいるずいう事である。

      䜆し、バックグラりンドずしお起動したコマンドのゞョブ情報もtrap handler を
      抜けるず消えおしたうのかもしれない。詊せば分かるが面倒なので必芁になった
      ら確認する事にする。

    b もう䞀぀の方法はシグナルを凊理しおいる時は
      jobs の曎新は行わないずいう物。これが劥圓な気がする。

      ? この珟象が起こるのは WINCH だけなのか、或いは別のシグナルでも発生するのか。
        →確認した所、INT でも同様にゞョブ情報に fork が乗る様である。

        trap '(true); jobs' INT

      ? 珟圚シグナルの䞭にいるかどうかを刀定する方法は存圚するだろうか。
        或いは ble.sh の枠組みの䞭で trap-handler 経由で呌び出されたか
        どうかの情報を甚いお刀定する?

        trap-handler の䞭にいるかどうかの刀定方法。䞀぀は return を
        䜿っお関数を抜けた時に、盎前の exit status を返すか、
        或いは固定の exit status を返すかを芋るずいう方法。
        よく考えたらこれは bash-4.4 以降でしか䜿えない。
        Bash はこの郚分に぀いお振る舞いを倉曎したのだった。

    % 取り敢えず b の方向で実装する事にする。
    % ble.sh の䞭での jobs の仕様実態に぀いお確認する。
    %
    % どうやら指定した名称に察応する jobs が存圚するかどうかの確認にも
    % jobs -- "$value" を䜿甚しおいる様である。これに぀いおは、偶々
    % value に䞀臎する終了したゞョブ名が存圚するず jobs -- "$value" を実行する事によっお
    % その情報がゞョブ情報のリストから削陀されおしたう。この問題を回避する為に
    % jobs -- "$value" を実行する為に ble/util/joblist.check を実行しおいるが、
    % trap handler の䞭で joblist.check をスキップしおしたうず、
    % そのゞョブ情報が正しく拟われずに消滅しおしたう可胜性が残る。
    % trap handler の内郚では jobs はサブシェルで実行するのが良い気がする。
    %
    % 1 done: 䜕れにしおも最初に trap handler の䞭で実行しおいるかどうかを確認す
    %   る必芁がある。特に ble.sh の実装が原因で発生する倉なメッセヌゞを防げれば
    %   良いので、trap/.handler の䞭でロヌカル倉数を定矩する事にする。
    %
    % 2 done: jobs を䜿っおいる箇所を確認する。
    %
    %   * util.sh は ble/util/joblist だけでしか jobs を呌び出しおいない。修正した。
    %   * core-syntax.sh も ble/syntax/highlight/cmdtype/.is-job-name だけで䜿っ
    %     おいる。察策した。
    %   * edit.sh では ble/builtin/exit で終了する時にナヌザに確認を求める所で実
    %     行しおいるが、exit する時には䜕れにしおもゞョブ䞀芧を出力するので敢えお
    %     盎接実行する。倉なゞョブ情報が出力される事になっおしたうがこれは仕方が
    %     ない。
    %   * 他に ble/widget/command-help/.type で jobs -- "" を実行しおいる。これに
    %     ぀いおも修正を行った。
    %
    % 3 動䜜確認: さお、実際に修正しお芋た所盎っおいない。どうも trap を抜けた埌
    %   も倉なゞョブ情報は残っおいる様である。ナヌザのコマンドずしお jobs を実行
    %   すれば倉なゞョブは消えおなくなっおいるが、bind -x の䞭から jobs を呌び出
    %   すず党お出力されおしたうずいう事だろうか。
    %
    %   サブシェルの䞭で jobs を実行する様にした結果か、䜙蚈に倧量の停ゞョブが登
    %   録されおしたっおいる。
    %
    % 改めお bind -x を組み合わせた時の動䜜に぀いおも確認する→うヌん。再珟した 。
    % WINCH の盎埌の bind -x の䞭で jobs を実行するず停情報が出る。
    % 別の bind -x を䞀回実行しおから次の bind -x で jobs を実行しおも再珟する。
    % bind -x 以倖の入力を行った埌でも、bind -x の䞭で jobs を実行するず再珟する。
    % 䞀回でもナヌザコマンドを (空でも良いので) 実行するず、停情報は出なくなる。
    %
    % こうなっお来るず倉なゞョブ情報が消えるのを埅぀䜜戊に頌るのは困難である。
    % 今たでの倉曎は取り敢えずなかった事にする。

    うヌん。trap/.handler の䞭で jobs を敢えお実行しお結果が描画に回る前に
    停情報をクリアしおしたう事にする。blehook WINCH を実行する前に joblist 曎新をしお、
    曎に実行した盎埌にも joblist の曎新を行う。二回目の joblist の曎新では、
    䞀時的に珟れおそれで盎ぐに消滅したむベントはむベントずしお登録しない事にした。

    これだず blehook WINCH を実行しおいる最䞭に終了した本圓のゞョブ終了の情報が
    消滅すrこずになるが、実際に blehook を実行しおいる途䞭に jobs の状態倉化を
    Bash が受信するのか䞍明だし、もしそうだずしおも blehook WINCH の凊理のよう
    なごく短時間でその様な事が起こる確率は䜎いず考えられる。なので、気にしない
    事にする。

    取り敢えず動いおはいる様子である。

2020-12-14

  * progcomp: : や = の quote の取り扱い (reported by 3ximus) [#D1434]
    https://github.com/akinomyoga/ble.sh/issues/77

    ? そもそも \=, \: の様に゚スケヌプしおいたのは䜕故だったか。

    ? bash-completion の提䟛した補完に察しお \= や \: の様に゚スケヌプを実斜す
      る必芁はあっただろうか。その蟺りの実装はどの様になっおいたのだったか。

    関連しそうな物を探す。ble-0.3 では = の゚スケヌプはしおいない。

    #D1133 でコマンド名に関しおは =, : の quote はしない様にしおいる。
    #D1098 6c6bae56 で = や : の゚スケヌプが導入されおいる。
    #D1094 では = や : による候補の分割を議論しおいる。

    うヌん。元々゚スケヌプは #D1098 で導入された物の様だが深くは考察しおいない。
    改めおどの様に振る舞うのが自然か考察する必芁がある。

    * そもそも ble.sh の補完は展開埌の結果を生成しお貰う前提になっおいる。
      䞀方で bash の補完は展開前の結果を生成する事を蚱容しおいる。
      䟋えば abc$(echo hello) の様な文字列を補完で生成する事すら可胜なのである。
      それどころか耇数単語からなる展開結果にする事も可胜の筈である。

    * それでは progcomp の結果はそのたた挿入する事にすれば良いのではないか
      ずも思われるが歀凊で問題になるのは、ble.sh の偎で適圓に展開を実行しおから
      COMP_LINE を構築しお progcomp に枡しおいるずいう事である。

      これは途䞭に $var 等の単玔な展開等が含たれおいる堎合でも
      progcomp で補完を実行できる様にする為に必芁。

      この時、progcomp が展開前の補完結果を生成した時に、
      それを劂䜕に元のコマンドラむン文字列に反映させるのかが問題になる。

    x [OK] 手蚱では再珟しおいないが scp chat\:down[TAB] で chat\: が消滅しおしたう?

      notepc の方は bash_completion が入っおいないので今詊せない。
      * chat は port を倉えおいるので localhost: から詊そうずしおもできない。
        localhost や chat を .ssh/config に登録しおパスワヌド無しで補完できる様にしたが、
        補完候補は出しおくれない様である。
      * hp2019 -> chat を詊しおみたが再珟しない。local にも mkdir downloads したが再珟しない。

      うヌん。取り敢えずそもそも䜕故倱敗するのか考える?
      plain bash で実行したずころ failglob で倱敗しおいる。
      shopt -u failglob にしたら ble.sh の䞭でも補完が動く様になった。

      そしお chat\: が消滅しおしたう問題に関しおは、
      plain bash でも再珟する事ができた。
      これは bash-completion の問題である。

      特にロヌカルのカレントディレクトリに "host:..." ずいうファむルが存圚する時に、
      host\:... ず入力しおいる可胜性があっお、この時に host: の郚分が消滅しおしたう
      ずいう問題が発生する。

      https://github.com/scop/bash-completion/issues で報告をしようかず考えたが、
      もしかするず最新版で盎っおいる可胜性もあるので、
      最新版の bash-completion を詊しおみおも良い。

    うヌん。progcomp による展開結果が空癜などを含んでいる時にどのように振る舞うのか。
    plain bash はそのたた䜕も加工を行わずに展開しおしたう。うヌん。
    blesh ではどの様に取り扱うべきか。

    * できるだけ progcomp が提䟛した quote を保持する様にしたい。
      然し、これは珟実的には難しいのではないか。

      a = 及び : に぀いおだけ quote しおいるかそうでないか保持する? それ以倖の
        文字に぀いおは自分で quote し盎す。

        その為には progcomp が生成した単語に぀いお = や : で分割を詊しお、その
        䞊でそれぞれ quote しおから再結合する? これだずいかにも凊理量が倧きい。
        非効率的である。

        これは凊理方法ずしお耇雑でありナヌザから芋たら䞍自然で予枬䞍胜に芋える
        かもしれない。凊理の重さずしおは次に述べる方法よりは珟実的である。

      b 入力枈みの郚分に䞀臎する郚分を陀去しおそのたた挿入。

        ここで問題になっおいるのは既に入力枈みの郚分に察応する文字列を
        どの様に取り陀くのかずいう事であった。二分法を甚いる等しお
        これに぀いお既に入力枈みの郚分を陀去する方法はないだろうか。

        どの様にしたら良いのかを調べる必芁がある。二分探玢で調べるずいう方法ず、
        1 unit ず぀読み取っお行くずいう方法の二皮類を考える事ができる。

        * 二分探玢で調べるずいうのは耇雑な気がする。元の文字列に぀いお途䞭で切
          断しお二分探玢しおいくずいう手も考えられるが、倉数名の途䞭など倉な所
          で切断するず内容が空になるなどしお意図しない結果になっおしたう。

        * 取り敢えず 1 unit (simple word element) ず぀読み取っお行っお、切断す
          るずいう方法? 然し、'...' 等の様に䞀気に読み取る事ができるliteral 等
          になっおいるずするず、実装が耇雑になる。面倒である。そもそも凊理が耇
          雑になる。面倒である。

      c 今たで通り基本的に progcomp が生成した物は展開毎ず芋做しお quote を行う。
        = 及び : は基本的には quote を加えない。compopt -o filename で quote が
        明瀺的に指定された時にのみ =, : の quote を行う。

        これは progcomp が quote を自前で行っお候補を生成した時に問題になる。぀
        たり quote が二重に為される事になり、意図しない結果になっおしたう。然し、
        この問題は今たでにも存圚しおいた問題の筈である。取り敢えずの修正ずしお
        は劥圓である。

    取り敢えず今たでも quote を勝手にする事による問題はあった。
    党おを䞀床に解決するのは難しいししなくおも良い。
    歀凊は c の方針で修正する事にする。

2020-12-13

  * README: ((_ble_bash)) && ble-attach だず set -u の時駄目 [#D1433]
    ble.sh ロヌドに倱敗した時や ble.sh を意図的に読み蟌たなかった時に
    _ble_bash が存圚しないので内容をチェックする前に゚ラヌになっおしたう。

    [[ ${BLE_VERSION-} ]] && ble-attach にするべき。

2020-12-10

  * complete/mandb: FreeBSD 䞊で man 情報の抜出に倱敗しおいる [#D1432]

    | freebsd には roff, nroff, troff 等が存圚しおいない。
    | それでも man が動䜜しおいる事を考えるず、
    | 䜕らかの方法で man pages を倉換しおいるずいう事の筈。
    | それに぀いお調べお察応する。

    察応した。FreeBSD では mandoc ずいうコマンドを䜿っお倉換を行っおいる。
    nroff ず同様に -man 等を指定する事ができる様だが、
    どうやら FreeBSD は -man ではなくお -mdoc を想定しお man pages を曞いおいる様だ。
    ずいう蚳なので -mdoc を前提ずしお抜出をする様に曞き換えた。

    ちゃんず nroff を䜿う版も動いおいる。OK

  * highlight: command \^J-a ずした時に -a がオプションずしお着色されない (reported by cmplstofB) [#D1431]
    https://github.com/akinomyoga/ble.sh/issues/76

    珟圚の着色では \-a や ''-a 等の様に quote がある堎合には、
    意図的にオプションずしおの着色を避けおいる。
    そういう意味に斌いお \^J-a もやはりオプションの前に quote が
    ある物ずしお取り扱っおオプションずしおの着色が無効になっおいる。

    a 然し意味的に考えるずやはり \^J は単語の䞀郚に含たれない様にするのが自然に
      も思われる。

      ? その様に構文解析を倉曎する事は恐らく簡単だろうが、単語の䞀郚ずしお解析
        しない郚分文字列がコマンドラむンに含たれる事による副䜜甚などはあるだろ
        うか。思うにリダむレクションなども単語の䞀郚ずしお登録しおいないので、
        特にこの事で問題が発生する事はない気がする。

      たた sabbrev の単語刀定でもやはり語頭の \^J は含たれない様にしたい。

    語頭の \^J は skip する事にする。これはどの様に実装すれば良いか?
    ^J や空癜を凊理しおいる箇所で䞀緒に凊理すれば良いだろうか。

    取り敢えず構文解析は修正した。倚分倧䞈倫。副䜜甚が起こるかもしれないが、
    それは実際に䜕かが起こっおから芋るずいう事で良いだろう。
    うヌん。問題が起こるずすれば二次的に起こる問題ではなくお、
    構文解析自䜓が倉になる可胜性が高い気がするが倚分倧䞈倫。

  * color: italic が描画できおいないずいう (by rlanore) [#D1430]
    https://github.com/akinomyoga/ble.sh/issues/73

    詊しおみるず手蚱では動いおいる。察応しおいない端末で䜿おうずしおいるのではないか。
    この Issue には返信がないがもう䞀぀の新しい Issue に察しお Terminal 情報を茉せおいる。
    Terminator 1.92 を䜿っおいる様である。

    Cygwin 付属の Terminator 0.98 は italic に察応しおいない。
    Cygwin 附属の GNOME terminal は察応しおいる。
    vte の゜ヌスコヌドを芋るず 2012 には italic 関連のコヌドが存圚しおいる様だ。
    2014 にたた別のフォント初期化コヌドが远加されおいる。然し䞀方で pango も呌び出しおいる。
    これが実際に X11 環境で䜿われるのかどうかはよく分からない。

    →これは結局向こうの tmux の蚭定が問題であった。手蚱で詊しお芋たずころに䟝
    るずどうも tmux は default-terminal の倀に応じお自身の振る舞いも倉曎する様
    である。これに぀いお wiki の manual にも曞いおおく必芁があるのではないか。
    →wiki に説明を远加した。

  * complete/mandb: ^H が倧量に挿入される (reported by rlanore) [#D1429]
    https://github.com/akinomyoga/ble.sh/issues/75

    これは nroff で倪字を衚珟するのに <CHAR>^H<CHAR> を出力する物がある為。
    なので、単に .\b を削陀すれば良い。

    取り敢えず修正しおみたが本圓に動くか埮劙。耇数の OS で詊す必芁があるのではないか。
    freebsd で詊しお芋たずころ、troff がないので動いおいない。
    これに぀いおは埌で察応する事にする。

2020-12-09

  * complete: 補完候補が曎新されない問題 (reported by 3ximus) [#D1428]
    https://github.com/akinomyoga/ble.sh/issues/74

    これは明らかに menu-filter で候補がなくなった時に、
    元の候補を党お衚瀺する様に倉曎したのが原因である。
    やはり䞀臎しなくなった時点で候補は衚瀺しない様に倉曎する事にした。

    b 或いは別の倉曎方法ずしお、候補再生成のフラグを蚭定しお、
      この時にはメニュヌから候補を拟う事はしない様にする?

      x ず思ったが、そうするず結局候補を党お衚瀺する意味がない? 候補を衚瀺する
        のはメニュヌから遞択させる為であるが、メニュヌから候補を拟わない様にし
        た時点でそれが䜿えない?

        % x ず思ったが連続 TAB や、明瀺的な menu-complete の bind の時には、候
        % 補の再生成をせずに menu に入る事が可胜になる。

        でも連続 TAB の堎合は最初の TAB の時点で候補再生成が起こるので、衚瀺し
        おいる候補が䜿われる事はない。明瀺的な menu-complete の bind に぀いおも
        既定では C-TAB 等䜙り䜿われなさそうな物になっおいるので蚭蚈に考慮に入れ
        なくお良い気がする。

      歀凊たで凊理を耇雑にしおも䜙り有甚ではなさそう。次の TAB で候補䞀芧はすぐ
      に消えおしたうので、絞り蟌み前の候補䞀芧を衚瀺しおも华っお混乱を生むだけ
      である。この遞択肢は华䞋である。

2020-12-08

  * util/term: lxterminal, gnome-terminal で vte の怜出に倱敗しおいる [#D1427]
    これは゜ヌスコヌドを確認しおみた所、xterm の version 抜出コヌドを远加した時
    に動かなくなった物の様に芋える。修正した。

2020-12-01

  * prompt: PROMPT_COMMAND で倉曎した PS1 がその堎で反映されない (reported by 3ximus) [#D1426]
    https://github.com/akinomyoga/ble.sh/issues/72

    確認した。これは曞き換えミスである。prompt_ps1_final 等の曞き換えの時に、
    曎新の必芁性があるかどうかの刀定を PROMPT_COMMAND よりも前に持っおきたのが行けない。

    これはどの様に修正したら良いだろうか。PROMPT_COMMAND は曎新の必芁がある時に
    のみ実行したい。或いは :leave: の時にも実行するべきだろうか。leave の時に
    PROMPT_COMMAND は実行しなくおも良い気がしおきた。うん。その様に倉曎する。

  * complete: 単語補完で = の右蟺の . で始たるファむル名が補完されない (reported by cmplstofB) [#D1425]
    https://github.com/akinomyoga/ble.sh/issues/71

    これは詊しおみた所、a= で補完しおから . を入力しお絞り蟌みをするず、最初の
    a= の時に . で始たる候補が列挙されおいなかった為に、絞り蟌みモヌドに入っお
    も . で始たる候補が列挙されないたたになるずいう問題。a=. たで入力しおから初
    めお補完を開始する様にしたらちゃんず . で始たるファむル名でも補完できる。

    修正の方向性ずしお二぀考えられる。

    a 䞀぀は最初から . で始たるファむルも列挙しおおくずいう事。

      ぀たり dotglob を有効にしお補完を実行すれば良い。

      この方法だず . から始たるファむル名も党郚衚瀺されお煩い様な気もするが、よ
      く考えれば䞀文字でも入力しおいればこれらの候補は衚瀺されないのだし、. を
      含めお候補生成しおも特に問題ない気がする。

    b もう䞀぀の方向性は a=. たで入力した埌に先頭䞀臎する候補が芋぀からないず分
      かった時点で候補を再生成するずいう事。

      x この方法だず BS で巻き戻しお再床候補を衚瀺しようず思っおももう戻っおこ
        ないずいう問題がある。改めおその堎所から補完を実行しなければならなくな
        る。

      x たた . が郚分䞀臎しおいる堎合には、先頭の . が郚分䞀臎を意図した物なの
      か、或いは . で始たるファむルを改めお生成するべきかの刀断が付かない。安党
      偎に倒すずすれば . から始たるファむルを再生成すれば良い気もするが、そうす
      るず郚分䞀臎を意図しおいた時に䜍眮文字入力する床に候補が再生成される事に
      なり重くなる。或いは、本圓に特定のコマンドの時にだけ再生性を行うずいう事
      になり䞍自然な気がする。

    x a の方針で実装しおみたが実際に動かしおみるず動かない。ずいうよりナヌザが
      dotglob を有効にしおも勝手に dotglob が off になっおしたう。䜕故だろうか。
      うヌん。

      * ble.sh だけしか読み蟌んでいなくおも勝手に dotglob が off になっおしたう。
      * 補完を詊みない限りは dotglob に倉化はない。
      * dotglob ずいう文字列を含むコヌドを党おコメントアりトしおも dotglob が
        off になっおしたう。

      どうやら GLOBIGNORE= : を実行しただけで dotglob の蚭定が倉わっおしたう様
      だ。そしおこの振る舞いは bash のマニュアルに曞かれおいる。

      珟圚の実装で GLOBIGNORE を蚭定しおいるのは core-complete.sh だけである。
      glob 展開を抑制しお split を実行する箇所では GLOBIGNORE=* ではなくお set
      +f を甚いる様に倉曎を行った。その他の eval-pathname-expansion は珟圚の
      GLOBIGNORE の蚭定に忠実に展開を実行するので GLOBIGNORE には觊らない。

      改めお GLOBIGNORE の取り扱いに぀いお考え盎す必芁がある。local GLOBIGNORE
      ずするず bash-3.0, 3.1 で圱響が残っおしたう問題があった。ここでは䜕凊かに
      倀を保存しおおいおそれを埩元するずいう圢にするべきか。

      →その様に曞き盎した。dotglob はこれで勝手に曞き換わらない。. で始たる候
        補もちゃんず出力される様になった。

  * highlight: ~+ 等のチルダ展開が着色されない (reported by cmplstofB) [#D1424]
    https://github.com/akinomyoga/ble.sh/issues/71

    Cygwin 䞊では再珟しなかったが Linux 䞊では再珟した。調べおみるず
    ble/syntax:bash/simple-word/locate-filename/.exists を呌び出した時点で単語
    が ''~+ の様に曞き換えられおいお意図的にチルダ展開が無効になっおいる。

    調べおみるず構文解析の段階で ~ に tilde 属性が蚭定されおいない時には
    notilde が指定される様になっおいた。実際に構文解析の結果を芋るず䜕故か ~+
    の時には ~ にチルダ展開の着色が為されおいない。これは構文解析の問題である。

    どうも分かった。shopt -s extglob になっおいるず +() の可胜性が考えられるの
    で、~+ が来おも ~ 迄で構文解析が䞀旊切れる。これでチルダ展開の可胜性を刀定
    しようずするず、埌ろに䜙分な文字が存圚するずいう理由でチルダ展開が無効化さ
    れる。なので tilde が構文着色されない。結果ずしお単語着色でチルダ展開が無効
    化されおいる。

    そもそも extglob が有効になっおいる時に + が含たれおいる単語は単玔単語なの
    だろうかずいう疑問もある→実際に詊しお芋るずちゃんず単玔単語ずしお認識され
    おいる。+() が含たれおいる堎合には単玔単語ではない。よく考えたら圓たり前ず
    いえば圓たり前。() が含たれおいるかどうかだけ刀定すれば良いのだから。

    a reject: うヌん。珟圚の文字集合ベヌスの刀定ではなくお simple-word で刀定し
      おしたうずいうのが自然な気がしおきた。䜆し、/: 等は含たれない様にする。ず
      思っおその様に曞き換えおみた。

      x しかし、よく考えおみたらこの堎所に斌ける刀定は構文解析の 1 step である。
        なので、simple-word の様に耇数の解析ステップを跚ぐ様な先読みを実行する
        ず倉な事になる。なので、やはり元の実装のように chars ベヌスで刀定しなけ
        ればならないのである。

    b reject: 䞀回の解析で読みきれない様なチルダ展開は着色しなくおも良いのでは
      ないかずいう説。䟋えばナヌザヌ名ずしお a~b~c の様な倉な物を遞んだ時に、果
      たしお ble.sh が ~a~b~c の様なチルダ展開に察しお正しく凊理を行う必芁があ
      るのかずいう話。

      そうは蚀っおもナヌザヌ名の堎合には倉なナヌザヌ名にするのが悪いずいう事に
      なるが (ble.sh に限らず様々な堎所で問題が起こるだろう)、~+ に関しおは暙準
      で存圚する特別な指定なので、やはりちゃんず凊理したい。

    c + を特別扱いする? 結局これが珟実的な解になるのだろう。

      ~+ の時にはこれ党䜓をチルダ展開ずしお抜出する? ず思ったがそうするず ~+ た
      でが解析終了点ず刀定されお、~+(echo hello) 等を正しく構文解析できなくなる。

      或いは ~+ で始たる時だけ完党に独立に実装し盎す事にする?

      色々詊行錯誀したが、既存のコヌドず同じ凊理にしお䜆し、~+ がチルダ展開でな
      かった時に ~ たで埌退するずいう実装方法にする事にした。

    d ~ の盎埌で切れおも良いがその盎埌が + の時には特別にチルダ展開を蚱容する?
      ず思ったが、これだず ~+aaa 等の時にもチルダ展開ずしお着色されおしたう。駄
      目。

    x 結局 c の方針で実装したが今床は ~+(echo) が動かなくなった。ちゃんず解析䜍
      眮を埌退する様にした筈なのに。ずいうより ~+ がチルダ展開ずしお着色されお
      いる。

      →分かった。 ~+( ずなっおいお "(" が delimiter ずしお登録されおいるので、~+
      ず ( の間で単語が切れおいるず刀定されおしたっおいる。これは駄目。"(" は
      delimiter ずしお登録しなくおも良い気がする。→そのように盎した。

    動いおいる気がする。

2020-11-27

  * complete: dynamic sabbrev が動かなくなっおいた (reported by darrSonik) [#D1423]
    これは cand/yield を sabbrev/expand の䞭で䜿っおいたが、
    cand/yield に察する芁求が増えおいたのが原因だった。修正した。
    他の ble/complete/cand/yield の箇所で問題がないかも確認した。
    本来は積極的にテストを远加するべきなのである。
    然し、察話的な昚日に察しおテストを远加するのは面倒である。

2020-11-26

  * 2020-03-22 syntax: { echo $fd; } {fd}>&0 の着色が倉 [#D1422]
    これは単語着色の陀去ができおいない問題であろう。

    →これは #D1421 ず党く同じ問題で、#D1421 に䌎っお自然解消した。

  * 2017-11-26 highlight: 配列代入の解析の䞍敎合? [#D1421]

    最初から arr[index たで入力した時の着色ず
    arr[index] たで入力しおから䞀文字削陀した時の着色が異なる。

    | _ble_syntax_attr/tree/nest/stat?
    |  7 aw   000 'a'  stat=(CTX_CMDX w=- n=- t=-:-)
    |  8 a e  001 '['  nest=(CTX_VRHS w=ATTR_VAR:0- n=- t=-:-)
    |  8*a    002 'a'  stat=(CTX_EXPR w=- n=@1 t=-:-)
    |  6*a e  003 'b'
    |  |    s 004 ^@  stat=(CTX_EXPR w=- n=@1 t=-:-)
    | \_ 'a[ab'
    |     \_ '[ab'
    |
    | _ble_syntax_attr/tree/nest/stat?
    |  7 aw   000 'a' |  stat=(CTX_CMDX w=- n=- t=-:-)
    |  8 aw   001 '[' || nest=(CTX_VRHS w=ATTR_VAR:0- n=- t=-:-)
    |  8*aw   002 'a' || stat=(CTX_EXPR w=- n=@1 t=-:-)
    |  |*aw   003 'b' ||
    |  8*aw   004 ']' ++ word=CTX_CMDI:0-5>@4 word="a[":1-5 stat=(CTX_EXPR w=- n=@1 t=-:-)
    |  |    s 005 ^@    stat=(CTX_ARGX w=- n=- t=$5:-)
    | \_ 'a[ab]'
    |     \_ '[ab]'
    |
    | _ble_syntax_attr/tree/nest/stat?
    |  7 a    000 'a'  stat=(CTX_CMDX w=- n=- t=-:-)
    |  8 a e  001 '['  nest=(CTX_VRHS w=ATTR_VAR:0- n=- t=-:-)
    |  8*aw   002 'a'  stat=(CTX_EXPR w=- n=@1 t=-:-)
    |  6*awe  003 'b'
    |  |    s 004 ^@  stat=(CTX_EXPR w=- n=@1 t=-:-)
    | \_ 'a[ab'
    |     \_ '[ab'

    どうも構文の状態は同じだ。単語の着色が異なる。
    しかしそもそも䜕故単語着色が起こっおいるのだったか。
    単語着色は CTX_CMDI ずしおの着色が残っおいるずいうこず。
    これは単語着色の偎の問題であっお、解析の問題ではない。

    2019-02-13 "{ echo; } 3>&1" ず入力した時にも
    䌌たような事になる。"{ echo; } 3" たで入力した時の単語゚ラヌ着色が
    最埌たで残っおしたう。#D0930

    2020-11-26 改めお振る舞いを確認しおみる。a[a ずするず単語が消滅しおいる。
    たた、a の堎所に単語着色が残っおいる。消滅した単語に察する凊理がない事が原因。

    消滅単語に関する凊理は今どうしおいるのだったか。note.txt の䞭を怜玢しおみた
    がよく分からない。消滅単語の範囲にある単語に぀いお再床着色を実行するずいう
    事が曞かれおいるが 。

    うヌん。ble/highlight/layer:syntax/update-word-table の内郚で消滅した単語の範囲を
    _ble_syntax_word_u{min,max} 及び color_u{min,max} に反映させおいる。
    曎に ble/highlight/layer:syntax/word/.apply-attribute 0 "$iN" d を実行しお、
    color_u{min,max} の内郚にある属性を党お消去しおいる。
    その埌で挞く各単語の属性に基づく着色を蚈算しおいる。
    ぀たり、消滅単語の範囲が狭すぎる。恐らく単語登録䜍眮の範囲であっお、
    単語が実際に暪たわっおいた範囲ではないのである。

    然し実際に ble/syntax/vanishing-word/register の実装を芋おみるず、
    ちゃんず wbeg, wend を埗おそれに基づいお範囲を曎新しおいる。
    これが意味する所は䜕か。消滅した単語がちゃんず登録されおいないずいう事か?
    vanishing-word の䞭で倉数を出力しおみたが、どうやら lbeg,lend が狭く蚭定されおいる所為で
    wbeg,wend が狭められおれロ幅になっおいる様である。lbeg,lend ずは䜕か。䜕を目的ずした匕数か。

    確認しおみるずどうやら 0:i1 に曎新範囲を制限しおいる。
    ぀たり、解析開始点よりも前に䜍眮する消滅単語に぀いおしか消去しおいない。
    これを 0:i2 に拡匵したらどうなるだろうか 。もしかするず、
    既存の消去しおは行けない単語に぀いおも消去しおしたう可胜性もある。
    実装に぀いお確認する必芁がある。

    確認するず実際に単語終端が i1:i2 の倖にある単語が残っおいるず、この単語に぀
    いおの着色が消されおしたう気がする。ず思ったが、単語終端が倖偎にあっおもそ
    の䞀郚が i1:i2 の内偎にあるのであれば、必ずその単語は属性再蚈算の察象になる
    のだからちゃんず曎新されお然るべきである。うヌん。0:i1 で vanishing-word を
    制限しおいたのは単に最初の clear を最小限にするのが目的ずいうだけの気がする。
    ずいうか color_u{min,max} を広げれば良いだけの話では? ず思ったがどう広げる
    のが良いのかずいう事を考えるず結局 vanishiing-word を芋お最小限の広げ方に留
    めるのが良い気がする。ずいう蚳で、やはり vanishing-word の方を広げる事にする。

    取り敢えず修正した。効率化する為に syntax:layer/fill も
    新しく ble/dense-array#fill-range ずいう関数を䜜っお眮き換えた。
    動いおいる。䞊蚘の a[a] の着色も { echo; } 3>&1 の着色も盎った。
    取り敢えずはこれで様子芋ずいう事で良い気がする。

  * 2020-11-07 highlight: declare 等に指定したオプションの着色に぀いおも察応する [#D1420]
    →declare の着床は特別にしおいるず考えおいたが実際に芋おみるず、
    通垞の匕数ず同じ仕組みを通じお凊理しおいた。特に CTX_ARGVI も
    オプションの刀定に含めるだけで察応する事ができた。

2020-11-20

  * highlight: bin が存圚しないディレクトリで bin/ ずした時に゚ラヌ着色されなくなっおいる [#D1419]

    どの様に倉曎しお動かなくなったのか調べようずしたが、
    逆に今たでの実装で䜕故動いおいたのかよく分からなくなった。
    今たでの実装を芋る限りはディレクトリ名でなければやはり着色されない気がする。

  * highlight: option を cut/paste するず䜕故か着色されない [#D1418]
    ファむル名に関しおも同様に着色されなくなっおしたっおいる。
    䜕が起こっおいるのかに぀いお調べる必芁がある。

    そもそも以前の version ではちゃんず動いおいただろうか。
    やっぱり前の version では動いおいる。
    犯人は䞀番最埌の commit である事も確定した。
    そんなに倉な倉曎はしおいない筈なので簡単なミスではないか。
    然し、䜕が原因か思い圓たる節もない。
    同じ単語でも着色される時ずされない時があるから、
    単語着色の決定自䜓に問題がある蚳ではない気がする。

    うヌん。どうも comp_words の時点で単語が䞀぀少なくなっおしたっおいる。
    調べるず実は別に単語が枛っおいる蚳ではない。
    ルヌプに戻っお確認しおみるず途䞭で i が曞き換わっおいる。
    倉数リヌクだった。修正した。

2020-11-16

  * complete: echo ~ TAB ずしおメニュヌを衚瀺した埌 [#D1417]
    存圚しないチルダ展開を詊みるず ~ が重耇しお挿入されおしたう問題。

    これは䜕が起こっおいるのだろうか。
    メニュヌを衚瀺しおいない時には䜕も起こらない。

    ~x が空の文字列に展開されおその埌に文字列が挿入されおいる可胜性?
    menu 経由の候補に察する曖昧補完かもしれない。
    然し、~x ずなっおいる物は展開されない筈だし䜕かが倉。
    具䜓的に䜕が起こっおいるのか確かめる必芁がある。

    メニュヌから初期化した cand_cand 及び cand_word は特に倉な事にはなっおいない。
    そもそも既存の文字列を保持したたた挿入されるずいう点が䜕か倉である。
    ~1234 が ~~1234 になる。1234 が䜕凊から来たのかずいう事を考えるず、
    これは候補から生成された文字列ではない?

    調べおみるず ble/complete/candidates/determine-common-prefix が既に
    ~~1234 ずいう文字列を返しおいる。

    * 調べおいくず count-match-chars が 0 を返しおそのたた結合しおいる。
      䜕故 ~ を共有しおいるのに count-match-chars が 0 になる?
      ず思っお comp_filter_pattern を確認しおみたが䜕故か空である。

      →単に count-match-chars は comp_filter_pattern を䜿わないからだった。
      なので init を実行する必芁はない。確認するべきは COMPV でった。

    * それから common0 を展開した結果が /home/murase になっおしたっおいる。
      うヌん。埌に䜕か文字列が続く事によっおそこたでの展開結果が倉化しおしたう、
      ずいう状況を今たで考慮に入れおいなかった。この堎合にどの様に取り扱うのかは埮劙。

      取り敢えず COMPS で芋た時の共通郚分は瞮玄する?
      或いはチルダに関しおは䜕らかの特別な取り扱いを行う?
      よく考えたらグロブ展開でも同様の事は起こるのではないか。
      ずいう事を考えるずチルダに関しおだけ特別扱いしおも仕方がない。

    結局、既存の文字列 ~1234 ず共通郚分 ~ を比范したい所が、
    ~1234 ず ~ の比范になっおしたっおいお、
    それが展開されお ~1234 ず /home/murase の比范になっおしたっおいる。

    うヌん。明確な解決方法はない気がするが COMPS を通じお瞮玄する事にする?
    或いは * や ~ などを特別扱いしお瞮玄するか 。
    glob を off にしお ~ 展開も off にしお芋る?

    →取り敢えず noglob, notilde で展開した結果を甚いお挿入を行う事にした。
    埗られた結果に含たれる *?[ などの glob は党お glob ずしお quote せずに挿入しおしたう。
    これが意味する所は 'a*b' ずなっおいたずしおも、a*b になっおしたうずいう事。
    これは実装の制限である。

  * complete: source:file の実装で ~+ 等の特別なチルダ展開の候補が列挙されない [#D1416]

    これに぀いおは䞀床考察した様な気もするが忘れた。ず思っお改めお実装を確認し
    おみるずチルダ展開による候補生成は ~ 単䜓でも発生するので、実は ~ だけでも
    起動する筈である。しかし実際には動いおいない。

    x fixed: 動く筈のチルダ展開による候補生成が動いおいない。調べおみるず
      yield-filenames の䞭で消滅しおいる様だ。曎に調べるず cand/yield の䞭で消
      滅しおいる。filter:head/test で陀倖されおいる様だ。head は実際には䜕の制
      限も行わないずいう物なので head/test の実装を true に眮き換える事にした。

      ず思ったがそれで良いのだろうか 。珟圚の実装だず取り敢えず可胜な候補を党
      お列挙しおいるので、filter をしない様にするず党お列挙されおしたう。

      䞀方で filter を実行する様にするず filter 偎は $COMPV (/home/user) でフィ
      ルタしようずしおいるのに、こちら偎は ~user を枡そうずするので垞に陀去され
      おしたう。ちゃんず filter する為には COMPS を甚いお filter する必芁がある。
      →その様に実装した。OK。動いおいる。

    ? ok: head/test を true に眮き換える事による圱響は? 他の箇所で埓来から盎接
      filter:head/test を呌び出しおいた箇所での振る舞いが倉化しおしたわないか確
      認する必芁がある。

      →やはり filter:head を曞き換えるのは止めた。filter:none を新しく远加しお
      最初の候補生成の時にだけ filter:none を指定しお、それ以倖の filter では
      既定で head を䜿甚する事にした。

      たた、今たで menu-filter は head に䞀臎する物のみを絞り蟌んでいたが、候補
      が党お珟圚入力枈み単語に䞀臎しない堎合は、最初に生成された候補を党お衚瀺
      する事にした。遡っお曞き換わる様な候補を補完噚が生成したかもしれないし、
      もしそうでなくおも生成された候補の䞭から遞べる様にするのは䞀぀の手であるから。

      もしかするず候補が党く生成されない時には再床補完噚を呌び出す様になっおい
      るかもしれないず思っお確認したが、特にそういう事はしおいない様だ。よく考
      えたらその様に実装するず本圓に䞀臎しない文字列を入力した時に、文字を入力
      する床に補完噚を呌び出す事になっお効率が悪い。なのでその様な実装になっお
      いるずは考えにくい。なので、この可胜性は考えなくお良い。(もしそうなっおい
      たら勝手に党候補を返すずいう様に振る舞いを倉える蚳には行かなくなる。)

  * complete: CDPATH を蚭定しおいるず候補が重耇しお生成される (reported by Lennart00) [#D1415]
    https://github.com/ohmybash/oh-my-bash/pull/183
    oh-my-bash の Issue を芋おいたら偶然発芋した。

    確かにそうだ。そしお . を CDPATH に指定する意味があるのかず思ったが、色々詊
    しおみるず、どうやら CDPATH を指定しおいるず珟圚のディレクトリよりも CDPATH
    で芋぀かったディレクトリの方が優先される。これを防ぐために . を CDPATH に含
    めるずいう方法が䜿える様である。

    埌、action:file にしお候補を登録しおいるがこれだずディレクトリが芋぀からな
    いので゚ラヌ着色になっおしたう。新しい action を定矩する事にする。

    * うヌん。珟圚、カレントディレクトリ以䞋のディレクトリ名に぀いおは
      source:dir を通じお列挙しおいるが、CDPATH で既に芋぀かった物ず同じファむ
      ル名を持぀ディレクトリに぀いおは yield しない様にする必芁がある。

      どの様に凊理するべきだろうか。source:dir で䜕らかの陀倖条件を倖郚から指定
      できる様に曞き換えるか、或いは source:dir の実装を真䌌お自前で実装するか。

      →改めお自前で complete:cd 内郚で source:dir ず同様の事を実行する事にした。
      䞀郚の共通凊理は source:tilde ずしお括りだす。実装した。動いおいる気がする。

    動䜜確認する。

    x fixed: "[[ ${$1[x\$2]+set} ]]: 誀った代入です" ずいう゚ラヌメッセヌゞ。
      これは ble/set#contains の内郚でのクォヌト忘れ。

    x fixed: cdhist 候補の背景色が濃すぎる気がする→倉曎した。

    x fixed: 珟圚のディレクトリ由来のファむル名も cdhist 着色になっおいる。
      これはディレクトリ名に付加した / を陀去するのを忘れお . ず比范しおいた為。

    x fixed: bleopt complete_menu_style=desc にしお芋た所 segfault した。無限再垰だろうか
      →action:cdpath/get-desc を定矩する所を action:file/get-desc を䞊曞きしおいた。
      そしお、内郚では action:file/get-desc を呌び出しおいた。

    x fixed: やはりg倀を合成するず芋にくい色になっおしたう。
      ディレクトリの皮類に応じた色は desc の方で着色するべきでは。

  * complete (source:file): tilde expansion の補完が filter されずに登録される気がする [#D1414]

    際にコヌドを調べおみるず他にも filter されずに登録されおしたう箇所があった
    ので䞀緒に修正した。

    flag_source_filter に察する修正はyield-filenames の䞭ではなくお、
    yield-filenames に枡すファむル名を生成しおいる偎である呌び出し元で行うべき
    である。その様に曞き換えた。

2020-11-15

  * 2020-11-13 complete: cd の曖昧補完で意図せず遡っお曞き換わる (reported by cmplstofB) [#D1413]
    https://github.com/akinomyoga/ble.sh/issues/67

    これは yield で filter する様にした結果である。progcomp は実行する前に
    compvを reduce する。䞀方で source:dir は compv が reduce されおいないずい
    う前提の䞋で、maA フラグに埓っお候補を生成する。その時に filtering は意図的
    に offにしおいる。ここで progcomp の䞭から source:dir を呌び出すず reduce
    されたcompv で生成された候補が党お filter なしで登録されおしたう。

    この問題に察する正しい察凊法は䜕だろうか。bash progcomp の枠組みにおける呌
    び出しでは、曖昧補完には察応しおいないので珟状通り reduce しお良い。
    complete:cd に関しおは曖昧補完を認識しおいるので、勝手に reduce しない様に
    するべきだろうか。

    * complete:* で個別に曖昧補完に察応する?

      o ble.sh native な補完蚭定ずいう事であればそれが自然な気がする。

      x 党おの complete:* の実装は曖昧補完に察応する必芁がある。ナヌザヌが補完
        を実装するのが面倒になっおしたう。

        →然し珟状ではドキュメントも敎備しおいないし実際に自分で定矩しおいるナヌ
          ザもいないから、砎壊的倉曎は気にせずできる。

        →ナヌザが真面目に実装しおいなかった堎合には head に察応する候補が毎回
          生成されるだけなので 2回目以降の呌び出しでは filter されお䜕も生成さ
          れない。凊理時間が無駄に増えるだけである。ナヌザの入力があれば候補生
          成を停止しおいる様にしおいるので芋た目の動䜜ずしおは䜕も問題は発生し
          ない。

      取り敢えずその様に曞き換える事にしたい。この時、reduce はもっず埌で実行する必芁がある。

      →実装を確認しおみた所、実は progcomp は COMPS, COMPV を党く参照しおいな
      い? ぀たり、単玔に COMPS, COMPV に察する補正をしない様に倉曎すればOK?

    色々曞き換えた。結局、COMPS, COMPV はそのたたにしお、comp_* の方を適圓に
    reduce した物に曞き換える事にした。これで問題は起こらない筈。元のデヌタを曞
    き換えおいないし、bash progcomp ず blesh progcomp で同じ倉数を芋おいるので、
    䞡者で曖昧補完に察応した補完実装もできるし、察応しおいない補完実装もできる。

    以䞋デバグに䜿った .bashrc の蚭定

    | # bashrc
    |
    | blehook/eval-after-load complete debug1
    | debug1() {
    |   ble/cmdinfo/complete:cd() {
    |     local ret
    |     ble/complete/source:file/.construct-pathname-pattern "$COMPV"; local pattern=$ret
    |     ble/debug/print-variables COMPS COMPV pattern
    |     ble/complete/util/eval-pathname-expansion "$pattern/"
    |     ble/debug/print-variables ret
    |     ble/complete/util/eval-pathname-expansion "$pattern"
    |     ble/debug/print-variables ret
    |   } >> a.txt 2>&1
    | }
    |
    | comp1() {
    |   ble/debug/print-variables COMP1 COMP2 comp_type
    |   ble/debug/print-variables comp_cword comp_words
    |   ble/debug/print-variables COMP_CWORD COMP_WORDS
    | } &>/dev/tty
    | complete -F comp1 comp1

  * complete: 䞀旊 option の補完を実行するず bleopt complete_menu_style が曞き換わる [#D1412]

    local bleopt_complete_menu_style ずしお曞き換わらない様にしおいる筈なのに。
    これは auto_complete 経由で曞き換わっおいる?
     →やはり auto-complete であった。修正した。

  * syntax: simple-word でない時に゚ラヌ着色になっおしたう (reported by cmplstofB) [#D1411]
    https://github.com/akinomyoga/ble.sh/issues/68

    #D1409 の曞き換えに䌎うバグだろう。

    これは簡単なミスだった。is-simple のチェックが抜けおいた。locate-filename
    を䜿う堎合は内郚で is-simple に盞圓するチェックを行っおいたが、それ以倖の単
    語党䜓をファむル名ずしお刀定する堎合には is-simple チェックがなくなっおいた。
    盎した。

2020-11-12

  * syntax: オプションの単語着色にも察応したい [#D1410]

    コヌドを少し確認しおみたが耇雑になりそう。- で始たる物に぀いおは匷制的にオプ
    ションず芋做す様にする。䜆し、-- が途䞭にある堎合には着色しない様にする。

    ず思ったがその様に実装する為には、コマンド抜出をしお -- がないかどうか確認す
    る必芁が出おくる。぀たり、凊理が重くなる可胜性があるずいう事? ず思ったが珟圚
    の実装ではコマンド抜出はどうなっおいたのだったか。独自の着色を蚱すのだずした
    ら䜕れにしおもコマンド抜出を始めに実行しなければならない。そしお各単語に぀い
    お毎回コマンド抜出をしおいるず非効率である事から、普通に考えお単語情報はちゃ
    んず既にあるず考えるのが自然。珟圚の実装を確認。

    呌び出し元で -- の確認をしおオプションを付加するのが良い気がする? 実装を確認
    しおみたが、単に各単語に぀いお word:default を呌び出しおいるだけであった。぀
    たり、぀たり単語に぀いお調べる必芁がある。

    実装しおみたが埮劙。途䞭に = や : がある堎合は陀倖しおいる。本来は = の巊偎
    ず右偎で独立に着色を決定したい。右偎も着色する為には右偎に察しおパス名の着色
    を適甚できる様にしなければならない。

    パス名に぀いおは =, : で区切っお着色を䞎えおいるが最埌のパスしか着色しおいな
    い。パス名の着色に぀いお再考しおから察応する必芁がある気がする。

    → #D1409 で䞀緒に実装した。

    * -- ずいう匕数が指定された埌はオプションずしお解釈しないずいう凊眮が未実装。
      →察応した。

    * mandb による補完候補の着色にも同じ色を甚いる。

  * highlight: =, : で区切られたパス名の着色に぀いお再考 [#D1409]

    珟圚の実装では locate-filename で最初に党䜓に䞀臎を詊みお、それから次に先頭
    から順に削っおいくずいう方法になっおいる。この様になっおいるのは
    https://... 等の圢匏の URL たたは C:\... の圢匏のファむル名を認識する為であ
    る。これを拡匵しお任意の堎所で切れる様にするにはどうしたら良いか?

    䟋えば A:B:C ずなっおいたずする。できるだけ長く䞀臎させたいので A:B:C から順
    に詊しおいく? A:B, A ず詊しお、駄目であれば B:C, B, C ずいう順に詊しおいく。
    途䞭で䞀臎した堎合にはそれで確定しお、未凊理の文字列に぀いおたた続きから詊す。

    珟圚の実装では =, : を等䟡に取り扱っおいるが、= は最初の䞀぀だけ凊理する様に
    したい。或いは、最初に = で分割しお、その埌で : で分割する? 䜕だかよく分から
    ない。。。ずいうより、= に぀いおは巊蟺の圢に制限を加えるべき。倉数代入圢匏か、
    或いは -[-[:alnum:]_]+ で䞀臎させる事にする。

    a. ^-[-[:alnum:]_]+= に䞀臎する堎合には、= 以前を匷制的にオプション着色にす
      る。この堎合には右蟺の䞭の = は分割に寄䞎しない。右蟺は : で分割しおも良い。
    b. ^[[:alnum:]_]+= に䞀臎する堎合には党䜓をファむル名ず芋做しおも良いし、或
      いは、右蟺をファむル名ず芋做しおも良い。右蟺は : で分割しおも良い。
    c. それ以倖の堎合には = は分割でない。: で分割しおも良い。

    1 先ず初めにオプションに䞀臎するか確認しお、もし䞀臎したら其凊たでを凊理枈みにする。
    2 オプションに䞀臎しない堎合には倉数代入の圢匏になっおいるか確認しお、
      もし倉数代入の圢匏であれば = を可胜な分割点の候補ずしお登録する。
    3 残りの郚分は : を分割点の候補ずしお登録する。
    4 分割点の候補を元にしおできるだけ長く䞀臎させる。

    eval の戊略に぀いおも考える必芁がある? 分割点が決たったら先に各芁玠を eval
    しおしたうか、或いは、詊行の床に eval を実行するか。うヌん。各芁玠を eval し
    おから繋ぐ事を考えおいたが、実は詊行の床に eval しおも良いのではないかずいう
    気がしおきた。OK

    * done: ble/syntax/progcolor/wattr#* の敎備

      次に考えるべき事。各パス芁玠毎に着色をするずするず、前のパス芁玠の結果を明
      瀺的に凊理しなくおも自動で構築できる様な方法で登録する必芁がある。

      wattr を動的に構築できる様に枠組み (ble/syntax/progcolor/wattr#*) を敎えた。
      先ずは既存の振る舞いを壊さない様に wattr#* に移行する。以前よりもコヌドが
      すっきりした。

      曎に progcolor/word:default に぀いおも党䜓に wattr#* を䜿う様に曞き換えた。
      前より少しぐちゃっずしおいる気がしないでもないが、恐らく慣れの問題だろう。
      客芳的に考えれば倉数の倉な取り回しも陀かれお前よりも敎理されおいる筈。

    オプションの着色は埌回しにしお、取り敢えずパス名の着色に぀いお再床。

    取り敢えず = による分割は確定ずいう事にしお、探玢は : 区切りだけにする。或い
    は , も区切り文字ずしお解釈しおも良いかもしれない。ずいうのも、
    -Wl,-rpath,... 等の様なオプションの指定の仕方をする事がある為。

    * done: locate-filename を耇数のパスを抜出する様に曞き換える。
      →曞き換えた。ret は配列になり第䞀芁玠は今迄ず同じく範囲の開始である。
      䜆し、最埌の範囲ではなくお最初の範囲の開始である事には違いがある。
      これだず範囲の開始点以降党おをファむル名ずみなす実装に斌いお問題が出るが、
      関数の意味的にはそんなに倉な拡匵ではないので良しずする。

    * done: locate-filename を甚いお新しく各パス芁玠を着色する様に倉曎した。動い
      おいる。叀い実装はもう削陀しおも良い様な気がしおいる。オプションに関しおも
      ちゃんず動いおいる。

    * ok: highlight: echo hello:~ においお ~ の着色が行われない。ず思ったが、こ
      れは恐らく意図した振る舞いである。ず思っおコヌドを確認したが、やはりちゃん
      ず凊理しおいない気がする。倉数代入圢匏の時には ~ を有効にしたい。ず思っお
      実際に詊しおみるずちゃんず倉数代入圢匏の堎合には ~ の着色が有効になっおい
      る。これに぀いおはどうやっお実珟されおいるのか改めお確認が必芁である。

      →これに぀いおは分かった。文法解釈を参照しお tilde がチルダ展開の物かどうか
      刀定しおいる。この実装で良い。

    x fixed: パス芁玠が誀っおいる堎合に locate-filename でファむル名ず怜出されず
      に着色されない。この堎合には途䞭の正しいディレクトリ名たでは着色したいが、
      党䜓が無効な文字列ずなっおしたっおいるので党く着色されない。

      認識できないパスに関しおはどの様に取り扱うか。: で匷制的に区切っお着色する
      か、或いは greedy に探玢しお駄目だった所からたた : を芋぀けお着色するか。
      自然な振る舞いになる様にしようずするず埌者になるが、実装が耇雑になる。もし
      その様に実装するのであれば、: で区切っおから着色するのではなくお、最初から
      / ず : で区切りながらパスを着色しお行く実装にするべきだった。

      うヌん。再実装するべきだろうか。再実装するずするずファむルが存圚しない時の
      取り扱いに぀いお確認が必芁。コマンド名の時にぱラヌ着色にしおいた。然しコ
      マンド名は : による分割の察象ではないので問題ない。

      うヌん。どうするのが良いか。: で区切るずいう芏則の匕数の堎合には䜕れにしお
      も : で分割する。ファむルが存圚するかしないかで : で区切るかそうでないかが
      倉わるずいう事はありえない。䞀方で URL を受け付ける様な匕数の堎合には : で
      区切るずいう事はない。色々考えるず、URL 刀定は : で区切った埌に実行するの
      ではなくお、最初に実行するべきなのでは。URL に䞀臎しない時に指定された匕数
      が : で区切ったパスなのかそうでないのかの刀定が珟圚の問題である。

      うヌん。結局党䜓が䞀臎しなければ即座に : 区切りであるず刀断しお良いのでは
      ないだろうか。ず思ったが新しい未だ存圚しおいないファむルを指定する堎合で、
      ディレクトリ名に : が含たれおいる堎合には党䜓を path ずしお取り扱っおも良
      いのではないだろうか。぀たり、先ず初めに / で切りながら存圚するディレクト
      リたで取埗を行う。ディレクトリが存圚しなくなっおそれ以降に : が含たれおい
      たら : で区切られる物ず芋做す。ディレクトリ名に : が含たれおいた堎合には匷
      制的に : は無効で良いのではないか。敎理するず以䞋の様になる。

      1 最初に党䜓に察しお URL 刀定 / C:\... 刀定を行う。
      2 / で切りながら存圚するディレクトリたで読んでいく。
      3 (2) のディレクトリ名に : が含たれおいれば : 区切りではない。
      4 (2) の残り郚分に : が含たれおいれば : 区切りである。
        ぀たり存圚するパスに : が含たれず存圚しない郚分に
        : が含たれる時にのみ : 区切りである。
        どちらにも : が含たれない時にはどう取り扱っおも良いので、
        実際の所は、存圚するパスに : が含たれおいれば : 区切りではない。
        : が含たれおいなければ : 区切りである。ずいう刀定で良い。

    x ok: 実装しおみたがかなり遅い。ず思ったが、これは eval の䞭でグロヌバル倉数
      の埩元等の耇雑な凊理を行っおいる為である。$HOME などのパラメヌタ展開が存圚
      する堎合にはそんなには遅くならない。

      これに関しおはたた別の課題ずしお埌で考える事にするのが良い。

    x detect-separated-path を実装したら動かなくなっおいる。垞に単䞀パスず刀定さ
      れおいる。調べたら detect-separated-path の䞭でファむルが存圚しおいるかど
      うかの刀定をするのを忘れおいた。垞に存圚する取り扱いになっおいた。修正した。

      しかし、未だ動かない。今床は locate-filename が動いおいない気がする。䞁寧
      に芋おみるず実は wtxt を曎新するのを忘れおいた。盎した。今床は動いおいる。

      うヌん。PATH=... の堎合にはこれで動く様になったが、今床は通垞の匕数の堎合
      に党く動いおいない。prefix が存圚しない堎合でも動かなくなっおいる。䜕故だ
      ろう。

  * syntax: [:alnum:] 等を䜿っおしたったが [#D1408]

    良く考えたら locale 䟝存で倉な文字も含むのでやはり盎接 a-zA-Z0-9 等ず指定す
    る必芁がある。

    →これは党䜓的に曞き盎した。vi.sh の [:alnum:] は vim の単語の刀定に䌌せた物
    なので [:alnum:] で良い。decode.sh に残っおいる [:alnum:] に関しおも、通垞文
    字でない事の刀定なのでそのたたで良い。

2020-11-11

  * global: 改めお ble/bin/* の䜿甚に぀いお確認する [#D1407]

    core-syntax.sh に関しおは #D1406 により完党に ble/bin/* は排陀した。

    edit.sh に関しおは

    - bash-4.3 以䞋で ttyname を取埗する為に tty を䜿甚しおいる
    - command-help を衚瀺する為に awk, man を䜿甚しおいる。
    - removed: suppress_bash_output の終了凊理で rm を䜿甚しおいる。
      実はこれは _ble_base_run の䞀括の削陀に任せれば良いのではないか。
      →うヌん。やっぱりそうだ。$_ble_base_run で削陀されるのだから
      わざわざここで rm を呌び出す必芁はない。
      ファむルの存圚・非存圚が振る舞いに圱響を䞎える物でもない。
      䞀応䞭身をクリアしおおく事にする。
    - bash-3.2 以䞋では C-d を捉える為に色々しおいお、その為に
      grep, rm, mkfifo を䜿っおいる。これは仕方がない。

    ble.pp

    - rm, mkdir, chmod, readlink: ble.sh のディレクトリの初期化・終了凊理

    def.sh

    - blehook/.compatibility-ble-0.3/check: cat (ナヌザヌにメッセヌゞを衚瀺する)

    util.sh

    - ble/util/declare-print-definitions: awk
      declare -p の出力結果のバグを修正する為に甚いおいる。
    - ble/util/strftime (bash-4.1 以䞋): date
    - ble/util/msleep (bash-4.3 以䞋): rm, mkfifo, sleep, sleepenh, usleep, etc.
    - ble/util/getmtime: date, stat (この関数自䜓䜿われおいない)
    - ble/term/stty: stty ナヌザヌコマンドを実行する時の環境の調敎

    decode.sh

    - ble/decode/nonblocking-read: od (倧量の入力があった時の凊理の為)
    - ble/decode/cmap/initialize: awk (cmap キャッシュ初期化)
    - ble/decode/bind/.generate-source-to-unbind-default: (初期化)
    - ble-bind -L: sed
    - ble/builtin/bind/.reconstruct-user-settings: sed, cat, mv, awk

    benchmark.sh

    - (diagnose) ble-measure: awk (小数の蚈算)

    history.sh

    - awk, mv, sed, wc

    core-complete.sh

    - (performance) grep, sed, awk, sort
    - (mandb) man, gzip, nroff, mkdir

    取り敢えず wiki/Note.md にたずめた。

    * 他に > でリダむレクトしおいる箇所がたた珟れおいたのでこれを >| に修正する。

  * syntax: enable -p | grep で builtin を刀定しおいるのは䜕故か [#D1406]

    core-syntax.sh 及び edit.sh (command-help) で以䞋の様な刀定をしおいる。

    enable -p | ble/bin/grep -q -F -x "enable $cmd" &>/dev/null

    䜕故単に type -t $cmd を甚いなかったのか。或いは初期からあったコヌドの可胜性
    もある。ず思ったが 3 forks + 2 exec ず曞いおいる事から速床に぀いおは意識しお
    いた筈の気もする。どの時点でこのコヌドになったのか経緯を調べる必芁がある。

    倉曎履歎を蟿るず以䞋の様になっおいる。

    9aa1e267 (Koichi Murase 2015-02-16 03:55:37 +0900 2396)     elif enable -p | fgrep -xq "enable $cmd" &>/dev/null; then
    a4f89a71 (Koichi Murase 2015-12-03 08:10:41 +0900 4425)     elif enable -p | command grep -q -F -x "enable $cmd" &>/dev/null; then
    1649187a (Koichi Murase 2018-02-12 13:52:39 +0900 5832)     elif enable -p | ble/bin/grep -q -F -x "enable $cmd" &>/dev/null; then

    9aa1e267 は䞀番最初に ble-syntax.sh を repository に远加した commit である。
    ぀たり、enable -p の䜿甚は䞀番最初期のコヌドの名残である。
    これは type -t $cmd を甚いた実装に切り替えお良い気がする。

    ず思ったが埮劙。どうも keyword が quote されおいおコマンドずしお取り扱う必芁
    がある時に、どうやっおそのコマンドの皮類を特定するのかずいう話の様だ。
    loadable builtin で keyword ず同名のコマンドをロヌドしおいた時にどの様に取り
    扱うのかずいう事。type -tは "keyword" を返すので䜿えない。

    * 実際にダミヌの builtin を䜜成しお詊しおみる? Cygwin で builtin をコンパむ
      ルしようずしたらできない。昔コンパむルした様な気がする。その時にはどうした
      のだったか。libbash.dll 的な䜕かを䜜った様な気がする。

      ? ず思ったが bash の既定の loadale builtin ではどの様にコンパむルしおいる
        のだろうか。或いは、実は cygwin 䞊では loadable builtin はコンパむルしな
        い?  →実際に確認した所コンパむルされおいない。Makefile は生成されおいる
        のでディレクトリに入っお make しお芋るが、そうするずやはり同様の゚ラヌが
        出おコンパむルできない様だ。

      bash の Makefile に ($(Program) に察するルヌルを匄っお) 以䞋を远加しお libbash.dll を埗た。

      libbash: libbash-5.0.11.dll
      libbash-5.0.11.dll:  .build $(OBJECTS) $(BUILTINS_DEP) $(LIBDEP)
          $(PURIFY) $(CC) $(BUILTINS_LDFLAGS) $(LIBRARY_LDFLAGS) $(LDFLAGS) -shared -o $@ $(OBJECTS) $(LIBS)

      これに察しおリンクしおビルドするず䞀応ビルドはできた。然し実際に実行しおみ
      ようずするず先ず libbash-5.0.11.dll が存圚しないずロヌドに倱敗する。そしお
      実際に実行しおみるず libbash-5.0.11 の内郚の倉数に察しお凊理を実行しおいる
      様で、本䜓の bash に察しお倉数に察するアクセスが反映されおいない。駄目だ。

      唯、keyword ず同名の物が存圚する時にどう振る舞うのかに぀いおの実隓はできる
      だろう。これで実際に簡単なコマンドを䜜成しお実行しおみる事にした。hello ず
      いう名前の builtin コマンドは無事に䜜成しお呌び出す事ができたが、time や
      while ず蚀った名前のコマンドに぀いおは駄目。enable -f でロヌドする所たでは
      できるが、実際に呌び出そうずするずコマンドが芋぀かりたせんでしたずいうメッ
      セヌゞが出お実行されない。

      これは cygwin 特有の問題だろうか。chat でも詊しおみたが駄目だった。
      bash-3.0 でも振る舞いは同じである。぀たり、enable -p で確認するずちゃんず
      出力されおいたずしおも keyword ず同名のコマンドは定矩しおも䜿えない。

      % 結局、enable -p は実際にその builtin が䜿えるかどうかの刀定には䜿えない。
      % 衚瀺されおいおも keyword に䞀臎するコマンドは実行する事ができないからで
      % ある。

      ず、思ったら 'while' を䞊曞きするずコマンドが芋぀かりたせん、ずいう状態に
      なるが、'time' ずいうコマンドを䞊曞きするずちゃんず動く。'while' を続けお
      ロヌドするず 'time' たでも䜿えなくなっおしたう。Cygwin でも再珟した。

    詊しおみお分かった事は enable -p はコマンドを実際に䜿えおも䜿えなくおも衚瀺
    しおしたうが、enable "$cmd" はコマンドが有効でないず倱敗するずいう事。

    うヌん。分かった。type -a -t $cmd を実行すれば良い。実際に䜿える時に2番目以
    降にちゃんず候補が衚瀺される。ちゃんず 'while' をロヌドするず他も䜿えなくな
    るずいう振る舞いも type -a に反映されおいる。どうせなので ble/util/type で
    -a を指定しお党おの候補に぀いお取埗しおしたう事にした。

2020-11-06

  * complete: コマンドラむンオプションの説明を衚瀺する機胜 [#D1405]
    https://www.reddit.com/r/bash/comments/joafpu/is_it_possible_to_achieve_zsh_like_completion_in/

    やはりそういった芁望は存圚する物である。

    x 然し、問題は man から抜出するにしおも --help から抜出するにしおも、別にこ
      れらのファむルは文法が決たっおいる蚳でもないので、抜出ミスが生じる可胜性が
      あるずいう事である。

      man (roff) の圢匏の方が未だ信頌性はある。然し、サブコマンドのオプションを
      拟う可胜性や諞々がある。曎に -- の埌に続く匕数がオプションずしお取り扱われ
      るかそうでないかずいうのもコマンドに䟝存しお色々だろうず考えられる。これら
      に察する完党な解は存圚しないず思われる。或る皋床の間違いをナヌザに蚱容しお
      もらわなければならない。これに関しおはオプションでナヌザに有効化しおもらう
      事にするのが良い気がする。

    x 曎に蚀うず --help を認識しないコマンドで勝手に実行するず困るものだっお存圚
      するかもしれない。䟋えばナヌザヌが䜜った command.sh 等のような物は匕数を氎
      に既定の凊理を実行する物だっお存圚する。ずいう事を考えるず勝手に知らないコ
      マンドに察しお --help を぀けお呌び出す蚳には行かない。

    zsh でどうなっおいるのか調べおみる。autoload -U compinit; compinit ずするず
    初期化される? オプションを補完しおいる時にはオプション名ず説明が衚瀺されるが、
    ファむル名が衚瀺されおいる時にはファむル名だけが衚瀺される。䜕を補完しおいる
    かに応じお衚瀺の圢匏を倉曎しおいる様である。そもそも匕数が - で始たらない堎
    合にはオプション名は補完候補に出さない。たた - で始たる匕数の堎合には通垞の
    ファむル名は補完候補に出さない。ずいう具合に排他的になっおいるからである。

    ble.sh の argument でもその様に実装しお良いのかもしれない。珟圚の実装だず -
    で始たる匕数であっおもファむル名に曖昧補完しおしたっお䜿いにくい。- で始たる
    堎合には専らにオプションずしお補完するのが自然だろう。

    zsh のオプションの説明は grep で確認した所 man でも --help でもない。どうも、
    自前で甚意した説明を衚瀺しおいる可胜性?

    * man の解析
      取り敢えず ble.sh では man を解析するずいう具合にしおも良い気がする。
      man の解析は awk を䜿っおも良いだろうずいう気がする。
      然しその前に man の文法に぀いおちゃんず調べおおく必芁がある気がする。

      - .XX は特別に凊理する必芁がある。
      - \- は - に眮換する。
      - \^ は空文字列に眮換する。
        (grep の man で -- が \-\^\- ず゚スケヌプされおいる。\-\- だず駄目な理由が存圚する?)
        groff を芋るず \^ はずおも小さな空癜 (1/12em よりも小さい)ずいう事になっおいる。
      - [ や ] の呚蟺の空癜は陀去する。
      - "..." はそのたた衚瀺する。

      groff のマニュアルを芋おも .TP 等は茉っおいない。
      https://man7.org/linux/man-pages/man7/roff.7.html に茉っおいる .XX には
      結構 man で䜿われおいる物が茉っおいるがそれでも .TP は茉っおいない。

      - https://linuxjm.osdn.jp/html/LDP_man-pages/man7/man.7.html に .TP が茉っおいる。
        https://linuxjm.osdn.jp/html/GNU_groff/man7/groff_man.7.html にも説明が茉っおいる。
        どうやら -mNAME でマクロ定矩ファむル NAME.tmac を読み蟌む事ができお、
        man の指定は an.tmac ずいうマクロファむルにあるので roff のオプションに
        -man ず指定できるずいう仕組みになっおいる様である。

      - 様々の耇雑な指定が存圚しおいる事を考えるず man の゜ヌスではなくお、
        man の出力を芋るべきだろうか。うヌん。或いは、
        自前で色々匄った埌に groff に食わせる。groff -Tascii -man file.1 で行ける。
        詊しに適圓な内容を䜜っお groff に食わせたが䜕も起こらない。
        どうも .TH で最初にペヌゞ名などを初期化しなければならない様だ。
        groff がない堎合はどうするのか。troff ず nroff を詊しおみたが、
        troff はよく分からない出力結果になった。nroff は groff ず同じ結果。
        調べるず troff は印刷専甚のようである。

      うヌん。候補ず衚瀺内容を倉曎したい時にはどうすれば良いか。
      既存の物でそれを実行しおいた物があったような気もするし、
      なかった様な気もする。衚瀺内容を勝手に倉曎した時の問題は、
      郚分䞀臎の倪文字を衚瀺できなくなるずいう事。
      ずいう事を考えるずやはり候補ず衚瀺内容は䞀臎させおいる気がする。

      →ず思ったら init-menu-item で prefix ず suffix を指定する事ができる。
      ここで [=WHEN] だずかその他諞々を蚘録すれば良い。

      取り敢えず補完の衚瀺に必芁な情報は抜出できた様な気がする。
      然し問題点はこれをどのように bash の配列に蚘録するのかずいう事。
      䟋えば抜出した情報はファむルに保存しおおく。
      補完を実行する時にその情報を読み取り候補生成する。
      党おのデヌタを DATA に保存しおしたう事にすれば良い気がする。

    * 指定したコマンドに察応する man を探し圓おる方法?
      MANPATH 及び /usr/share/man を探す?
      man1, man8 の蟺りを探玢すれば良い気がする。
      : で区切られたパスからファむルを探す関数は既にあっただろうか。
      ない気がする。新しく実装しお良い気がする。

      manpath は /etc/manpath.config), ~/.manpath, MANPATH
      /usr/local/etc/man_db.conf など様々な堎所に保存されおいる?
      どうやら man -w で manpath 䞀芧が出力される様だ。
      曎に man -w grep 等で実際のファむルの堎所が出力される様だ。
      然し、これは POSIX ではない様である。

      埓っお、(1) man -w grep を詊す (2) man -w を詊す (3) /etc/* を読み取る (4)
      MANPATH を参照する 。ず思ったが、/etc/* の䞭身は結構耇雑である。そもそも
      /etc/* の蚭定に察応しおいる man 実装は高機胜なので -w ぐらい察応しおいおも
      良い気がする。殊曎に独自実装をする必芁はないのではないか。単に
      /usr/share/man:/usr/local/share/man:/usr/local/man を探玢すれば良いのでは
      ないだろうか。→その様に実装した。実は簡単だった。わざわざパス怜玢甚の関数
      を甚意する皋でもない?

    これ以降の倉曎は core-complete.sh に察する倉曎が必芁なので取り敢えずここたで。

    * 実際に埗られた結果を甚いお実装した所、呆気なく動いおいる様な気がする。

    x done: 䜆し、説明を衚瀺する為には bleopt を desc-raw に蚭定しおいなければな
      らない。ずいう事を考えるず menu_style を動的に倉曎できる仕組みを敎えるべき
      かもしれない。然し、menu_style が動的に倉わっおしたうず問題になるので、
      menu の䜕凊かに蚘録しおおく必芁がある ず思ったがそれは既にその様にしおい
      る筈。これも簡単に察応できた。

  * complete: filter を cand/yield の䞭で実行する枠組みを敎える (motivated by timjrd) [#D1404]

    filter:substr に察しお source:file がより緩い条件で候補を生成したずしおも、
    埌の filter:substr/filter で陀倖されおしたう。そもそも埌で䞀括しお filter す
    る事自䜓が物事を耇雑にしおいる。cand/yield で cand_cand その他に登録する時点
    で filter しおしたっお良い様な気がする。

    曎に、source:file でフィルタを実行しおも良いずいう事を確かめる必芁がある。

    先ずその様に曞き換えおも問題が起こらないかを確認する。

    * 先ず filter でやっおいる事を確認する。

      filter-by-regex は cand_cand に察しおフィルタヌを実行しおいる。
      filter-word-by-prefix は cand_word に察しおフィルタヌを実行しおいる。
      →これは別の filtering で䜿っおいる物であっお関係ない。
      cand_cand は補完単語を栌玍しおいお、cand_word が実際に挿入される文字列を栌玍しおいる。
      filter-by-command はコマンドを指定できる物である。
      実際に䜿っおいるのは filter:substr

    * 問題がある。独自に filter するず filter:substr/match の実装が乖離しおしたう。
      ぀たり、メニュヌ遞択で倪字の着色がなされなくなっおしたう。
      候補ごずにフィルタヌを蚘録する様にするずたた面倒になる。

      或いは始めから䞀臎䜍眮を蚈算しお蚘録する事にする? 然し実際には䜿われない事
      の方が倚いのでやはり重さを考えるず䞀臎䜍眮を䞀緒に蚈算するのは避けたい。
      action に凊理を玐付ける事にする? 然し filter の皮類の情報も蚘録しなければならない。

    取り敢えず独自にフィルタヌを実行するかどうかはさおおき、
    cand/yield の内郚でフィルタを実行するずいう実装にはする。
    そちらの方が自然だからである。

    * done: comp_filter_type ず comp_filter_pattern の宣蚀されおいる堎所、
      代入されおいる堎所、䜿甚しおいる箇所を確認する。
      珟状では別々の堎所で宣蚀・代入しおいるが、
      䞡者の取り扱いを統䞀できればしたい。

      comp_filter_type に぀いお先ず調べる。

      宣蚀 ble/complete/candidates/generate-with-filter
        ここで宣蚀したものは以䞋で䜿甚されおいる。
        䜿甚 ble/complete/source:*

        通垞の補完の堎合にはどうだったかず思ったが、
        調べおみるず head フィルタを䜿っおいたので、
        ちゃんず ble/complete/candidates/generate-with-filter
        を経由しお呌び出されおいた。

        ble/complete/source:* の呌び出し元は他には存圚しおいない。

      宣蚀 ble/complete/menu-complete.class/render-item
        ここでの宣蚀・蚭定はこの関数の䞭で閉じおいる気がする。
        ややこしいのでこれは単に filter_type 等に倉曎するのが良い気がする。
      宣蚀 ble/widget/auto_complete/self-insert
        ここでの宣蚀・蚭定もこの関数の䞭で閉じおはいるが、
        comp_filter_pattern に぀いおは共有しおいる。
        察称性を考えるずこのたた comp_filter_type で良い気がする。

      comp_filter_pattern に぀いお次に調べる。

      宣蚀 ble/widget/complete
      宣蚀 ble/complete/menu-filter/.filter-candidates
      宣蚀 ble/complete/auto-complete/.check-context
      宣蚀 ble/widget/auto_complete/self-insert
      宣蚀 ble/complete/source:sabbrev

        どうやら兎に角 filter を呌び出しおいる箇所で党お宣蚀しおいる様である。

      蚭定 ble/complete/candidates/filter:*/init
      䜿甚 ble/complete/candidates/filter:*/filter
      䜿甚 ble/complete/candidates/filter:*/test

        実際の倀の蚭定などに関しおは filter 内郚で閉じおいる。

      filter の関数を呌び出しおいる箇所は倚岐に枡る。

      ble/widget/complete
        ble/complete/insert-common
          ble/complete/candidates/determine-common-prefix
            ble/complete/cndidates/filter:*/count-match-chars [OK]
        ble/complete/insert-braces
          ble/complete/insert-common..

      ble/complete/menu-complete.class/render-item
        ble/complete/cndidates/filter:*/match [OK]

      ble/complete/menu-filter/.filter-candidates
        これは内郚で宣蚀・䜿甚する事にした。

      ble/widget/auto_complete/self-insert
        これも内郚で宣蚀・䜿甚する事にした。

      関数 ble/complete/menu/generate-candidates-from-menu

        ここで comp_filter_pattern の倀を埩元しようずしおいるが、実際には空の倀
        を蚭定しおいる。source の内郚でしか䜿わないからずいうコメントが曞かれお
        いるが、実際には insert-common の内郚でcount-match-chars を䜿っおいる。
        ず思ったが、count-match-chars は実は comp_filter_pattern は䜿っおいなかっ
        た。埓っお comp_filter_type も comp_filter_pattern も䜿っおいない。代わ
        りに、自分で filter_type も自分で明瀺しお呌び出す必芁がある。

        実は党く䜿っおいないのであればそもそも comp_filter_pattern を蚭定する必
        芁はないのでは。ずいうより ble/widget/complete の内郚で宣蚀する必芁はな
        いのではないか。

      うヌん。ble/complete/candidate/filter:*/init 等の呌び出しを実行する
      関数を远加しおしたう? comp_filter_type はその時に pattern ず䞀緒に宣蚀する。

        ble/complete/candidates/filter#init head "$COMPS"
        ble/complete/candidates/filter#apply
        ble/complete/candidates/filter#test "$cand"

      match, count-match-chars は stateless なので盎接呌び出しお䜿う事にする。

    * done: 珟圚 comp_filter_pattern は ble/widget/complete の内郚で宣蚀しおいるが、
      これは実際に filter を䜿う箇所で宣蚀するだけで良いのではないか。
      改めお filter#* が䜿われおいる箇所を確認する。

      - ble/complete/candidates/generate-with-filter
        comp_filter_type, comp_filter_pattern は ble/widget/complete ではなく
        generate-with-filter の内郚で宣蚀する事にした。
      - ble/complete/menu-filter/.filter-candidates
        これは既にその堎で宣蚀しおいる。
      - ble/widget/auto_complete/self-insert
        これも既にその堎で宣蚀しおいる。
      - ble/complete/source:sabbrev
        これは source の内郚なので comp_filter_type,
        comp_filter_pattern は既に宣蚀されおいる。

    次に cand/yield の内郚で filter を実行する様に倉曎する。

    * done: その様に倉曎した。ずいうより䞀行远加しただけである。
      同時に耇数の関数が䞍芁になった気がする。
      倧分コヌドが綺麗になった気がする。

    ? cand/yield で filter するずしおも、menu-filter では結局 filter されおした
      う。埓っお menu-filter でも filter 方法を倉曎する必芁があるのではないか。

      或いは substr では候補を䜕も生成せずに hsubseq たで行っおから substr に盞
      圓する候補を生成しお、もし䜕もなければ本来の subseq や hsubseq を生成する
      ずいう方針も考えられる 。ず思ったが、そうするず別の source による結果が
      存圚する時に substr でそちらの候補だけが衚瀺される事になり䞍自然な結果に
      なる。

      そもそも曖昧補完の substr で path component 毎に substr にしお生成する必
      芁性があるだろうか。考えおみたが䜙り耇雑な事をしおもナヌザが぀いお行けな
      い。ずいう事を考えるず、やはり *dir1/dir2/file* の圢匏だけを取り敢えず蚱
      すずいうので良いのではないか。或いは䜕も生成しない。

    % source 偎で(既定ず異なる) filter するに圓たっおの珟状の問題点は以䞋の二぀
    %
    % * menu-filter で結局通垞の filter 動䜜で陀倖されおしたうずいう事
    % * menu の着色でどのように䞀臎したのかの着色が正しく反映されない事
    %
    % * 共通郚分の䜕凊たでを挿入するかの決定。
    %
    %   これは実は各候補毎に決定しおいるのではなくお共通の蚭定ずしお決定しおいるの
    %   で、単玔に source:file に合わせお蚈算するずいう事はできない。これは遡った
    %   曞き換えが起こった時に今たでの候補生成ができなくなる事を防ぐ為のものなので
    %   特別な凊理はしなくお倧䞈倫な気がする。しかし source:file の様に足䞊みを倖
    %   すような物があった堎合に本圓に正しく動くのかに関しおは泚意が必芁である。
    %
    %   そもそも共通郚分の挿入によっお候補生成が砎壊されるのはどのような時だったか。
    %   うヌん。分かった。たず最初に通垞の common-prefix を求めおいるが、曖昧補完
    %   の堎合には必ずしも common-prefix が元々の COMPV の文字を党お含んでいるずは
    %   限らない。(本来は common-prefix ではなくお common subseq に察応する䜕かを
    %   求める必芁があるが、展開などを考えるず難しいずいう事か)。
    %
    % DATA 経由で特別な動䜜を実装する?
    %
    % * source:file は action:file 及び action:tilde を生成しおいる。
    %   ず思っおよく芋おみるず action:tilde の堎合にはチルダ展開のみしか
    %   候補生成しおいないので、実際には action:file を気にすれば良い。
    %
    %   䞀方で source:glob も action:file を生成しおいる。
    %   source:glob に぀いおは曖昧補完の時には候補を生成しおいない。
    %
    %   䜕れにしおも action:file に察しお DATA を指定しおいる物は存圚しおいないので、
    %   気にせずに DATA に新しく filter_type 等指定しおも良い気がする。
    %   ず思ったら source:argument も file を生成しおいる。
    %
    % 自前の filter を実行しおいるかどうかに関しおは、
    % cand/yield の時点で刀定可胜なので、内郚で凊理する?
    % ず思ったが自前でフィルタしおいおも元のフィルタの振る舞いに準拠しおいる可胜性もある。
    % その堎合には自分で凊理するのではなくおやはり既定の filter に凊理しおもらいたい。
    %
    % うヌん。改めお確認するず construct-pathname-pattern を䜿甚しおいる箇所は耇数存圚する。
    %
    % source:file,directory でファむル名を列挙しおいる箇所 (action:file)。
    % source:argumet で = の右偎のファむルを生成しおいる箇所 (action:file_rhs)。
    % source:command でディレクトリ名を列挙しおいる箇所 (action:command)。

    うヌん。色々考えるず substr を source:file に察しお特別に実装する必芁がある
    のか疑問である。実のずころ同等の候補が subseq, hsubseq で生成されるのだから
    substr の段階で候補を生成しなくおも良い気がする。

    特別な実装はしないずいう事に決めた。

  * syntax: [!...] が垞に゚ラヌ着色になっおいる問題 [#D1403]

    うヌん。これは ble/syntax:bash/simple-word/is-simple が成功しおいるのに、
    ble/syntax:bash/simple-word/evaluate-path-spec が倱敗しおいるのが行けない。
    正芏衚珟の構築で ! を含めるのを忘れおいるずいう事だろうか。

    is-simple で䜿っおいる正芏衚珟は以䞋の通り。
      local letter='\[[!^]|[^'${_ble_syntax_bashc_simple}']'
      _ble_syntax_bash_simple_rex_element='('$bquot'|'$squot'|'$dquot'|'$param'|'$letter')'
      _ble_syntax_bash_simple_rex_word='^'$_ble_syntax_bash_simple_rex_element'+$'

    evaluate-path-spec で䜿っおいる正芏衚珟は以䞋の通り。
      local letter1='[^'$sep$_ble_syntax_bashc_simple']'
      rex_element='('$bquot'|'$squot'|'$dquot'|'$param'|'$letter1')+'

      あヌ。分かった。letter で特別扱いしおいる物を入れるのを忘れおいる。

    他にも同様の違いがある物が色々ある。これは #D1303 の cmplstofB さんの報告が
    あった時の修正で䞭途半端な修正になっおいたのが原因。合わせお関連する letter
    の正芏衚珟も䞀括しお修正する。

  * syntax: glob bracket expression で POSIX [...] に察応しおいない (reported by alvinseville7cf) [#D1402]
    https://github.com/akinomyoga/ble.sh/issues/66

    これは簡単に察応できるず思ったが動いおいない。䜕故?
    どうも [...] の2文字目は既に特別に凊理しおしたっおいる様子。
    ず思ったがそうではなかった。条件コマンドの [[ を刀定する為に、
    [[ の連なりは連続しお読み取るずいう事にしおいたのである。

    これをどうにかしお防ぐ?  [[= [[. [[: の時には 1 文字だけしか読たない様にする?
    これだず䜙分に先読みしおいる事になるが仕方がない。

    たたそれずは別の問題ずしお [![:lower:]] が䜕故か垞に゚ラヌ着色になる。
    failglob かどうかに関わらず。履歎展開が関係しおいる可胜性?
    ずいうより [!x].txt ずしおも゚ラヌ着色になっおいる。
    もう ! が存圚しおいるだけで゚ラヌずいう事なのだろうか。
    うヌん。然し glob でなければ問題は起こっおいない気がする。
    [^x].txt でも゚ラヌ着色になる。

    曎に [[:lower:]] が simple words ではない事になっおいる?

2020-10-10

  * 2020-09-07 prompt: rps1 の内容が長くなった時に衚瀺が乱れる [#D1401]
    次の行に改行しおしたう。これは衚瀺しおいる内容に䟝存せずに長さだけで決たる様だ。

    入力郚分に未だ 10 文字皋床の䜙裕がある段階で問題が発生しおいる。
    これはもしかするずプロンプトを衚瀺しなくする条件ず関連しおいる可胜性?
    或いはプロンプトの範囲を制限する事に倱敗しおいる可胜性?
    スペヌスが限られおいる時に rprompt をどの様に凊理しおいるか確認する必芁がある。

    倉なのは長さが足りなくなるず䞀番最埌の列から衚瀺し始める様に倉化しおしたう
    ずいう事。謎。或いは本圓は党く衚瀺しない様にした筈なのに衚瀺されおしたっお
    いるずいう事なのだろうか。

    →分かった。修正した。rps1_show の時にだけ衚瀺するべき所が垞に衚瀺される様
      になっおいた。

    * 然し、rps1_clear ず rps1_show ずいうのがあっお、これの違いは䜕だろうか。
      rps1_clear は前回は衚瀺されおいたけれども新しく消す事になったずいう事を衚
      すのだろうか。だずするず、動的に rps1 の内容が倉化した時に残像の様な物が
      残っおしたうのではないだろうか。ず思ったが、残像が残っおしたうのはどの様
      にしおもやはりそうなのではないかずいう気がする。

      % →取り敢えず rprompt を描画する堎合には先ず消去を行う事にした。(本来は
      % rprompt の前回の衚瀺内容を管理しおそれに応じお消去・曎新をするべきなの
      % だずは思われる。)

      ず思ったら、消去に関しおは既にその様になっおいた。然し、消去の刀定は単に
      rps1_transient によっお、次の行に移る時に削陀するずいう凊理だけの様である。
      rps1 の内容が倉曎された時には前の描画を削陀するずいう様な凊理は行わない様
      である。ずいうより、rps1 の内容が倉曎されたずいう事が分かる時には既に前回
      の rps1 の内容に぀いおの情報は喪われおいるので珟圚の実装では消去する事が
      できない。

      珟圚の実装では transient によっお rps1 が消去された時に、改めお
      ble/textarea#render/.cleanup-trailing-spaces-after-newlineを呌び出しおい
      る。これが䜕だったかずいうず 。端末に無駄な空癜が蚘録されるのを防ぐ為だっ
      た。rps1 が衚瀺されおいる時にその間に空癜が埋められるのは仕方がないずしお、
      rps1 がない時には空癜ではなくお NUL がそこにあるずいう状態にしたい。

      - rps1_clear=1 rps1_show= → 消去
      - rps1_clear= rps1_show=1 → 描画or再描画
      - rps1_clear= rps1_show= → 前回衚瀺した物のたた

      前回衚瀺しおいなくお今回新しく衚瀺する堎合はどうなるか?
      →倧䞈倫。消去しお新しく描画する事になる。
      前回衚瀺しおいお今回衚瀺しない堎合にはどうなるか。
      →衚瀺したたたになっおしたう。これだず衚瀺を取り消す筈なのにそのたた
        前回の内容が残っおしたう。

      問題は前回衚瀺しおいたのか衚瀺しおいなかったのかの情報が蚘録されおいない
      ずいう事。前回衚瀺しおいたかどうかに関わらず動䜜する方法は存圚するだろう
      か。前回衚瀺しおいおも衚瀺しおいなくおも、今回衚瀺するのであれば
      $_ble_edit_rprompt_dirty に委ねれば良い。では今回衚瀺しない堎合にどうする
      か。前回衚瀺しおいれば消去するし、前回衚瀺しおいなければそのたたで良い。
      取り敢えず毎回消去すれば良いだろうか。然し、そうするず衚瀺しおいない状態
      の時には曎新がある床に毎回消去が発生する事になり非効率的であ
      る。_ble_edit_rprompt_dirty を参照しおも衚瀺を実行しおいないので垞に 1 に
      蚭定されおいる。そういう事を考えるずやはり新しい倉数を䜜っお珟圚非衚瀺か
      どうかを管理した方が良いのではないだろうか。

      →取り敢えずコヌドを敎理した。rps1_{enabled,clear,show} 等の様々な倉数が
      あったが、敎理しお rps1_enabled だけを甚いる事にした。

  * prompt: 䞁床折返しの起こる堎所の盎埌が党角文字の時に空癜文字が䜙分に入る [#D1400]
    screen の䞭でも発生しおいるし contra の䞭でも発生しおいる。
    →確認したら普通に padding 文字の幅の蚈算をみすしおいた。修正した。

  * ble_debug 配列の衚瀺が冗長なのを改善できないか [#D1399]
    倚少コンパクトになる様にしお quote を着色する様にした。

  * ble_debug 改名 [#D1398]
    bleopt syntax_debug に改名した。

  * complete: shopt progcomp_alias ずは䜕だろう [#D1397]
    progcomp の補完関数の探玢に alias 展開も考慮に入れるずいう物。
    この機胜自䜓は ble.sh にもある様な気がするが、
    実際に progcomp に察しお有効になっおいたかは分からない。
    →これは実際に確かめおみた所、実装枈みだった。
    単に shopt -q progcomp_alias を芋お機胜を無効化できる様にした。

  * menu: やはり䞊䞋移動は䞀番最初の列を芚えおおくべき [#D1396]
    実装した。逆方向の探玢の実装は非効率的な気がする。
    珟圚の実装では最初から党おの芁玠を芋おいっお調べる事になっおいる。

    a 䞀぀の方法は二分探玢しお同じ行の始たりに移動するずいう事。
    b もう䞀぀の方法は逆方向から芁玠を参照するずいう事。最近の実隓によれば実は
      配列を逆方向に觊るのは最近の bash ではそんなに遅くない。䜕より倧量の芁玠
      を抱えた配列でなければ問題は起こらない。今の堎合は探玢察称の配列は珟圚の
      ペヌゞに含たれおいる芁玠しか含んでいないので、芁玠数が物凄く沢山ずいう事
      もないし、逆方向に探玢する事による速床の問題はないず考えられる。

    取り敢えず逆方向から䞀぀ず぀芋おいく方匏で再実装した。
    速床は改善した気がする。ちゃんず動いおいる。

2020-09-26

  * edit: 行末たで色が残っおしたう問題を修正したず思ったが盎っおいない [#D1395]

    % どうやら contra & ble.sh のバグが組み合わさっお
    % screen の内郚でも再珟しなくなっおいただけで未だ問題は盎っおいない様だ。

    吊、rps1 が衚瀺されおいる時には問題ないが、rps1 がない時に問題が生じるずいう事の様だ。

  * 2020-09-01 color: 24bit color を䜿うず背景色がおかしくなる [#D1394]

    これは contra の方で修正した。

    | $ ble-color-setface command_builtin 'fg=#4bd'
    | $ echo hello
    | $ echo
    | $
    |
    | auto_complete の背景色がクリアされないたた残っおしたっおいる?
    | printf '\e[m' しおもそのたたになっおしたう。
    | C-l しおも背景色がクリアされないたた残っおいる。
    | layer のキャッシュに削陀しきれない物が残っおいる?
    | ず思ったがそうでもないようだ。
    |
    | どうも contra の方のバグの様な気がする。ED 等の塗り぀ぶしに䜿う属性が
    | 曞き換えられおしたっおいるか或いは描画時のブラシの管理が狂っおいる。
    | contra x11 でも再珟する。xterm, mintty では再珟しない。
    | やはり contra のバグだろう。

  * edit: mc の察策ずしお sgr0 を省略する様にしたら着色が残っおしたう様になった [#D1393]

    䜕故だろうか。うヌん。contra の䞭だず発生しない。
    screen の䞭だず発生する。mintty や cygwin/ConPTY でも発生する。

    contra の䞭で発生しおいないし rps1 がなくおも発生しおいる事を考えるず、
    別に空癜文字が実際に倧量に出力されおいるずいう蚳でもないのだろう。
    具䜓的にどの様な出力がされおいるのかに぀いお調べおみる事にする。

    →調べるず ECH(113) が出力されおいる。成皋、これで contra ず他の terminal の
    振る舞いの違いが説明できる。ECH の出どころは䜕凊か。put-ech.draw を芋匵っお
    芋たが歀凊は通過しない様だ。_ble_term_ech で調べるず、

    * reject: もう䞀぀は textmap#update にある。eraser ずいう所で行のそれ以降の
      文字列を消去しおいる。取り敢えずここに _ble_term_sgr0 を入れる事にする。
      →ず思ったが歀凊を修正しおも䜕も倉化がない。歀凊は関係ない?

      ? 懞念: SGR を埩元する必芁があるのではないか?

        _ble_textmap_ichg は関係あるだろうか。
        _ble_textmap_ichg は改行に぀いお登録しおいる。
        ずいうかこれは #T0005 で議論しおいる内容である。
        #T0005 の内容は改行に゚ラヌ着色がある時にそれをどう衚瀺するかずいう話。
        改行の "SGR が行末たで反映されるのを防ぐ" のではなくお、
        "䞀文字だけ着色" などの现かい制埡をどうするかずいう話である。
        確かに、党く衚瀺しないずいうのでも良いのかなど色々単玔ではない。
        今回は textmap#update に察しおは倉曎は行わない事にする。

    * ok: もう䞀぀の箇所は ble/textarea#render/.erase-forward-line.draw である。
      ここにも _ble_term_sgr0 を入れる事にした。
      →これにより動く様になった。

    * ok: rps がない堎合には EL が䜿われおいる。
      この時にもちゃんず察策する必芁があるのでは。
      →これも䞊ず同じ箇所での凊理である。同様に _ble_term_sgr0 を入れる。

    * ok: contra が ECH に察しお珟圚の背景色を適甚しないのは意図的だったか。
      うヌん。倉だ。既定では mode_bce が true なので珟圚の背景色で ECH する筈。
      然し、実際には反映されおいない。䜕故だろうか。うヌん。これはバグである。
      →これは contra を修正した。

  * edit: mc ず䞀緒に䜿うず mc が固たる (reported by onelittlehope) [#D1392]
    https://github.com/akinomyoga/ble.sh/issues/62

    報告した症状は起動時に 10s の delay が入るずいうこず。
    これは自分の手蚱でも再珟する。

    | 䜕故だろうか。取り敢えず実行しおみるず mc は新しく PTY を䜜っお、その䞭で
    | bash を interactive に起動する様子である。
    |
    | ずいうか mc はどういう蚀語で曞かれおいるんだ?  PTY を生成しおいるずいう事は
    | bash ずいう事はなかろう。䜕のために bash を起動しおいる? 䞍思議なのは実際に
    | コマンドを実行する堎合にはnon-interactive の bash が䜿われおいるずいうこず。
    | 或いは、ble.sh がロヌドされおいなければ interactive になるのか。fallback ず
    | しお non-intarcive の bash になっおいるのか。
    | →どうやらその様である。
    |   ble.sh なしで起動した時には interactive mode になっおいる。

    * mc はコマンドを受け取る為に PTY を開いお䞭で bash を interactive mode で起動する。
      然し、ble.sh が有効の時には䜕らかの timeout により non-interactive bash に fallback する。

    | prompt-attach をしない様にすればOK? ず思ったが実際に attach するずやはり動かない。
    | うヌん。mc は䞀䜓䜕を期埅しおいるのだろうか。或いは  C-q 等の状態になっおいる可胜性?
    | 或いは stty の状態を ble.sh が倉曎しようずするのがいけない可胜性?
    |
    | もしかしお mc はプロンプトが衚瀺されるのを埅っおいる可胜性?
    | そしお PS1= を蚭定しおいる。ず思ったが、vi モヌドの時には -- INSERT -- を衚瀺するから
    | それを prompt だず刀定しおも良いのではないかずいう気がする。
    | 実際に䞀回起動しおから source ble.sh するず -- INSERT -- をプロンプトだず思う様である。
    | それに PS1= を蚭定するのにプロンプトが衚瀺されるのを埅぀ずいうのは倉である。

    mc の䞭にいる事を刀定できる方法はあるだろうか。䟋えば環境倉数が蚭定されおいるかなど。
    調べおみるず以䞋の倉数が蚭定されおいるので怜出する事は可胜である。
    そもそも mc は自身の line editor を䜿っおいる様なので、
    ble.sh が䜿えなくおも特に問題はない。
    なので基本的には mc の内郚では ble.sh を無効にするずいう方法で良い筈。

    declare -x MC_SID="30814"
    declare -x MC_TMPDIR="/var/tmp/mc-murase"

    䞀方で䜕故この様な振る舞いになるのか調べおおく必芁はある。
    ゜ヌスコヌドは以䞋にある。C蚀語で曞かれおいる。
    https://github.com/MidnightCommander/mc

    | ゜ヌスコヌドを怜玢しおみたが特に bind を䜿っお bash ず亀信しおいるずいう事はない気がする。
    |
    | * TERM も別に mc の物を蚭定しおいるずいう蚳ではない。
    | * ble-0.1 でも同様に問題は発生する。
    | * PS1 に倉な物が指定されおいるずいう事もない。
    | * PS1='\$ ' ずしお芋おも問題は倉わらない。
    | * bleopt_internal_suppress_bash_output= を詊したがやはり振る舞いは倉わらない。
    |
    | mc は䞀䜓䜕を埅っおいるのだろうか。゚ラヌメッセヌゞもないので分からない。
    | mc の゜ヌスコヌドの䜕凊かに non-interactive で起動するのず
    | interactive で起動するのの二皮類が存圚する筈である。
    | 或いは PTY ありずなしで起動しおいるだけの可胜性もあるが。
    | うヌん。grantpt で怜玢したら subshell/common.c に init_subshell ずいう関数があっお、
    | 其凊で色々ず初期化しおいる様に芋える。
    |
    | mc をコンパむルした。詊しおみる。確かに init_subshell の䞭で 10s 過ごしおいる。
    |
    | どうも PROMPT_COMMAND に pwd >&XXX を蚭定しおいお、
    | これが実行されるのを埅っおいる様だ。
    | ず思ったが、もしそうならば --noattach & attach でちゃんず動く筈なのでは。
    | 実際に詊しおみるず PROMPT_COMMAND は ble-attach 時には空になっおいる。
    | →PROMPT_COMMAND を䜕凊で蚭定しおいるのかず思ったら䞀回起動した埌に、
    |   PROMPT_COMMAND=... ずいうコマンドを pty 経由で入力しおいる。
    |
    | ble.sh はコマンド履歎を受け取っおいない気がする?
    | それなのに .bash_history にはちゃんず文字列が远加されおいる。
    | これは䞀䜓どういう事なのだろうか。別の経路で bash 本䜓がコマンドを受信しおいる?
    | ず思ったが分からない。それは考えにくいずいう気がする。
    | 或いは単に芋萜ずしだろうか→芋萜ずしだった。
    | ちゃんず実行されおいた。然し問題はコマンドの途䞭の改行で分割されお実行されおいるずいう事。
    | 倚分 syntax が初期化される前なので文法チェックがなされずに盎接コマンド実行されおいるずいう事?

    状況をたずめるず。mc は bash に察しお 'PROMPT_COMMAND=云々' ずいうコマンドを送信する。
    そしお次のプロンプトが衚瀺される時に PROMPT_COMMAND に蚭定した pwd >&15 ずいうコマンドを経由しお
    珟圚のディレクトリを受信する。珟圚のディレクトリを受信する迄埅ち 10s で timeout するず倱敗ず芋做す。

    ble.sh は最初のコマンドを受信するが受信した文字列を、
    途䞭の改行で分割しお個別に実行しようずする為、PROMPT_COMMAND の蚭定に倱敗する。
    埓っお pwd >&15 がい぀たでも実行されないのでブロックされる事になる。

    syntax.sh がロヌドされおいない状態でもちゃんず
    文法チェックをする様にした方が良いのかもしれない。

    うヌん。分かった。䜕故効かないのかずいうず \n (C-j) を䜿っお改行を入力しおいるからだ。
    䞀方で ble.sh では C-j を匷制実行に割り圓おおいる。

    % 取り敢えず ble-bind -s C-j $'\r' 等ずしおおけば問題は発生しない様だ。
    % 報告されおいるもう䞀぀の問題もこれで䞀緒に解決する。
    % 察策ずしおは MC の䞭にいる時には既定で䞊蚘の蚭定に切り替える。
    % もしくは最初のコマンド実行迄は C-j を匷制的に C-m に読み替える様にする。
    % MC の䞭にいるかどうかをより正確に刀定するにはどうすれば良いか。
    % MC_SID の有無だず曎に subshell の䞭に入った時にも察策が起動しおしたう。
    %
    % * 匷制的に attach しおいる筈なのに ble-detach 状態になっおいる。䜕故か。
    %   ず思ったらそもそも ble-attach しおいなかった。そしおble-bind で解決したかに芋えたのも、
    %   単に ble-attach しおいなかったからである。

    改めお回避方法に぀いお考える。ble-bind -f C-j nop ずするず、
    ごみの bash_history すら远加されなくなる事を芋るず、
    ちゃんず ble-bind は効果を持っおいる。然し、反応がなくなっおしたう。

    ずここで分かった。先ず ble.sh の C-m は文法構造に関係なく、
    続きに䜕か入力がある時には改行挿入ず芋做す。
    そしお䞀旊改行がコマンドラむンに入るず以降は multiline mode になっお
    以降どんなに改行が珟れおも改行挿入にしかならない。

    ぀たり ble.sh の C-m でも C-j でもない振る舞いにしなければならない。
    うヌん。accept-line でも文法チェックを行う?
    →結局 accept-line に syntax ずいう匕数を䞎えるか、
    或いは $$MC_SID == $$ 䞔぀ LINENO == 0 の時に文法的に完党かどうかをチェックする事にした。

    x fixed: 実際にコマンド履歎に劙な物が倧量に出力されおいる。
      これに぀いおもどうにかする必芁がある。
      或いは特に問題が発生しない限りはコマンド履歎に倉な物が登録される事はないのだろうか。

      ずいうか普通に bash が起動できた堎合にもこのごみが出力されるのだろうか。
      →確かにごみが .bash_history に残っおしたう。
      cd の蚘録皋床であればたあ残っおいおも良い気がするが、
      PROMPT_COMMAND 云々は .bash_history に残す理由もないし消したい所である。

      うヌん。ble.sh だず PROMPT_COMMAND= ず PS1= の二皮類のコマンドが履歎に曞き
      蟌たれおしたっお、最初の物は空癜が前眮されおいるので HISTCONTROL に
      ignorespace が入っおいる distro では䜕も起こらないが、二番目の PS1= は空癜
      が前眮されおいないので本圓に履歎に曞き蟌たれおしたう。所が bash の䞭で実行
      するず PROMPT_COMMAND しか蚭定されない。この違いは䜕凊から来るのだろうか。
      或いは䜕かの゚ラヌが起こった時に fallback ずしお PS1 を蚭定しおいる?

      ゜ヌスコヌドを芋るずちゃんず PROMPT_COMMAND ず共に PS1= が送信される様になっおいる。
      然し実際に起動した物を芋るず PS1 は蚭定されおいない様に芋える。䜕故。
      うヌん。どうもこれは kill -STOP $$ がどの時点で発動するかずいう問題の様だ。
      元の bash では \n が来た時にコマンドの解釈が途切れるので、
      その時点で SIGSTOP が来お bash が取り敢えず動䜜を停止する?
      䞀方で、ble.sh では kill -STOP をしおもお構いなく入力されたコマンドを党お実行する。
      結果ずしお埌に続く PS1= も䞀緒に実行されるずいう事である。

      これは意図的にその様に動䜜する様にしおいるのだず思われるが䜕故かはよくわからない。
      取り敢えず珟状のたたに ble.sh の䞭では PS1= も実行しおしたうずいう振る舞いのたたにする。
      cd に関しおはナヌザの蚭定で HISTCONTROL=ignorespace でも远加しおもらう事にする。

    x fixed: プロンプトが消滅しおいる。これは rps1 やその他の特別なプロンプトを
      $MC_SID == $$ の時には衚瀺しない様にすれば良い気がする。
      ず思っおその様に察策したがそれでもプロンプトが消滅したたたである。

      明瀺的にプロンプトの蚭定を党お削陀しおもやはりプロンプトは消滅したたたである。
      ずいうかそもそもプロンプトが食われおしたっお䜕も衚瀺されない。
      ずいう事はプロンプトを抜出するコヌドで䜕か問題が生じおいるずいう事。

      調べるず正に read_subshell_prompt ずいう関数が存圚しおいる。
      うヌん。ずいうかもしかしお kill -STOP を甚いお区切れを刀定しおいる?
      そしお kill -STOP のタむミングが倉なのでプロンプトではなくコマンドの出力ず思われおいる可胜性。
      然し、実際にはプロンプトが消滅しおしたっおいるずいう事を考えるずやはり違うのだろうか。
      或いはプロンプトが消滅しおしたっおいるのは単に \r\e[K しお珟圚行を消去しおいるからずいう可胜性もある。
      それにテストしおいる最䞭に -- INSERT -- をプロンプトず認識しおしたう事もあったので、
      恐らく kill -STOP のタむミングによる問題ではないのではないか。

      * 改めお read_subshell_prompt の動䜜に぀いお確認する必芁がある。

        read_subshell_prompt の呌び出しを芋おみるず通垞の bash では䞀回しか呌び出
        されおいないのに、ble.sh の䞭ではコマンドを実行する床に 3 回呌び出されおい
        る。最初の呌び出しでは空文字列が読み取られ、二回目の呌び出しでちゃんず内容
        が読み取られる。最埌の呌び出しで \e[m が読み取られお終わる。
        どうしお呌び出しの回数が異なるのか。

        䜕凊から呌び出されおいるのか。filemanager/layout.c の do_load_prompt から
        呌び出されおいる。そしお do_load_prompt は曎に load_prompt から呌び出され
        おいる。呌び出し経路を調べおみるず、

        bash (1) do_load_prompt -> read_subshell_prompt (有限)
        ble.sh (1) do_load_prompt -> read_subshell_prompt (空)
        ble.sh (2) load_prompt -> do_load_prompt -> read_subshell_prompt (有限)
        ble.sh (3) load_prompt -> do_load_prompt -> read_subshell_prompt (sgr0)

        の様になっおいる。ble.sh では load_prompt 経由の読み取りが䜙分にある。
        そしお load_prompt は filemanager/midnight.c の初期化時に

          add_select_channel (mc_global.tty.subshell_pty, load_prompt, NULL);

        の様にしお登録されおいる以倖は䜿われおいない。芁するに pty で䜕か受け取っ
        た時に load_prompt が呌び出されるずいう事の様に思われる。それにしおも䜕を
        trigger にしお呌び出されるのだろうか。

      * 3回目の read_subshell_prompt の呌び出しで sgr0 を読み取っおしたうのが原因に思われる。
        この3回目の read_subshell_prompt が起こらない様にすればよいのではないか。
        その為にはこの sgr0 の出どころを調べる必芁がある。

        䜕が起こっおいるのか分かった。ble/textarea#render を実行するず、
        特に曎新の必芁がない堎合には ble/textarea#focus が呌び出され、
        カヌ゜ル䜍眮を ble/textarea#render の珟圚䜍眮に移動する。
        この時に sgr0 を出力しおから移動しようずするのである。

        もう䞀぀の疑問は䜕故二぀に分けお出力されおいるのかずいう事。
        うヌん。分かった。ble/textarea#render -> ble/util/idle.do
        -> ble/textarea#render の順に呌び出されおいる。埓っお、
        ble/textarea#render が二回呌び出されるのである。

      うヌん。goto しおも移動がない堎合には _ble_term_sgr0 は出力しない事にする?
      他に圱響があるかどうか分からないが倚分倧䞈倫だろう。
      →これでちゃんず動くようになった。実は set -o vi でもちゃんず動いおいる。
      -- INSERT -- を衚瀺するタむミングずプロンプトを衚瀺するタむミングが偶々
      良い感じになっおいたからだず思われる。

      それでも C-o の画面に戻るずプロンプトが消滅しおしたっおはいる。これは画面
      の䞀番䞋にいる時に発生しおいる。どうも mc はコマンドを実行する時に画面の䞀
      番䞋の行にカヌ゜ルを持っおくる様である。ble.sh の canvas は行を党お管理で
      きおいるず思っおいるから、消去したい panel に普通に CUD で移動しお削陀しよ
      うずする。然し、実際には CUD で移動するのに倱敗しお誀っお珟圚の行を削陀し
      おしたうずいう事。これは察策できる気がする。察策した。

  * widget: keymap による自動的な振る舞いの切り替えの仕組みを䜜る [#D1391]

    うヌん。䜕だか面倒になっおきた。そもそも vi_imap の時にだけ振る舞いが倉わる
    物が倚過ぎお widget が色々異なるのが面倒である。ble/widget/newline を呌び出すだけで
    珟圚の keymap に応じお適切に振る舞いを倉曎する様に倉曎したらどうだろうか。
    edit.sh に党おの実装を曞き蟌むず edit.sh が肥倧化しおしたうので、
    動䜜を自動的に切り替える仕組みを䜜るずいうのでも良い。

    ず思ったが ble/widget/newline に関しおはナヌザの奜みで振る舞いを倉えたい事もあるかもしれない。
    等ず考えるず、keymap で固定しおしたうのではなくやはり自分で蚭定できる様にするべきだろうか。
    うヌん。然し、それはオプションで制埡できる様にしおも良い気がする。
    或いは、もしナヌザが自前で widget を䜜るのだずしたらそれは備え付けの ble/widget/newline ずは
    関係がないのだから気にしなくおも良い。

    ずいうか今その察策をする必芁はあるだろうか。
    うヌん。この察策をせずに実装しようずするず、
    accept-line に぀いおも vi_imap 云々ずいう keymap 刀定をしなければならなくなる。
    取り敢えず暫定の実装ずしお accept-line の内郚で keymap 刀定を実行する様にするか、
    或いは先に keymap 刀定を自動的に実行する仕組みを䜜っお敎理しおから accept-line
    に察する察策を実行するか。

    先に ble/widget/newline 等の実装を自動で切り替える仕組みを実装する事にする。
    察象は newline, accept-single-line-or, accept-line である。

    accept-single-line に関しおは vi-command 版もある。
    vi-command/accept-single-line-or は vi_nmap でしか䜿われおいないが、
    名称的には vi_[onx]map で䜿っおも問題がない様に蚭蚈されおいる気がする。

    これらにちゃんず察応する為には vi_omap, vi_xmap に぀いおも機胜を远加するか、
    或いは vi_nmap しか察応しないか、或いは vi_[onx]map の時には特別に
    vi_command も䞀緒に探玢する事にするか。取り敢えずは vi_nmap だけの察応で良い
    気がしおきた。

    * dispatch 先の関数名をどうするか。

      a 取り敢えずの実装ずしおは ble/widget/NAME に察しお ble/widget/KEYMAP/NAME
        を詊行する事にした。このルヌルは既存の緩やかなルヌルに合臎しおいるので既
        存のコヌドを倧きく曞き換える必芁はないだろう。

      b たた ble/widget/NAME/.keymap:KEYMAP 等の名称よりはわかりやすい気がする。
        ず思ったが、: が含たれる堎合も widget ずしお列挙されない様な気がする。ず
        いう事は ble/widget/NAME/keymap:default でも良い様な気もする。

        うヌん。keymap 特有の accept-line を呌び出す時に内郚的に accept-line を
        呌び出したい時にble/widget/accept-line ではなくお
        ble/widget/default/accept-line を呌び出さなければならないずいう事を思う
        ず、ble/widget/accept-line/keymap:default の方が良い? ず思ったが、䜕れに
        しおも ble/widget/accept-line/keymap:default ず曞いお呌び出さなければな
        らない。ble/widget/accept-line の儘で呌び出せる方法はないのである。なの
        で、やはり名称は ble/widget/default/accept-line でも倉わらない。

      c この芳点だず ble/widget/accept-line.default や
        ble/widget/accept-line.vi_imap 等だったら分かりやすかったかもしれないが、
        ble/widget/*.* の圢匏の補助関数は沢山あるのでそれず被っおしたう問題があ
        る。

      やはり取り敢えずは dispatch 先の関数名は a の方針で行く事にする。

    [倉曎]

    - done: newline 察応した。
    - done: accept-single-line-or

      実はこれは今察応する必芁はない? ずいうのも accept-line から newline を呌び
      出した時にもう既に自動的に keymap に察応する関数が呌び出される様になっおいる。
      埓っお特別に実装する必芁はないのではないか。

      䞀方でコヌドの綺麗さずいう芳点で考えるずやはり歀凊は統䞀した枠組みの䞊で実
      装したい。うヌん。やっぱり accept-single-line-or に぀いおも keymap dispatch
      に察応する事にする。

    - done: accept-line
      これも既に vi-command/accept-line ずいう物があるので keymap dispatch にする。
      vi-command/accept-line は vi_nmap/accept-line に名称を倉曎。
      実は vi_nmap/accept-single-line-or はこれで䞍芁になる。

    他にも vi_imap/... 等は存圚しおいる気がするが、これらは互いに呌び出す等の事
    をしお耇雑になっおいる蚳でもないので、远々眮き換えおいけば問題ない。
    取り敢えず動いおいる気がするので気にしない事にする。

2020-09-15

  * [解消] 2020-09-07 complete: 空癜を含むファむル名の補完候補が増殖する [#D1390]
    Note: #D1389 で解決した。

    曎にファむル名のパタヌンによっお同じ候補が沢山衚瀺されるこずもある。
    これは䞀般の匕数で発生する。complete -r しおも同様。
    どうもファむル名に含たれおいる空癜の数だけ候補が増殖する様子である。

    これは bash_completion では発生しない。
    自前の補完を甚いた時に発生する問題である。

    先ずは再珟させなければならないが再珟できない。新しい ble.sh で自然
    に盎ったのかずも思ったが叀いセッションでやっおも再珟しない。
    →再珟できた。少なくずもファむル名に完党䞀臎しおいる状態で<TAB>するず起こる。
    然し新しい ble.sh では再珟できおいない。

    䞀応䜕が原因で発生しおいたのか調べる必芁がある。OK。発生は確かめた。
    次に確認するべき事は䜕かずいうず、 候補生成で䜕が起こっおいるのかずいう事。

    分かった。これも glob pattern が単語分割されおいるのが原因だった。
    echo 'a b c' に察しおパタヌンが以䞋の様になり、
    結果ずしお3぀に展開されおいたずいう事である。

      pattern: ret='*a* *b* *c*'
      expanded: ret=('a b c' 'a b c' 'a b c')

    これは #D1389 で自然に解決したず芋お良い。

  * 2020-09-10 complete: mkdir aaaaaaaaaaa. ずするず無限ルヌプになる [#D1389]
    →aの数が少ないず問題が起きない。ずいう事を考えるずこれは曖昧補完で䜿っおいる
    正芏衚珟たたはパス名展開による物ず思われる。
    実際には無限ルヌプになっおいるずいう蚳ではなくお指数関数的に凊理量が倧きくなっおいる。
    これに察する察策はしおおかなければならない。

    同じ文字数でも abcdefg.... ずいう文字列だず問題は起こらない。
    ぀たりこれは同じ文字が連続で存圚しおいる時に発生する問題である。

    䞀぀の察策方法は同じ文字が耇数䞊んでいる時の曖昧文字列生成に぀いお。
    然しそれでも abababababa ずいうパタヌンに察しおは脆匱になるのではないか。

    ずいうよりそもそも、a*a ずなっおいる時に最初の * の䞭に
    a が含たれる事を犁止すれば良いのではないか。
    a*b の堎合には b を犁止する。その様にすれば必ず literal b match は、
    a の埌に珟れる最初の b ずいう事になるので曖昧さはなくなり、
    様々な皮類のパタヌン䞀臎を詊す必芁もなくなるのではないか。
    そしおそれはグロブパタヌンならば *([!b]) 等ずすれば良い。
    正芏衚珟ならば [^b]* ずすれば良い。

    然し、本圓にこれで問題ないだろうか。実はこれによっお䞀臎しなくなっ
    おしたうパタヌンなどがあったりするのではないか? ず思ったが 。倚分
    倧䞈倫である。元のパタヌンで䞀臎する文字列であれば必ず制限をかけた
    パタヌンでも䞀臎するずいう事を瀺せば良い。そしおそれは自明の事のよ
    うに思われる。

    chatoyancy 䞊で再珟できないず思ったらどうやら bash-4.4 では問題が
    起きるが bash-5.0 では問題は起きない様子だ。䜕れにしおも再珟できる
    様になったので修正できる。

    取り敢えず *([!b]) に倉換する様にしおみたがこれでちゃんず動䜜するかは分からない。
    先ずはちゃんず ambiguous expansion が働くかどうか。動く。
    そしお bash-4.4 で遅くなっおしたう問題も解決しおいる。
    取り敢えずこれで様子芋する事にする。

  * 2020-09-10 最初に起動した時に bleopt prompt_screen_title が反映されおいない [#D1388]

    これは分かった。ble.sh は _ble_term_TERM を芋お
    prompt_screen_title を出力するかどうか決めおいる。然し
    _ble_term_TERM は DA2 応答があるたでは代入されない。
    最初は空なのである。

    _ble_term_TERM が空の時には TERM も確認する事にした。
    流石に screen, screen.* に蚭定しおいるのは screen か tmux だけだろう。
    screen が xterm に蚭定しおいる堎合には刀定できないが仕方がない。

  * 2020-09-07 complete: メニュヌ補完で匕甚笊が消える [#D1387]

    匕甚笊で囲んでいる状態でメニュヌ補完するず匕甚笊が消える。䜕故だろう
    詊しおいた所メニュヌ補完でなくおも問題が生じる事が分かった。
    これは cd の匕数でだけ発生する? →どうもその様である。

    然しディレクトリ名のパタヌンによっお発生したりしなかったりする。
    OK. 再珟する。

    $ mkdir 'a b'
    $ cd 'a b       <--この状態で TAB を抌すず匕甚笊が消える。

    実は bash_completion を有効にしおいる堎合は cd だけでなく mkdir でも起こる。
    原因が同じかどうかは分からない。

    ble/cmdinfo/complete:cd を削陀するず再珟しない。
    ble/cmdinfo/complete:cd で盎接 ble/complete/source:file,dir 等を実
    行する様にしおいる堎合は再珟する。

    →普通にquote-insert も呌び出しおいる ず思ったが、調べおみるず、
    COMPS も COMPV も蚭定されおいないずいうこずが刀明した。䜕故。

    →調べるず䞀回目の呌び出しではちゃんず有限の文字列になっおいお匕甚笊も含た
    れおいる。然し、それに察しおは候補生成に倱敗しお、曎に 曖昧補完ずしお
    COMPS, COMPV を空にしお再床呌び出された時に候補が生成されるずいう事である。
    ここで二぀の問題がある。

    x fixed: 䜕故最初の匕甚笊ありの補完に倱敗しおいるのか

      これは分かった。glob で "$COMPV"*/ に等䟡な物を生成しようずしおいるが、

      % $COMPV の郚分を゚スケヌプする時に空癜文字の゚スケヌプをしおいないのが原
      % 因。然し、実際に䞀文字ず぀゚スケヌプする必芁があっただろうか。実は
      % '...'*/ ずしたり、或いは最早 "$COMPV"*/ でも良かったのではないだろうか。
      % 然し、それはどの様にパス名展開を匕き起こしおいるのかに䟝存する。もし
      % eval "a=($pattern)" ずしおいるのであれば良いが、もし a=($pattern) ずし
      % おいるのであれば quote 陀去や倉数展開は䜿えない。展開は実際に
      % ble/complete/util/eval-pathname-expansion で行われおいお、その䞭では以
      % 䞋の様にしお展開が実行されおいる。
      %
      % IFS= GLOBIGNORE= builtin eval 'ret=(); ret=($pattern)' 2>/dev/null
      %
      % ぀たり埌者なので quote 陀去や倉数展開は䜿えないのである。
      %
      % ? 然しここで疑問が生じる。もしこの様にしおいるのであれば、䜕故空癜をファ
      %   むル名の䞀郚ずしおパス名展開が行われないのか。ず思ったが、それよりも
      %   先に単語分割が先に行われおしたう。
      %
      % ? もう䞀぀の可胜性ずしお eval "ret=(); ret=($pattern)" の様に曞き換える
      %   ずいう事。こちらの方が融通が効くのではないかずいう気がする。然し、
      %   "$COMPV" の様な特定の倉数の倀が保持されおいる事を前提ずする物は䜿いた
      %   くない。だずするず '...' による quote に頌る事になる。実は \ に察する
      %   グロブ自䜓の quote ず察しお倉わらないのではないかずいう気がする。
      %
      %   然し、もしちゃんず \ による゚スケヌプで動䜜できる様にするのであれば、
      %   その儘の圢で意図した物にちゃんず䞀臎する様にパタヌンを構築した方が自
      %   然の気がする。ずいう事を色々考えるずやはり珟状の方針を倉えずに゚スケヌ
      %   プを修正するずいう方向で盎す。
      %
      % ? ファむル名に改行が含たれおいる堎合にはどうなるのか?
      %
      %   この堎合は単玔に pattern=$'a\\\nb*' 等ずしおも䞀臎しない気がする。
      %   実隓しおみる事にする。動かない。ずいうより気づいおしたったが、
      %   実は通垞の空癜であっおも \ を前眮しおも単語分割を防ぐ事はできない様だ。
      %
      % ? ok: bash-5.0 pathname expansion quirk の問題はあるか
      %
      %   䞀方で bash-5.0 の特別な振る舞いずしお \ が含たれおいるか含たれおいな
      %   いかで、ret=($PATTERN) ずした時に PATTERN がグロブパタヌンずしお取り
      %   扱われるかどうかが切り替わるずいう話がある。これは bash-5.1 でたた昔
      %   の動䜜に戻った。これに関しおは、ble.sh で䜿う時には必ず * 等のパタヌ
      %   ンを含んでいるから垞に意図的にパス名展開の察象であるので"意図せずパス
      %   名展開が起こった" ずいう事態にはならない。

      →倉数に含たれるグロブパタヌンに斌いお空癜を゚スケヌプする手段は存圚しな
      いずいう事が刀明した。぀たり ret=($pattern) ずいう展開自䜓が駄目ずいう事。
      代わりに pattern を適切に゚スケヌプした䞊で eval "ret=($pattern)" ずする
      必芁がある。

      先ず ble/complete/util/eval-pathname-expansion の呌び出し元を確認する。
      党お ble/complete/source:file/.construct-pathname-pattern の結果を䜿っおいる。
      なので、䞡方を曞き換えれば問題ない。

      ? util: 実は ble/util/eval-pathname-expansion でも同様に泚意が必芁なのでは?
        ず思ったが、調べおみるず ble/util/eval-pathname-expansion では始めから
        eval "ret=($1)" の圢匏を採甚しおいたのでこの手の問題は発生しない。

      * 単に pattern='"$COMPV"*' ずすれば良いのではないかず考えたが、
        それだず is-cygwin-slow-glob の刀定をすり抜けおしたうので、
        やはり自分で展開しお quote する圢にするのが良い気がする。

      どの様に quote するか。単玔に考えれば '...' で良いが特別の文字を含む時に
      限っお'...' の圢匏に移行するずいうのでも良い気がする。
      →これに察しおは新しく ble/string#quote-command ずいう関数を䜜った。
      取り敢えずこの問題に関しおは修正された気がする。

    x 二回目の補完で COMPS が消滅しおいるのにも関わらず、COMPS が存圚しおいるず
      いう前提での文脈に応じた escape をしおいる。これは単に COMPS に応じお
      escape の皮類を倉えるずいう事で察凊できる。

      quote-insert から呌び出しおいる escape では comps_flags を参照しおいる。

      こちらに぀いおは修正されおいない。先に前者の方を修正しおしたったので、
      改めおこれを再珟させる方法を考えなければならない。ず思ったが、
      単に head による候補列挙を䞀時的に停止すれば良いだけの気がする。

      ず思ったら空癜を含むファむルの補完候補が増殖する問題が邪魔をしお再珟でき
      ない。取り敢えずそちらを先に解決する事にする。ず思ったが勘違いだった。䞭
      途半端に head による候補列挙をスキップした為に候補が重耇しお生成されおい
      ただけだった。取り敢えず問題を再珟させる所たでは行った。原因は明らかであ
      る。問題はどの様にしおこれを実装するべきかずいう事である。

      元々の quote では元々存圚しおいる文字列を眮換しないずいう事を前提ずしおい
      た。なので quote 状態は砎壊されないずいう前提であった。或いは COMPV がちゃ
      んず quote 状態に察応しおいるずいう前提があったのである。然し、曖昧補完の
      時には COMPV を匷制的に眮換しおしたっおいるので、quote 状態ず COMPV が察
      応しおいない状態になっおいるのが元々の問題点である。

      COMPV を眮換せずに曖昧補完であるずいう事を䌝達するか、或いは曖昧補完の時
      には quote 状態のフラグも䞀緒に倉化させおしたうか。埌者の堎合には、元々の
      quote の皮類が補完によっお倉わっおしたうずいう事を意味する。やはりできる
      だけ quote の皮類は保持する様に眮換を実行したい。或いは珟状のたたで
      COMPV= が特別に曖昧補完であるずいう事にしお、quote を凊理するずいう方針?
      この方が良い様な気がしおきた。

      念の為 COMPV= を蚭定しおいる箇所に぀いお確認する。調べるずどうやら各
      source に斌いお独自の刀断で COMPV を空にしおいる様である。これは本来は内
      郚の倉数にコピヌしおから改倉するべきなのではないかずいう事。COMPV はその
      儘にしおおく事で quote の偎ではこれにより補完で遡った曞き換えが起こったか
      どうかを正しく刀定する事ができる。

      | a 䟋えば COMPV から compv にコピヌしお凊理するずいう事。この時に䜕らかの
      |   問題が生じる可胜性があるだろうか。COMPV を䜿甚しおいる箇所に぀いお確認
      |   する。結果分かった事は COMPV は候補生成の時にしか䜿われおいなくお、寧ろ
      |   元の文字列を参照する必芁があるのは quote をする時だけの様であるずいう事。
      |   ぀たり、逆に COMPV は珟状の様に凊理しお、代わりに別の倉数に本来の COMPV
      |   を保持するべきではないか、ずいう事。もしくは COMP_POINT か䜕かの倉数を
      |   甚いお自前で COMPV に察応する文字列を抜出する?
      |
      |   ず思ったが、COMPV は eval 埌の倀である為そう単玔ではない。ずいうか、本
      |   圓に COMPV による刀定だったろうか?
      |
      |   刀定は [[ $comps_flags == *v* && $CAND == "$COMPV"* ]] で行われおいる。
      |
      |   この時に䞀臎しおいる郚分たでを COMPS に眮き換えおそれ以降を゚スケヌプし
      |   お远蚘しおいる。うヌん。或いは、COMPS= COMPV= ずしたのが行けなくお、
      |   COMPS に匕甚笊などを保持しお眮くべきだったのかもしれない。それは䞀぀の
      |   解決方法である。
      |
      |   x compv の䜿甚箇所に぀いお確認を行う。ほずんど䜿われおいない。䜿われお
      |     いるのは filter を実斜する関数内で icasematch を実行する為に内郚で
      |     lower case に倉換しお差し替える為に眮き換えおいる所のみである。
      |
      |   x 然し䞀方で小文字の compv を特殊倉数名ずするのには抵抗がある。やはりで
      |     きるだけ特殊な関数の間で共有しお動的スコヌプでアクセスする倉数は
      |     prefix を぀けるか倧文字にするかしお区別する様にしたい。
      |
      | b COMPV= ずする時に COMPS の方にちゃんず匕甚笊等の quote も含めた倀を蚭定
      |   する。もしくは、quote 状態のフラグを修正する。
      |
      | c 或いは COMPS が空で quote 状態が蚭定されおいる時には曖昧補完ずしお
      |   COMPS/COMPV が䞊曞きされたず刀定する?

      うヌん。b の方法が珟圚のずころ䞀番良い様な気がする。取り敢えず COMPS=
      COMPV= を実行しおいる箇所を関数に眮き換える事にする。ず思ったが埮劙な事が
      残る 。COMPS=${COMPS::1} 及び COMPV=${COMPV::1} しおいるのは駄目である。
      䟋えば COMPS が 'hello' だった堎合に、COMPS=\' COMPV=h ずいう状態になっお
      したう。これだず h が補完埌に消滅しおしたう事になる。珟状でも問題になるの
      ではないだろうか。今たで問題が起こらなかったのは䜕故だろうか 。

      実際に詊しおみるず確かに問題が発生しおいる。

      $ touch hello
      $ echo 'hll <-- ここで TAB を抌すず補完結果が 'ello' になっおしたう。

      COMPS=${COMPS::1} ずしおいる郚分も含めおちゃんず察応する必芁がある。䞀方
      でどの様に切り出すのが正しいのかずいうのはかなり謎。うヌん。COMPS は別に
      自分で勝手に䜜り出しおも良いのではないだろうか。どうせ曖昧補完なので遡っ
      お曞き換わっおしたうのは仕方がない。それに実際に眮換する時には、呌び出し
      元の関数で凊理するので曞き換わった COMPS の圱響はない。飜くたで候補生成に
      圱響を䞎えるだけなので気にしなくおも良い。

      ずいう蚳で䜕れにしおも COMPS ずしお適圓な物を合成する方針にする。これだず
      䟋えば abc"def<TAB> ずした時に "abcdef... になるずいう動䜜になるが、たあ
      それで良いだろうずいう気がする。

      x 取り敢えず実装した ず思っお動䜜確認したら党く盎っおいない。どういう事
        だろうか。確認したら簡単なミスだった。コヌドの敎理もした。

    ? ok: source:command を芋るず command の曖昧補完は起こらない様になっおいる?
      ず思ったが実際にやっおみるず動いおいる。䜕故だろうか。確認する必芁がある。

      改めお確認するず source:command/gen を呌び出しお曎にその䞭の
      source:command/gen.1 に斌いお曖昧補完の蚭定をしお実際の展開を行っおいる。
      これに぀いおはOK

    ? comps_fixed がある時 (ブレヌス展開がある時) 曖昧補完を実行しようずするず䜕が起こるのか?

      | 䟋えばブレヌス展開がある所たでは展開結果が䞀臎しおいたずしおも、匕甚笊
      | 関連で曞き換えが起こるずするず補完できないずいう事になるのでは。以䞋を
      | 詊したら補完できなかった。これに぀いおは他を修正しおから改めお確認する。
      |
      |
      | $ touch hello
      | $ echo h{'ll<TAB>
      |
      | これに関しおは曖昧補完の堎合でも comps_fixed に察応する郚分たではそのたた
      | にしお補完を実行するのが良い気がする。問題は、h{xxx,ll<TAB> ずした時に䜕
      | 凊たでが fixed_part なのかずいう事。"h{xxx," が fixed part になっお展開結
      | 果が h になるのであればOK。䜕れにしおも取り敢えず実装しお様子を芋る。

      →これは次のテスト項目で䞀緒に取り扱う事にする。

    以䞋の動䜜確認を行う。

    | $ touch hello
    | $ echo 'hll<TAB>
    | $ echo 'hello'
    | これは動いた。
    |
    | $ echo h"ll<TAB>
    | $ echo "hello"
    |
    | これは動かない。䜕故だろうか。うヌん。もしかしお h"ll は単玔単語ではない?
    | 実際に呌び出しおみるず別に単玔単語でないずいう事はない。ちゃんず h"ll" に
    | 倉換しおその䞊で hll に倉換される。䞀応 h'll の堎合には期埅通りに党䜓が
    | '...' で囲たれた圢で補完されるので圓初期埅した機胜はちゃんず実装できおい
    | る。問題は䜕故 ' で動いお " で動かないのかずいう事。これはたた独立に調べ
    | る必芁がある。
    |
    | $ echo h{'ll<TAB>
    | $ echo h{'ello',
    |
    | これも動かない。echo h{ello', になっおしたう。ブレヌス展開の堎合には
    | quote が倖されおしたうので、末端の ' を぀けおはいけないずいう事。ブレヌス
    | 展開があっおも適圓な所で始たりの quote を挿入する様にしなければならないの
    | である。ず思ったが、分からない。
    |
    | 調べおみるず先ず $CAND == "$COMPV"* のテストには倱敗する。曖昧補完先頭䞀
    | 臎の堎合には COMPV=hl ずいう具合に最初の䞀文字を含んでいるからである。
    |
    | * うヌん。実は COMPV に既に文字が含たれおいる堎合には先頭䞀臎でも COMPV
    |   に新しい文字を远加する必芁はない。そうしないず CAND == COMPV のフィルタ
    |   リングで無駄に候補が削られおしたうから。ずいうよりそもそも hl から始た
    |   る単語しか生成されなくなっおしたう。ず思ったが、それは或る意味期埅した
    |   事なのでは? うヌん。然し、やはり h から始たる単語にした方が盎感的な気が
    |   する。その点に関しおはたた埌で修正する。
    |
    | x ok: もう䞀぀の問題は䜕故か COMPV に文字列を蚭定しおいるのにも関わらず、
    |   関係ない候補が沢山生成されおいるずいう事である。埌でフィルタリングされ
    |   るずは蚀え無駄である。これは bash_completion だろうか。或いは ble.sh 自
    |   䜓の問題だろうか。→ complete -r したら生成されなく鳎ったのでこれは
    |   bash_completion である。無芖しお良い。
    |
    | x pinned: 䜕故か quote-insert の時に COMPS/COMPV が倉化しおしたっおいる。
    |   quote-insert は source:* の䞭で呌び出されおいるのではないのか。実際に確
    |   かめおみるず source:argument の䞭で呌び出されおいる。぀たりちゃんず
    |   COMPS/COMPV は補正されおいる筈である? やはり内郚で曞き換わっおしたっお
    |   いる。代入しおいる箇所は他にはない気がする。䞀䜓䜕が起こっおいるのか改
    |   めお確認する。先ず䜕凊で曞き換わっおいるのかを特定する。
    |
    |   うヌん。どうやら分かった。 COMPS/COMPV を補正しおいるのは
    |   .generate-user-defined-completion の䞭であるが、実際に yield しおいるの
    |   はそれよりも倖偎の関数ずいう事の様である。䜕故だろう。
    |
    |   分かった 。source:file がそもそも曖昧補完に察応しおいないか壊れおいる?
    |   調べおみるず source:file はパス名展開を甚いお曖昧候補を生成する仕組みに
    |   なっおいる。぀たり別の枠組みで生成しおいる。
    |
    |   これは今たでにもあったバグだろうかず思っお調べおみるずやはり以前から存
    |   圚しおいたバグの様である。これも別に修正しなければならない。ず思ったが、
    |   これの前に修正したバグで再珟しおいただけかもしれない。䜕だか分からない。
    |   少なくずも新しく問題が起こる様になった蚳ではない。
    |
    | * comps_fixed が quote を含んでいないずいう点には泚意する。この時䜕凊かに
    |   は quote を入れる必芁があるのである。これに぀いおは改めお考察する必芁が
    |   ある。

    問題がたた絡み合っおきたので改めお珟状に぀いお敎理する。以䞋のテストケヌス
    を考える。

      $ touch hello
      $ echo 'hll<TAB>

      $ echo h"ll<TAB>

      $ complete -r
      $ echo 'hll<TAB>

      $ echo h{'ll<TAB>

    䞊蚘が党お動くようにならなければならない。既知の問題は、

    x fixed: source:file の実装で曖昧補完の時の quote 再珟に察応できおいない。
      これに察応する為にはどうしたら良いか。うヌん。単玔に開始 quote を
      quote-insert の偎で挿入しおしたうずいう事? たあそれで良い気がする。これは
      "曖昧補完による特別凊眮 COMPV= の時の特別な振る舞い" ではなくお、䞀般に
      "COMPV にも comps_fixed にも䞀臎しなかった時の振る舞い" ずしお適圓な物で
      あるから ad hoc な凊眮ではない。

    x fixed: ブレヌス展開がある時 comps_fixed は "h{" になるのであっお、quote
      の開始 "'" を含む蚳ではない。comps_fixed に続いお quote 文脈に応じた
      quote 開始を挿入する必芁がある。

      これに関しおも comps_flags に応じお勝手に匕甚笊を挿入するずいうので良い気がする。
      comps_fixed に入る文字列はちゃんず quote を閉じおいるず期埅したい。
      因みに h{aaa,'ll ずなっおいる堎合は comps_fixed は䞀䜓どうなるのか?
      ず思っお調べた所、

    * done: [[ $compv ]] のチェック in reduce。COMPV から compv_fixed を取り陀
      いた埌 compv= (空文字列) になっおいる時に、"最初の䞀文字を切り出す" 凊理
      をするのは倉である。芋た感じ問題が起こりそうな気配もないがちゃんずチェッ
      クしおおく。

    o echo 'hll<TAB>
    o echo 'hll<TAB> (complete -r)
    o echo h{'ll<TAB> (complete -r)
    o echo h{aaaa,'ll<TAB> (complete -r)

  * complete: bash_completion の autoload が初回に倱敗する問題 [#D1386]

    [たずめ] これは echo h"ll 䞭に芋぀かった䞍自然な振る舞いから。結局、
    autoload した埌再床補完を実斜する事を芁求する 124 の終了ステヌタス
    を受け取った時、改めお補完関数の探玢からやり盎す所で、default opts
    が残っおいた所為で、新しい補完蚭定ではなくお再び complete -D の補
    完蚭定を䜿っお読み取りを行おうずしおいた事が原因だった。これは 124
    を受け取った時に default opts を削陀しお再床補完を実行する様に倉曎
    しお解決した。

    | 䞍思議な事に最初の䞀回はちゃんず補完されお、二回目以降からは補完
    | 候補が䞀臎しない物も含めお党お衚瀺される様になる。
    |
    | 最初の呌び出しではプログラム補完が芋぀からずにデフォル
    | トの補完が走っお、それが倱敗する事によっお次の曖昧補完に移行し
    | おいる。二回目以降の補完ではプログラム補完が呌び出されおそれが
    | 成功するので曖昧補完が走らない。
    |
    | プログラム補完が芋぀からないずご刀定されおいるのかず考えたが、
    | 実際に補完は芋぀かっおおらず complete -p echo しおも補完指定が
    | 芋぀かりたせんでしたず衚瀺される。ずいう事は別の箇所で echo に
    | 察する補完指定が蚭定されおいるずいう事になる。䜕凊だろうか。
    |
    | 恐らく default を䜿っお compgen を呌び出したタむミングだろう。
    | 䞭を芗くずちゃんずデフォルトの補完が読み蟌たれお 124 を返しお、
    | 結果ずしお再床補完が走っお、最終的にちゃんず補完が呌び出される。
    |
    | % ここで気づいた事 。䜕故か compgen に枡されおいる compv が空
    | % になっおいる。124 で再ロヌドした埌にのみちゃんず倀が蚭定され
    | % おいる。ず思ったらこれは勘違いだった。
    |
    | 䞀回目ず二回目を比范しおみるず どうも compopt の内容が違う。ど
    | うしお前者では候補が生成されず (期埅通り)、埌者では合臎しない候
    | 補が生成されおしたうのか。
    |
    | H2332:builtin compgen -o bashdefault -o de
    | fault -F ble/complete/progcomp/.compgen-he
    | lper-func -- 'hll' 2>/dev/null
    | comp_func=_python_argcomplete_global
    |
    | H2332:builtin compgen -F ble/complete/prog
    | comp/.compgen-helper-func -- 'hll' 2>/dev/
    | null
    | comp_func=_minimal
    |
    | 補間関数も含めお比范しおみるず䞡者が異なっおいる。䜕故? ずいうよ
    | りリロヌドしお評䟡した筈なのに䜕故再床同じ関数が呌び出されおいる
    | のか?? 挞く分かった。compgen の匕数に "default" が入っおいるので、
    | 124 で再ロヌドしおも default 甚の補間関数が呌び出されおしたうず
    | いう問題であった。

  * complete: echo h"ll<TAB> で bash_completion が党ファむル名を列挙する [#D1385]

    [たずめ] これは extract-command で閉じおいない単語を回収するのに倱
    敗しおいたのが原因だった。閉じおいない単語を仮に実䜓化しおいたがそ
    の時の単語の皮類 wtype が CTX_ARGX になっおいた。然し、
    extract-command は CTX_ARGI しか回収しおいなかった。単語を仮に実䜓
    化する時に、ctx-word-end で実際にやっおいるのず同様に wtype を補正
    する事にした。

    | これはどうも bash_completion が入っおいるず駄目のようである。
    | bash_completion の生成する候補に問題がある?
    | もしくは、progcomp による yield に問題がある?
    | うヌん。実は bash_completion による候補は filtering で党お消える?
    |
    | 䞀回どのような候補が生成されおいるのか確認する必芁がある? 取り敢
    | えず bash_completion は党おのファむル名を列挙する。filter:head
    | は䜕もしおいない様に芋える。実際に動䜜を芋おみるず䜕もしおいない。
    | ぀たり、progcomp が生成した物をそのたた䜿うずいう䜜戊になっおい
    | る。これはたあ理解できる。䞀方で bash_completion が遡っお曞き換
    | えの起こる候補を党お出すのも理解できる。
    |
    | これに完党に察応する為には bash_completion の生成した候補に察し
    | おフィルタをかける必芁があるが うヌん。フィルタをかけお有限個の
    | 候補が残ればOK、そうでなければそのたた沢山の候補を保持するずいう
    | 䜜戊? でもよくわからないのは最初の補完ではちゃんず補完ができるず
    | いう事。䜕故だろう。
    |
    | 改めお bash_completion の振る舞いに぀いお確認する。ble.sh なしで
    | 実行するず h"ll に察しお゚ラヌメッセヌゞが出るが最終的にはちゃん
    | ず䜕も候補を生成せずに終わる。然し、経由だず党おの候補が列挙され
    | おしたっおいる。぀たり、ble.sh の時ず bash の時でやはり䜕らかの
    | 違いがあるずいう事だろうか。具䜓的に ble.sh による呌び出しの時ず、
    | bash による呌び出しの時でどのような違いがあるのかに぀いお調べる
    | 事にする。
    |
    | * 取り敢えず今たでに埋め蟌んだデバグ甚の出力は党お削陀する。
    | * _minimal に察しお advice を仕掛ける。
    |
    | | ble.sh の䞋では、
    | | -----------------
    | |
    | | COMP_CWORD='1' COMP_KEY='67108969' COMP_LINE='echo '
    | | COMP_POINT='5' COMP_TYPE='9'
    | | COMP_WORDS=('echo' '')
    | | COMPREPLY=('a b' 'a b' 'a' 'bc' 'a xyz' 'h ello')
    | |
    | | bash の䞋では
    | | -------------
    | |
    | | COMP_CWORD='1' COMP_KEY='9' COMP_LINE='echo h"ll'
    | | COMP_POINT='9' COMP_TYPE='9'
    | | COMP_WORDS=('echo' 'h"ll') COMPREPLY=()
    |
    | 成皋、これは ble.sh が悪い。COMP_WORDS の埩元に倱敗しおいる。空
    | の単語になっおしたっおいる。COMPV 等に基づく候補生成はちゃんず動
    | いおいるずいう事を考えるず、extract-command か或いは COMP_WORDS
    | の構築に倱敗しおいる。
    |
    | 確かめた所、extract-command の時点で倱敗しおいるずいう事が刀明し
    | た。問題は h'll の時にはちゃんず成功しおいるのに䜕故 h"ll の時に
    | はうたく行かないのかずいう事。" が䞭に構造を持぀事ができるずいう
    | 事に関係しおいるだろうか。
    |
    | 実際に構文朚を芋おみるず確かに nest が蚭眮されおいお単語が構築で
    | きおいない状態になっおいる。本来は擬䌌的に文法構造を閉じおその䞊
    | で解析するのではなかったか。芚えおいないがその様な凊理が䜕凊かに
    | あった筈。これである。
    |
    | ble/syntax/tree-enumerate/.initialize で TE_root を
    | ${_ble_syntax_tree[iN-1]} の補正版ずしお初期化しおいる。本来はこ
    | れによっお nest が閉じられお単語になっお欲しいのだが、実際にはそ
    | うはなっおいない。然し、f11 による画面でも文法構造が確定せず゚ラヌ
    | の様な状態になっおいる。ず思ったが f11 による画面では文法構造を
    | 閉じおいないので圓然ずいえば圓然である。具䜓的に問題の起こる状況
    | で TE_root がどの様に埩元されおいるかを確認するず以䞋の様になっ
    | おいる。
    |
    | TE_root='3 4 0 5 -- none 3 -1 -1 -- '
    |
    | 3 は wtype で 4 は珟圚の単語の長さである。歀凊たでは正しい。0 は
    | 子単語たでの offset であり、実は同じ䜍眮に子単語が存圚しおいる。
    | 子ノヌドは wtype=none (nest 構造) であり、長さは 3 である。子や
    | 兄芁玠は存圚しない。実際にこれに問題があるのかどうかの刀定は分か
    | らない。芋た感じは明らかな異垞はない様に芋える。特に長さが "4"
    | ずなっおいる以䞊は長さ4の単語を抜き出せお良いのではないだろうか。
    |
    | 䜕故正しく単語を抜き出せないのかに぀いおは、実際にどの様に
    | tree-enumerate が走るのか確認するしかない。
    |
    | * 色々分かった。TE_root の埩元によっお生成された単語は CTX_ARGX
    |   になっおいる。䞀方で通垞の単語は CTX_ARGI である。
    |   extract-command では ARGI な単語しか収集しおいない。぀たり
    |   ARGX による単語は register-word が呌び出されず登録されない事に
    |   なる。
    |
    |   䞀方で、䞀番最初に芋぀かった単語の終端がが珟圚の起点の䜍眮より
    |   も前にある堎合には、珟圚の起点の䜍眮に長さ 0 の単語が存圚しお
    |   いるず芋做しお、"" の単語を挿入する。この空単語は ARGX になっ
    |   おスキップされた単語ずは䜕の関係もない。
    |
    | この状況に斌いおどのように修正するのが正しいか。TE_root を構築す
    | る時に ARGX → ARGI の芏則を適甚するのが良い気がする。その様にし
    | たらあっさりず動く様になった。

2020-09-05

  * ln23.para.bscc が䜕故か SM(?1004) Any event mouse を蚭定する [#D1384]
    これにより focus/blur で SS3 I, SS3 O が送信される様になっお
    ble.sh が混乱しおいる。SS3 I は TAB になっおいる。
    SS3 O は䜕のキヌにも束瞛しおいないので ESC O O ずいう入力になっおしたう。
    取り敢えず SS3 O を認識する様に修正する。

2020-09-03

  * 2020-08-31 util: is-global の実装はちゃんずしおいるのだろうか [#D1383]
    ぀たり倉数が unset 状態にある堎合等に察しおも予想通りに動䜜するのだろうか。
    たた、珟圚の実装ではヘルパヌ関数を甚いおいるがこれは本圓に必芁だろうか。

    →詊しおみるず global に declare だけしおいる倉数を local ず勘違いする様である。
    global に declare だけしおいる時に readonly するず local でも倉数を䜜れるずいう事?
    ず思ったらテストの問題だった。テストは恐らく関数の䞭で実行しおいるので、
    トップレベルに declare v1u 等ずしおいる぀もりでも関数内に倉数が䜜成されおいる。
    declare -g を䜿っお明瀺的にグロヌバルに unset 倉数を䜜成しおテストした所ちゃんず動くこずを確かめられた。

  * 2020-08-03 ble.sh ロヌド方法ず attach 戊略に察する考察 [#D1382]
    関連 (attach=prompt): #D0940, #D0737, #D1124

    そろそろ .bashrc の蚭定方法を倉曎しおも良いのではないだろうか。
    特に、 .bashrc の末尟に蚘述するのが良い気がする。
    或いは未だ先頭に . ble.sh を蚘述する必芁性があっただろうか。

    ナヌザヌが ble.sh の有無で bashrc の䞭の蚭定を切り替える堎合がある。
    この堎合には最初に source しお BLE_VERSION を甚いお刀定するのが良い。
    然し、ble.sh の有無はナヌザが独自に刀定しおいる堎合も倚いので、
    わざわざこれの為に二箇所に ble.sh のコヌドを曞くのはやはり倉かもしれない。

    * BLE_VERSION を䜿っお刀定する為にはちゃんず読み蟌みに倱敗した時に
      unset されおいなければならない。ちゃんずその様になっおいるか。

      * _ble_bash ず BLE_VERSION の初期化されおいる䜍眮をたずめた。
      * たた、_ble_bash 初期化前に倀を参照しおいる箇所があったので䜿わない様に修正した。
      * BLE_VERSINFO に぀いおも同様に unset する様にした。
      * ble/base/unload で _ble_bash, BLE_VERSION, BLE_VERSINFO を削陀する様にした。

    以䞋の attach 戊略に察する考察は #T0004 に纏め盎した

    | 初に蚘述するず他のフレヌムワヌクが勝手に PROMPT_COMMAND を曞き換えた時に動かない。
    | 埌に蚘述するず他の蚭定で ble.sh の有無で切り替えを行いたい時に䞍䟿である。
    | うに、どの堎所に蚘述しおも動く様にするのが本圓は良いのだろう。
    | 状の問題点ずしおは PROMPT_COMMAND を䞊曞きされるず動かないずいう事だけである。
    |
    | 或いは、その堎で attach しおしたう方向で改良する手もあるのかもしれない。
    | ず思ったがそれだず PS1 の蚭定などが反映される前にプロンプトを衚瀺しおしたう?
    | その盎埌に PS1 が蚭定されお次のキヌボヌド入力の際に曎新されるのだろうが、
    | それだずちら぀いたりしおよくない。
    |
    | 或いは、その堎で attach した時には最䜎限の凊理を行っお、
    | それでナヌザの入力を受け付ける様にする。
    | PROPMT_COMMAND が生きおいれば続きの凊理を行っお、
    | もし䞊曞きされお動いおいない堎合でもできるだけ問題が起こらない様に凊理する。
    |
    | ble-attach しお最初は出力抑制しない䜜戊
    |
    | もっず具䜓的に考える。その堎で attach した時の問題点は䜕かずいうず、
    | attach しおプロンプトを衚瀺しお、然しその埌で bashrc の䞭から䜕か
    | メッセヌゞが画面に衚瀺しようずしおも出力が抑制されおいるので
    | 内容が消えおしたうずいう事である。
    |
    | 然し、ble-attach の時は出力を抑制しないでその次のナヌザの入力の
    | 時に初めお抑制をするずいう手もある。
    |
    | x この時には最初のナヌザ入力の際に䞀瞬だけちら぀きが発生しおした
    |   う。
    |
    | x もう䞀぀の問題点は ble-attach した埌に、bashrc の別のシェル蚭
    |   定が画面に䜕か出力するず衚瀺が乱れおしたうずいう事である。
    |
    | 埌者の問題を解決する為に、プロンプトの衚瀺は PROMPT_COMMAND たで
    | 遅延するずいう可胜性もある。
    |
    | x しかし、そうするず起動たでの時間が気になる。ble-attach するず
    |   いう事は bind するずいう事で、bind するずいう事は keymap の初
    |   期化を行うずいう事である。぀たり時間がかかる。本来はそれより前
    |   にプロンプトは衚瀺しおおきたい。たあ、これはそれ皋気にしなくお
    |   も良いかもしれない。
    |
    | 前者のちら぀きの問題に関しおは、PROMPT_COMMAND が正しく機胜すれ
    | ば特に問題ない筈である。
    |
    | ble-attach しお出力抑制もする。埌で出力内容を dump する䜜戊
    |
    | 或いは ble-attach しおから次のナヌザ入力を埗るたでの間に bashrc
    | から出力された内容は適圓なタむミングで画面に出力する様にする?
    | これは䞀぀の手であるような気がする。PROMPT_COMMAND が有効であれば、
    | その瞬間にそれたでに出力された内容を dump すれば良い。
    |
    | x ただし、時間のかかる凊理やプログレスバヌ等の衚瀺があるず最埌に
    |   䞀気に衚瀺するので期埅はずれの動䜜になる
    |
    | x 曎にナヌザの入力を求める凊理があるず䜕も衚瀺されない状態になっ
    |   お困る。いざ /dev/tty に察しお読み曞きするプログラムがあったずし
    |   おも、今床は逆に画面の衚瀺が乱れおしたう。
    |
    | 等などの事を考えるずやはり ble-attach しおから、埌の bashrc の凊
    | 理を適圓に流すずいうのは難しいのではないか。或いは本栌的に bash
    | の出力を別のプロセスに繋げお、そのプロセスで出力内容を遞別しなが
    | ら適圓に描画を乱さない様に調敎する? ず思ったがそれだず本栌的に端
    | 末を実装する様な物だし、/dev/tty を䜿われたら結局調敎もできなく
    | なる。駄目。
    |
    | 或いは trap RETURN もしくは trap DEBUG を甚いお PROMPT_COMMAND
    | を監芖する? 䞊曞きされたり砎壊されたりしたら埩元する。
    |
    | 関連する議論が #D1124 及び D#0737 にある。然しこれも埮劙である。
    |
    | x trap DEBUG はコマンドの実行盎前に実行されるので、bashrc の䞀番
    |   最埌の行で PROMPT_COMMAND が曞き換えられるず駄目。それに trap
    |   DEBUG 自䜓を䞊曞きされおしたうず動かなくなっおしたう。それに
    |   trap DEBUG は結構面倒である。
    |
    | x trap RETURN は bashrc の末尟では発生しないようなのでこれは党然
    |   䜿えない。
    |
    | れ以倖に䞍定期で呌び出される hook の類は存圚しただろうか。本圓は
    | OMPT_COMMAND が倉曎された時にそれを怜出できたら良い。或いは
    | OMPT_COMMAND に察する読み曞きを党お hook できたら良い。然し、ス
    | リプトだけでそれを実珟する方法はないのだろうずいう気がする。
    |
    | EXIT はプロセスが終了する時にしか呌び出されないし、ERR もコマン
    | ドが倱敗した時にしか発生しない。bashrc の最埌に自動的に倱敗する
    | コマンドを呌び出させる方法もない。
    |
    | command_not_found_handle はコマンドが芋぀からない堎合にしか呌び
    | 出されない。それにディストリビュヌションによっお䜕か凊理が蚭定さ
    | れるだろうから PROMPT_COMMAND ず同様の問題がある。寧ろ、凊理の远
    | 加ずいう事ができないので PROMPT_COMMAND にも増しお䜿いづらい。
    |
    | bashrc の凊理を芋たら bashrc の最埌に介入する方法が芋぀かったり
    | しないか。ず思ったが eval の最埌に䜕もないように bashrc の最埌に
    | も特別な物は䜕もないだろうずいう気がしおならない。
    |
    | bash は maybe_execute_file ずいう関数を甚いお bashrc を呌び出す
    | 様である。調べおみるずどうもファむルの䞭身を䞞ごず文字列 string
    | に読み蟌んで、曎にそれを parse_and_execute で䞀気に実行する様で
    | ある。第䞉匕数のフラグには SEVAL_RESETLINE を蚭定しおいる。然し、
    | parse_and_execute の䞭には介入できそうな堎所はやはりない。
    |
    | 或いは execute_prompt_command を芋たら䜕かないだろうか。たたはそ
    | の呌び出し元。execute_prompt_command を芋たら単に PROMPT_COMMAND
    | を芋おいるだけである。呌び出し元は parse_command であり、その冒
    | 頭で run_pending_command を呌び出しおいる。うヌん。これが䜿える?
    |
    | kill -USR2 $$ をしたら trap handler が実行されるのはどのタむミン
    | グだろうか。もし bashrc が終わっおから䞀括で実行されるのであれば
    | kill -USR2 $$ で bashrc 盎埌の凊理を予玄できる。
    |
    | うヌん。駄目だった。その堎で実行される。kill -USR2 $$ & ずしお芋
    | おも駄目だった。USR2 が届いおから次のコマンドを実行する盎前に実
    | 行されるずいう事の様である。
    |
    | PROMPT_COMMAND の代わりに PS1 に $(kill -USR2 $$) をしかける等の
    | 手もあるかもしれないが、これは PROMPT_COMMAND ず同じ問題が圚る。
    | ずいうより、PS1 は远蚘ではなく眮き換えお䜿う物なので
    | PROMPT_COMMAND よりも信頌性は䜎い。
    |
    | もし PROMPT_COMMAND を䞊曞きした犯人がいるのだずしたら、䞊曞き埌
    | のコマンドを必ず実行する筈で、だずすればそれを trap DEBUG で刀定
    | できるのではないか。
    |
    | | そしお bashrc の䞭か倖かの刀定ができれば OK. ず思ったが #D1124
    | | を芋るず 4.3 以降で動く埮劙な方法しかない様だ。
    | |
    | | * reject: 或いは bashrc の䞭で declare などしおおけばそれが消滅
    | |   した事を芋れば bashrc の倖に来たず分かる? ず思ったが実際に詊し
    | |   おみるずbashrc の䞭で蚭定した declare はそのたたグロヌバルスコヌ
    | |   プになる様だ。なのでこれは䜿えない。
    | |
    | | どうやら関数の䞭で ${BASH_SOURCE[-1]} を参照しおそれが bashrc ず
    | | 䞀臎しおいるかを確かめれば良さそうだ。ず思ったが 。珟圚の
    | | bashrc が䜕かを知る方法がない。BASH_ENV に入っおいるのは別の倉数
    | | の様子だ。grep しお確かめるず BASH_ARGV の末端には bashrc の名称
    | | が栌玍されおいる様だが、これは関数の䞭では䜕れにしおもトップレベ
    | | ルの関数名が入っおいるので区別できないのでは。
    | |
    | | 唯、䞀぀明らかなのは、bashrc の䞭にいる間は BASH_SOURCE に䜕か蚭
    | | 定されおいお、PROMPT_COMMAND を実行しようずした瞬間には䜕も蚭定
    | | されおいないずいう状態になるずいう事。なので原理的に可胜である。
    | |
    | | x PROMPT_COMMAND に関数定矩だけ蚭定されおいる等の時、DEBUG は呌
    | |   び出されないのでは。たあその様な特殊な堎合には仕方がない。
    | |
    | | * 重倧な問題ずしお bashrc の䞭で source ble.sh したのず、普通の
    | |   察話コマンドの䞀郚ずしお source bashrc しお間接的に source
    | |   ble.sh したのをどう区別するのかずいう事。埌者の堎合には、
    | |   source bashrc; echo hello 等ずしおいた時のためにトップレベルた
    | |   で戻ったずしおも即座に PROMPT_COMMAND になったず刀定しお発火す
    | |   るのではなくお、本圓の PROMPT_COMMAND が珟れるたで埅たなければ
    | |   ならないのでは無いか。
    | |
    | |   LINENO を参照すれば刀定できる? ず思ったが LINENO は察話コマン
    | |   ドではコマンドの番号であるが、bashrc の䞭ではファむル内の行番
    | |   号ずいう事になっおいる。䜿えない。
    | |
    | |   うヌん。もしかしお BASH_LINENO[-1] が垞に0?
    |
    | PROMPT_COMMAND など倖郚のコマンドの実行盎前に発火したい。bashrc
    | の倖に出た事を怜出する必芁がある。
    |
    | * DEBUG で [[ ${FUNCNAME[-1]} == source ]] である事を監芖しお最
    |   初にそれが砎れた瞬間を PROMPT_COMMAND もしくは別のコマンドず考
    |   えれば良い気がする。
    |
    | * [[ $BASH_COMMAND == $PROMPT_COMMAND ]] は䜿えない。䜕故なら
    |   PROMPT_COMMAND が単䞀のコマンドずは限らないから。それに叀い
    |   version の bash だず BASH_COMMAND は本圓に今のコマンド [[
    |   ... ]] になっおしたうので圓おにできない。
    |
    | x PROMPT_COMMAND が空に蚭定されおしたった時や、PROMPT_COMMAND に
    |   関数定矩だけが蚘述された堎合には怜出ができなくなっおしたうが、
    |   その様な堎合は皀であるし、それで逃したずしおも次の別のコマンド
    |   の実行時に attach が発火するので問題ない気がする。
    |
    | * 珟圚 rcfile の実行䞭である堎合には ${BASH_LINENO[-1]} == 0 に
    |   なっおいる。
    |
    |   然しよく考えたら rcfile かどうかを区別する必芁はあるのだろうか。
    |   察話コマンドで source .bashrc ず入力した堎合を考えるず、この堎
    |   合にも .bashrc の䞭で PROMPT_COMMAND を䞊曞きされる可胜性を考
    |   えるず同様に察策が必芁になるのではないだろうか。
    |
    |   * rcfile で実行しおいる時には rcfile の倖に出た瞬間に attach
    |     しお良い。䜕故ならば rcfile の倖に出たら次は PROMPT_COMMAND
    |     の実行以降であり既に attach のタむミングになっおいるから。
    |
    |   * 察話コマンドで実行しおいる時には top level の source を抜け
    |     たずしおもすぐに attach しお良いずは限らない。䜕故ならその埌
    |     に盎接たた別のコマンドを蚘述しおいるかもしれないから。ここで
    |     出来るのは PROMPT_COMMAND に別の倀が蚭定されおいた時にそれを
    |     ble.sh のそれに修正する事である。然し、珟圚 PROMPT_COMMAND
    |     が実行されおいる時に限れば、その堎で attach しなければならな
    |     い。その為には珟圚実行しおいるのが PROMPT_COMMAND なのか或い
    |     は通垞のコマンドなのかを刀定する必芁がある。それは
    |     BASH_LINENO が増えたかどうかで刀定できるだろうか? ず思ったが
    |     倚分難しい。
    |
    |   * どうやら HISTCMD / ${_histcmd@P} の結果で刀定できる気がする。
    |     察話コマンドの実行䞭は HISTCMD には履歎項目の個数が入っおい
    |     るが、PROMPT_COMMAND の実行䞭は 1 に展開される。HISTCMD が
    |     unset されおいたずしおも ${_histcmd@P} (_histcmd='\!') は 1
    |     に展開される。HISTCMD が unset されおいるかどうかは
    |     ((HISTCMD++)) しお数が倉化するかどうかを確認すれば良い。
    |
    |   * ゜ヌスコヌドも確認したがやはり PROMPT_COMMAND を区別するのは
    |     本質的に難しい? PROMPT_COMMAND は parse_and_execute 経由で実
    |     行しおいお、この時フラグに SEVAL_NONINT|SEVAL_NOHIST を指定
    |     しおいる。぀たり $- を芋たら違いが分かるかもしれない? ず思っ
    |     お確認したら通垞コマンドも PROMPT_COMMAND も himBHs だった。
    |
    |     別に分かった事は rcfile の凊理䞭は $- に s が存圚しおいなく
    |     お、PROMPT_COMMAND の時には s が存圚しおいるずいう事。s は䜕
    |     か。man によるず bash の起動時の -s は䜍眮パラメヌタの指定が
    |     あるかどうか? いや、暙準入力から読み取るモヌドになっおいる時
    |     に s が入るのである。
    |
    |     類䌌の倉数ずしお $BASHOPTS があるが、こちらは rcfile ずそれ
    |     以降で違いは芋られない。
    |
    |     bash の倉数 "interactive" で振る舞いが倉わる物を䜿っお
    |     interactive の状態を怜出できるだろうか。゜ヌスコヌドを怜玢す
    |     るず取り敢えず alias は non-interactive の時にだけ有効になっ
    |     おいる気がする。
    |
    | * DEBUG trap の取り扱いが難しいずいう事に泚意する。これに぀いお
    |   は未解決の task が存圚した筈である。


2020-08-29

  * 2020-08-24 auto-menu を有効にしおいるず vbell がずっず鳎っおいる状態になる [#D1381]
    auto-menu は倧々的には告知しおいないし manual にあるだけなので
    䜿っおいる人はいないのだろうずいう気がするが修正する必芁がある。

  * 2020-08-23 main: bash-5.1 で PROMPT_COMMANDS が定矩されおいる時 --attach=prompt が効かない [#D1380]

    PROMPT_COMMANDS 経由で attach する様にしなければならない。
    たた PRPOMPT_COMMANDS 経由で attach した堎合は、
    attach した埌に自身を消去する必芁がある。

    曞いおいる内に分からなくなった。PROMPT_COMMAND ず共存する為にどう
    したら良いのか。結局 bug-bash で議論を呌びかけおみたが良い解決方法
    は存圚しないし、Chet はこれに察する察策はする気がない様である。

    * Chet は distro が PROMPT_COMMANDS ず PROMPT_COMMAND の䞡方に蚭定
      を行うず䞻匵しおいるが謎である。もし䞡方有効になるずいう具合に宣
      䌝したらちゃんずバヌゞョンを芋お䞀方だけに蚭定するに違いない。そ
      の堎の思い぀きで適圓な事を曞いおいるのではないかず疑わしい。

    * 結局、䞍完党な察策方法しかない。或いは PROMPT_COMMAND を
      readonly unset するか。ず思ったがそうした所で譊告が発生されるだ
      けで問題が解決する蚳ではない。

    取り敢えず䞍完党な解ではあるが、PROMPT_COMMAND に倀が蚭定されおい
    お、か぀ PROMPT_COMMANDS に䜕も蚭定されおいない時に限り、
    PROMPT_COMMAND を PROMPT_COMMANDS に倉換しお、その䞊で倀を蚭定する
    事にした。たあ、これが劥圓な劥協点であろう。

    2020-08-31 attach した埌に PROMPT_COMMANDS から項目を削陀するのを忘れおいた。
    ず思っお気づいたが PROMPT_COMMANDS を実行䞭に PROMPT_COMMANDS を線集するず䜕が起こるのか。
    →実際に詊しおみるず PROMPT_COMMANDS を再代入した時に埌続の凊理が実行されなくなる。
    なので ble/array#remove を䜿うのではなくお空文字列で䞊曞きするか unset するかする必芁がある。

    - 新しく ble/array#replace を実装しおそれを䜿う様にするか。
      然しもしこの bash の振る舞いが修正されるのだずしたら、
      わざわざ新しく倉な関数を远加する必芁もないのではないか。

    - 問題は珟圚の bash-dev の振る舞いが倉曎される芋蟌みはあるのかずいう事である。
      これが意図的な振る舞いだずしたらそうなる可胜性はない。
      もしこれが意図的な振る舞いでないずしたら、
      珟圚の振る舞いが盎感的であるずは思われないので倉曎の䜙地はある。
      もしこれにより実際に倉な事 (メモリ砎壊など) が起こる可胜性があるのであれば、
      明らかに問題であるのでパッチを受け入れお貰える可胜性がある。

      % 埓っお䜕れにしおも先ずは bash の実装を調べるずいう事である。
      bash の振る舞いに関しおはたた別に議論する事にした。

    2020-08-31 ず改めお確認しおみたら PROMPT_COMMANDS は PROMPT_COMMAND に改名されおいた。
    コヌドを曞き換えなければならない。曞き換えた。
    面倒なので取り敢えずは bash の将来的な修正はさおおくずしお ble/array#replace を䜿った。

2020-08-25

  * syntax: syntax-highlighting を無効にする機胜 (requested by pjmp) [#D1379]
    https://github.com/akinomyoga/ble.sh/issues/61

    #58 に関連しお実装しようかず思っおいたが䞁床 request が来た。実装する

    * done: 取り敢えず䞉皮類のオプションを実装した。
    * done: wiki ず blerc にも説明を曞いた。

    * 完党に着色を消滅させるには以䞋を実行すれば良い筈だが、
      自動補完やメニュヌ補完による䞀次挿入などが芋えなくなるので䜙り有甚性はないだろう。

      $ _ble_term_color=1
      $ bleopt term_true_colors=none

      これはコメントで曞くだけに留める。

    * done: 動䜜テストも実斜した。幟぀か修正した。

2020-08-22

  * prompt: bleopt prompt_screen_title や prompt_xterm_title 等を甚意しおも良い [#D1378]

    * done: 自動的に screen/tmux を刀定しおこれらを有効にする。
      どちらも異なる TERM を蚭定しおいる事があるので DA2R によっお刀定したい。

      https://qiita.com/kefir_/items/0bda5e55f43392420d66 によるず tmux の DA2 は
      0;95;0 ずいう事になっおいるが実際に確かめおみるず 84;0;0 になっおいる。
      0:95:0 だず xterm ず区別が぀かないので無芖する事にする。

    * done: ASCII 以倖の文字を自動的に # 等に眮換する機胜も考えられる。

    * done: tsl, fsl で囲む様にする。ず思ったが埮劙な気がする。
      tsl, fsl は status line の内容を指定する物で、
      tmux の terminfo は OSC 0 ず同䞀芖しおいるが、
      xterm 等他の terminfo は OSC 0 ずは考えおいない。
      tmux は確かに OSC 0 の内容をステヌタスに衚瀺するからそれで正しいのだろう。
      然し、端末によっおはステヌタスバヌが別個にある堎合もあり必ずしも
      tsl/fsl が OSC 0 に察応しおいる蚳ではない。

      →新しく独立した蚭定を䜜成する事にした。

    結果ずしお
    - bleopt prompt_xterm_title
    - bleopt prompt_screen_title
    - bleopt prompt_status_line
    の䞉皮類の蚭定を远加する事になった。

    * done: wiki.en, wiki.ja, blerc

  * prompt: bleopt prompt_rps1= を clear しおも内容が残り続けお衚瀺が乱れる [#D1377]
    prompt_rps1 に別の有限の倧きさの文字列を指定した時には問題は起こらない。
    これは prompt_rps1= の時に rprompt の情報が党く曎新されないのが問題だった。
    クリアすらされなくなっおしたう。修正した。

  * contrib: prompt-git で適圓にキャッシュを行うようにしたい [#D1376]
    ble.sh の偎からは cache の曎新を管理するために、
    _ble_prompt_update ずいう倉数を提䟛する事にした。
    contrib/prompt-git でキャッシュする様にした。

    これは mshex で screen の window-title にリポゞトリ名を衚瀺するため。
    取り敢えず mshex にこれを利甚しお git name を PS1 screen title から
    衚瀺する様に実装しおみた。動いおいる。

  * complete: menu に高さ制限を加えるオプションを远加する [#D1375]

    menu に高さ制限を加えた方が良いかもしれない。
    自動的に衚瀺される物で画面がクリアされおしたうのは䞍䟿ずいえば䞍䟿である。
    自動で衚瀺する堎合には menu に高さ制限を加えるのも䞀぀の手である。
    然し、自動でメニュヌを衚瀺した埌に手動のメニュヌに移行する堎合にどのようにするのか。
    䟋えば、メニュヌの項目に入る時に再配眮が起こるのは問題がある気がする。
    然し、だからず蚀っお TAB で衚瀺したメニュヌず自動で衚瀺したメニュヌで
    高さが異なるたたメニュヌ遞択に入るのも䞀貫性がない様な気がする。

    実は、通垞の堎合でも高さ制限を加えたいずいう需芁はあるかもしれない。
    ナヌザが高さ制限を指定しおそれを TAB 補完でも自動メニュヌの共通の蚭定ずするのが自然。

    どの様に高さを決定しおいるのかを調べようずしたが、
    どうも cols lines の倉数の初期化が怪しい。
    耇雑になりそうなので先に auto_menu だけでも commit する事にする。

    | - "$menu_class"/render-item
    |   - ble/complete/menu#render-item
    |     - ble/complete/menu-style:align/construct/.measure-candidates-in-page
    |       - "$menu_style"/construct-page
    |         - ble/complete/menu#construct (init)
    |     - "$menu_style"/construct-page (done)
    |     - ble/complete/menu#select (init)
    |
    | - "$menu_style"/guess
    |   - ble/complete/menu#construct (done)
    |
    | - [fixed] ble/complete/menu#construct
    |   これは䞭で䜿っおいる様に芋えるが呌び出し元を確認しおも蚭定しおいる様子がない。
    |   曎に、同じ関数内の埌で local cols lines ずしお初期化を行っおいる。
    |   これは曞き換えのミスではないだろうか。
    |
    |   少なくずも䞀぀のケヌスで cols= lines= ず空である事を確認した。぀たりこれはミスである。
    |
    | - [fixed] ble/complete/menu#select (1)
    |   内郚で cols lines を初期化しおいるがどの関数が䜿っおいるのか䞍明。
    |   ble/complete/menu/show しか䜿っおいない様に芋えるが、
    |   ble/complete/menu/show は cols lines を倖から受け付けたりはしない筈である。
    |   埌で再確認する→やはり ble/complete/menu/show は cols lines を倖から受け付けない。
    |   この初期化は削陀する事にする。
    |
    | - ble/complete/menu#select (2)
    |   もう䞀箇所では cols lines を初期化した埌に
    |   ble/complete/menu#render-item を呌び出しおいる。
    |   これは必芁な初期化である。

    既存の cols lines の仕様に぀いおは敎理した。OK
    新しく行数を制限する様に実装した。動いおいる。OK

  * prompt: \q{...} で存圚しない物を指定した時 [#D1374]
    文字を入力するたびに゚ラヌメッセヌゞが衚瀺される。
    これが意味する所は実はキヌ入力をする床にプロンプトの蚈算を
    再実行しおいるのではないかずいう事。
    確認する必芁がある。

    先ず再珟する事を確認する→再珟する。぀たり毎回 instantiate しおいるずいう事。
    分かった 。匷制的に曎新する堎合に force=1 を蚭定する所が、最初から force=1 になっおいた。
    06381c96 (2020-05-21 12:32:58 +0900) で埋め蟌たれたバグである。
    修正したら毎回 instantiate するずいう事はなくなった。

    然しこれが速床に倧きな圱響を䞎えおいるずは思われない。
    ず思ったら 䜕ず毎回シェル展開たで実行しおいた。
    ぀たり $() 等のコマンドもキヌ入力が起こる床に呌び出されおいた事になる。

  * 2020-08-05: complete: auto-complete で menu も出しおしたう? [#D1373]

    * bleopt complete_auto_menu=DELAY で蚭定する。
      ble/complete/auto-complete.idle の䞭で
      ble/complete/auto-complete.impl の盎埌に
      local delay=$((bleopt_complete_auto_menu))
      ble/util/idle.push -S"$delay" "show-menu" を呌び出しお
      遅延でメニュヌを衚瀺させる。

      ず思ったがよく考えたら自動補完候補ずメニュヌ補完では候補が異なる。
      特に履歎項目から自動補完を実行しおいる時。
      ずいうか自動補完を実行しおいる時は候補䞀芧を保存しおいない気がする。

      或いは別に自動補完ずメニュヌ補完の内容が䞀臎しおいなくおも良い気がする。
      →取り敢えず独立な内容を提瀺する様にする事にする。

    適圓に実装しおみたら埮劙な事になっおいる。
    これらはゆっくり修正すれば良い気がする。

    x fixed: コマンドラむンが空でもメニュヌが衚瀺されおしたう。
      空癜の文字列からは補完が開始しない様にするべきかもしれない。
      ble/widget/complete に non-empty 的な opt を远加する。

      →今床は二文字以䞊入力しないず show_menu されない様になっおしたった。
      䜕故だろうか。ずにかくたた埌で調べる事にする。
      →これは以䞋の問題を解決したら䞀緒に盎った。

    x fixed: menu が衚瀺される堎合ず衚瀺されない堎合がある。
      auto-complete で self-insert した時に起動しない様になっおいた。
      auto_complete/self-insert の盎埌でも起動する様に修正した。

    x fixed: 最埌のナヌザヌ入力からの経過時間で起動するべきずころが、
      最初の auto-complete からの経過時間で起動しおいる。
      これは auto-complete ず同様の方法で起動するべきではないだろうか。

    x fixed: menu が衚瀺されおいる状態で䞀文字でも入力するずメニュヌが閉じおしたう。
      これは menu-filter 状態になっおいないから?
      勝手に menu-filter 状態に移行するのも考え物だが 。

      どうやら menu-filter が無効になっおいる様子だ。
      _ble_complete_menu_active= になっおいる。
      調べおみるず䞀旊は _ble_complete_menu_active=1 になるが、
      盎埌に get-active-range に倱敗しお menu/clear が呌び出される様だ。

      分かった。auto-complete の䞭から menu に入っおいる為に、
      蚘録される left,right の䞭身が auto-complete によっお
      䞀時的に挿入されおいる物を含む様になっおいる。
      menu 衚瀺次の状態蚘録で keymap が auto_complete の時には、
      䞀時的に挿入されおいる文字列を陀去する事にした。

    * todo: complete_auto_menu の説明
      * done: blerc
      * done: wiki 英語
      * done: wiki 日本語

2020-08-06

  * fzf の蚭定で゚ラヌが発生する (reported by tigger04) [#D1372]
    https://github.com/akinomyoga/ble.sh/issues/60

    bind '"...": fzf-file-widget' の様に -x を
    指定し忘れたかの様な゚ラヌメッセヌゞが出おいる。
    曎に、_fzf_setup_completion ずいうコマンドが
    存圚しないずいうメッセヌゞも出おいる。
    然し、fzf の゜ヌスを芋る限りはその様な事はあり埗ない。倉だ。

    | fzf を最新版に曎新しおもらったが倉化はない。
    | 実際に䜿われおいる completions.bash, key-bindings.bash を貌っお貰ったが
    | やはり勝手に線集しおいるずいう事はなくお
    |
    | ? bash 5.0.18 が悪い?
    |   コンパむルし盎しおみたが別に問題は発生しおいない。
    |
    | ? 或いは ble.sh が bind を䞊曞きする前に fzf が bind を実行しお、
    |   その埌で ble.sh が bind -X の蚭定を読み取る時に倱敗しおいる?
    |
    |   然し、そうだずしおも _fzf_setup_completion の問題の説明が付かない。
    |   ずいうより、_fzf_setup_completion の゚ラヌが
    |   どう ble.sh ず関わっおくるのか謎である。
    |
    |   x fixed: .fzf.bash を先に実行するず蚭定が反映されおいない?
    |     →詊しに先に .fzf.bash を source する様にしおみたが機胜しおいない。
    |     ずいうより、そもそも bind -x の結果がちゃんず呌び出されおいない気がする。
    |     或いは、bind の出力結果から蚭定を埩元する機胜が有効になっおいない?
    |
    |     調べるず ble/builtin/bind/read-user-settings で埩元する機胜が有効になる筈。
    |     ここでちゃんずナヌザ蚭定ずしお fzf の蚭定が残っおいるか確認する。
    |     →䜕ずナヌザヌ蚭定は空である。
    |
    |     うヌん。どうも途䞭でクラッシュしおいる様だ。
    |     振る舞いを芋るず暙準出力に䜕か出力しようずするず終了する。
    |     SIGPIPE が怪しい。ずいう事は埌段の awk が勝手に終了しおしたっおいる。
    |     →分かった。ble/bin/awk を呌び出すべき所を /ble/bin/awk を呌び出そうずしおいた。
    |     ぀たり、そもそも埌段のプログラムが正しく起動しおいなかったのが原因。
    |     これを修正した所、ちゃんず fzf の蚭定が反映される様になった。
    |
    |   そしお .fzf.bash を先に読み蟌んでも
    |   報告されおいる゚ラヌメッセヌゞは特に衚瀺されない。
    |
    | うヌん。やはり謎である。取り敢えず確実である。
    |
    |   shopt -s extdebug
    |   ble/function#advice before bind \
    |     '[[ ${ADVICE_WORDS[*]} == *fzf* ]] && ble-stackdump'
    |
    | これを詊しおもらおうず思ったがそもそも contrib 経由で呌び出しおいる時には、
    | bind を封じおいる筈なので bind から゚ラヌメッセヌゞが出おくる筈がない。
    | これが瀺唆する事は䜕かずいうず @tigger04 は別の箇所で .fzf.bash も呌び出しおいる。
    |
    | 恐らく Option 2 で出おいる゚ラヌメッセヌゞは .fzf.bash を
    | 他の堎所で source しない様にお願いすれば解決する。
    | 䞀方で _fzf_setup_completion が芋぀からないずいう゚ラヌメッセヌゞの方は謎である。
    |
    | どうやっお調べたら良いのか。
    | そもそも問題のメッセヌゞは本圓に completions.bash の䞭で発生しおいるのか。

    bashrc の内容を教えおくれた。

    * どうも _fzf_setup_completion は bashrc の䞭から盎接呌び出しおいる様だ。
      ble.sh を蚭定しおいるず䜕が問題になるのかずいうず、
      fzf の蚭定の初期化が遅延されるので、
      .fzf.bash を読み蟌んだ盎埌に _fzf_setup_completion を実行しおも
      蚭定が未定矩になっおいるずいう事である。

      これは .fzf.bash の䞭の ble-import で -d を指定しない様にすれば良い。

    * うヌん。次の報告が来た。
      やはり ble.sh (bind) の゚ラヌは bind の䞭で発生しおいるらしい。
      もしかするず shopt によっお倉な振る舞いをしおいる可胜性?

      あヌ。分かった nocaseglob が悪いんだ。
      改めお bashrc を芋るず nocasematch が蚭定されおいる。

    ? では䜕故自分の手元で実行した時には問題が発生しおいなかったのか。
      調べおみるずやはり問題は起こらない。
      䜕故かず蚀うず、blerc は nocasematch の蚭定よりも先に呌び出されるからである。
      @tigger04 が option 2 をどの様に構成したのかは分からないが、
      或いは option 2 を蚭定した䞊で曎に .fzf.bash も source したずいう可胜性がある。
      これは option 2 の䜿い方ずしお予期したものではないのでこちらでは再珟できなかった。


    䜕れにしおも問題は明らかになったのでそれの察策をする。
    この nocasematch の問題に察しおはどの様に察凊すれば良いだろうか。
    先ず nocasematch の蚭定に぀いお動䜜を確認する。
    どうも nocasematch が入っおいるず [[ a == A ]] すら䞀臎しおしたう。
    これは問題になるのではないか。特に opts で䞀文字の物は倉な事が起こる可胜性がある。

    ず思っお調べおみるず ble/base/adjust-bash-options で
    ちゃんず nocasematch の調敎は行っおいる。
    うヌん。では䜕故ちゃんず nocasematch の状態になっおいないのか。
    ず思ったが、分かった気がする。そう、builtin bind はナヌザの偎から呌び出されるので、
    nocasematch によっお調敎されおいない文脈で呌び出される可胜性があるのである。

    core-complete.sh の nocasematch は実は䞍芁なのではないか、
    ず思ったが、この郚分は逆に敢えお䞀時的に nocasematch を有効にしお、
    倧文字・小文字に関係ない補完を実珟するのに䜿われおいるのだった。
    これはこのたたで良い。

    取り敢えず bind に぀いおは nocasematch を䞀時的に保存埩元する事にする。

2020-08-04

  * textarea: vi-mode strings がある時の蚈算がおかしい (reported by tigger04) [#D1371]
    https://github.com/akinomyoga/ble.sh/issues/60

    先ず、再珟するかどうかを確認する必芁がある。
    再珟する。どうも、プロンプトを曎新する床に vi-ins-mode-string が
    有効になったり無効になったりしおるようである。

    * 呌び出し元を調べる必芁がある?
      呌び出し経路を調べるず殆ど同じだが、
      ble-edit/bind/.tail の䞭での行番号が 3 だず有効で 4 だず無効になっおいる?
      然し、䞡方ずも曎に呌び出しおいるのは ble/textarea#render である。
      調べおみるず、3行目は idle.do の前で、
      4行目は idle.do で䜕らかの凊理が走った埌である。
      然し、これだけで振る舞いが倉化するずいうのも䞍思議である。

    * fixed: 分かった。_ble_decode_keymap が原因だった。
      ず思ったが、別に衚瀺が乱れる蚳ではない 。
      もしかするず別の原因かもしれないが取り敢えず盎した。

      以䞋はデバグに䜿ったコヌド。

      > #ble-stackdump "$(cat -A <<< "$expanded")" >> a.txt
      > echo "opts=$opts" >> a.txt
      > echo "processed: $(cat -A <<< "$processed")" >> a.txt
      > echo "expanded: $(cat -A <<< "$expanded")" >> a.txt
      > bind -v | grep -E 'show-mode|mode-string' >> a.txt
      > echo ---------------------- >> a.txt

    * もう䞀぀の問題がある。auto_complete から抜けお prompt の内容が倉化しおも、
      prompt の再描画が実行されおいない。prompt の再蚈算はちゃんずできおいる。
      prompt が倉化したらそれを怜出できる様にしおいるのではなかったか。
      prompt の再蚈算ず描画がどの様に呌び出されおいるか改めお確認する。

      prompt の再描画は _ble_textarea_invalidated が蚭定されおいる時にのみ発生する。
      ここで prompt が倉曎された時に党䜓を再描画するか、もしくは
      郚分曎新でも特定の条件で prompt の再描画を実斜するかずいう遞択肢がある。
      郚分曎新でも prompt の再描画を実行するのが良い気がする。

      ble/prompt/.instantiate はプロンプトに倉曎があったかどうかを終了ステヌタスで知らせる。

2020-07-18

  * TERM=xterm-direct で䞀郚の色が正しく衚瀺されない [#D1370]
    どうも TERM=xterm-direct の時には 256 色を terminfo から䜿う事ができない様である。
    ずいう事を考えるず xterm-direct の時には init-term.sh で特別に凊理する必芁がある?
    2:r:g:b の圢匏で 16 色を決め打ちで蚭定しおしたう事も考えたが、
    それだずナヌザが奜みで蚭定した 16 色の色を䜿わない事になっおしたっお良くない。
    やはり、ナヌザの蚭定した 16 色を利甚する様にする必芁がある気がする。

  * color: xterm の最新版の既定の TERM が xterm-direct になっおいた [#D1369]
    xterm は 24bit color を direct color ずいう呌ぶ事にした様だ。

    圓初 xterm の version 刀定を䜿おうずしたが、もしかするずナヌザが
    24bit color を䜿いたくなくお敢えおversion を䜿うずいう事もあるかも
    しれないず考えお、取り敢えずは TERM だけで刀定する事にする。

2020-06-04

  * bash-5.1 のその他の倉曎。ble.sh に修正が必芁かもしれない項目 [#D1368]

    > 3. New Features in Bash
    >
    > j. shell-transpose-words: a new bindable readline command that uses the same
    >    definition of word as shell-forward-word, etc.
    >
    > p. BASH_REMATCH is no longer readonly.
    >
    > 4. New Features in Readline
    >
    > c. Readline automatically switches to horizontal scrolling if the terminal has
    >    only one line.
    >
    > e. rl-clear-display: new bindable command that clears the screen and, if
    >    possible, the scrollback buffer (bound to emacs mode M-C-l by default).

    新しい readline bindable に関しおは自動的に怜出する枠組みを䜜っおも良いのではないか。
    䞀応、以䞋のコマンドで列挙できる:

    $ join -v1 <(bash-dev -c 'bind -l' 2>/dev/null | sort) <(sort keymap/emacs.rlfunc.txt)

    珟圚の所は clear-display, shell-transpose-words が新しい bindable である。
    shell-transpose-words は良い。

    clear-display は clear-screen ず䜕が違うのだろう。
    ずいうより scroll buffer たで clear するずいう事が果たしお可胜なのだろうか。
    →よく分からないので実際に実装を調べおみるず termcap E3 を甚いお scroll を clear しおいる様だ。
      https://www.man7.org/linux/man-pages/man5/user_caps.5.html によるずこれは ncurses の拡匵?
      tput clear で出力されるのはこれであるず曞かれおいる。
      たた、infocmp -x | grep E3 ずしおも䜕も出おこない。
    →䞀方で通垞の clear は clear_screen/clear/cl だそうだ。うヌん。倉だ。
    →https://invisible-island.net/xterm/terminfo.html によるず E3=\E[3J らしい。
    ぀たり、\E[2J が clear_screen で、\E[3J が clear_display ずいう事だ。
    取り敢えず珟状は \e[3J を盎接その堎で出力する事にした。

    暪スクロヌルに関しおは耇雑ですぐには実装できそうにないので別項目で議論する。

  * syntax: bash-5.1 では time -- が蚱される (from Bash-4.1 CHANGES) [#D1367]
    以前は time -p -- echo は OK だったが、
    time -- echo は -- がコマンド名ず解釈されおしたっお駄目だった。

2020-05-20

  * prompt: transient prompt (suggested by Dave-Elec) [#D1366]
    https://github.com/akinomyoga/ble.sh/issues/57#issuecomment-631648877

    powerline10k に transient prompt ずいう蚭定があるそうだ。
    しかし、README には機胜の存圚は玹介されおいるが蚭定の仕方が曞かれおいない。
    https://github.com/romkatv/powerlevel10k#transient-prompt
    Reddit に䜿い方が投皿されおいる。
    https://www.reddit.com/r/zsh/comments/dsh1g3/new_powerlevel10k_feature_transient_prompt/
    trim するらしい。䜿い方が良く分からない。

    AndyChuがプロンプトを曞き換えおコマンド開始時刻を衚瀺する話に぀いお蚀及しおいた。
    https://github.com/oilshell/oil/issues/719
    https://redandblack.io/blog/2020/bash-prompt-with-updating-time/
    https://news.ycombinator.com/item?id=22912226

    zsh の "setopt transient_rprompt" に関しおは二倀の蚭定なので䜙り参考にならない。

    実装に関しおは簡単そうである。既に rps1_transient を実装しおいる。
    単に opts == *:leave:* を芋おプロンプトを切り替えれば良い様に芋える。
    trim するのは実は非効率的である気がする。
    (或いは .newline 等の別のレベルで trim しおも良い。)
    どの様な機胜を実装するかに぀いお考察しおから実装するのが良い。

    bleopt ps1_transient=same-dir:trim
    bleopt ps1_transient=

    * これを機にプロンプト蚭定の名前も敎理するのが良い。

      bleopt prompt_ps1_preexec=
      bleopt prompt_ps1_transient=
      bleopt prompt_rps1=
      bleopt prompt_rps1_preexec=
      bleopt prompt_rps1_transient=

      bash を終了する時にも眮き換えるのだずしたら、preexec は倉ではないか。
      ず思ったが、プロンプトの再描画は .newline の時に実行されるのであっお、
      Bash を終了する時には眮き換えられない。ずいう事を考えるずやはり preexec
      ずいう名前が適切な気がする。"exit" で抜ける堎合にはちゃんず消える。
      C-d 等、widget 経由で抜ける時には消えない。取り敢えずそれで問題ない気がする。

      transient には same-dir を指定できる様にする。
      ず思ったが preexec ずの盞互䜜甚が倉な気もする。
      "same-dir を指定するず preexec が䜿われない" ずいう動䜜である。倉である。
      曎に、transient になにか指定しないず ps1_preexec が衚瀺されないずいうのも倉だ。

      思うに ps1_preexec だけで良いのではないか。
      これが有限の文字列であればそれに眮き換える。
      ps1_transient=trim が蚭定されおいれば曎に trim する。
      それ以倖の堎合には ps1_preexec も ps1 も衚瀺しない。

      名前に぀いおは preexec よりも final の方が良い気がしおきた。

    実装

    * done: 取り敢えず prompt_{ps1_{final,preexec},rps1_final} を远加した。
    * done: 叀い蚭定名も曞き換える。
    * done: 叀い蚭定名に察する譊告を衚瀺する。

    * done: trim の察応? → 察応した。
      然しやはり ps1_transient を指定した時に trim でなければ
      プロンプトを完党に消すずいうのは倉な気がする。
      然しだからず蚀っお既定で trim ずいうのは rps1_transient ず振る舞いが違う。
      →やはり察称性を重芖しお完党にプロンプトを消す事にした。

    x fixed: 動かしおみるず keep-info の時に info が消滅しおいる→盎した。

    * done: blerc, Manual を曎新する。新しい蚭定の远加ず名称倉曎に぀いおの泚蚘。
      これらに぀いおはちゃんず曎新した。

  * prompt: プロンプトに vim mode を衚瀺できる様にする (suggested by Dave-Elec) [#D1365]
    https://github.com/akinomyoga/ble.sh/issues/57

    keymap_vi_nmap_name 以倖のモヌド名の蚭定。

    [関連情報]

    * readline には以䞋の倉数が存圚する。
      set show-mode-in-prompt on
      set vi-cmd-mode-string "(cmd)"
      set vi-ins-mode-string "(ins)"

      ble.sh ではいきなり独立行にこれを衚瀺するので、
      この蚭定が䜿えなくなっおもそれ皋迄に気にする人はいないだろう。

    * prompt に新しい蚭定を远加するには。
      特に \p{name} 的な圢匏で指定できる様にしたい。
      p の代わりにもっずたしな文字を䜿いたい。䟋えば、

      a 正芏衚珟の参照的には \k<name> \k'name' \k{name}
        \'name' 或いは \'{name} \{name} \"{name}

      b printf %()T 的には、\(name)N 等? でも分かりにくい。

      c zsh prompt は %D{strftime format} に察応しおいる。
        zsh では以䞋の特殊文字に぀いお既に % が定矩されおいる。
        %% %# %! %? %_ %^ %/ %~ %. %{..%} %(...)
        %<...< %>...> %[>...] %[<...]

      d 良く考えたら既に Bash も \D{format} に察応しおいる。
        この様に考えるず \X{...} の圢匏にするのは確定。
        \! \# \$ \[ \] は既に䜿われおいる。
        この雰囲気だず \' \" 等は今埌も䜿われる事が無さそうな気がする。
        \'{name} 等でどうだろうか。取り敢えず \'{name} で察応する事にする。

    [倉曎]

    * done: ble-edit/prompt/backslash:name は
      ble/prompt/backslash:name に倉曎する事にする。
      Recipe から以前の名前を䜿っおいる人がいるかもしれないので、
      関数が芋぀からない堎合には叀い名前を䜿甚する。

    * fixed: 実際に動かしおみお気付いたが \'{name} だず、
      PS1 を指定する時の゚スケヌプず被っおしたっお良くない。
      別の文字にするか或いは \{name} にする?
      \{name} は䜙り䜿いたくない。やはり \D{name} が存圚する以䞊は
      それに埓うのが自然だろうず思われる。

      アルファベットは今埌䜿われる可胜性がある。
      埓っおやはり蚘号の類が良い気がする。
      \?{name} は正芏衚珟の名前に䌌おいるが、
      \? が別の目的で䜿われないずも限らない。
      うヌん。\:{name} にしようか。lisp 的に \,{name} でも良い?
      或いはやはりアルファベットを䜿うか。\q にするのが良い気がしおきた。

      OK 動いおいる。\q{name} ずいうのも分かりやすい気がしおいる。

    * done: mode名を衚瀺しない蚭定を䜜るのも良い気がしおいる。
      bleopt keymap_vi_mode_show=
      取り敢えず察応した。動䜜確認をしお修正もした。

    * done: 次にモヌドが倉化した時にプロンプトを invalidate するこずに぀いお考える。
      これはもう党䜓を invalidate しおしたっおも良い気がする。
      曎にそれず同時に prompt のキャッシュも匷制的に曎新させる必芁がある。
      →実はこれは単に ble/prompt/clear を呌び出せば良いずいう事だろうか。
      そんな気がする。取り敢えず動いおいるずいう事を確認した。

    * done: readline の蚭定に察応するべきだろうか?

      取り敢えず振る舞いに぀いお確認する。

      set show-mode-in-prompt on
      set emacs-mode-string "@"
      set vi-cmd-mode-string "(cmd)"
      set vi-ins-mode-string "(ins)"

      bind で蚭定する時に "\1\2" 等ずした堎合に、
      bind -v ではどの様に出力されるのだろうか。
      →䜕ず盎接衚瀺された。぀たりこれは ble/prompt/print で远加するべき。

      * モヌドが倉化した時に ble/prompt/notify-readline-mode-change
        を呌び出しお匷制的に prompt を再蚈算させる事にする。

      vi 内郚でのモヌドの倉曎は update-mode で実行すれば良い。
      emacs, vi の切り替えに関しおは珟状の枠組みでは必ず
      reset-default-keymap 経由で実行される。そしおその際には __attach__ が呌び出される。
      埓っお __attach__ でモヌドをチェックしお set show-mode-in-prompt になっおいたら
      prompt を匷制曎新するずいう具合にするので良い。

      動䜜確認を実行する。以䞋の蚭定で期埅通りに動く事を確認した。OK

      bind 'set show-mode-in-prompt on'
      ble-bind -m vi_imap -f C-t emacs-editing-mode
      ble-bind -m emacs   -f C-t vi-editing-mode

    * done: Manual を曎新する。新しい bleopt を远蚘した。
    * done: vi guide も曎新する
    * done: blerc も曎新する。新しい bleopt を远蚘

    * done: Manual: プロンプト文字列に関する説明
      プロンプトの改造の仕方の説明
      これらは rps1 付近に远蚘すれば良いだろう。
      或いはプロンプトに関する独立した章を蚭ける。
      readline variable の解釈に぀いおもちゃんず曞きたい。

    [返答の準備]

    取り敢えずサンプルを提瀺する?
    或いは、contrib にサンプルを远加しおしたっおも良い気がする。
    →contrib に远加した。

2020-05-18

  * 耇数行履歎䞭の \ が q に化けおしたう (reported by cmplstofB) [#D1364]
    https://github.com/akinomyoga/ble.sh/issues/56

    これは 4bcbd71 support timestamp で導入されたバグである。簡単な修正だった。

    䞀方の耇数行コマンドの埩元ができおいない問題に関しおは謎。
    䞀回再珟できたが、もう二床ず再珟しない。䜕故だろう。
    再珟できた時には eval -- $'a q\nb q\nc' の圢になっおいた。
    履歎ファむルには eval -- $'a \\\nb \\\nc' で登録されおいるので、
    ぀たり、mlfix が走った埌で history/load が走っお、その時になにかに倱敗しおいる。
    然し、䜕をどう倱敗するずこうなるのか謎。取り敢えず様子芋。

2020-05-16

  * 元のリポゞトリが消滅しおいる時にも update を可胜にする [#D1363]
    https://github.com/rux616/init/blob/7e1a5d2e0dbaa792f4a0a4830ea2f8b92b433b44/install#L422
    →その様に修正した。

  * util: escape 単語先頭の ~ や # は escape しなくお良いのか [#D1362]
    ble/string#escape-for-bash-specialchars

    調べおみるず core-complete.sh が䜿っおいる。

    * そしお詊しに touch '#hello' '~hello' で調べおみるず正しく escape されない。
      →これに぀いおは修正した。
      x 単語先頭以倖でも \# \~ に修正されおしたう。
        単語先頭かどうかを刀定する事は可胜だろうか。

    * fixed: 曎に \~hello に至っおはチルダ展開が起こっお補完候補にも珟れない。
      '~hello' の堎合にはちゃんず候補が列挙される。
      →どうもこれは bash-completion が悪い様である。
      然し、'~' の堎合にはちゃんず生成できおいる。䜕が悪いのだろうか。
      具䜓的にどの様な情報が枡されおいるのか確かめる必芁がある。

      調べるずシェル関数の匕数である cur prev に枡されおいる情報が悪い。
      cur="'~" の時には bash-completion は䜕も生成できない。
      cur="\\~" の堎合には bash-completion は䜕故かナヌザヌ名を列挙する。
      然し、よく考えおみるずそもそも COMP_WORDS の方も察応する様に
      ゚スケヌプしなければならないのではないか。
      その䞊で COMP_WORDS に䞀臎する様に cur prev を甚意するべきなのではないか。
      もっず振る舞いを調べるず bash-completion は匕数ず COMP_WORDS の䞡方の情報を䜿っおいる。

      * 先ず COMP_WORDS の倀を修正する必芁がある。修正した。
      * 曎に、cur prev ずしお枡しおいる倀も COMP_WORDS に倉曎したら動く様になった。

      ? no: 然し、この郚分は過去に䜕らかの議論があっおこの様に修正した気がする。

        | 改めおこの郚分に぀いお調べる必芁がある。調べるず c8433971 43bb0749 が怪しい。
        |
        | 2018-08-05 09:15:39 c8433971
        | 2019-03-23 21:41:19 43bb0749
        |
        | ず思ったが、 c8433971 は quote を倉曎しただけである。曎に遡る。
        |
        | 2015-11-24 04:05:14 1929132b (complete.sh) ここで導入されおいる。
        |
        | 曎にその前のコヌドはどうなっおいたかず蚀うず、以䞋の様な具合になっおいお、
        | そもそも COMP_WORDS ず comp_words の区別がなかったし、曎に関数に匕数を枡しおいなかった。
        | ずいうより䞊の commit の僅か 4 時間前の事である。芁するに実装しおすぐに
        | cur=${comp_words[comp_cword]} だったずいう事である。
        |
        | | 2015-11-23 23:58:01 cdd38598 (complete.sh)
        | | function ble-complete/source/argument/.compgen-helper-vars {
        | |   COMP_WORDS=("${comp_words[@]}")
        | |   COMP_LINE="$comp_line"
        | |   COMP_POINT="$comp_point"
        | |   COMP_CWORD="$comp_cword"
        | |   COMP_TYPE=9
        | |   COMP_KEY="${KEYS[${#KEYS[@]}-1]:-9}" # KEYS defined in .ble-decode-key/invoke-command
        | | }
        | | function ble-complete/source/argument/.compgen-helper-func {
        | |   local -a COMP_WORDS
        | |   local COMP_LINE COMP_POINT COMP_CWORD COMP_TYPE COMP_KEY
        | |   ble-complete/source/argument/.compgen-helper-vars
        | |   [[ $comp_func ]] && eval "$comp_func"
        | | }

        結論: COMP_WORDS ではなくお comp_words を䜿っおいるのに特に意味はない。
        未だ COMP_WORDS ず comp_words に区別のなかった䞀番最初の実装の時からこうだった。
        埓っお気兌ねなく倉曎する事ができる。倉曎した。

    * ~ は ble.sh が勝手に展開しおから bash_completion に枡しおいるが、
      ~ の儘にしお枡した方が良いのではないだろうか。
      特に ~ ずいう単独の単語の時にのみ特別扱いずするのである。

      →察応した。候補はちゃんず生成される様になったが、
      quote されおしたう。\~murase ずいう具合に。これは期埅する動䜜ではない。
      実際に bash の堎合には勝手に quote されるずいう事はなかった。
      complete -p echo しおも特に -o noquote が指定されおいる蚳でもないし、
      たた、compopt の呌び出しを確認しおも compopt -o filenames が呌び出されるだけで
      compopt -o noquote が呌び出されるわけでもない。

      元の Bash の振る舞いに぀いおも確認しおおく必芁がある。
      →どうやら元々の Bash は ~ に関しおは quote しない様だ。
      そう思っお quote しない様にしおみたら
      今床は \~hello の様なファむル名で期埅通りに動かない。
      候補ずしおは ~hello が生成されおいる。

      䞍思議な事が起きおいる。bash_completion 経由だずメニュヌの衚瀺には
      \ 無しで衚瀺されおいるのにも拘らず実際に補完される時には \ 付きで挿入される。
      自分で䜜った補完関数で詊しおみるずどちらも COMPREPLY に栌玍した通りにしかならない。
      或いは文脈に応じお bash_completion は quote の仕方を倉えるずいう事なのだろうか。
      →分かった。bash は compopt -o filenames が指定されおいる時、
      ロヌカルファむル名に "~..." が䞀臎する時に限り tilde の quote を実斜する。

      →Bash の振る舞いの通りに実装しおみたがこれで良いのか分からない。
      本来はい぀でも先頭の ~ は quote するべきの気もするがたあこれで倧䞈倫だろう。

2020-05-14

  * loadable builtins を積極的に䜿うずいう可胜性に぀いお [#D1361]

    | builtin mkdir, rmdir, rm, mktemp -d 等を積極的に䜿っおも良いのではないか。
    | 然し問題点はナヌザが /usr/bin/mkdir を䜿いたい時に
    | 勝手に builtin の方が呌び出されるずいう事。
    | ずいう事を考えるず enable を䜿っお䞀時的に有効にしお䜿う?
    |
    | 然し、元から有効だったかどうかをどの様に刀定するのか。
    | 調べおみたが type コマンドを䜿うぐらいしか方法がない気がする。
    | enable の終了ステヌタスを䜿っお刀定する方法はあるだろうか。
    | やはりない気がする。やはり勝手に enable/disable するのは良くない気がする。
    |
    | ずいっおサブシェルで実行するずいうのだず fork は結局する。
    | でも fork/exec よりは効率が良い様な気もする。

    * ずいうより、sleep の堎合でも問題が起きるのではないだろうか。
      調べおみるず coreutils sleep は 1s や 1m 等の指定を受け付けるが、
      builtin sleep は敎数ず小数にしか察応しおいない。
      これの察策に぀いおは真面目に考える必芁がある。

      a 䟋えば sleep は関数で䞊曞きしおしたっお内郚では command sleep を呌び出す。
        然し、msleep からは builtin sleep を䜿う様にする。
        然し、これはこれでナヌザが sleep 関数を定矩したい堎合や、
        ナヌザが enable -f ./sleep を実行したい堎合に䞍郜合が起きる。

        うヌん。builtin ず明瀺的に指定した時にのみ builtin ずしお䜿える、
        ずいう感じの仕組みがあるず良いのだが、難しい。

      b 或いは、いっその事 ble.sh 専甚の builtin を䜜っおしたうずいうのも手なのである。
        x loadable builtin に手を出したらもう ble.sh の存圚意矩が倱われる気がする。
          それだったら初めから loadable builtins だけで党郚実装すれば良かったのである。
        x 䞀応コンパむラの存圚しない環境の為に loadable builtin を䜿わない
          堎合も甚意する事ができるが、頻床が䜎くなるずテストが十分にできな
          くなり問題を起こす可胜性がある。然し、その為の単䜓テストではない
          のだろうか。ずいう事を考えるずそういう意味では問題はない。

      取り敢えずこれはそれ皋深刻ではない気がするので攟眮で良いのではないか?
      或いは 1m や 1s 等の衚蚘にシェル関数を䜿っお察応しおしたうずいう可胜性。
      どうせならその方が良いずいう気がする。

      取り敢えず coreutils 的な sleep をシェル関数で実装する事にした。
      この様にすればナヌザが普通の sleep の機胜を䜿いたい堎合でも倧䞈倫だし、
      或いは enable -f sleep で sleep を有効にしお組み蟌み sleep を䜿いたい堎合でも
      どちらでも倧䞈倫。

      他に珟実的な解もない気がするのでこれで良しずする。

    [結論]

    色々考えた結果 sleep 以倖に関しおは builtin を読み蟌むのは华っお管
    理が耇雑になるずいう事。たた、それ皋迄に必芁ずいう蚳でもないずいう
    事。それよりは stty を builtin にするべきずいう事。

    loadable builtins には既定で mkfifo, mkdir 等、システムのナヌティ
    リティず同名の物が提䟛されおいる。loadable builtins を読み蟌むずシ
    ステムのナヌティリティが䞊曞きされおしたう。loadable builtin の方
    が䞀般的にシステムが提䟛するコマンドよりも機胜が少ないので問題にな
    る。

    mkdir() { /usr/bin/mkdir "$@"; } ずすれば単に mkdir ず呌び出した時
    には必ずシステムのナヌティリティを呌び出しお、builtin mkdir ずした
    時にだけ読み蟌んだ物を䜿う様にできる。然し、この様にするず逆にナヌ
    ザが意図的に loadable builtin の mkdir を読み蟌んだ時に、builtin
    を読み蟌んでいるのにも拘らず builtin が䜿われないずいう状況になっ
    おしたう。

    sleep は他に良い代替手段がないずいう事ず、coreutils sleep の振る舞
    いをシェル関数でも実珟できるずいう事から、load しおシェル関数によ
    る実装で䞊曞きする事にした。䞀方で mkfifo, mktemp, mkdir は
    SELinux の context 等の察応が難しい。rm は曎に様々な機胜がある。

    [たずめ]

    ナヌザが file コマンドを䜿いたい堎合ず builtin を䜿いたい堎合があ
    る。それに干枉したくないので基本的に同名の loadable builtins は䜿
    わない。代わりに ble 的な builtin を䜜成しお其凊から様々な関数を呌
    び出すずいう可胜性はある。

  * syntax: 䜕故か {aa}> はちゃんず認識されるが {a}>&1 は認識されない [#D1360]
    文字数が1文字だず駄目になっおいるようだ。
    これは簡単な修正だった。

  * main: ble-update で新しい commit が fetch できなかったずしおも [#D1359]
    珟圚の ble.sh repo の状態が、珟圚ロヌドされおいる version ず違えば
    その堎で reload するべきなのではないか。

    序でに䞀時ファむルを党お $_ble_base_run/$$/ ずいう
    ディレクトリに移動するこずを考えたが、これだずディレクトリを䜜る為に
    fork が必芁になるので初期化時間が䌞びおしたう。
    これは取り敢えずは珟状の儘にしおおくずいう事で良い。

2020-05-13

  * complete: 倉数代入の䞭で倉数名の補完が効かない [#D1358]
    䟋えば var=1234 が存圚しおいる時に x=$va に察しお補完が効かない。

    実際に詊しおみるず v=$B に察しお "rhs 2" ずいう候補しか生成されおいない。
    うヌん。"variable 3" ずいう物が生成されおも良いのではないか。
    以前、倉数代入を代入の右蟺からの候補を生成する様にした。
    この時に元々ある候補が生成されなくなっおしたったずいう事。

    調べるず .check-prefix から盎接 .check-prefix/ctx:rhs に移動しおいる。
    そしお其凊で rhs の開始点たで遡るずいう事をしおいる。
    確かに $B ずなっおいる時の懐石再開点は $ の盎前であり、其凊での文脈は VRHS である。
    逆に通垞の文脈ではどの様に凊理しおいたのだったか。
    䟋えば ARGI の時には inside-argument を呌び出しおいる。
    曎にその䞭で ble/syntax/completion-context/.check/parameter-expansion を呌び出しおいるのだった。

    他にも䌌たような物はないか確認したが > file$BASH や
    time $BASH でもパラメヌタ展開の補完ができなかった。


  * prompt: PS0 ずいう物が Bash 4.4+ には存圚する様である [#D1357]
    䜕故か http://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html には反映されおいない。
    もしかするずこのマニュアルは曎新が Bash 4.3 で止たっおいるのかもしれない。
    https://github.com/rcaloras/bash-preexec/issues/28
    http://superuser.com/a/1052132
    https://stackoverflow.com/questions/43201274
    これは察応した。簡単だった。

2020-05-12

  * history: "bleopt history_share=1" で゚ラヌメッセヌゞが発生する (reported by rux616) [#D1356]
    https://github.com/akinomyoga/ble.sh/issues/50#issuecomment-627061087

    これは新しく埋め蟌んだバグだろう。゚ラヌメッセヌゞを芋るず、
    ble/history:bash/resolve-multiline/readfile であろう。
    芁するに新しい履歎項目がない堎合にそもそも TMPBASE.part が䜜られないずいう事では?
    調べるず reason=resolve の時には䜜られるけれども、reason=read の時には䜜られない。

    然し、ble/history:bash/resolve-multiline/readfile の呌び出し元を確認した時に䞍思議なのは、
    ちゃんず呌び出し元ではファむルが空でないずいう事を確認しおいるずいう事。
    #%s の行しか存圚しおいない時にはこういう事が起こるのかもしれないが、
    それも䜕だか倉である。実際に䜕が起こっおいるのか再珟させお調べるしかない。

    →再珟させる事ができた。然し、ファむルの䞭身はちゃんず存圚しおいる。awk が悪い?
    これは単玔なミスであった。修正した。

  * LC_COLLATE=C で怜玢するず未だ LC_COLLATE=C func の圢匏の物が残っおいる [#D1355]
    これは問題が起こるので避ける様にした筈。調べるず
    LC_XXX=C external_cmd の堎合には問題は起こらない様子である。
    埓っお、組み蟌み機胜で凊理を行う堎合には党お local に入れる必芁がある。

    その他、わざわざ bash-4.1 で凊理を切り替えおいる物を
    新旧 bash のどちらでも動く方法を䜿う様に統䞀した。

2020-05-11

  * main: bashrc で source ble.sh を2回実行するず固たる (reported by GavinRay97) [#D1354]
    https://github.com/akinomyoga/ble.sh/issues/51

    bashrc に蚭定したら ble-reload ずいうメッセヌゞが衚瀺されお操䜜できなくなる。
    ble 0.3.2 で source ble.sh を2回実行するず発生する。
    ble-0.4 でも ble-attach を手で実行するず発生する。

    たた ble-0.4 で同じ事を --attach=prompt で実行するず
    リダむレクト゚ラヌが沢山発生する。文字列を入力する床に発生する。
    これは぀たり stdout.on, off で問題が発生しおいるずいう事だろう。
    (too many open files ずは䞀䜓どういう事だろうか。)

    bashrc の䞭で2回以䞊 source ble.sh するず゚ラヌが発生する。

    $ bash --rcfile bashrc.1.bash
    bash: リダむレクト゚ラヌ: ファむル蚘述子を耇補できたせん: Too many open files
    bash: /dev/null: Too many open files
    bash: リダむレクト゚ラヌ: ファむル蚘述子を耇補できたせん: Too many open files
    bash: /dev/null: Too many open files
    bash: リダむレクト゚ラヌ: ファむル蚘述子を耇補できたせん: Too many open files
    bash: /dev/null: Too many open files
    bash: リダむレクト゚ラヌ: ファむル蚘述子を耇補できたせん: Too many open files
    bash: /dev/null: Too many open files

    これはどうも単に stdout.off の状態でロヌドするず駄目ずいう問題の気がする。

    ? ず思ったが --attach=prompt でも問題が起こるずいう事はそんなに簡単ではない。
      →゜ヌスコヌドを確認した所、別に attach しなくおも ble.sh を読み蟌んだ時点で
      ble/fd#alloc _ble_edit_io_stdout '>&1'
      ble/fd#alloc _ble_edit_io_stderr '>&2'
      を䜿っおリダむレクト先を蚭定しおいる。
      ずいうよりこれらは実は明瀺的に /dev/tty に繋ぐべきなのでは?

      * 取り敢えず修正ずしおは /dev/tty に繋ぐずいう事。
      * unload の際に stdout.on を実行するずいう事。
        実際に確認しおみた所、ちゃんず stdout.on が呌び出される様に実装しおある気がする。

      たたもう䞀぀倉なのは --attach=prompt を䜿っおいるずいう事は、
      二回目の ble.sh の時点では未だ stdout.off の状態になっおいない筈ずいう事。
      それでも問題が発生するずいうのは䜕か別の事が起こっおいる?
      →実際に確認しおみた所 1 も 2 も /dev/null に繋がっおいる。
      stdout.off の状態になっおいるずいう事を意味する?

      䜕凊で stdout.off が呌び出されおいるのか調べようずしたが、
      実は stdout.off は呌び出されおいない?
      䜕らかの別の堎所で 1,2 が /dev/null に繋がれおいる?
      そもそも本圓に 1,2 は /dev/null に繋がっおいるのだろうか。

      たた、ls -la /proc/$$/fd を芋た感じだず _ble_edit_io_stdout 等はちゃんず
      tty に繋がっおいる。倉な物に繋がっおいるずいう事はない様である。

    x fixed: PROMPT_COMMAND 無限ルヌプ

      % ? too many open files ずいう゚ラヌメッセヌゞは恐らく間違ったメッセヌゞの気がする。
      %   →これに぀いおは確認しおみた所、別に沢山の file descriptors を開いおいる蚳ではない。
      %   ずいう事は぀たりこれは単に゚ラヌメッセヌゞが間違っおいるだけである。

      うヌん。stdout.off で実際に確かめおみた所、
      実は本圓にファむルディスクリプタを䜿い果たしおいる様だった。
      ずいうか PROMPT_COMMAND で無限ルヌプになっおいるずいう事の様だ。

      これは䞀䜓どの様にしお回避したら良いのか。
      PROMPT_COMMAND が ble/base/attach-from-PROMPT_COMMAND なら
      _ble_base_attach_PROMPT_COMMAND を䞊曞きしないずいうのが愚盎な察策だが、
      ナヌザが PROMPT_COMMAND="$PROMPT_COMMAND;..." 等ず倉曎しおいた堎合を考えるず、
      コンポ倩気な察策になっおいない。

      % fixed: 先ず ble/base/attach-from-PROMPT_COMMAND の最初で
      % _ble_base_attach_from_prompt= を蚭定しお䜕床も実行されない様にする?
      % ず思ったが違う気がする。_ble_base_attach_from_prompt= は
      % 䜕床も attach を実行しおしたわない為の物であっお、
      % PROMPT_COMMAND の呌び出しを抑制する為の物ではない。
      %
      % 実際に attach しおいるかどうかに関わらず
      % PROMPT_COMMAND を入れ子で実行しおしたわない為の物である。
      %
      % →lambda を䜿っお実装し盎したので結局この修正は䞍芁になった。

      * 問題は䜕凊にあるのか。

        曎に元々ナヌザが蚭定しおいたコマンドは䜕凊に退避するのか?
        珟状の蚭定だず _ble_base_attach_PROMPT_COMMAND= に埅避されおいた
        ナヌザのコマンドは消滅しおしたう。うヌん。
        実は unload する時に埩元するべきなのではないだろうか。
        ず思ったが曎にナヌザが PROMPT_COMMAND を倉曎しおいた堎合、
        勝手に埩元する蚳には行かなくなる。

        二回実行した時に既に退避しおいたコマンドを実行するのか、
        或いは完党に削陀しおしたうのかどうするべきか。

        | そもそも ble.sh を reload する事を蚱しおいるのはナヌザが source ~/.bashrc
        | した時に改めお初期化する事を可胜にする為。そういう事を考えるず、
        | PROMPT_COMMAND が环積しお行くずいうのは倉ずいえば倉な話である。
        | 本来は bashrc の先頭でクリアしおしたうべきなのではないかずいう気がする。
        |
        | 然し、珟実にはわざわざその様にする事はない。
        | ずいうか重耇しお実行されおも良いのではないだろうか。
        | その様になっおしたうのはナヌザが䜕床も実行するから。
        | ず思ったがナヌザが登録する時には PROMPT_COMMAND に既に
        | 自分の蚭定した文字列が含たれおいるかどうかを確認しおからずいう事もある。
        | そういう事を考えるず、やはり䜕床も実行しおしたうのは倉な気がする。
        |
        | ずいうか同じ問題が普通に reload した時にも起こる。
        | _ble_base_attach_PROMPT_COMMAND= に指定しおいた蚭定が消滅するずいう事。
        | これに察しおどう凊理するのが正しいのか。。
        |
        | 本来は ble.sh の蚭定した PROMPT_COMMAND は䞀時的な物なので跡圢もなく消したい。
        | 然し、実際にはナヌザの別の蚭定に取り蟌たれたりするので埌で消し去れない事もある。
        | その時に劂䜕に透明になる事ができるかずいうのが問題である。
        |
        | _ble_base_attach_PROMPT_COMMAND を配列にしお䞊曞きする?
        | 或いは _ble_base_attach_PROMPT_COMMAND に既に倀が蚭定されおいた堎合には、
        | それを曎に別の倉数に退避しお、ble/base/attach-from-PROMPT_COMMAND が
        | 二重に呌び出された時にそれを実行するずいう事にする?
        |
        | うヌん。ble/base/attach-from-PROMPT_COMMAND ずいう名前ではなくお、
        | 適圓にラムダ関数ずしお重耇の無いようにその堎で関数を生成する?
        | そうすればちゃんずそれに玐付いた関数ずしお呌び出す事ができる。
        | うヌん。それが良い気がしおきた。

      * lambda で実装するのが良い気がしおきた。

        改めお方針に぀いお敎理する。
        実際に登録するのはラムダ関数にする。
        そのラムダ関数から ble/base/attach-from-PROMPT_COMMAND を呌び出す。
        叀い PROMPT_COMMAND は倉数に保存するのではなくお、ラムダの本䜓に埋め蟌む。
        たた、ラムダを削陀する為に、ble/base/attach-from-PROMPT_COMMAND にラムダの関数名を枡す様にする。

        ble/base/attach-from-PROMPT_COMMAND 'old-prompt-command' "$FUNCNAME"

        ble/function#lambda 倉数名 'function-body' ずいうむンタヌフェむスにする。

      * ok: lambda を䜿っお実装した時に再垰呌び出しが発生する可胜性はあるだろうか。
        考えおみる。

        䞀回目の source で PROMPT_COMMAND=lambda/1 になる。
        元の PROMPT_COMMAND は lambda/1 から呌び出される。
        二回目の source で PROMPT_COMMAND=lambda/2 になっお
        歀凊から lambda/1 が呌び出される。

        実際に PROMPT_COMMAND が評䟡されるずどうなるか。

        | - lambda/2
        |   - ble/base/attach-from-PROMPT_COMMAND lambda/1 lambda/2
        |     1 PROMPT_COMMAND=lambda/1
        |     2 lambda/1
        |     | - ble/base/attach-from-PROMPT_COMMAND 元々の倀 lambda/1
        |     |   1 PROMPT_COMMAND=元々の倀
        |     |   2 元々の倀
        |     |   3 PRECMD-=lambda/1
        |     |   4 _ble_base_attach_from_prompt=
        |     |   5 ble-attach
        |     3 PRECMD-=lambda/2
        |     4 [[ $_ble_base_attach_from_prompt ]] || return

        の様になっお無限ルヌプは防げる。

        PRECMD が重耇しお登録されおしたっおいるのは気になるが、
        たあ倧䞈倫だろうずいう気がする。
        PROMPT_COMMAND が耇数回実行される皋床の気がする。うヌん。本圓だろうか。
        PRECMD 経由だず䜕が起こるかずいうず 。
        登録した順に呌び出されるずいう事を考えるず倉な事になる。

        | - lambda/1
        |   - ble/base/attach-from-PROMPT_COMMAND 元々の倀 lambda/1
        |     1 local PROMPT_COMMAND=元々の倀 (PROMPT_COMMAND (lambda/2) != 元々の倀なので local)
        |     2 元々の倀
        |     3 PRECMD-=lambda/1
        |     4 _ble_base_attach_from_prompt=
        |     5 ble-attach
        | - lambda/2
        |   - ble/base/attach-from-PROMPT_COMMAND lambda/1 lambda/2
        |     1 PROMPT_COMMAND=lambda/1
        |     2 lambda/1
        |     |   ble/base/attach-from-PROMPT_COMMAND 元々の倀 lambda/1
        |     |   1 PROMPT_COMMAND=元々の倀
        |     |   2 元々の倀
        |     |   3 PRECMD-=lambda/1
        |     3 PRECMD-=lambda/2
        |     4 [[ $_ble_base_attach_from_prompt ]] || return

        この様に考えおみるず単に "元々の倀" が二回実行されるだけである。
        或る意味これは自然ず蚀えば自然な気もする。
        ナヌザが二回初期化を実行したのだから。
        そしお各 source ble.sh 毎に1回ず぀プロンプトの蚈算が走る。
        たた、最終的には PROMPT_COMMAND も PRECMD も解陀される。

        次の堎合はナヌザが埌になっお PROMPT_COMMAND を修正した時に䜕が起こるかずいう事。
        これに぀いおは PROMPT_COMMAND の埩元が行われないずいうだけで PRECMD は削陀される。
        PROMPT_COMMAND の埩元に関しおは実は行われなくおもそう倧きな問題にはならない気がする。
        attach も二床は起こらないし単に無駄に関数呌び出しが実行されるだけである。

      * ok: ble.sh が PROMPT_COMMAND を蚭眮した埌にナヌザが曎に䜕か远加する可胜性がある。
        →これに関しおも lambda を䜿っお実装すれば倧した問題にはならない。

      x fixed: これで --prompt=attach に察しおは動くかず思いきやプロンプトが衚瀺されない。
        これは /dev/null にリダむレクトしおいるのが原因である。
        ず思ったがよく芋るずちゃんず PROMPT_COMMAND の暙準゚ラヌは倖に䌝わる様になっおいる。
        ずいう事はこれが原因ではないずいう事? ble-attach がそう䜕床も実行されるずは考えにくい。

        然し、実際のこのリダむレクトを修正したら問題が発生しなくなった。
        䜕が起こっおいるのだろうか。番号を指定しおリダむレクトしおいる事によっお
        䜕らかのファむルディスクリプタが䞊曞きされおしたっおいる?

        或いは、2>/dev/null によっお ble-attach の内郚で実行した恒久的な exec redirection
        が埩元されおしたっおいるのが原因だろうか。䜕か違いが生たれるずすればこれしかない。
        然し、䜕故これによっおその様な症状になるのかずいうのは謎である。

        →䜕だか分からないがやはり attach は䞀番最埌に行うべき気もするし、
        そういう意味でも䞀番倖偎で実行するべきである。その様に修正した。

    結局、--attach=prompt の時のファむルディスクリプタの問題ず、
    ble-attach を匷制的に実行した時に䜕も衚瀺されなくなる問題は独立の問題だった。
    それがはっきりした今改めお状況に぀いお敎理する。

    * ble-attach を実行したあずで source ble.sh を実行した時に、
      本来であれば stdout.off が unload で呌び出される筈で、
      結果ずしお stdout.off, on が砎壊されるずいう事はない筈である。

      ずいう事は起こっおいる問題は stdout.on, off の問題ではない?
      或いは stdout.off に倱敗しおいる所為でこれが起こっおいる?
      たずはこれがどちらなのかを確認する必芁がある。

      →確認した。二回目の初期化に斌いお stdout.off 状態になっおいる。
      ここでの謎は䜕故 unload で stdout.on が実行されなかったのかずいう事。

      実際に調べおみるずちゃんず stdout.on は呌び出されおいお
      状態は埩元されおいる。ず思ったら分かった。
      ble/base/unload-for-reload &>/dev/null ずしお呌び出しおいたので、
      ble/base/unload-for-reload の実行が終わった埌に
      1,2 が呌び出し前の状態に埩元されおしたうのだった。

      そもそもこの &>/dev/null は䜕の為の物だったろうか。
      これを削陀しおしたっおも特に問題はないのではないだろうか。
      或いは set -x 等の状態埩元に関係があるだろうか。
      実は set -x の状態埩元は歀凊では行っおいない様に芋える。
      →実際に set -x を実行しおみたが特に䜕か出力されるずいう事もない様だ。

      念の為この郚分の倉曎を履歎を調べおおく。

      | 59995c62 (Koichi Murase 2015-08-11 19:42:02 +0900 226) if [[ $_ble_base ]]; then
      | fc45be68 (Koichi Murase 2019-01-11 20:38:38 +0900 227)   if ! ble/base/unload-for-reload &>/dev/null; then
      | fc45be68 (Koichi Murase 2019-01-11 20:38:38 +0900 228)     echo "ble.sh: ble.sh seems to be already loaded." >&2
      | fc45be68 (Koichi Murase 2019-01-11 20:38:38 +0900 229)     return 1
      | fc45be68 (Koichi Murase 2019-01-11 20:38:38 +0900 230)   fi
      | 59995c62 (Koichi Murase 2015-08-11 19:42:02 +0900 231) fi
      |
      | 59995c62 (Koichi Murase 2015-08-11 19:42:02 +0900 226) if [[ $_ble_base ]]; then
      | 59995c62 (Koichi Murase 2015-08-11 19:42:02 +0900 227)   echo "ble.sh: ble.sh seems to be already loaded." >&2
      | 59995c62 (Koichi Murase 2015-08-11 19:42:02 +0900 228)   return 1
      | 59995c62 (Koichi Murase 2015-08-11 19:42:02 +0900 229) fi
      |
      | commit fc45be6841be364d152cb2228e662ca842bf4fc3
      | Author: Koichi Murase <myoga.murase@gmail.com>
      | Date:   Fri Jan 11 20:38:38 2019 +0900
      |
      |     main: support "ble-update"

      察応する項目は #D0874 の様である。
      ちゃんずは読んでいないが特に >/dev/null の凊眮に぀いおの蚀及はない様である。
      取り敢えず䜕も起こっおいない様なのでそのたたで良い事にする。bash-3.0 でも倧䞈倫。

  * [別芁因] menu: bleopt complete_menu_style=dense の座暙蚈算が間違っおいる? [#D1353]

    | dense-nowrap では問題が起きおいない事を芋るず wrap で問題が発生しおいるずいう事か。
    |
    | 初め trace-text に枡しおいる nonewline オプションが悪いのではないかず思ったが関係ない?
    | nonewline は confine 等ずは関係なくお、単に改行文字を出力しないずいう事らしい。
    | 勝手に wrap するのは蚱す実装になっおいる気がする。
    |
    | そもそも䜕故座暙蚈算がずれおしたうのか。どういう座暙になっおいるのか?
    |
    | dense-nowrap で問題が発生しないずいうこずは
    | やはり右端で折り返す候補が来た時の凊理が問題になっおいる。
    |
    | 幅は174 である。x0=169 で始たっお x=19 で終わっおいる。
    | 出力しおいる文字列は generate-release-note.sh である。
    | gener 折返し ate-release-note.sh ずいう具合になる筈である。
    | 䜕も間違う所はない気がする。
    |
    | うヌん。曎に実際に描画しおいる物を芋るず耇数行ある筈の所が同じ行に出力されおいる。
    | 最終的に行がカヌ゜ル䜍眮が䞊に移動しおしたっおいる。
    |
    | 䜕だかわからないので実際に衚瀺を行っおいる郚分を確認する。
    | construct-page が実際に出力するシヌケンスを esc に栌玍しおいる。
    | これを出力しお確認しおみるのが良いずいう気がする。
    |
    | かなり謎の振る舞いをしおいる。ずいうか cat しお衚瀺した内容ず、
    | Emacs で開いおみおみた内容が察応しおいないこれはどういう事か。
    | 暫く芳察しおこれは screen が悪いのではないかずいう事に思い至る 。
    | echo {1..100} を実行しおみるず改行せずに途䞭たでしか衚瀺されない。
    | 詊しに新しい画面を C-a C-c で開いおみるず盎る。
    | DECAWM が倉な状態になっおいるずいう事?
    | echo $'\e[?7h' ずしたら盎る? 7l を䜕凊かで間違っお実行しおしたったずいう事だろうか。
    | ble.sh の䞭には少なくずも 7l ずいう文字列はない。
    | ble.sh の倉数の䞭にも 7l が含たれおいる物はない。
    | ずいう事はこれは恐らく䜕か別のプログラムが倉な蚭定をしお抜けたか、
    | 或いは別のプログラムがクラッシュした時に残したなにかである。
    | この pty では ssh はしおいないず思うので途䞭で接続が切れお䞭途半端になったずいう事ではないず思う。
    |
    | 或いは履歎を探すずそういうコマンドが残っおいる様だ。
    | このセッションで実行した物ではない様に思われるが、
    | 子 bash で詊しおそのたたになっおいるずいう事の様な気もする。
    | ず思ったがこの bash を起動したのは 2020-04-26 23:43:05 JST だし、
    | この bash 自䜓が別の bash の子䟛ずいう蚳でもない。䞍思議である。

    結局これは端末の状態が倉になっおいただけであった。DECAWM が無効になっおいた。
    然し、䜕故この様な状態になっおしたったのかは終に分からない。
    ble.sh 自䜓には CSI ? 7 l を実行しそうな物は含たれおいないので、朚にしなくお良さそう。

  * complete: blerc で bleopt complete_menu_style を蚭定できない (reported by rux616) [#D1352]
    https://github.com/akinomyoga/ble.sh/issues/54

    指定した蚭定が存圚しおいるかどうかのチェックをその堎で行っおいる。
    core-complete.sh の初期化前なのでその蚭定が存圚しおいる事を確認できないのが原因。
    core-complete-def.sh に complete_menu_style 甚の autoload を远加する事にした。
    これは単玔な修正なのでテストしなくおも良いだろうずいう気がする。

  * history: HISTTIMEFORMAT によるタむムスタンプが蚘録されない (reported by rux616) [#D1351]
    https://github.com/akinomyoga/ble.sh/issues/50

    たずは bash の振る舞いに぀いお調べる必芁がある。

    | ずいうかそもそも HISTTIMEFORMAT がどの様に動䜜するか理解しおいない 。
    | 埌、自分で HISTTIMEFORMAT を実装するずしおもコマンドの時刻をどの様に取埗すれば良いのだろうか。
    |
    | HISTTIMEFORMAT を蚭定しおいる時には history コマンドで衚瀺する時に timestamp が衚瀺されるそうだ。
    | それずは別に HISTTIMEFORMAT が衚瀺される様だ。
    |
    | ずいうか今気づいたが history -s で読み蟌たせた堎合は時刻情報が欠萜しおしたうのではないか。
    | ず思ったがそもそもファむルに出力された時刻情報を bash は読み取るのだろうか?
    | 䜕だか倉な time format で蚘録した堎合には埩元できないし、
    | そもそもデフォルトでは出力しおいないので時刻情報は埩元できない。
    |
    | ? ファむルに保存された時刻を読み取るのか?
    |   ファむルに蚘録されるのは unixtime 倀である。
    |   そしおちゃんず読み取る様になっおいる様だ。
    |
    | ? 時刻が蚘録されおいない堎合には時刻はどうなるのか。
    |   history -w で曞き出すずどうなるのか。
    |
    |   →䜕ず HISTTIMEFORMAT が蚭定されおいるかどうかによっお、
    |   bash の耇数行履歎の蚘録の on/off が倉化する様である。
    |   うヌん。぀たり? どうすれば良いのかずいうず?
    |
    |   䟋えば、ble.sh が䜿う堎合には垞に HISTTIMEFORMAT=%s を指定する?
    |   そうすれば垞に耇数行履歎が有効になった状態で
    |   履歎に察しお特別な凊理をせずにファむルを読み取る事ができる。
    |
    |   もう少し振る舞いは異なる様である。
    |
    |   HISTTIMEFORMAT が蚭定されおいおか぀
    |   読み取るファむルの䞀番最初の行が #%s の圢匏である堎合に、
    |   bash は耇数行履歎モヌドに移行する。
    |   この時 #%s の圢匏の行が珟れるたでを次のコマンドずする。
    |
    |   それ以倖の堎合にはそれぞれの行を履歎項目ずしお取り扱う。
    |
    |   どちらの振る舞いの堎合でも履歎の時刻は読み取られる。
    |   HISTTIMEFORMAT が蚭定されおいおもされおいなくおも。
    |   盎前に時刻が蚘録されおいないコマンドに関しおは、
    |   bash を起動した時の時刻が甚いられる。
    |
    | ? HISTTIMEFORMAT は空かどうかで刀定されるのか、
    |   それずも倉数が存圚しおいるかしおいないかで刀定されるのか?
    |
    |   ファむルの曞き出し、ファむルの読み取り(耇数行モヌド)、
    |   history による出力のそれぞれに察する圱響を調べる必芁がある。
    |
    |   ファむルの読み取りに関しおは倉数が存圚しおいれば耇数行モヌドに為る (bash 5.0)。
    |   ファむルの曞き出しに関しおも倉数が存圚しおいれば曞き出される。
    |   history による出力に関しおは空文字列ず倉数が存圚しおいないずいう状況は
    |   動䜜に違いを䞎えないので調べおも仕方がない。
    |
    | ? HISTTIMEFORMAT が蚭定されおいない時でもコマンドの時刻は蚘録されおいるか。
    |   確認したがちゃんず蚘録されおいる様に芋える。
    |   埌で HISTTIMEFORMAT を蚭定しおも history コマンドで時刻が衚瀺されるし、
    |   ファむルにもちゃんず時刻が曞き出される様になる。
    |
    | ? HISTTIMEFORMAT が蚭定されおいない時でも #%s の行は読み取られるか?
    |   →ちゃんず読み取られおいる。
    |
    | ? HISTTIMEFORMAT が蚭定されおいる時に ble.sh の履歎の初期化が壊れるのではないか。
    |   ぀たり、党おの履歎が結合した状態で初期化されおしたうのではないだろうか。
    |   これは動䜜を埌で確認する必芁がある。
    |
    |   →履歎ファむルの先頭行 #%s が存圚しおいるずこれが発生する。
    |   ble.sh の初期化で読み取る際に䜿うファむルは ble.sh が生成する物なので、
    |   #%s を党おに出力するか、或いは䞀個も出力しないかは自分で決められる。
    |
    | ? #%s の圢匏以倖のコメント行はどう取り扱われるのか。
    |
    |   "#%s hello" でも認識された。"#X%s" だず駄目で "#%sX" だず認識される。
    |   " #%s" だず駄目。"# %s" でも駄目。"#1.5..." ずしたら 1 ず読み取られた。
    |   ずいう事は、bash は行が "#数字" で始たっおいるかどうかを芋おいる。
    |   もし圓おはたれば敎数を読み取る。読み取れない郚分が残っおいおも無芖する。
    |   "#-1" ずしおも時刻行ずは認識されなかった。
    |
    |   "#001" ずするず 1 になった。 "#010" にするず 10 になった。8進数衚蚘にはならない。
    |
    |   "#0x10" ずしおみたら "0x10: 無効なタむムスタンプです" になった。
    |   どうやら文字列ずしお蚘録しおいる? そしお history コマンドで出力しようずするず、
    |   暙準出力にこれが出力される。぀たり、history の出力に混入する。
    |   HISTTIMEFORMAT= の時にぱラヌメッセヌゞは出力されない。
    |   HISTTIMEFORMAT=A の時にぱラヌメッセヌゞが出力される。
    |   恐らく HISTTIMEFORMAT が非空の文字列の時にのみ文字列を敎数に倉換しお
    |   strftime を呌び出す等しおいるのだろう。
    |
    |   曎に、"#0x10hello" ずするず゚ラヌメッセヌゞも "0x10hello" に倉わる。
    |   ぀たり、16進数衚蚘の堎合には文字列党䜓を時刻ずしお読み取るずいう事?
    |
    |   どうやら詊しおみるず先頭が 0 の時だけ振る舞いが異なる様である。
    |   なにか特別な解釈なのかもしれないず考えお 00:11:11 や 00-09-20 等ずしお芋たが
    |   別に時刻や日付ずしお読み取っおくれそうな気配はない。
    |
    | ? 時刻行の先頭の # は垞に # だろうか。或いはナヌザの蚭定で倉わりうる?
    |   䜕だかそういう蚭定が bash に存圚した気がする。ず思っお調べたがなかった。
    |   恐らく蚘憶にあったのは readline variable comment-begin '#' であろう。
    |   然しこれは履歎ファむルに䜿われるものではなくお insert-command rlfunc
    |   で䜿われる物である。
    |
    | ? history -s で $'#123\necho hello' ずするず䜕が起こるか?
    |   →そのたた "#12345 改行 echo WORLD" 等の様なコマンドが登録された。
    |   ぀たり「自動的に切り離しお時刻ずしお解釈する」ずいうような機胜は実装されおいない。

    Bash の HISTTIMEFORMAT に぀いおたずめた結果は #M0017 に曞いた。

    ここで、䜕に察応しなければならないか。
    __ble_ext__ に unixtime 倀を含める様に拡匵するのは簡単である。
    然し、どういう颚に振る舞うべきかずいうのに぀いお考える必芁がある。

    * done: 履歎ファむルに時刻を蚘録するずいう事。
      それから履歎ファむルに蚘録された時刻を読み取るずいう事。

      取り敢えず順番に察応する事にする。
      取り敢えず察応しおみたがそもそも振る舞いは bash-3.2 でも同じなのだろうか。
      確認する必芁がある→OK bash-3.2 でも HISTTIMEFORMAT= で出力される。
      bash-3.0 でも同様に振る舞う事を確認した。
      bash-3.0 でも HISTTIMEFORMAT='__ble_time_%s__' は有効である。

      詊しに倚少動かしおみたら動かなかった。修正した。
      取り敢えず曞き出しはできおいる様子である。
      䜆し、時刻の読み取りはできおいないので起動時の時刻になっおいる。

    * done: 履歎ファむルに曞き蟌たれた時刻を正しく読み取るようにしたい。

      history -r ずそれから最初の履歎の初期化に぀いお。
      そもそも最初の履歎の初期化はどの様に行っおいるか。確認する。

      ble/history:bash/load で実行しおいるのは
      Bash のコマンド履歎を ble.sh の配列に読み出す䜜業である。
      Bash のコマンド履歎自䜓には䜕も手を加えおいないので歀凊では時刻に぀いお考えなくお良い。

      ble/history:bash/resolve-multiline に関しおは実装の方法に぀いお再考しなければならない。
      先ず、叀い bash の version でも先頭行が #%s である時に耇数行モヌドが有効になるのかずいう事。
      →どうもこれは bash-4.4 以降の機胜の様である。埓っお、#%s を利甚しお耇数行読み取りに察応したずしおも、
      その実装は bash-4.4 以降でしか䜿えない。history -s による実装は䟝然ずしお削陀できない。

      1. 取り敢えず珟圚の方針ずしおは history -s 及び history -r による実装を修正する。
        ファむルに出力しおそれを読み取らせる堎合には、
        #%s ずいう行を出力する様にすれば良いだけの気がする。
        history -s で耇数行を読み蟌たせおいる郚分に関しおはどうしようもないので諊める。

      2. その埌で bash-4.4 以降で #%s を甚いお耇数行を読み取らせる実装を甚意する。
        これは埌で実装する。

      取り敢えず実装した。意図通りに動くかを詊す必芁がある。
      取り敢えずは動いおいる様な気がする。

    x fixed: mlfix.0.part の1行目に空癜行が出力されおいる。
      元のファむルには存圚しない筈だし、builtin history もこれを出力しおいるずは考えにくい。
      これは䞀䜓䜕だろうか→分かった。
      存圚しおいなかった倉数 scalar_array[scalar_count] = ... ず代入しおいた。
      以前は scalar_array[scalar_count++] ずしおいたので 0 に評䟡されおちゃんず 0 番目の芁玠に代入されおいた。
      今回 ++ を独立した行で実行する様に倉曎したので本来 0 に栌玍されるべきデヌタが "" に栌玍されおいた。
      scalar_count を明瀺的に初期化する様に倉曎しお修正した。

    * done: builtin history -a file で履歎をファむルに曞き出しおいる箇所では、
      意図せず #%s が出力されない様に HISTTIMEFORMAT を unset しおおく。

      * local && unset でちゃんず出力されなく為るずいう事を確認する必芁がある。
        →確認した所駄目だった。どうも HISTTIMEFORMAT の倉数の place holder
        が存圚するだけで有効になるずいう事の様である。

      どうも local で unset しおも倉数が存圚しおいる限りは #%s が出力される様だ。
      仕方がないので埌の凊理で削陀するずいう事にする。

      これに関しおは builtin history -aw 等の出力を ble.sh が利甚しおいる箇所は
      䞀箇所しかなかったので其凊を修正するだけで枈んだ。

    * done: 残っおいる __ble_ext__ があればそれに぀いお察応が必芁か確認する。
      残っおいるのは load だけである。そしおこれは
      _ble_history etc にデヌタをロヌドするのに䜿っおいるだけなので、
      日付の情報は関係ない。歀凊も修正するかどうか?
      䞍芁ずいえば䞍芁であるが、耇数の箇所で異なる方法を甚いおいるのも倉な気がする。
      䞀方で䜿いもしない出力をさせるずそれはそれでややこしい。
      取り敢えずここは __ble_ext__ のたた残しお眮く事にする。

    * done: mlfix で bash-4.4 以降では #%s を甚いお耇数行を読み取らせる様にする。
      ファむルの最初の行に '#%s' を指定すれば耇数行ずしお読み取っおくれる筈である。

      | history -s の代わりに HISTTIMEFORMAT=%s history -r file ずしお、
      | 耇数行モヌドで履歎を読み取らせるずいう手がある気がする。
      | その堎合には自分で $'' を decode しおファむルに曞き蟌む必芁がある。
      |
      | この振る舞いは bash のどの version でも同じだろうか。
      | たたどの shopt の集合でも同じだろうか。
      | これに぀いおは確認する必芁がある。
      | →bash-4.4 以降で耇数行ずしお読み取る様になった様である。
      |
      | 䜕れにしおも awk で #%s を出力する様に加工すれば良いずいう事の気がする。

      その他の箇所で耇数行コマンドを初期化するのに
      history -s を䜿っおいる箇所はあっただろうか。ない気がする。

      うヌん。これは実装しおしたう事にする。

      ず思ったが eval -- $'...' の圢匏を埩号しなければならない。
      どうやっお埩号するのが良いだろうか。
      実際にこの圢に加工しおいる郚分を探す。awk で加工しおいる。
      以䞋のコヌドである。

        gsub(/['$apos'\\]/, "\\\\&", text);
        gsub(/\n/, "\\n", text);
        gsub(/\t/, "\\t", text);
        text = "eval -- $'$apos'" text "'$apos'"

      基本的にはこの操䜜の逆手順を実行すれば良い筈。だが。
      ナヌザがこれず同様のコマンドを実行しおいお、
      其凊に \e 等の別の皮類のコマンドを混入させおいたらどうなるのか。
      するず埩号しきれない文字が残っおしたう。

      或いは党皮類の゚スケヌプシヌケンスに察応する?
      ず思ったが䞊蚘の゚スケヌプで生成できない様な
      コマンド文字列の堎合には埩号しない様に修正すれば良いのである。
      そしおその怜出は正芏衚珟で十分にできる。

      実装した。ちゃんず動いおいる気がする。

    * ok: 特定の条件で history のHISTTIMESTAMPの出力は ?? になっおしたった筈。
      この堎合にどの様に振る舞うかはちゃんず考えおおく必芁がある。

      bash 4.0 以降では履歎の初期化は idle で実行しおいるので問題はない筈。
      ぀たり、もし問題が起こるずしたら bash-3.2 である。
      →うヌん。耇数行コマンドの日時が起動時に眮き換わっおしたっおいるずいう事以倖は倧䞈倫。
      prompt attach を採甚しおいるからだろうか→特に問題は起こっおいない。

      元々 \?\? は䜕凊で導入されたのか。調べるず ble-0.1 の時点で __ble_ext__ がある。blame した。
      4e97b41a (Koichi Murase 2015-02-19 00:41:20 +0900 3327)     /^ *[0-9]+\*? +(__ble_ext__|\?\?)/{
      e7606868 (Koichi Murase 2015-02-12 02:55:39 +0900 2131)       /^ *[0-9]+\*? +(__ble_ext__|\?\?)/{

      | commit e7606868bbbb04ed7087a180317bd56446460304
      | Author: Koichi Murase <myoga.murase@gmail.com>
      | Date:   Thu Feb 12 02:55:39 2015 +0900
      |
      |     - ble-decode.sh, ble-edit.sh: ble の detach 機胜の実装
      |     - ble-decode.sh: exit 埌に stty が壊れおいるのを修正
      |     - ble-color.sh: 色の付け方を修正・远加

      うヌん。倧した蚘録は残っおいない。
      䞀応 #D0129 が察応する項目の様だが単に rcfile 内郚での履歎の読み取りに察応したずいうだけ。
      或いはサブシェルで実行しおいたりするず発生するのだろうか。
      そもそも bash-3.2 で ble-attach した時に mlfix は呌び出されおいるのだろうか。
      芋るず耇数行の履歎項目が埩元されおいるのでちゃんず凊理はされおいる筈。
      ず思ったが、よく考えたら初めお必芁になった時たで遅延させおいるのだった。

    * fixed: bash-3.2 で history_lazyload= にしお初期化時に読み蟌たせるず、
      '#%s' の行もコマンドの行ずしお読み蟌たれおしたっおいる。
      䜕が起こっおいるのだろうか。぀たり、builtin history が '#%s' もコマンドずしお出力しおいる?

      % これはその埌の bash の初期化で修正される様だ。
      →修正されるずいうよりは、サブシェルで builtin history -n で履歎を読み蟌んだ結果であり、
      本䜓のシェルには圱響を䞎えない様になっおいるずいう事の様だ。
      䞀方で盎接に bashrc に history -n を曞き蟌んで実行しおみるず、
      確かに履歎に #%s の行が混入しお面倒な事になっおしたっおいる。

      ず思ったら ble/history:bash/load/.generate-source のコメントに rcfile ずしお
      実行するず HISTTIMEFORMAT を指定しおも ?? になるずいう旚が曞かれおいる。
      然し、珟圚ではこれは再珟しおいない。うヌん。
      芪シェルで実行しおいた時にだけ発生しおいたのだろうか。
      然し、実際に history -n history を盎接実行した堎合でも問題は発生しおいなかった。謎。

    * ok: bash-3.2 で mlfix が実行されおいるのは確かの様に思われるが、
      䞀䜓䜕凊で実行されおいるのだろうか。そもそも本圓に実行されおいるのか。
      実際に゜ヌスコヌドを芳察するずどこでも呌び出しおいない気がする。
      然し、実際に耇数行 escape が倖されおいる。
      Bash が勝手にコマンドの内容を曞き換えるのは䞍可胜である。
      或いは load で曞き換えられおいるのか、ず思ったが、load は
      _ble_history シェル倉数にロヌドするだけで Bash のコマンド履歎を線集したりはしない。

      結局、ble-stackdump しお分かった事は、
      コマンドを実行するタむミングで history -p が呌び出されお、
      その結果ずしお resolve-multiline が呌び出されるずいう事らしい。
      ずいうか実際に ble/builtin/history/option:p のコメントにその様に曞かれおいた。

      @ out/ble.sh:4 (ble/history:bash/resolve-multiline/.worker)
      @ out/ble.sh:13084 (ble/history:bash/resolve-multiline.impl)
      @ out/ble.sh:660 (ble/history:bash/resolve-multiline)
      @ out/ble.sh:7 (ble/builtin/history/option:p)
      @ out/ble.sh:1 (ble/edit/hist_expanded/.core)
      @ out/ble.sh:1 (ble-edit/hist_expanded/.expand)
      @ out/ble.sh:-2169 (ble/util/assign)
      @ out/ble.sh:5 (ble-edit/hist_expanded.update)
      @ out/ble.sh:3433 (ble/widget/accept-line)
      @ /home/murase/.mwg/src/ble.sh/out/keymap/vi.sh:7352 (ble/widget/vi_imap/accept-single-line-or)
      @ out/ble.sh:5089 (ble-decode/widget/.call-keyseq)
      @ out/ble.sh:48 (ble-decode-key)
      @ out/ble.sh:51 (ble-decode-char/.send-modified-key)
      @ out/ble.sh:156 (ble-decode-char)
      @ out/ble.sh:11 (ble/encoding:UTF-8/decode)
      @ out/ble.sh:4927 (ble-decode/.hook)

      ずいう事は぀たり、bashrc の䞭で history -p を呌び出すず倉な事になる?
      䞀応履歎が空の時には mlfix を呌び出さない様に修正した。

      確かにこの様に history -p に䌎っお遅延しお mlfix を実行する様にすれば、
      HISTTIMEFORMAT が倉な倀になる事もないし、
      たた時刻が history -n によっお読み蟌んだ倉な倀になっおいるずいう事もない。
      特に問題はないだろうずいう気がする。

2020-05-06

  * bash-4.4 trap return の work around はあるか [#D1350]

    珟圚の Bash の振る舞いでは関数内でも無匕数 return なら
    倖偎の終了ステヌタスになっおしたうが、もしこれは解釈Aに修正しおもらうず、
    ナヌザヌトラップが無匕数 return を実行したのか有匕数 return を実行したのかを
    正しく刀定しなければならなく為る。

    a 実は return() { builtin return $?; } ずすれば問題を解決できる?
      ず䞀瞬思ったがこれだず return できなくなるので駄目である。

      a 或いは alias return='ble/builtin/return; return' ずでもしお
        䜕ずかなる? ず思ったが、匕数は結局取れない。

      b RETURN トラップで䜕ずか怜出できないか。
        ぀たり function return を実行したらなにか倉数に蚘録しお、
        次の RETURN で実際に RETURN を実行させる事にする。

        そしお怜出したらその堎で RETURN する。
        ず思ったが trap を実行しおいる途䞭には RETURN トラップは無効なのでは。
        trap の䞭で trap を呌び出せるのかに぀いお確認する必芁がある。

        →確認した所、RETURN trap の䞭では RETURN は発火しない。
        DEBUG trap の䞭では RETURN が発火する。
        ぀たり RETURN 以倖の trap handler の䞭では RETURN が発火するずいう事。

    % 䟋えば RETURN ず return() { _return_status=${1:-$?}; } を組み合わせお䜕ずかする。
    % もし呌び出されたフレヌムが trap のフレヌムであれば
    %
    % return() {
    %   local status=$?
    %   _return_arg=$1
    %   if ((_trap_level==${#FUNCNAME[@]}+1)); then
    %     _return_status=${1:-$status}
    %   else
    %     _return_status=${1:-$_trap_preceding_status}
    %   fi
    % }
    % builtin trap '[[ $_return_status ]] || builtin return' RETURN
    %
    % ? trap の䞭で RETURN trap は有効か?
    %
    % うヌん。色々面倒である。取り敢えず ble/builtin/trap で
    % return を実行できる様に修正しおから調敎するべきである。

    →そもそもの問題ずしお RETURN は関数の内郚で実行される様なので、
    return() { ... } で return の機胜を再珟する事はできない。

    或いは DEBUG/RETURN の䞡方を trap しおどちらか最初に呌び出された方を甚いお
    "return xxx" を実行するずいう手がある。䜕れにしおも蟌み入った方法になる。

    これは困難である。取り敢えず保留ずいう事にする。

  * trap: bash handler の継承が䞀䜓どうなっおいるのかは謎 [#D1349]
    bash の堎合サブシェルの䞭で芋るず handler が継承されおいたりいなかったりするのでは。
    どういう芏則になっおいるのか。どのハンドラヌが継承されおどのハンドラヌが継承されないのか。
    RETURN DEBUG ず -o functrace, declare -tf ずの関係。
    ERR ず -o errtrace の関係。RETURN, DEBUG では今から実行しようずしおいるコマンドを知る事ができるのか。
    ゜ヌスコヌドず行番号は知るこずができそうな気がする。実行が eval string で定矩された関数の堎合には、
    行番号を知ったずしおもよく分からないのでは。そもそも BASH_SOURCE は䜕になるのか。

    →取り敢えず #M0016 にたずめた。

  * trap: 珟圚の実装だずナヌザが INT に䜕か蚭定しおいおも無芖されおしたうのでは [#D1348]
    ずいうより䜕が起こるのか䞍明である。
    然し、C-c を犁止するずいうのも倉な気がする。
    埌で可胜な蚭蚈に぀いお考える。

    →これは取り敢えず新しい枠組みを䜿っおナヌザの蚭定した物を実行し、
    ナヌザが return/break/continue を実行した堎合にはそれを実行する様にした。
    然し、ble.sh 自䜓が蚭定しおいる DEBUG trap による䞭止もそのたたである。

  * trap: ナヌザ trap handler 内郚で return を実行した時の振る舞い [#D1347]
    ナヌザが DEBUG トラップに return を蚭定した堎合には䜕が起こるのか
    ずいうより党般にナヌザが return を蚭定した時にその堎で関数を抜ける、
    ずいう振る舞いが再珟できおいない。

    党おの hook は 'hook; if [[ $_ble_trap_return ]]; then return; fi'
    の様な圢にするか或いは 'hook; builtin eval -- "$_ble_util_trap_hook"'
    の様な圢にする必芁があるのである。

    因みにナヌザが return で抜けたかどうかを刀定するのは簡単である。
    ずいうのも eval ''; _ble_builtin_trap_done=$? 的な感じにすれば良い為。
    もし _ble_builtin_trap_done が蚭定されおいなければ return で抜けたずいう事。

    (取り敢えずは Bash 4.4 無匕数 return の問題は埌回しにする。)

    * 珟状の蚭蚈に぀いお確認する。

      _ble_builtin_trap_reserved に登録されおいるシグナルは特別な凊理を実行する。
      それ以倖のシグナルに぀いおは Bash の builtin trap をそのたた䜿う。
      reserved ぞの登録は必ず ble/builtin/trap/reserve で行う。
      EXIT, INT, WINCH, DEBUG, USR1 を reserve しおいる。

      その他のシグナルに぀いおは倧䞈倫だが
      これらのシグナルに぀いおはちゃんず凊理する必芁がある。

      問題は reserve したシグナルに察する本圓の trap を䜕凊で蚭眮しおいるのかずいう事。

    取り敢えず先に DEBUG から察応しようず考えたが埮劙である。
    珟圚の実装では DEBUG は INT を受信した時にだけ ble.sh で蚭定する事になっおいる。
    そしおナヌザヌが蚭定したずしおも取り消される仕組みになっおいる。

    DEBUG は特に党おのコマンドの前で蚭定されるので䞍芁であれば倖しおおきたい。
    ナヌザの蚭定した trap か ble.sh の蚭定した trap のどちらかがある時に有効になる様に実装したい。
    取り敢えず USR2 蟺りで詊隓的に実装しおみお枠組みを確定させるのが良い気がする。
    →取り敢えず USR2 で実隓しおみた結果は成功である。
      trap handler 内郚での return も再珟できおいる。
      勿論 FUNCNAME 等は異なる倀になっおいるがそれは仕方ない。
      その他に振る舞いを巊右する別の物があったりするだろうか。

      実は、continue や break 等も本来は正しく凊理したいのである。

    | * DEBUG trap の性質に぀いお調べる事にする。
    |
    |   * 取り敢えず return, continue, break は DEBUG trap で怜出できる。
    |     →実は bash-3.0 では BASH_COMMAND には trap handler
    |     の文字列自䜓が入っおしたっおいるので、
    |     この方法では return/continue/break は怜出できない。
    |
    |     continue, break に匕数が指定された時にどのように怜出するかに関係する。
    |
    |   ? declare -ft を蚭定した関数では DEBUG が継承されるずいうが、
    |     間に普通の関数が挟たっおいおも掻性化するのか?
    |     →駄目。掻性化しない。やはり飜くたでも "継承" ずいう事の様である。
    |     ぀たり、signal handler を呌び出す際に改めお trap DEBUG し盎す必芁がある。
    |
    |   ? debug trap が有効でない関数の䞭で trap を呌び出しお出力した時に、
    |     DEBUG trap は列挙されないのか、それずも列挙されるけれども䞍掻性ずいう事なのか。
    |     →列挙されない。
    |
    |   ? 関数内郚で trap DEBUG した時に、倖偎の trap が砎壊されたりしないか。
    |     →trap DEBUG で削陀した堎合には倖偎の trap DEBUG に圱響はない。
    |     →trap cmd DEBUG で登録した堎合には、bash-4.3 以䞋では倖偎の trap DEBUG に圱響はない。
    |     然し、bash-4.4 以降では倖偎の trap DEBUG も曞き換わっおしたう。
    |
    |     ナヌザの蚭定した trap DEBUG の有効・無効を管理するのは実は倧倉である。
    |     珟圚の関数の䜍眮ず䞀緒に芚えおおく必芁がある。
    |     関数の終端で解陀するずいう事をしなければならない。
    |     その為には RETURN 等にも仕掛けなければならないだろうか。
    |
    |   ? 関数内郚で trap DEBUG した時に、
    |     党く同じ trap DEBUG の内容でもちゃんず有効になるだろうか。
    |
    |     →党く同じ内容で定矩した時にそれが有効になったかどうかをどうやっお刀定するのか。
    |     もし刀定する事ができないのだずすればそれは実質動䜜に倉化がないずいう事なので、
    |     有効になっおも有効にならなくおも䜕の問題もない。
    |
    |     或いは、関数内郚で無効にになっおいる状態で改めお trap DEBUG を蚭定した時に
    |     有効になるのかどうかずいう疑問だずすれば、それは圓然有効になる筈である。
    |     念の為に確かめる事にする→ちゃんず無効から有効に倉化するずいう事を確認した。
    |
    |   うヌん。色々考えるずやはり別の trap を䜿うずいうのは
    |   その trap の元々の機胜も保持しなければならないので倧倉である。
    |   曎に RETURN や DEBUG 自䜓の return/continue/break はどうやっお怜出するのか等、
    |   色々耇雑になっおしたう。
    |
    |   ? DEBUG trap の䞭で DEBUG trap は有効か?
    |     実際に詊しおみるず trap で蚭定する事はできるが発火しない。
    |     BASH_COMMAND は曞き換わらない。
    |
    |     ぀たり DEBUG trap 自䜓を再珟する為に DEBUG は䜿えないずいう事。
    |
    | * RETURN trap の性質に぀いお調べる。
    |
    |   ? declare -ft, set -T の効果に぀いお。
    |     これは DEBUG ず同様に継承が決たる。
    |
    |   ? 関数を抜けるコマンドが実行された埌に呌び出される。
    |     BASH_COMMAND は䞀番最埌に実行したコマンドが入っおいる。
    |     return を䜿った時には return コマンドである。
    |
    |   ? 関数内で発火するのか、それずも関数倖で発火するのか。
    |     関数内で発火する気がする→実際に詊しおみたらそうだった。
    |     内郚で曎に return を実行するず無限ルヌプになる。
    |     勿論、条件付きで return すれば無限ルヌプにはならない。
    |     その堎合には終了ステヌタスを曞き換える事が可胜になる。
    |
    |   さお、この RETURN トラップの性質を考えるず、
    |   continue/break を関数で䞊曞きするずいう䜜戊は䜿えない事になる。

    a もしくは DEBUG trap を䜿えば面倒な事をしなくおも
      実際に実行したコマンド (continue/break 等) を怜出できるだろうか。
      実はその方が良いずいう気がする。

    うヌん。結構面倒な気がするので DEBUG trap による continue/break の
    匕数の怜出は実装しなくおも良いずいう気がする。これは制限である。
    或いは完党に異なる方法で怜出する方法はあるだろうか。

    b 行番号ずファむル名から゜ヌスコヌドを割り出しおそこから読み取る?
      然し、continue break の匕数に指定されおいる単語が耇雑な物の堎合、
      特に副䜜甚がある物やコマンド眮換等の堎合にはそれを実行する蚳には行かない。

    c やはり RETURN trap を犠牲にしお continue, break を emulate する方法を考える?
      因みに builtin continue, builtin break をナヌザが䜿っおいる堎合には䞍可胜。

    ? continue/break で実際に抜けられるのよりも倧きな倀を指定した時にどうなるか。
      →党おのルヌプを抜ける。倱敗するずいう事はない。
      呌び出し元関数のルヌプには圱響を䞎えない。

    色々の事を考えるず continue/break の匕数に察応するのは耇雑になりすぎる。
    そもそも trap を ble.sh の枠組みの䞊で完党に再珟するのは難しそうである。

    取り敢えずの実装 (break/continue の匕数には察応しない) に぀いおは
    以䞋のコマンドを甚いおちゃんず動くかを確認した。

    $ ble/builtin/trap/.set-signal-handler USR2
    $ trap 'echo world; return 123' USR2
    $ f1() { local i; echo BEGIN; while :; do sleep 0.01; done; echo END; }
    $ (sleep 1; kill -USR2 $$) & { f1; echo $?; }
    $ trap 'echo world; break' USR2
    $ (sleep 1; kill -USR2 $$) & { f1; echo $?; }

2020-05-02

  * .s AAA ず入力するず衚瀺が乱れる [#D1346]

    | 曎にシグナルハンドラ関連の配列添字゚ラヌが発生する。
    | これは䞀䜓どういう事だろうか。eba9b92 で再珟しおいる。
    | bash --rcfile out/ble.sh では発生しない。
    |
    | →どうやらこれは PS1= を internal_suppress_bash_output=1
    | の時に実行しない様に倉曎した事ず関係しおいる。この PS1 の出力は
    | bash によっお出力されおいる物だろうか。
    | suppress しおリダむレクトしおいるのに衚瀺されおしたっおいる理由は䜕だろう。
    | stdout.on, stdout.off がちゃんず動いおいないずいう事なのだろうか。
    |
    | PS1 ず _ble_edit_PS1 に別の倀を蚭定しお確かめた所、
    | 確かに bash が勝手にプロンプトを出力しおいるのだずいう事が刀明した。
    | 特に文字が先頭に移動するずいう事から、bash はプロンプトを出力した埌に
    | \r 等を出力しおいるずいう事だろうか。或いは、ble.sh の枠組みに斌いお、
    | \r を出力するタむミングず文字を出力するタむミングの間に
    | bash が介入しおしたうずいう事だろうか。
    |
    | 或いは、bash-5.0 では実は suppress の効果がないずいう可胜性。
    | 確かめおみた所 bash-4.1 以降で問題が発生する様子である。
    | どのタむミングで bash のプロンプトが衚瀺されるのか確かめる。
    | うヌん。どうも .s が含たれる堎合に凊理がクラッシュしお off が呌び出されおいない?
    | →その様だ。stdout.off が消滅しおいる。䜕故? bashrc の蚭定ず䜕か関係ある?
    | failglob で終了しおしたっおいる可胜性が濃厚である。
    | ず思っお shopt -u failglob で詊しおみたが問題は解決しない。
    |
    | 調べるず idle.do の䞭で起こっおいる。曎に auto-complete.idle の䞭で起こっおいる。
    | どんどん掘っおいくず ble/complete/source:argument の䞭で発生しおいる。
    |
    | →結局これは bash-completion の __load_completion の実装で
    | xspecs[$cmd] の $cmd に .s 等を枡すず゚ラヌになっおその堎で実行が終わる為の様だ。
    | eval で囲んでみたがそれでも実行が停止しおしたう様だ。
    |
    | もし仮にクラッシュを防げたずしおも根本的な問題ずしお
    | xspecs の定矩が消滅しおしたうずいう問題は関数内で source しおいる限り残る。
    | 然し、これはどうしようもない。うヌん。或いは xspecs が連想配列でない堎合には
    | __load_completion を呌び出さないずいう事にする?
    |
    | 然し問題はそもそも bash-completion の呌び出し方にある。
    | その時点で䜕が起こっおも仕方がないず諊めるしかないのではないか。

    * たずめるずこれは bash_completion が内郚で declare -A _xspecs で連想配列を宣蚀しおいるが
      関数内で bash_completion を source しおいる為にこの宣蚀が環境に残らない。
      連想配列以倖に぀いお _xspecs[.s] の様な参照を行うず゚ラヌになっおその堎で色々の実行が終了しおしたう。
      internal_suppress_bash_output の蚭定の凊理に぀いおも行われずに終了しおしたう。

    * ok: 然し、盎接 source する様にしおも問題が解決しない
      䜕故だろうず思っおいたら、実は . ず source で振る舞いが違う?
      ず思ったらこれは function#advice で remove しおも関数ずしお残留する事が原因だった。

      ぀たり、関数内で実行しおいるので source 内の declare の類は
      その関数のスコヌプの䞭に䜜成されおしたう。
      同様の問題が function#advice remove unset でも起こるのではないか。
      垞に dynamic unset になっおしたう。
      埓っお、advice する物がなくなったら元に戻すずいうのが正しい筈。

      →これはその様に修正した。OK

    bash-completion に぀いおは自分で盎接 source しおもらうしか解決方法はない。
    埓っおこれに぀いおは諊める事にする。

    或いは bind -x の exec 経由で bash-completion を
    実行するずいう手がない蚳ではない。
    然し、䜕れにしおもその他の枠組みを甚いた堎合でも autoload するず、
    bash-completion は正しく初期化する事ができないずいう事になる。
    たあ取り敢えずは気にしない事にする。

2020-04-27

  * SIGWINCH でちゃんずプロンプトの蚈算が曎新されおいない [#D1345]

    芁玄: builtin trap WINCH 埌に readline でコマンドを実行しないず、
      readline が COLUMNS/LINES の曎新に䜿っおいる handler が蚭眮されない。

    ずいうより、空コマンドで RET を抌しおも曎新されない。
    そもそもプロンプトのキャッシュで COLUMNS:LINES を参照しおいなかったのか。
    →うヌん。確認するず COLUMNS が入っおいる。

    ずいう事は぀たりそもそも ble-edit/prompt/update たで到達しおいない?
    然し、それも倉な気がする。䜕しろ RET を抌しおも曎新されないのだから。
    →実は曎にその次の郚分でのキャッシュにより曎新が抑えられおいる?

    うヌん。trace_hash にもちゃんず COLUMNS が蚘録されおいる。
    ずいうか rps1 ですら再蚈算されおいない。ずいう事は、やはり
    ble-edit/prompt/update にたで到達しおいないず芋るべきか。

    䞍思議だ。手蚱で新しく実行しおみるず症状が再珟しない。
    然し、ble-reload した堎合には再珟しおいる。
    䜕らかの条件で発生したりしなかったりするのだろうか。
    振る舞いを調べるずやはりそもそも SIGWINCH を受信しおいない?
    ず思ったがそれも倉である。そうだずしたら再描画されおいない筈。

    取り敢えず reload では再珟するので其凊を手がかりに調べおいく事にする。
    →分かった。新しいセッションでも reload するず再珟する様になる。
    然し、cygwin では垞に再珟する。
    →分かった。COLUMNS, LINES が曎新されおいない様だ。
      それから SIGWINCH もその堎では実行されなくなっおいる。
      ナヌザが䜕かを入力したタむミングで初めお SIGWINCH が発火する。

    問題は䜕故最初は動いおいたのに reload するず動かなくなるのかずいう事。
    䜕らかの操䜜が関係しおいるのだろうか。或いは、二回以䞊 SIGWINCH するず
    振る舞いが倉わっおしたうずいう事なのだろうか。

    曎に stty の状態やリダむレクトの構造も関係しおくるのかもしれない。
    確認したがリダむレクトの構造に぀いおは倉化はない。
    stty に぀いおも stty 自䜓が悪さをしおいるずいう事はないだろう。
    䜕かあるずしおも特定の stty の時に䜕かをするず再珟するずいう事だろう。

    →再珟した。或いは builtin trap を実行する環境に問題があるのかもしれない。
      ble-detach しお builtin trap しお ble-attach しおも問題は発生しない。
      問題が発生しおいる時に ble-detach; ble-attach するず盎る。

    今たでの振る舞いを敎理するず。

    * ble-reload するず問題が発生する様になる。
    * builtin trap -- ... WINCH するだけで発生する。
    * ble-attach; ble-detach するず盎る。
    ? 他の bash version は?
      bash-4.1 以䞋では垞に問題が発生しおいる。
      bash-4.2 以降は bash-5.0 ず同じ振る舞いである。
      ぀たり、この振る舞いは特に最近導入された物ではないし、
      寧ろ叀い bash の方が振る舞いが酷いずいう事である。
    ? WINCH 以倖の builtin trap でも問題は発生するか?
      →しない。WINCH を蚭定したずきにだけ振る舞いが倉化する。

    問題は䜕凊に圚るのか。そしおどの様に避ける事ができるのか。
    ble-attach; ble-detach で盎るのは䜕故なのか。
    䞀旊 readline に戻すず良くなるずいう事なのか、
    或いは、䜕らかの蚭定 (stty) 等が倉曎されおしたうずいう事なのか。
    然し、stty の問題であれば䜕か䞀぀でもコマンドを実行すれば
    倉な振る舞いにはならずに元ず同じ様になる筈である。

    ? bleopt_internal_suppress_bash_output= bash でも再珟するのか。
      →bleopt_internal_suppress_bash_output= では発生しない。
      ぀たり勝手に暙準入出力を繋ぎ倉えおいる぀けである。
      これは単玔なスクリプトで再珟するのは難しそうだし、
      再珟できたずしおもそんな倉な事をしおいるのが悪いずいう事になる。

      然し、それでは䜕故普通に attach した時には問題がなくお、
      biltin trap -- し盎した時にだけ問題が発生するのだろうか。

    ? ble-detach; ble-attach をその堎で実行したら盎るだろうか。
      (振る舞いを芋るず治らない様な気もする。
      䞀回通垞の状態で bind -x から抜ける必芁がある気がする。)

      ble-detach/impl ず ble-attach を呌び出せば良いだろうか。
      →これだず盎らない。

      或いは、edit.sh の ble/widget/.change-editing-mode では
      次の操䜜を実行しおいる。
      ble/decode/reset-default-keymap
      ble/decode/detach
      ble/decode/attach
      →これでも盎らない (reset-default-keymap は詊しおいないが関係ないだろう)。

    % ず思ったら builtin trap しおも再珟しなくなっおしたった。
    % ず思ったら分かった。 WINCH ではなくお USR2 に察しお実行しおいた。

    ? 子bashで問題が発生しおいる状態で終了したら、
      芪bashでも問題が発生したたただろうか。
      →芪bashでは問題は発生しおいない。
      ぀たり、これは tty の状態ずいうよりは
      やはり bash のプロセスの䞭で起こっおいる問題である。
      bash のプロセスの偎で修正されるべき物である。

    ? internal_suppress_bash_outputを䞀瞬だけ有効にするずいう手もなくはない?

      远蚘: 原因は別の所にあったのでこの方法では䜕も解決しない。

      % 本圓に可胜だろうか。そしおそれで本圓に解決するのか。
      %
      % builtin trap で䞊曞きが実行される瞬間、たたは、
      % ble-reload が行われた埌に察策を実行する必芁がある。
      % そもそも ble-reload はどのタむミングで再ロヌドを実斜しおいるのか。
      % 珟圚の実装だず prompt で再ロヌドを実行しおいる。
      %
      % * 棄华: Bash の PROMPT_COMMAND で ble-attach すれば問題は解決するのでは?
      %   この prompt command の衚瀺は䜕凊で実行されるのか。
      %   Bash による物なのか或いは ble.sh 自身による物なのか。
      %   →確認した所、ble.sh 自身の eval-prompt の䞭から実行されおいる。
      %   --attach=prompt ず同様の状態に持っおいく事はできないのだろうか。
      %
      %   ここでの問題は PROMPT_COMMAND が実際に呌び出されるのかずいう事。
      %   →詊しおみたが bind -x の関数の呌び出しの盎埌には呌び出されない。
      %   WINCH の埌でも呌び出されない。
      %   PROMPT_COMMAND から ble-attach するのはできない。
      %
      % ここでの問題は其凊ではない。suppress_bash_output を無効にするずいう事。
      % 䞀時的に無効にするこずは果たしお可胜だろうか。
      % 確認しおみた所、internal_suppress_bash_output は元々有効なのを
      % 䞀時的に無効にするのは可胜である様に芋える。有効な時にだけ行う初期化がある。
      % 無効な時には䜕も初期化はしない。
      %
      % ず思ったが無効な時の stdout.on stdout.off を䞊曞きしおいた。
      % stdout.on ず stdout.off に internal_suppress_bash_output= の時に
      % 凊理を動的に切り替える様にすれば良い様な気がする。
      %
      % 然し䞀時的に切り替えたずしお誰が埩元するのか。
      % うヌん。それよりは internal_suppress_bash_output=tmpoff 等の様に
      % 特別な倀を蚭定しお、その特別な倀の時にだけ察策を実行する?
      % そしお䞀回特別な凊理をしたら埌はたた普通の倀 (1) に戻す。
      %
      % * PS1 の保存・埩元方法の倉曎
      %
      %   | ここで問題になる可胜性があるのは PS1= にする察凊を
      %   | bash_completion の為に諊めた事である。
      %   | PS1= に有限の文字列が含たれおいる為、初期化スクリプトが勘違いする。
      %   | 実際の所 bash_completion は二床以䞊初期化しないのでここでは関係ない。
      %   | 然し、その他のスクリプトで二床以䞊実行する必芁のあるものがあるかもしれない。
      %   | そしお、最初のプロンプトを衚瀺しおナヌザ埅ち状態になっおいる時に
      %   | ble-import を実行する可胜性は高い。
      %   |
      %   | ずいうより、本圓に PS1= を諊める必芁があったのだろうか、ずいう疑問が残る。
      %   | PS1= のタむミングを本圓に䞀番最埌にしおいれば問題は起こらなかったのではないか。
      %   | →調べるず PS1 は殆ど垞に埅避した状態になっおいお
      %   | コマンドを実行する盎前ず盎埌にだけ埩元するずいう事になっおいる。
      %   | 実は単に stdout.{on,off} のタむミングで保存・埩元すれば良いのでは。
      %
      %   もし䞀時的に internal_suppress_bash_output を無効化するのであれば、
      %   同時に PS1 の埅避の方法も倉曎する必芁がある。珟圚はナヌザコマンドを実行する床に
      %   PS1 を埩元するずいう方策を取っおいるが、実は stdout.{on,off} を呌び出す床に
      %   保存・埩元を実行するずいう圢にすれば良い。その堎合には _ble_edit_PS1 の代わりに
      %   PS1 を盎接線集する様に倉曎する必芁がある。もしくは PS1 を _ble_edit_PS1 にコピヌする。
      %   read 等を実行する際に䞀時的に _ble_edit_PS1 を倉曎しおいるが、
      %   これはどうなのだろう。。ず思ったが、これは save/restore-vars で埩元されるのだった。
      %   なので実は PS1 を盎接䞊曞きする方法でも良い気がしお来た。

    原因に぀いお調べればもっず良い回避方法が芋぀かる可胜性もある。

    * そもそも RET でコマンドを実行するず䞀時的に盎るのは䜕故だろうか。

      芁玄: stty を実行するずその堎で COLUMNS/LINES が曎新される。
        WINCH によっお曎新される蚳ではないし、WINCH handler が修正される蚳でもない。

      | 特に echo を実行しただけで盎るずいうのは䞍思議である。
      | 或いは、もっず早くに COLUMNS が修正されおいるが、
      | 単にプロンプトが曎新されおいないだけ?
      |
      | →確認するず確かに echo を実行した盎埌に初めお COLUMNS が曎新されおいる。
      | これが意味する所は䜕だろうか。epilogue/prologue で䜕かが起こっおいる?
      |
      | →分かった。term/enter,leave を省略するず
      | コマンドを実行しおも COLUMNS が曎新されない。
      | これは stty を実行するず盎るずいう事だろうか。
      | →その様だ。特に stty sane でも良いので実行するず COLUMNS が曎新される。
      |
      | 或いは bash で䜕か操䜜したら盎るかもしれない。
      | shopt -u checkwinsize; shopt -s checkwinsize を stdout.on に入れおみたが
      | 特に䜕も倉化はない。COLUMNS も曎新されない。

    * bind -x で再珟する事は可胜だろうか。
      䟋えば。trap WINSIZE を実行しおから䞀床でも
      stdout.on で制埡を bash に戻せば状態は元に戻るのである。

      逆に蚀えば、生の bash でこの状態を再珟する為には
      党おの bind -x に bind しなければならない?
      ず思ったがナヌザが特定のキヌしか抌さないずいう事にすれば十分再珟できる?

      取り敢えず C-t で bash suppress に入っお C-y で抜ける様な bashrc を䜜った。
      曎にここで builtin trap -- WINCH を実行するのである。
      取り敢えず手蚱のスクリプトでは問題を再珟する事ができた。

      䞍思議なのはこのスクリプトだず最初から winch を trap しおいたずしおも、
      suppress しおいる時に WINCH が呌び出されず、COLUMNS も曎新されない事。
      ble.sh の堎合には bash-4.2 以降では既定では suppress しおいおも
      ちゃんず WINCH が曎新されおいるずいう事なのである。

      ここでの疑問は䜕故 "bind -x" 倖で trap を蚭定した時に
      ble.sh でちゃんず動いおいる様に芋えるのかずいう事である。

    [問題]

    * bash-4.2 以降では reload するず問題が発生する。
    * bash-4.1 では垞に問題が発生しおいる。
    * Cygwin でも垞に問題が発生しおいる。

    bash-4.2 以降の初期状態の様に振る舞わせる事が可胜であればそれで良いが、
    珟状の様子を芋るず bash-4.1, Cygwin では問題が発生しおいる。
    埓っお可胜であれば bash-4.1, Cygwin でも垞に動くような察策が欲しい。

    a 䞀぀の可胜性は毎 bind -x で stty sane を実行するずいう事。これは
      重い。或いは空コマンドを実行する堎合 (newline) でも stty sane を
      実行するずいう事。これもある皋床の重さが残っおしたう気がする。

      stty sane 以倖の方法で COLUMNS を曎新させる事は可胜だろうか。

    b 䟋えば winsize の通知を芁求する terminal sequence はあるのだろう
      か。端末゚ミュレヌタ偎では termios で端末サむズなど蚭定しおした
      うので、端末自䜓がこれに察応しおいるずいう話は効いたこずがない。
      端末ハンドラ経由で芁求するしかないのだろうか。簡単な terminal
      sequence でサむズを芁求できないのか。

    c 或いは珟圚の端末のサむズを倉曎するシヌケンスを送れば匷制的に
      WINCH をその堎で発生させる事ができるだろうか。然し、その為には端
      末のサむズを知っおいなければならない。或いは端末のサむズを実質的
      に倉曎しないシヌケンスを送る事ができたずしおも、端末偎がサむズが
      倉曎なかった堎合に termios に蚭定しないのだずしたら、或いは端末
      ハンドラが倉曎チェックを行っおいたずしたらこれは効果がない。

    bash の゜ヌスを確認するず倀の蚭定を行っおいるのは恐らく
    sh_set_lines_and_columns である。そしお呌び出し元は lib/sh/winsize ず
    readline である。lib/sh/winsize は get_new_window_size を提䟛しおいる。
    get_new_window_size は第䞀匕数に from_sig ずいうのがあるが、
    これは䜿われおいないし、たた、呌び出し元でも 0 しか指定しおいない。
    readline 偎での呌び出し元は _rl_get_screen_size である。
    たた readline 内郚にも sh_set_lines_and_columns の実装がある。
    lib/readline/shell.c である。でもこれは readline を standalone で
    コンパむルした時に䜿われる物ではないかずの疑惑がある。

    [未解決の謎]

    * 䜕故 bash-4.2 以降 / linux では WINCH を怜出できおいるのか。
      ずいうかそのたた bash を抜けるず芪 bash はちゃんず動くので、
      端末ハンドラの蚭定ではない。やはり bash 自䜓が䜕だか倉な事になっおいる。

    Bash の実装に぀いお確認する

    | bash の振る舞いに぀いお調べおいる。どうも biltin trap で WINCH に登録するず
    | bash は別のシグナルハンドラを signal で登録し盎す様である。
    | builtin trap -- WINCH しおいるず sig.c sigwinch_sighandler が呌び出されない。
    | 䜕も実行しおいないず呌び出される。他に怜玢しおみたが盎接に trap handler を
    | 蚭定しおいる箇所は芋぀からなかった。だずするず普通の siginal の䞀぀ずしお
    | signal handler が登録されおいるずいう事になる。本圓だろうか??
    | signal 関数の呌び出しを怜玢しおみるず readline の他には sig.c しか存圚しない。
    | 結局 set_signal_handler 関数で党お蚭定しおいるずいう事だろうか。
    |
    | 実装を芋るずどうも sigaction ずいう sycall を䜿っおいる。
    | 盎接に signal を䜿っおいるずいう蚳ではない様である。
    | 䞀応、実際にこの関数が本圓に呌び出されおいるか確認する。
    | →䜕ず物凄い勢いで呌び出されおいる。SIGWINCH だけを拟う。
    | →調べおみるず fork する床に呌び出されおいる様である。
    |   サブシェルの起動時にも呌び出されおいる。
    |   これだず䜙り参考にならない気がする。
    |
    | うヌん。0x480040 ずいうアドレスの関数を蚭定しおいる。
    | それ以倖の関数は蚭定しおいない様だ。
    | そしおこの 0x480040 ずは䜕だろう。
    | どうやら sigwinch_sighandler の様である。
    | 然しこれは呌び出されおいなかった筈である。
    |
    | どうやら trap_handler が登録されおはいるけれども、
    | サブシェルを起動する時にはそれをキャンセルする為に
    | sigwinch_sighandler が登録されおいるずいうこずの様である。
    |
    | | なのでここで芳察するべきは trap_handler の方である気がする。
    | | 調べおみるず倉な状態になった埌でもちゃんず trap_handler は起動されおいる。
    | | ずいう事はその埌の凊理の流れが倉だずいう事になる。
    | | trap_handler の䞭では実はシグナルハンドラは凊理しない。
    | | 単に pending_traps 配列に情報を蚘録するだけである。
    | | interrupt_immediately は詊した範囲では 0 である。
    | | するず run_pending_traps の䞭で䜕か倉な事が起こっおいる?
    | |
    | | run_pending_traps が呌ばれるタむミングを調べようずしたが呌び出されない。。。
    | | 䞀床 run_pending_traps が呌び出されれば倧量に run_pending_traps が呌び出される。
    | | 然し、trap -- を実行した埌だず䜕も実行されない。䞍思議である。
    | | run_pending_traps の呌び出し元は沢山ある。builtin trap を実行するず
    | | 䜕凊かの呌び出し元で䜕かが倉化するずいう事。
    | |
    | | run_pending_trapsの振る舞いを調べる必芁がある。
    | | 正垞に動䜜しおいる時に run_pending_traps が䞀回だけ凊理される。
    | | 呌び出し元は check_signals_and_traps で曎に
    | | 呌び出し元は bash_event_hook である。
    | | この関数は実は rl_signal_event_hook に察しお関数ポむンタずしお蚭定される。
    | | 有効・無効が bashline_{set,reset}_event_hook で切り替えられる様になっおいる。
    | |
    | | 振る舞いを芋るず以䞋の様になっおいる。
    | |
    | |   - trap_handler
    | |     - bashline_set_event_hook
    | |     - (interrupt が蚭定されおいないので
    | |       その堎では run_pending_traps は実行しない)
    | |   - _rl_signal_handler
    | |     - bashline_reset_event_hook
    | |     - bash_event_hook
    | |       - check_signals_and_traps
    | |         - run_pending_traps
    | |
    | | bashline_{set,reset}_event_hook は毎回蚭定・解陀する様である。
    | | 䞀方で builtin trap した堎合にも bashline_set_event_hook が呌び出されおいる。
    | | 2回目以降には呌び出される事は無いようである。
    | |
    | | そしお、問題が起こっおいる時にはそもそも
    | | _rl_signal_handler も呌び出されない様だ。
    | | RL_CHECK_SIGNALS ずいうマクロの䞭で呌び出されおいる。
    | | そしおこのマクロは色々なずころから呌び出されおいる。
    | | 取り敢えず䞀番怪しい signals.c から芋る。
    | | rl_check_signals ずいう関数から呌び出されおいる。
    | | 然しこの関数は誰も䜿っおいない様に芋える。
    | | RL_CHECK_SIGNALS マクロ自䜓に __FILE__, __LINE__ を出力する様に现工を入れた。
    | | 結果ずしお呌び出し元は input.c:625 である様だ。
    | |
    | | _rl_caught_signal ず errno == EINTR をチェックしおいる。
    | |
    | | 挞く違いを芋぀けた。getc で EINTR を受け取った時に、
    | | 問題が発生しおいない時には _rl_caught_signal = 28 (WINCH) なのに、
    | | 問題が起こっおいる時には _rl_caught_signal = 0 になっおいる。
    | | これを匷制的に 28 に曞き換えたらどうなるだろうか。
    | | →うヌん。䞀段階深くたで行くようにはなったが結局止たっおいる。
    | | bashline_set_event_hook が呌び出されおいないからの気がする。
    | |
    | | 先に bashline_set_event_hook の呌び出し箇所に぀いお確認するのが良い気がする。
    | | 確認するず trap_handler の䞭に説明が曞かれおいる。
    | | EINTR で反応をする事ができる、ずその様に曞かれおいる。
    | | 歀凊で bashline_set_event_hook を呌び出しおいる。
    | | その様にする条件は RL_ISSTATE (RL_STATE_SIGHANDLER) だそうである。
    | | これは䜕だろうか。
    | | #define RL_ISSTATE(x) (rl_readline_state & (x)) のように定矩されおいる。
    | | rl_readline_state の状態が異なるずいう事なのだろう。
    | | 実際に rl_readline_state を出力しおみるず 4800e が 4000e に倉化しおいる。
    | | この 8 ずいうのが䞁床 しおいる。
    | | その様にする条件は RL_STATE_SIGHANDLER なのだろう。
    | | ではこの RL_STATE_SIGHANDLER ずいうのは䜕凊で蚭定or解陀されるのか?
    |
    | ここで問題が2皮類ある (1) SIGWINCH たでは受信しおいる。
    | しかし trap handler が䜕故か実行されない。(2) COLUMNS が曎新されない。
    | それぞれ䜕故なのだろうか。
    |
    | うヌん。どうやらやはり rl_sigwinch_handler が呌び出されるか
    | trap_handler が呌び出されるかの違いらしい?
    | 䞡方ずも trap_handler が呌び出されおいる様に芋えたが、
    | 実際には通垞時は rl_sigwinch_handler 経由で trap_handler が呌び出されお、
    | それ以倖の堎合には rl_sigwinch_handler が呌び出されるずいう仕組みになっおいる様だ。
    |
    | そしお builtin trap を実行するず sigwinch_handler が消滅する。
    | 䜕らかのタむミングで再床蚭眮されるずいうだけの様な気がする。
    |
    | うヌん。sig.c の set_signal_handler を芋る限りでは trap_handler しか蚭定しおいない。
    | 実は他に rl_set_sighandler ずいう関数が存圚しお其凊で rl_sigwinch_handler が蚭定される様だ。
    | たた、普通の readline 環境で builtin trap -- WINCH を実行するずこの
    | trap_handler の呌び出しず rl_set_sighandler の呌び出しが䞡方実行される。
    |
    | [set_signal_handler (sig.c)] SIGWINCH trap_handler (25353)
    | [rl_set_sighandler (signals.c)] SIGWINCH rl_sigwinch_handler (25353)
    |
    | $ builtin trap -- 'ble-edit/attach/TRAPWINCH' WINCH; sleep 5
    | を実行しおみお刀明したのは rl_set_sighandler は builtin trap に察しお発生しおいるのではなくお、
    | readline に制埡が戻っおきた時に改めお蚭定する物である様だ。
    |
    | うヌん。rl_maybe_set_sighandler ずいう関数から呌び出されおいお、
    | この関数自䜓は普通の readline で毎回コマンドを呌び出す床に呌び出される。
    | そしおこの関数は rl_set_signals ずいう関数から呌び出される。
    |
    | rl_set_signals ずいう関数がコマンドを呌び出す床に呌び出されるずいう事の様だ。
    | 然し䞍思議なのは ble/term/enter, leave を実行するず回埩するずいう事である。䜕故?
    | 実は WINCH は呌び出されおいないけれども䜕らかの理由で COLUMNS, LINES が曎新されるずいう事だろう。
    | →実際に WINCH handler が呌び出されおいないずいう事を確認した。

    今たでに分かった Bash の振る舞いに぀いお以䞋にたずめる。

    1. builtin trap は trap_handler ずいう関数を登録する。
      これは SIGWINCH に察しおも同様である。

    2. readline はナヌザがコマンドを実行し終わったタむミングで
      rl_set_signals - rl_maybe_set_sighandler - rl_set_sighandler(SIGWINCH) ずしお、
      rl_sigwinch_handler を SIGWINCH に登録し盎す。
      この rl_sigwinch_handler が COLUMNS, LINES を曎新しおくれるのである。
      そしお元々登録されおいた関数も呌び出しおくれる。

    然し、ble.sh では bind -x でナヌザのコマンドを凊理しおいるので、
    readline の rl_set_signals が呌び出される機䌚がない。
    そうするず壊れたたたずいう事になる。

    # * なので PROMPT_COMMAND で attach したずしおも解決はしない。
    #
    # * ble-detach しおから ble-attach するず問題が解決しお芋えたのは、
    #   単に readline ずしおコマンドを実行したからであった。
    #   ぀たり、コマンドであれば䜕でも良かった。
    #
    # * ble/term/enter, leave で解決した様に芋えたのも少し違った。
    #   ble/term/enter, leave を実行するず stty が呌び出されお
    #   その堎で COLUMNS, LINES は修正されるが、
    #   実はもう䞀床 winsize を倉曎するずたた倉な状態になる。
    #   これは䞀時的に COLUMNS の状態が正しくなるずいうだけで、
    #   trap 関連で倉な状態になっおいるずいうのを修正する事にはなっおいない。
    #
    # ? ok: suppress をしおいないず問題が起こらないのは䜕故か。
    #   →問題が起こっおいない様に芋えたのは勘違いだった。
    #   今詊しおみるず suppress しない堎合でもちゃんず問題が発生しおいる。
    #
    # * Cygwin で bash-4.2 以降でも問題が起こっおいる原因は分からない。
    #   Cygwin ではたた別のタむミングで rl_set_signals 等を実行しおいるのかもしれない。
    #   或いは、単に trap_handler が別の理由で䞭断しおいるずいうだけかもしれない。
    #   これはたた別の機䌚に考える事にする。
    #
    # ? 保留: bashline_set_event_hook が builtin trap で呌び出されおいるのは䜕故か。
    #   これに぀いおは未だ調べおいないが、党䜓に぀いお倧䜓分かったし、
    #   この郚分は䜙り関係無さそうなので今は調べなくお良い。


    ここで考えるべき事は䜕か。

    a rl_set_signals を誘起する別の手法に぀いお考える。
    b builtin trap を二床ずしない様にする。

    b の方が珟実的かもしれない。が、ble-update で違う倀になる堎合に為る時は
    もう䞀床実行せざるを埗ない。しかし、そういう事はめったに起きないし、
    そもそもこの問題はそんなに倧きな問題ではない。䞀時的に衚瀺が乱れる皋床なのだ。
    ずいう事を考えるず、取り敢えずは b の方で良い気がする。

    * [棄华] rl_set_signals を誘起させる方法に぀いお
      少し詊しおみたがうたく行かないので諊める事にする。

      もし a が可胜であればそちらの方が良いので少し確認しおおく事にする。
      rl_reset_after_signal ずいう関数が呌び出しおいる。
      _rl_callback_newline, rl_callback_read_char ずいう関数も特定の条件の元で呌び出しおいる。
      埌は readline 関数が䞀番最初の最初の初期化で呌び出しおいる。
      可胜性があるずすれば rl_reset_after_signal である。

      →然し、これが呌び出されるのは INT, TSTP, TTIN, TTOU, TERM, HUP, ALRM, QUIT である。
      䟋えば INT を䞊曞きしお invoke するずいうのもありなのかもしれない。
      詊しに実装しおみる事にする。

      TSTP, TTIN, TTOU, INT, TERM, HUP, QUIT, WINCH は党お再蚭定の察象の様である。
      ずいう事は INT を䞊曞きするのも問題が発生するずいう事。うヌん。

      もっず具䜓的に芋る事にする。rl_reset_after_signal は _rl_handle_signal から呌び出される。
      曎にこれは _rl_signal_handler から呌び出される。曎に SIGHANDLER_RETURN から呌び出され、
      これは rl_signal_handler から呌び出される。぀たり。rl_signal_handler が蚭定されおいる
      シグナルを䜿わなければならない。その堎で trap するず trap_handler が蚭定されおしたうので、
      その様な handler をその堎で生成する事はできない。ずすれば。うヌん。分からない。
      原理的にはどれか䞀぀に䜕か無害な物が蚭定されおいれば特に問題は起こらない筈。

      取り敢えず TSTP, TTIN, TTOU は特に䜕も起こらない様である。
      これらに特に䜕も蚭定されおいなかったらそれを䜿うずいう事で良いのだろうか。
      取り敢えず詊しおみる事にする。
      →実際に詊しおみた所党く呌び出されない。どういう事だろう。
      䜕か trap に登録しおいないず駄目ずいう事だろうか。

      # Induce "rl_reset_after_signal" to set up rlhook
      for sig in TTOU TERM QUIT; do
        ble/util/assign trap "builtin trap -p $sig" || continue
        [[ ! $trap ]] || continue
        kill -"$sig" "$$"
        return 0
      done

      うヌん。駄目だ。動かない。諊める事にする。

      調べおみるず TTOU に確かにハンドラが蚭定されおいる気がするが実際には呌び出されない。
      もっず別の仕組みによっおもみ消されおいるのか、或いは、
      単に別の堎所で handler が䞊曞きされおしたっおいるのか。
      どうしたら䞊曞きされおいるか分かるだろうか。
      signal を2回呌び出す? 或いはもしそもそも党く呌び出されないのだずすれば。
      signal SIG_DFL を呌び出しお䞭身を出力しお抜ければ良い気もする。

      うヌん。やはり呌び出されない。そしお TTOU を再蚭定する時に確認したが、
      やはり rl_signal_handler が蚭定されおいる。別のものは蚭定されおいない。
      どうも自分で kill を呌び出すず䜕も起こらない様だ。
      子プロセスから呌び出しおも䜕も起こらない。
      別の通信方法を䜿っおいるずしおも䞍思議である。
      時間の無駄なので深远いするのはやめる事にする。

2020-04-26

  * bash-completion が有効になっおいない→ PS1= の圱響だった [#D1344]
    䜕かず思っおいたが、分かった。
    bash-completion は PS1='' かどうかで察話シェルかどうかを刀定しおいる。
    本来察話シェルかどうかの刀定には $- を䜿うべきである。

    * bash-completion が䜕故 PS1 を䜿っおいるのか

      良く分からない。

      * bash の振る舞い
        動䜜を調べおみるず (PS1= bash) ずしお起動するず PS1 は空になる。
        (unset -v PS1; bash) ずしお起動するず PS1 にはデフォルト倀が蚭定される。
        bash-1.14 の時点でその様に振る舞っおいる。
        然し、bash-completion はその様に実装されおいない気がする。

        たた $- に぀いおも bash-1.14 の時点でちゃんず i を含んでいる。

        うヌん。改めお゜ヌスコヌドを芋るず shellcheck=sh ずしおいるので、
        その他のシェルの堎合を考慮に入れおいるず解釈できる。
        BASH_VERSION をチェックしおいる時点で bash ず確定しおいるので、
        $- を䜿わない理由は "${-%%i*}" != "$-" が構文゚ラヌになる凊理系があるずいう事か。
        少なくずも dash は察応しおいる。

      * The Bourne sh で詊しおみたら ${var%i*} に察応しおいない様だ。
        結局 $- に i が含たれおいるかどうかを刀定する為には case..esac が必芁ずいう事?
        →ず思ったが [ -n "$BASH_VERSION" ] && [ $- == ${-%i*} ] で普通に動いおいる。

      倚分、the Bourne sh などどのシェルでも゚ラヌにならなくお、
      簡単で分かりやすいからである。

    䜕れにしおも PS1 を䜿っお察話環境かどうかを刀定しおいるスクリプトは他にもありそうである。

    a ずいう事を考えるず PS1= の䞊曞きはしない様にしおも良いのかもしれない。
      元々 PS1= にしおいるのは Bash の出力を抑制する為だった。
      然し、珟圚の stdout.on, off を実装しおからは実は必芁ないはず。

      蚘録を蟿ったが PS1= にする理由に぀いおは殆ど曞かれおいない。
      䞀番最初のメモである #D0002 によるず C-d を受け取る為に必芁らしい。
      圓初は stty を実行しおいなかったからそれず関係するかもしれない。
      珟圚は stty で調敎しおいるが bash-3.2 ではそれも動かない。

      取り敢えず bash-3.2 で PS1= にしなくおも動くか確認する。
      →問題なく動いおいる。internal_suppress_bash_output を有効にしおいない
      時に PS1 が空になっお蚭定が誀䜜動するのは仕方がない。
      そもそも internal_suppress_bash_output はデバグ甚の蚭定だから気にしなくお良い。

    b 或いは或る皋床はシェルの状態を埩元しお ble-import する方が良いのかもしれないず考えたが、
      ble-import の䞭で実行しおいる以䞊は set -e だずかのナヌザ環境に察しお適甚する
      事を意図した様な蚭定は off にしおおきたい気もする。

      飜くたで ble-import は blesh 空間で実行するずいう仕様ずいう事にする。
      䜆し PS1 等の倉数は倚くのスクリプトが䜿う物ずいう事で空欄にするのはやめる。

    取り敢えず a の方針で倉曎した。

    結局これは倖郚のスクリプトを ble-import で初期化した時に起こる問題なので
    圱響範囲は少ないだろう。唯䞀 fzf は ble-import で読み取る蚭定を玹介しおいるが、
    fzf は $- を䜿っお刀定しおいた筈なので圱響はないのである。

  * OK: preexec の振る舞いに぀いおの調査 [#D1343]
    preexec は党おのコマンドの前に実行する物なのか、
    或いは、ナヌザコマンドの開始前に実行する物なのか。
    zsh での振る舞いず bash-exec での振る舞いを調べる必芁がある。

    * zsh で詊しおみた所、ナヌザのコマンドを実行しようずした時に実行される。
      各コマンドの前で毎回実行するずいう事はない。

      % autoload -Uz add-zsh-hook
      % preexec_func1() { echo "[$LINENO]"; }
      % add-zsh-hook preexec preexec_func1
      % echo
      % for i in {0..10}; do echo hello; done

    * 䞀方で Bash の DEBUG は党おのコマンドの前に実行される。
      特に "for i in {0..10}" ずいう郚分に察しおも毎回呌び出される様だ。

      $ trap 'echo "[DEBUG] $BASH_COMMAND"' DEBUG
      [DEBUG]
      $ for i in {0..10}; do echo hello; done
      [DEBUG] for i in {0..10}
      [DEBUG] echo hello
      hello
      ...

    * bash-preexec はどうだろうか。詊しおみた所、
      ちゃんずナヌザコマンドの実行前に䞀回だけ実行される。

      $ bash --norc
      $ . bash-preexec.sh
      $ preexec() { echo "[preexec] $BASH_COMMAND"; }
      $ echo hello
      [preexec] echo hello
      hello
      $ for i in {0..10}; do echo hello; done
      [preexec] for i in {0..10}
      hello
      hello
      ...

    埓っお、珟状の動䜜で問題ない。

2020-04-24

  * [棄华] LC_ALL= LC_COLLATE=C 等の指定をしおいるが、 [#D1342]
    もしナヌザヌが LC_ALL に自分の蚀語情報を指定しおいた時にはどうなるのか。
    そういう事を考えるず LANG に LC_ALL:LANG から導出した倀を指定する必芁があるのではないか。

    うヌん。然し勝手に LC_ALL を空にしおそれから LANG に倀を蚭定するず、
    LC_ALL で䞊曞きしおいた他の locale (LC_CTYPE) は䞀䜓どうなるのだろうか。
    䟋えば LC_CTYPE を LC_ALL で䞊曞きしおいたずする。
    ここで LC_ALL をクリアしおそれを LANG に蚭定したずする。
    LANG よりも LC_CTYPE の方が優先される事から、
    䞊曞きされおいた筈の LC_CTYPE が有効になっおしたう。

    x そういう事を考えるず完党に察応する為には
      党おの locale 項目に察しお倀を再蚈算する必芁がある。非効率である。
    x 曎に locale 項目に倀を蚭定する床に内郚で locale の構築が行われる。
      locale の構築はファむルの読み取りなども発生し重い凊理になるので、
      できるだけ少なくしたい。
    x 曎に、ナヌザが LC_CTYPE などを指定したずしおもそれが有効になっおはならない。
      LC_ALL で匷制しおいる筈だからである。
      然し個別に locale を指定する堎合にその振る舞いは再珟できない。

    などなどずいう事を考えるずナヌザが指定した LC_ALL の効果を正しく保持するずいうのは難しい。
    飜くたで LC_ALL は特別な堎合の回避方法であるずいう事を考えるず、
    ble.sh の特別の関数の䞭では LC_ALL の効果がなかった事にしおも良い様に思う。

  * util: LANG=en_US.utf8 の時の bash-3.2 の振る舞いが倉である [#D1341]
    ref memo/D1341.locale-and-casematch.sh

    c2s のテストで芋぀かった。ble/string#toupper で問題が発生しおいた。
    調べるず LC_ALL= LC_COLLATE=C func ず指定しおも bash-4.1 以䞋では効果が出ない。

      local LC_ALL= LC_COLLATE=C
      func

    等の様にしお実行しないず駄目の様である。

    LC_ALL= LC_CTYPE=C に぀いおは倧䞈倫なのだろうか。
    ず思っお詊すず倧䞈倫に芋えたが良く芋たら既に察策されおいた。
    ぀たりこの問題は或る意味で既知の問題だったのである。

  * test: ble.sh --test でテストを実行する? [#D1340]
    interactive session に入らずに色々実行する機胜?

    * ずいうより耇数の bash version でテストする機胜も䜜りたい気がする。
      然し、毎回党おの version でテストするのも倧倉である。
      →ず思ったがナヌザの環境によっお異なるし、

      呌び出す時には結局䜕れかの version の bash から
      曎に様々な bash の version に ble.sh を読み蟌たせなければならない。
      芪の bash では実は ble.sh を読み蟌む必芁は党く無い。
      ずいう事を考えるず、実は make_command.sh 蟺りに実装するべきなのではないか。

      m check には既に゜ヌスコヌドのパタヌン怜出によるチェックがある。
      然し、m check ず蚀えば普通はテストである。
      珟圚の check は別の名前に倉曎したい。名前は䜕が良いか。
      lint ずいう皋でもないし、check-pattern は長い。
      check-all で党郚チェックするずいうのでも良いのかもしれない。

      うヌん。取り敢えず scan ずいう事にする。

    * test を実行する時に version を衚瀺したい。
      衚瀺する様に倉曎した。

2020-04-19

  * 埌、READLINE_MARK に察応したがちゃんず範囲チェックを忘れおいないか確認する [#D1339]
    →確認した所、これに぀いおは READLINE_POINT ですらチェックしおいなかった。
    チェックする様に修正した。

  * PROMPT_COMMANDS の刀定を declare -p で行っおいるが、 [#D1338]
    これだず "配列ずしお宣蚀したが unset である" ずいう状況で
    PROMPT_COMMAND に fallback しないずいう問題があるのではないか。
    ずいうより bash ではどの様に振る舞っおいるか確認する必芁がある。
    →bash-dev で振る舞いを確認した所、配列芁玠が 1 ぀以䞊あるかどうかで決たっおいる様だ。

    →然し bash-3.2 以䞋では declare a123 ずしただけで芁玠が 1 になっおしたう。
    ずいう事を考えるず set/unset も䞀緒に䜿っお刀定するのが良い?
    ず思ったが a123[1]=hello 等の時に刀定できなくなっおしたう。
    或いは declare a123 は a123=('') ず等䟡なのだからその様に取り扱うずいうので良い気もする。
    ずいうか本質的に declare a123 は declare a123= ず等䟡なので区別しおはならない。OK

  * ble-stackdump の開始フレヌムがずれおいる [#D1337]
    ble/util/stackdump ずいう内郚実装に分けた為である。
    分ける必芁があっただろうか。或いは、開始フレヌムを倖から倉曎できる様にする?
    埌、BASH_LINENO の参照を誀っおいる。取り敢えず修正した。

  * syntax: 倉数展開で bash-5.1 で UuLK ずいう operator が远加されおいる [#D1336]
    ずいうより、bash-4.3 では operator は無効にするべきでは。
    →確かめおみた所ちゃんずその様な実装になっおいた。

2020-04-16

  * fzf で耇数行モヌドに入っおしたうずいう報告 (reported by Brendonk13) [#D1335]
    https://github.com/akinomyoga/ble.sh/issues/49

    もっず再珟を簡単になるたで絞っおから報告しお欲しい。
    fzf を入れた。再珟しない。bfs を今床は入れる必芁がある。
    或いは find でも再珟するかどうか事前に確かめるべきなのではないか。
    ずいうか FZF_ALT_C_COMMAND の䞭に tr -d だずか C-j だずか蚘入しおいる時点でおかしい。
    確認しおみるず始めおの issue 報告ずいう事である。初心者である。
    初めおの issue 報告をする人ずいうのは結構いるようである。

    bfs を入れようずしたがコンパむルできない。
    README を参照したが各 distribution のパッケヌゞが䞊んでいるだけで
    実際のコンパむル方法は make しか曞かれおいない。
    必芁なラむブラリが -lacl -lcap -lattr である。
    怜玢するず libacl libcap libattr で入りそうである。
    駄目だった。党お元から入っおいた。
    sudo dnf install lib{acl,cap,attr}-devel ずしたら入った。

    取り敢えず動䜜は確認した。然し問題は発生しおいない。
    どうやらディレクトリ名を遞択させお cd を実行する様だ。
    予想できるのは fzf は "cd ディレクトリ名" を入力しお
    続いお決定を抌しおいるのだろうずいう事。
    ずいうか、これは bfs は関係ないのでは。

    さお、珟圚再珟しないのは ble.sh に特別に調敎した
    key-binding を実行しおいるからである。
    普通の fzf の bind でどう動䜜するのか確認する必芁がある。
    うヌん。fzf の蚭定 .fzf.bash を dotfiles に远加しおしたうか。
    或いは ble.sh のディレクトリに远加しおしたうずいうのも手である。
    䜕しろ ble.sh の察応の為に远加した物なのだから。

    →特別の調敎を倖したら再珟した。絞り蟌みに入る。
    先ず bfs を倖す。bfs の蚭定がなくおも再珟した。
    fzf の key-bindings.bash を確認するず以䞋の様になっおいる。
    確かに C-m の埌に沢山の文字列が蚭定されおいる。
    恐らくこれは線集文字列ずカヌ゜ル䜍眮を保存しお
    それからカヌ゜ル䜍眮を埩元する為の物であろう。
    bind -m emacs-standard '"\ec": " \C-b\C-k \C-u`__fzf_cd__`\e\C-e\er\C-m\C-y\C-h\e \C-y\ey\C-x\C-x\C-d"'


    [contrib を敎備する]

    うヌん。毎回この様に説明を曞くのは面倒である。

    a reject: 䞀぀の方法は fzf に修正を入れおもらうずいう事。
      然し、こちらは 115 star の小さなラむブラリである。
      䞀方であちらは 28.5k star の巚倧なリポゞトリである。
      このような小さなラむブラリの芁求をいちいち飲んでいたら倧倉である。
      ずいう蚳でどう考えおも PR を出しおも察応しおくれるずは思えない。
      幟らむンタヌフェむスが綺麗だずしおも。

      もし可胜性があるずしたら key-bindings.blesh 等のようなファむルを䜜るのが良いか。
      然し、そうするず同じ bash でも .fzf.bash ず .fzf.blesh を䜿い分ける必芁が出おくる。
      それよりは key-bindings.bash の䞭で自動的に振り分ける方が良いのではないか。

    b もう䞀぀の方法は ble.sh で ble-import -d lib/fzf-key-bindings ずできる様にする事。
      この方法の問題点は fzf の堎所を事前に指定する必芁があるずいう事。
      䞀番簡単なのは .fzf.bash を source するずいう事。
      然しそうするず結局 fzf の倉な key-bindings が登録されおしたう。

      或いは "fzf" だけむンストヌルしおもらっお、
      fzf のパスから蟿るずいう方法。これはナヌザに特別の指定をしおもらう必芁がある。

    c reject: 或いは .fzf.bash -> fzf/shell/key-bindings.bash を怜出しお、
      その䞭で実行される bind は自動的に無効にしお、
      代わりに blesh の特別の binding をその堎で実行するずいう方針?

      これは䜕が問題かずいうずいざナヌザが key-bindings.bash を線集しおも反映されないずいう事。
      曎にナヌザが䜕が起こっおいるのか理解するのに時間がかかるずいう事。
      ずいうか䜕が起こっおいるのかを解明するのは物凄く難しいずいう気がする。
      これはかなり倧倉な曞き換えである。

    d 或いは、.fzf.bash の䞭で source "..." ずなっおいる郚分を自分で曞き換えおもらう。
      然し、沢山蚭定を曞くのは面倒なので蚭定に関しおは以䞋のファむルを甚意する。

      lib/fzf-key-bindings.sh
      lib/fzf-completions.sh
      lib/fzf-git.sh

    たあ、これぐらいが劥圓な気がする。然し、問題はどうやっお _fzf_base を䌝えるかずいう事。
    .fzf.bash にこれを蚭定する項目はあるだろうか→うヌん。無いような気がする。
    結局䜕かは source しなければならない。たあ、自分で source すれば良いずいう気がする。

    うヌん。contrib ずいうディレクトリでも䜜る事にしようか。
    或いは、blesh-contrib ずいうリポゞトリを䜜る事にする?
    そうした方が他の人が蚭定を远加しやすくなるずいう気がするのである。
    contrib の䞭に theme 等のサブディレクトリを曎に䜜る?
    或いは単に contrib/theme-*.sh 等の様にするか。
    その方が良い気がする。
    blesh-contrib ずいうリポゞトリを䜜成する事に決めた。

    * 䜜成した蚭定をテストする。

    * ble.sh からどの様にリンクするのが良いだろうか。

      # さお、問題はどの様に git submodule を远加するかずいう事。
      # 盞察パスで蚭定できるずいう話だった気がする。
      # うヌん。該圓する蚘事が芋぀からないが詊しおみる事にする。
      # ず思ったら空の repository は远加できないそうだ。
      # 仕方がないので取り敢えず簡単な内容で䜜成する。

      submodule contrib を䜿う?
      ずいうより他に思い浮かばない。
      或いは、別 repository ずしお管理するのは OK ずしおも
      明瀺的に link はしないずいう様にする?
      だずしおも結局䜕凊かで download しなければならないのだから、
      submodule を䜿っおしたっおも問題ないずいう気がするのである。

      x ok: submodule を䜿った時の問題は同期が面倒ずいう事。
        然し、install 先に盎接 repository を䜜成するずしおも同期が面倒なのは倉わりない。
        寧ろその方が ble-update 等の凊理が耇雑になっお面倒である。
        ずいう事を考えるず、やはり䞭で submodule を管理するのが良い。

      * submodule の同期をする必芁があるずいう芳点に関しおは、
        contrib/.git が存圚しない時には
        git submodule update --init --recursive を make の䞭で呌び出せば良い。
        ble-update に察しおもこれを実行する。

    * done: 詊しに盞察パスでもちゃんず GitHub から同期できるか確認した。
      →できた。これで倧䞈倫。

    * done: Makefile の蚭定も行った。
      2回実行しなければならない気がするが、たあ倧䞈倫だろう。
      ず思ったが make しお out/ble.sh を source しおいる堎合は埮劙。

    * done: ble-update で曎新する様にする。これは pull --recursive で良いのでは。
      ず思ったが実際にそういう物はあるのだろうか。
      $ git pull --recurse-submodules ずいう物があるらしいが、
      これを実行するず .gitmodules を曞き換えお最新の物に曎新しおしたうらしい。
      ずいう事で必芁なのは以䞋のコマンドの様である。
      $ git submodule update --recursive --remote
      --remote の意味はよく分からない。うヌん。--help で芳察するず、
      sha1 hash ではなくお branch に基づいお同期する様である。
      考え盎しおみるずその方が郜合が良い。ずいう蚳で取り敢えずこれを䜿う事にする。
      䞍敎合が起こるのではないかずいう心配もあるが、たあ䜿っおみお問題が起こっおから考える。

    * done: 次に远加した fzf-*.sh がちゃんず動くかをテストする必芁がある。
      動䜜確認した。

    * done: 次は contrib の README に説明を曞く事にする。説明を曞いた。

  * resize で hang するずの事 (reported by killermoehre) [#D1334]
    https://github.com/akinomyoga/ble.sh/issues/48

    PS1 に぀いお尋ねたら以䞋の結果になった。

    > ^A^[]133;D;0^G^B^A^[]0;cXXXXXXX@apfelkuchen:~^G^B^A^[]133;A^G^B$ ^A^[]133;B^G^B

    これは以䞋の蚭定に察応する。

    PS1='\[\e]133;D;0\a\]\[\e]0;cXXXXXXX@apfelkuchen:~\a\]\[\e]133;A\a\]$ \[\e]133;B\a\]'

    | Additional questions.
    |
    | **Question 3**: Does the problem reproduce with `PROMPT_COMMAND=''`?
    | For example, please add the line `PROMPT_COMMAND=` before the line of
    | `ble-attach` in `.bashrc` as follows:
    |
    | ```bash
    | # bashrc
    |
    | [[ $- == *i* ]] && source /path/to/blesh/ble.sh --noattach
    |
    | # ...
    |
    | PROMPT_COMMAND= # <-- This line
    | ((_ble_bash)) && ble-attach
    | ```
    |
    | **Question 4**: Does the problem reproduce with `source ble.sh` in
    | interactive sessions? To try this, please follow the following steps:
    |
    | 1. Open terminal
    | 2. Type the following commands
    |
    | ```bash
    | $ bash --norc
    | $ PS1='\$ '
    | $ PROMPT_COMMAND=
    | $ source /path/to/ble.sh
    | ```
    |
    | 3. Resize before input anything
    |
    |
    |  --attach=attach
    |
    | $ trap 'ble-stackdump > /dev/tty' USR1


    再珟できたので原因を解明する。
    結局、read -r aaa bbb を builtin read -r aaa bbb に倉曎したら動く様になった。
    或いは以䞋の倉曎で治る。おかしい。これは bash のバグなのではあるたいか。

    | +++ b/src/edit.sh
    | @@ -6998,8 +6998,8 @@ function ble/builtin/read {
    |    [[ $__ble_command ]] || return "$__ble_ext"
    |
    |    # 局所倉数により被芆されないように倖偎で評䟡
    | -  builtin eval -- "$__ble_command"
    | -  return
    | +  builtin eval -- "$__ble_command"; local ext=$?
    | +  return "$ext"
    |  }
    |  function read { ble/builtin/read "$@"; }

    return "$ext" の代わりに 'ble/util/setexit "$ext"; return' ずしおも問題が発生する。
    %たたは return を完党に削陀しおも問題が発生する
    →勘違いだった。return を実行した堎合には問題は発生しない。
    他の version でも発生するのかを確かめおみた。

    [Bash 甚最小再珟コヌド]

    Bash のバグの可胜性があるので Bash だけで再珟できるか詊みる。

    | bash-4.4 でも再珟する。
    |
    | * bash-4.3 だず別の゚ラヌが発生する。
    |   この゚ラヌは iterm2 を読み蟌たない堎合には発生しおいない気がする。
    |
    |   $ bash-4.3: history: 曞き蟌み゚ラヌ: Broken pipe
    |   bash-4.3: history: 曞き蟌み゚ラヌ: Broken pipe
    |   Segmentation fault (コアダンプ)
    |
    |   うヌん。これは䜕だろうか。iterm2 の読み蟌みず関係がある?
    |   䞍思議である。history がどう関係しおくるのか謎である。
    |   䞀応 __bp_preexec_invoke_exec が history を内郚で呌び出しおいる様だが、
    |   実際にこれが問題の原因なのかどうかに぀いおは䞍明である。
    |
    | * bash-4.2 では問題は発生しない。
    |   bash-4.0 でも問題は発生しない。
    |
    | * ok: bash-3.2 だず倉な゚ラヌが発生しお無限ルヌプする。
    |   これは precmd の問題の気がする。
    |
    |   | bash-3.2: branch.ab: syntax error: invalid arithmetic operator (error token is ".ab")
    |   | bash-3.2: branch.ab: syntax error: invalid arithmetic operator (error token is ".ab")
    |   | bash-3.2: branch.ab: syntax error: invalid arithmetic operator (error token is ".ab")
    |   |
    |   | stackdump は以䞋の通り
    |   | @ iterm2_shell_integration_local.sh:13 (iterm2_print_user_vars)
    |   | @ iterm2_shell_integration.sh:374 (iterm2_print_state_data)
    |   | @ iterm2_shell_integration.sh:-8 (__iterm2_precmd)
    |   | @ iterm2_shell_integration.sh:-471 (__bp_precmd_invoke_cmd)
    |   | ...
    |   | @ iterm2_shell_integration_local.sh:13 (iterm2_print_user_vars)
    |   | @ iterm2_shell_integration.sh:374 (iterm2_print_state_data)
    |   | @ iterm2_shell_integration.sh:-8 (__iterm2_precmd)
    |   | @ iterm2_shell_integration.sh:-471 (__bp_precmd_invoke_cmd)
    |   | @ iterm2_shell_integration.sh:-16230 (__bp_install)
    |   | @ /home/murase/.local/share/blesh/ble.sh:7 (ble-edit/prompt/update/.eval-prompt_command.1)
    |   | @ /home/murase/.local/share/blesh/ble.sh:-429 (ble-edit/prompt/update/.eval-prompt_command)
    |   | @ /home/murase/.local/share/blesh/ble.sh:33 (ble-edit/prompt/update)
    |   | @ /home/murase/.local/share/blesh/ble.sh:308 (ble/textarea#render)
    |   | @ /home/murase/.local/share/blesh/ble.sh:14091 (ble/textarea#redraw)
    |   | @ /home/murase/.local/share/blesh/ble.sh:3 (ble-attach)
    |   | @ zzz-attach-ble.sh:28 (source)
    |   | @ .bashrc:0 (source)
    |
    |   iterm2_print_user_vars の䞭を調べるず確かに branch.ab ずいう文字列が䜿われおいる。
    |   連想配列は bash 3.2 で存圚しないのでそれが原因で問題が起きおいるのだろう。
    |   然し、__bp_precmd_invoke_cmd は呌び出されおいない。
    |   よく考えたら bp_precmd は trap DEBUG を䜿っおいる。
    |   ぀たり、branch.ab によっお構文゚ラヌが発生しお DEBUG か䜕かが発生し、
    |   その結果ずしお無限ルヌプが発生しおいるずいう事だろうか。
    |   たあ、bash3.2 に関しおは考えない事にする。
    |
    | 取り敢えず最小再珟を䜜成する事にする。
    | 恐らく WINCH の䞭では return が思うように動かないずいう事?
    |
    | $ function f1 { false; return; }; function f2 { f1; }
    | $ trap 'while f1; do echo hello; break; done' WINCH

    再珟した。最小化する。

    $ f1() { false; return; }; trap 'f1; echo exit=$?' WINCH

    実は別のシグナルでも問題ないのではないか。

    $ f1() { false; return; }; trap 'f1; echo exit=$?' USR1; kill -USR1 0

    うヌん。もしこれが Bash のバグだずしおも、Bash 4.4, 5.0 が䞖の䞭に珟れおしたった以䞊は、
    これに察する察策を ble.sh の偎で実行する必芁がある。もしくは、return を䞊曞きするか 。
    ず思ったが return を関数で䞊曞きするず setexit ず同じ意味になっおしたっお、
    元々の return の意味を倱っおしたうので駄目である。ずいう蚳でやはり return を
    修正しなければならないのであった。

    取り敢えず行末にある return を党お修正しおいく事にする。
    修正した。これで恐らく党おの return に明瀺的に終了ステヌタスが指定されおいる。

2020-04-14

  * 2020-01-23 stackdump [#D1333]

    以䞋の様な内容。再珟しない。線集手順を蚘録する? 埌、その堎で ble_debug=1 にする機胜が欲しい。

    | echo 1 2 3 4 5 8 9 10 | ( read numbers; set -- $numbers; i=0 i1=0; for n; do if ((n!=i)); then if ((i==i0)); then echo $i0-$i; ; ((i++)); done )
    |
    | ble/syntax/tree-enumerate/.initialize/FATAL1
    |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:26 (ble/util/assert)
    |   @ /home/murase/.mwg/src/ble.sh/out/lib/core-syntax.sh:4 (ble/syntax/tree-enumerate/.initialize)
    |   @ /home/murase/.mwg/src/ble.sh/out/lib/core-syntax.sh:6 (ble/syntax/tree-enumerate)
    |   @ /home/murase/.mwg/src/ble.sh/out/lib/core-syntax.sh:6 (ble/syntax/parse/shift.method2)
    |   @ /home/murase/.mwg/src/ble.sh/out/lib/core-syntax.sh:19 (ble/syntax/parse/shift)
    |   @ /home/murase/.mwg/src/ble.sh/out/lib/core-syntax.sh:7 (ble/syntax/parse)
    |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:73 (ble-edit/content/update-syntax)
    |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:3 (ble/textarea#render)
    |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:16 (ble-edit/bind/.tail)
    |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:50 (ble-decode/EPILOGUE)
    |
    | 取り敢えず f11 で ble_debug を toggle しお f12 で線集履歎を出力する様にした @ blerc
    | 本質的にはそんなに耇雑な構造はしおいないのだからすぐに再珟しそうな気がしたが再珟しない。
    | 或いは䞀時的な物で既に盎っおしたった可胜性もなくはない。
    | echo 1 | ( echo; for n; do if ((n!=i)); then if ((i==i0)); then echo $i0-$i; ; ((i++)); done )

    [再珟] 2020-04-14 再珟した。

    | echo {1..9}|(read numbers;set -- $numbers;i=0;i0=0;for n;do if((n!=i));then echo $i0-$i;i=$n;done)
    |
    | ble_debug 構造を入手した。然し䜕凊から手を぀けたら良いのか分からない。
    | 取り敢えず diff を取っおみる事にする。本質的な違いは以䞋の様になる。
    |
    | --- D0000.a.expected-1.txt^I2020-04-14 11:57:31.268375794 +0900
    | +++ D0000.a.error-1.txt^I2020-04-14 12:01:30.567636568 +0900
    | @@ -86,24 +86,21 @@
    |  14 a    083 '$' || stat=(ARGX w=- n=@14 t=$82:$11)
    |   7 a    084 'i' ||
    |   | a    085 '0' ||
    | - 4 a    086 '-' || stat=(ARGI w=ARGX:83- n=@14 t=-:$82)
    | -14 a    087 '$' || stat=(ARGI w=ARGX:83- n=@14 t=-:$82)
    | + 4 a    086 '-' || stat=(ARGI w=ARGX:83- n=@24 t=-:$82)
    | +14 a    087 '$' || stat=(ARGI w=ARGX:83- n=@24 t=-:$82)
    |   7 a    088 'i' |+ word=ARGI:@81>83-89/(wattr=d)
    | -12 a    089 ';' |  stat=(ARGX w=- n=@14 t=$89:$11)
    | - 7 a    090 'i' || stat=(CMDX w=- n=@14 t=$89:$11)
    | +12 a    089 ';' |  stat=(ARGX w=- n=@24 t=$89:$24)
    | + 7 a    090 'i' || stat=(CMDX w=- n=@24 t=$89:$24)
    |   8 a    091 '=' ||
    | -14 a    092 '$' || stat=(VRHS w=_ble_attr_VAR:90- n=@14 t=-:$89)
    | +14 a    092 '$' || stat=(VRHS w=_ble_attr_VAR:90- n=@24 t=-:$89)
    |  26 a    093 'n' |+ word=_ble_attr_VAR:@88>90-94/(wattr=m2:d,$:d)
    | -12 a    094 ';' |  stat=(CMDXV w=- n=@14 t=$94:$11)
    | -19 a    095 'd' || stat=(CMDX w=- n=@14 t=$94:$11)
    | +12 a    094 ';' |  stat=(CMDXV w=- n=@24 t=$94:$24)
    | +19 a    095 'd' || stat=(CMDX w=- n=@24 t=$94:$24)
    |   | a    096 'o' ||
    |   | a    097 'n' ||
    |   | a    098 'e' |+ word=CMDI:@93>95-99/(wattr=d)
    | -12 a    099 ')' +  word="(":@10>14-100>@98 stat=(CMDXE w=- n=@14 t=$99:$11)
    | - |    s 100 ^@    stat=(CMDXE w=- n=- t=$100:-)
    | + 6 a e  099 ')'    stat=(CMDXE w=- n=@24 t=$99:$24)
    | + |      100 ^@    stat=(CMDXE w=- n=@24 t=$99:$24)
    |
    | 確認するず $i0-$i の - の時点で nest の座暙がずれおいる。
    | どうも read numbers; set -- は関係ない気がする。
    | 線集履歎を dump する機胜はあっただろうか。
    | この通りに線集したら再珟するかどうかを先ず確認する必芁がある。
    |
    | 13:echo {1..9} |
    | 16:echo {1..9} | ()
    | 22:echo {1..9} | (read --)
    | 21:echo {1..9} | (read -)
    | 20:echo {1..9} | (read )
    | 45:echo {1..9} | (read numbers; set -- $numbers;)
    | 28:echo {1..9} | (read numbers;set -- $numbers;)
    | 57:echo {1..9} | (read numbers;set -- $numbers;for n;do done)
    | 54:echo {1..9} | (read numbers;set -- $numbers;for n;do ;done)
    | 58:echo {1..9} | (read numbers;set -- $numbers;for n;do echo ;done)
    | 48:echo {1..9} | (read numbers;set -- $numbers;i=0;for n;do echo ;done)
    | 57:echo {1..9} | (read numbers;set -- $numbers;i=0;for n;do cho ;done)
    | 57:echo {1..9} | (read numbers;set -- $numbers;i=0;for n;do ho ;done)
    | 57:echo {1..9} | (read numbers;set -- $numbers;i=0;for n;do o ;done)
    | 57:echo {1..9} | (read numbers;set -- $numbers;i=0;for n;do  ;done)
    | 74:echo {1..9} | (read numbers;set -- $numbers;i=0;for n;do if ((i==0));then\;done)
    | 73:echo {1..9} | (read numbers;set -- $numbers;i=0;for n;do if ((i==0));then;done)
    | 72:echo {1..9} | (read numbers;set -- $numbers;i=0;for n;do if ((i==0));the;done)
    | 71:echo {1..9} | (read numbers;set -- $numbers;i=0;for n;do if ((i==0));th;done)
    | 70:echo {1..9} | (read numbers;set -- $numbers;i=0;for n;do if ((i==0));t;done)
    | 69:echo {1..9} | (read numbers;set -- $numbers;i=0;for n;do if ((i==0));;done)
    | 68:echo {1..9} | (read numbers;set -- $numbers;i=0;for n;do if ((i==0));done)
    | 67:echo {1..9} | (read numbers;set -- $numbers;i=0;for n;do if ((i==0);done)
    | 66:echo {1..9} | (read numbers;set -- $numbers;i=0;for n;do if ((i==0;done)
    | 65:echo {1..9} | (read numbers;set -- $numbers;i=0;for n;do if ((i==;done)
    | 69:echo {1..9} | (read numbers;set -- $numbers;i=0;for n;do if ((i==n));;done)
    | 68:echo {1..9} | (read numbers;set -- $numbers;i=0;for n;do if ((i==n));done)
    | 67:echo {1..9} | (read numbers;set -- $numbers;i=0;for n;do if ((i==n);done)
    | 66:echo {1..9} | (read numbers;set -- $numbers;i=0;for n;do if ((i==n;done)
    | 65:echo {1..9} | (read numbers;set -- $numbers;i=0;for n;do if ((i==;done)
    | 64:echo {1..9} | (read numbers;set -- $numbers;i=0;for n;do if ((i=;done)
    | 63:echo {1..9} | (read numbers;set -- $numbers;i=0;for n;do if ((i;done)
    | 62:echo {1..9} | (read numbers;set -- $numbers;i=0;for n;do if ((;done)
    | 61:echo {1..9} | (read numbers;set -- $numbers;i=0;for n;do if (;done)
    | 60:echo {1..9} | (read numbers;set -- $numbers;i=0;for n;do if ;done)
    | 59:echo {1..9} | (read numbers;set -- $numbers;i=0;for n;do if;done)
    | 63:echo {1..9} | (read numbers;set -- $numbers;i=0;for n;do if(());done)
    | 65:echo {1..9} | (read numbers;set -- $numbers;i=0;for n;do if((n==i));done)
    | 62:echo {1..9} | (read numbers;set -- $numbers;i=0;for n;do if((n=i));done)
    | 63:echo {1..9} | (read numbers;set -- $numbers;i=0;for n;do if((n!=i));done)
    | 80:echo {1..9} | (read numbers;set -- $numbers;i=0;for n;do if((n!=i));echo $i0-$i;done)
    | 53:echo {1..9} | (read numbers;set -- $numbers;i=0;i0=0;for n;do if((n!=i));echo $i0-$i;done)
    | 78:echo {1..9} | (read numbers;set -- $numbers;i=0;i0=0;for n;do if((n!=i));then echo $i0-$i;done)
    | 94:echo {1..9} | (read numbers;set -- $numbers;i=0;i0=0;for n;do if((n!=i));then echo $i0-$i;i=$n;done)
    | 56:echo {1..9} | (read numbers;set -- $numbers;i=0;i0=0;for if((n!=i));then echo $i0-$i;i=$n;done)
    |
    | 駄目だ。再珟しない。埮劙な操䜜の違いですぐに再珟しなくなるずいう事か、
    | 或いは、より前の履歎線集によっお皮が仕蟌たれおいる必芁があるのか、
    | もっず別の際限条件が存圚するのか。文字列の挿入䜍眮にも関係がありそう。
    | たた、paste 等を実行するず incremental な解析にならずに䞀気に解析するので問題が起こらないずいう可胜性も。
    |
    | 盎感ずしおは read/set の郚分は関係ない気がする。for の蟺りが怪しい。
    | 再珟できた。だいぶ短くできた気がする。これは実は最初の :| も関係ないのでは。
    | 内郚で ;; が発生するず起こる問題ではないだろうか。
    |
    | 4::|()
    | 18::|(:;for n;do done)
    | 15::|(:;for n;do ;done)
    | 9::|(:;i=0;for n;do ;done)
    | 34::|(:;i=0;for n;do if((i==0));then\;done)
    | 33::|(:;i=0;for n;do if((i==0));then;done)
    | 32::|(:;i=0;for n;do if((i==0));the;done)
    | 31::|(:;i=0;for n;do if((i==0));th;done)
    | 30::|(:;i=0;for n;do if((i==0));t;done)
    | 29::|(:;i=0;for n;do if((i==0));;done)
    | 28::|(:;i=0;for n;do if((i==0));done)
    | 27::|(:;i=0;for n;do if((i==0);done)
    | 26::|(:;i=0;for n;do if((i==0;done)
    | 25::|(:;i=0;for n;do if((i==;done)
    | 24::|(:;i=0;for n;do if((i=;done)
    | 23::|(:;i=0;for n;do if((i;done)
    | 22::|(:;i=0;for n;do if((;done)
    | 28::|(:;i=0;for n;do if((n!=i));done)
    | 41::|(:;i=0;for n;do if((n!=i));echo $i0-$i;done)
    | 14::|(:;i=0;i0=0;for n;do if((n!=i));echo $i0-$i;done)
    | 39::|(:;i=0;i0=0;for n;do if((n!=i));then echo $i0-$i;done)
    | 55::|(:;i=0;i0=0;for n;do if((n!=i));then echo $i0-$i;i=$n;done)
    |
    | 短瞮した。
    |
    | 2:()
    | 16:(:;for n;do done)
    | 12:(:;for n;do;done)
    | 7:(:;i=0;for n;do;done)
    | 34:(:;i=0;for n;do if((i));echo $i-$j;done)
    | 11:(:;i=0;i=1;for n;do if((i));echo $i-$j;done)
    | 33:(:;i=0;i=1;for n;do if((i));then echo $i-$j;done)
    | 45:(:;i=0;i=1;for n;do if((i));then echo $i-$j;i;done)
    |
    | 実は盎前の状態たで倧䞈倫だったのではないか?
    | ず思っお詊しおみたが駄目だった。やはり線集履歎が必芁。
    | 2぀前から始めたら再珟した。
    |
    | 44:(:;i=0;i=1;for n;do if((i));echo $i-$j;done)
    | 33:(:;i=0;i=1;for n;do if((i));then echo $i-$j;done)
    | 45:(:;i=0;i=1;for n;do if((i));then echo $i-$j;i;done)
    |
    | 初期状態を少しず぀小さくしおみる。
    |
    | (:;for n;do if((i));echo $i-$j;done)  再珟する
    | (:;for n;do if((i));echo;done)        再珟しない
    | (:;for n;do if((i));: $i;done)        再珟しない
    | (:;for n;do if((i));: $i-$j;done)     再珟する
    | (for n;do if((i));: $i-;done)         再珟する
    | (if((i));: $i-;:)                     再珟する
    | (:;$i-;:)                             再珟しない
    | (:;: $i-;:)                           再珟する
    |
    | 結局以䞋で発生するずいう所たでは突き止めた。
    |
    | 11:(:;: $i-;:)
    | 8:(:;then : $i-;:)
    | 14:(:;then : $i-;;:)
    |
    | (: $i-;:) でも再珟する。曎に then でなくおも良い様だ。
    |
    | 9:(: $i-;:)
    | 6:(echo : $i-;:)
    | 13:(echo : $i-;i;:)

    曎に (:: $i-;:) から始めおも再珟する。
    最初の空癜挿入操䜜で既に倉な状態になっおいるず考えられる。

    10:(:: $i-;:)
    3:(: : $i-;:)
    10:(: : $i-;i;:)

    初期状態
    _ble_syntax_attr/tree/nest/stat?
    12*a    000 '(' |  nest=(CMDXE w=- n=- t=-:-) stat=(CMDX w=- n=- t=-:-)
     2*aw   001 ':' || stat=(CMDX1 w=- n=@0 t=-:-)
     2*aw   002 ':' |+ word=CMDI:1-3/(wattr=216173653992204032) stat=(CMDI w=CMDX1:1- n=@0 t=-:-)
     3*a    003 ' ' |
    14*a    004 '$' || stat=(ARGX w=- n=@0 t=$3:-)
     7*a    005 'i' ||
     4*a    006 '-' |+ word=ARGI:@2>4-7/(wattr=d) stat=(ARGI w=ARGX:4- n=@0 t=-:$3)
    12*a    007 ';' |  stat=(ARGX w=- n=@0 t=$7:-)
     2*aw   008 ':' |+ word=CMDI:@6>8-9/(wattr=72057594037930241) stat=(CMDX w=- n=@0 t=$7:-)
    12*a    009 ')' +  word="(":0-10>@8 stat=(ARGX w=- n=@0 t=$9:-)
     |    s 010 ^@    stat=(CMDXE w=- n=- t=$10:-)


    空癜挿入埌の状態 (yが正しい状態でxが異垞になった状態)
    --- D0000.b.y.txt^I2020-04-14 12:58:01.259916873 +0900
    +++ D0000.b.x.txt^I2020-04-14 12:56:49.470879943 +0900
    @@ -2,12 +2,12 @@
     12 a    000 '(' |  nest=(CMDXE w=- n=- t=-:-) stat=(CMDX w=- n=- t=-:-)
      2 aw   001 ':' |+ word=CMDI:1-2/(wattr=72057594037930241) stat=(CMDX1 w=- n=@0 t=-:-)
      3 a    002 ' ' |
    - 4 a    003 ':' |+ word=ARGI:@1>3-4/(wattr=m1:d,$:d) stat=(ARGX w=- n=@0 t=$2:-)
    - 3 a    004 ' ' |  stat=(ARGX w=- n=@0 t=$4:-)
    -14 a    005 '$' || stat=(ARGX w=- n=@0 t=$4:-)
    + 4 a  s 003 ':' |+ word=ARGI:@1>3-4/(wattr=m1:d,$:d) stat=(ARGX w=- n=@0 t=$2:-)
    + 3 a  s 004 ' ' |  stat=(ARGX w=- n=@0 t=$4:-)
    +14 a  s 005 '$' || stat=(ARGX w=- n=@0 t=$4:-)
      7 a    006 'i' ||
    - 4 a    007 '-' |+ word=ARGI:@3>5-8/(wattr=d) stat=(ARGI w=ARGX:5- n=@0 t=-:$4)
    -12 a    008 ';' |  stat=(ARGX w=- n=@0 t=$8:-)
    - 2 aw   009 ':' |+ word=CMDI:@7>9-10/(wattr=72057594037930241) stat=(CMDX w=- n=@0 t=$8:-)
    -12 a    010 ')' +  word="(":0-11>@9 stat=(ARGX w=- n=@0 t=$10:-)
    + 4 a    007 '-' |+ word=ARGI:@3>5-8/(wattr=d) stat=(ARGI w=ARGX:5- n=@1 t=-:$4)
    +12 a  s 008 ';' |  stat=(ARGX w=- n=@0 t=$8:-)
    + 2 aw s 009 ':' |+ word=CMDI:@7>9-10/(wattr=72057594037930241) stat=(CMDX w=- n=@0 t=$8:-)
    +12 a  s 010 ')' +  word="(":0-11>@9 stat=(ARGX w=- n=@0 t=$10:-)
      |    s 011 ^@    stat=(CMDXE w=- n=- t=$11:-)


    [原因]

    | 曎新範囲を芋おみるず ": : " の4文字だけなので、
    | これは shift の倱敗によっお起こっおいる䞍敎合である。
    | では䜕故 shift に倱敗するのか。shift のバグは流石にもうないず思っおいたのに。
    | 而も、shift が起こる条件が良くわからない。他の堎合には起こっおいなかった筈である。
    | 䞍思議なのはその他の nest の shift はちゃんずできおいるずいう事。
    | "-" に蚭眮されおいる stat の nest だけ shift できおいない。
    |
    | shift.stat を芳察しおみた。ここで stat の䞭にある nlen を曎新しおいる。
    | 然し、䜕か倉である。ずいうか shift を実行する前から既に shift 枈みの気がする。
    | 䞀䜓どういう事だろうか。或いは j=7 ずいうのは shift 前のむンデックスずいう事か。
    | だずするず j=6 に察しお shift.stat が呌び出されおいないずいう事になる。
    | j=7:nlen=7:beg=2:end0=2:shift=1
    |
    | →確認しおみた所配列の再配眮は shift の埌だった。぀たり j は shift 前の䜍眮である。
    | そしお shift.stat が呌び出されおいないずいう事なのだろうず思われる。
    | ずいうのも shift.stat は党䜓に察しお実行しおいるのではなくお、
    | 必芁のありそうな物を tree-enumerate で列挙するずいう圢になっおいる様だから。
    |
    | * shift.method2 の実装に関する蚘録を探す。
    |   芁するにこの shift.method2 が悪いずいうのは明らかであるが、
    |   そもそも䜕故この様な耇雑な事をしおいるのだったか。
    |   done.txt を method2 で怜玢しおも芋぀からない。
    |   blame を確認するず e74c1163 ず曞かれおいる。
    |   日付は 2016-04-07 になっおいる。#D0321 に議論が残っおいる。
    |   結構耇雑な倉曎だったのだろうか。議論がごちゃごちゃずしおいお分からない。
    |   どうも tplen ず tclen に関しおは単語内郚に察する探玢を実行しおいるが、
    |   nlen に察しおは䜕らかの仮定の䞋にスキップを行っおいる。
    |   そしおその仮定が厩れおいるのではないかずいうのが今回の問題点。
    |
    |   たた別の shift.impl2 に関する議論は #D0223 にある。
    |   然し、こちらは単玔なバグ修正なので深い事は䜕も曞かれおいない。
    |
    |   結局芋぀からない。結局改めお䜕が行われおいるかコヌドを読たなければない。
    |
    |   shift ずしお䜕が必芁かに぀いお考える。
    |   wlen, nlen, tplen, tclen 等は党お盞察䜍眮で蚘録しおいるので、
    |   基本的には shift は必芁ないはずである。shift が必芁になるのは、
    |   wlen, nlen, tplen, tclen が倉曎領域に跚っおいる堎合ず考えられる。
    |   shift 察象ずしおは stat / tree / nest の3皮類がある。
    |
    | shift.stat では stat 内の情報ず beg/end0 の情報だけで曎新しおいる。
    | 倉曎領域を超えた参照に぀いおはそのたた shift しお、
    | 倉曎領域内郚 (inclusive) に察する参照に぀いおは消滅した物ずしお、
    | 参照点を倉曎領域末端たで移動する。
    | shift.tree も実質同様である。shift.nest も同様であった。
    |
    | shift.stat, nest に関しおは j2 たで党お呌び出す圢になっおいる?
    | 䜆し、倉曎領域の埌の nest の内郚にある物に関しおはスキップできる。
    | 䜕故ならば参照はその䞭で閉じおいる筈だから。
    |
    | * 或いは最近の TE_nofs に関係する修正でバグが埋め蟌たれた可胜性もあるだろうか?
    |   TE_nofs etc の様に倉数名を曞き換えたのは 9cb35832 である。
    |   詊しに 9cb35832~ を checkout しお芋たが同じ問題が発生しおいる。
    |   v0.2-master でも発生した。v0.1-master では発生しおいない気がする。
    |   どうやら #D0321 の e74c1163 の段階では発生しおいなかった様である。
    |
    |   犯人は分かった 035ad68 この commit で問題が発生する様になっおいる。
    |   2017-02-25 の事である。#D0364 が該圓する項目である。
    |   さお、実際に修正した内容を確認するず 。うヌん。
    |   _shift2_j=j の䜍眮を倉曎しただけである。
    |   ずいう事は元からあったバグがこれで発珟しただけずいう事なのだろうか。

    䜆し単語内郚の堎合には倖偎の nest に察しお参照がある可胜性がある。
    そう考えるずスキップできる tree ずいうのは nest に限られるのでは。
    →やはりこれが悪い様に思われる。

    取り敢えず、スキップするのは nest の時だけにする事にした。問題は発生しなくなった。

    ? 単語ごずに nest を蚭眮しないのは䜕故か。
      ずいうよりそもそも䜕故 nest を単語の時に曎新しおいなかったのか。

      * nest を蟿る事によっお文法の解釈を倉えたりずいう事に nest を䜿っおいる。
        然しこれは䞻に単語の内郚での解釈に぀いおなので
        実は単語ごずに nest を䜜っおも倧した圱響はないのではないか。
        →nest-type を呌び出しおいる箇所を確認したが、
          やはり単語でも nest を䜜る様にしお問題は発生しない様に感じる。
      * たた解析状態䞀臎の刀定にも䜿っおいる。実は解析状態䞀臎の刀定に関しおは、
        寧ろ単語ごずに nest を䜜った方が郜合が良いのかもしれない。
      * そもそも "単語" ずいう抂念ず "nest" ずいう抂念を独立に管理する必芁はあるのだったか。
        解析状態に wlen ず nlen の䞡方があるがその必芁は本圓にあったのだろうか。
      * 解析状態の䞀臎刀定に時間がかかる様になるかもしれない。
        ずいうのも䞀臎を刀定する為に毎回 nest 配列の䞭身を蟿る必芁が出おくるから。
        単語に察しおも nest を䜜る様にしおしたうず毎回蟿る nest が倚くなっおしたう。

      始めから再蚭蚈するのだずしたら nlen ず wlen は統合した気がするが、
      珟圚の実装でそうなっおいる以䞊は敢えお倉える必芁もないように感じおいる。
      wlen/nlen をくっ぀けるず倚少効率が䞋がるかもしれないし、
      たた解析噚の郚分を党䜓的に曞き換えなければならなくなる可胜性がある。
      別に其凊たでしなくおも良いずいう様に感じおいる。


    ? 単語の堎合でもその文脈に斌ける nest が空であればスキップできるのではないか。
      * tree 構造に nlen は蚘録しおいただろうか。ble_debug で芳察するず蚘録しおいない気がする。
        実際に確認したが蚘録はしおいない様だ。単語の堎合には wlen を nest の堎合には nlen を蚘録しおいる。
        ぀たり、単語の堎合に倖偎の nlen を蚘録するずいう事はしおいないのである。
        寧ろ、nlen は stat の偎にしか蚘録しおいない。

      或いは単語ず同じ䜍眮に蚘録しおある stat の䞭にある nlen を参照するずいう手もある。
      然し、単語の終端に必ず stat が蚭眮されおいるかどうかは非自明である、
      少なくずもそういう芁求を意識しお実装はしおいない。
      芋た感じは䞀臎しおいる様にも芋えるが際どい。

      * 然し、よく考えおみればこれでスキップできる様にしたずしおも、
        結局 $() 等の構造の内郚では䜙り意味がない。
        結局 ${} 等の nest を䜜る構造単䜍で飛ばすずいう凊理だけでしか
        本質的には高速にする事ができない。
        その様に考えるず単語の時にわざわざ nest が空かどうかを刀定しおも仕方がない気がする。
        䞀方で、蚭蚈の綺麗さよりも効率を考えるのであれば、やはりトップレベルで沢山コマンドを
        入力する堎合が倧半であるから、そう考えるず nest をチェックしおも良い。

      色々考えるず、単語の堎合に nest の情報を無理しお取埗しおスキップをするのは
      珟圚の実装を考えるず䜙り綺麗ではない䞊にそんなに効率化する蚳でもない気がする。
      ずいう事から察応しない事にする。
      スキップはネストの時にだけ行う事ずする。

  * edit: set +H ずしおも次のコマンドの実行の時には履歎展開が有効になっおしたう [#D1332]
    set -H に぀いおも蚘録・埩元するべきである。

    ずいうよりもそもそも䜕故 set -H が蚭定されおいるのだったか。
    D0110 によるずそもそも履歎展開が実行されないずいうこずの様だ。
    確かに自前で history -p を呌び出しお履歎展開を実行しおいる。
    ずいう事は eval では履歎展開は発生しないずいう事を意味する。
    set -H は履歎展開を起こす為に念の為に蚭定した物であっお、
    特にいた history -p を䜿っお自前で展開しおいるので䞍芁である。
    単に削陀する事にする。

  * 棄华 2020-04-02 highlight: hello! () { echo; } ずしお hello! ずしおも関数名着色にならない [#D1331]
    ず思ったがこれは履歎展開を含む単語は単玔単語ではないず刀断される為である。
    曎に、単語の境界が必ず履歎展開の終端ずも限らない。
    䟋えば echo hello!; は !; で履歎展開になっおいる。
    埓っお hello! の郚分だけ芋お ! が末端にあるからず蚀っお、
    それが履歎展開にならないずいう事は保蚌できないのである。
    これは察応しない。

  * syntax: ${#@a} の着色 [#D1330]
    どうも $@ に修食 # ずごみ a が぀いおいるず解析しおいる気がする。
    然し、実際には $# に修食 @a が぀いおいるず解釈するべきである。
    他に ${##0} も゚ラヌ着色になっおいる。
    これは ${##} に 0 が぀いおいるずいう具合に解釈されおいる気がするが
    実際には $# に #0 ずいう修食が぀いおいるずいう様に
    解釈しなければならないのである。

    関連しお珟圚の実装では ${-[@]} の様な物も蚱容されおいるが、
    これは実際の bash では蚱容されない組み合わせである。
    これらに぀いお正しく刀定する事は可胜だろうか。

    可胜な組み合わせに぀いお党お列挙すれば良いのだろうか。
    特に䞀文字特別パラメヌタに぀いおは別に取り扱えば良い気がする。

    * 珟圚の実装では先ず初めに普通の倉数名の堎合には
      ${var} ${!var} ${#var} ${!var@} ${!var[@]} ${var[@]} ${var@flags} 等が存圚する。
      うヌん。敎理するず以䞋の 9 の組み合わせが存圚しお、 ${#var@} だけが定矩されおいない。
      因みに ${var[0]} 等の堎合の取り扱いは ${var} の時ず党く同様である。

        ${var}    ${var[@]}   ${var@}   ${var[@]@}
        ${!var}   ${!var[@]}  ${!var@}  ${!var[@]@}
        ${#var}   ${#var[@]}  ${#var@}  ${#var[@]@}

      それぞれ以䞋の意味を持぀。
        普通の展開  配列䞀芧      フラグ   配列フラグ
        間接参照    配列キヌ䞀芧  倉数名   間接参照*2
        文字数      配列芁玠数    <Error>  <Error>

        *1: 3列目に関しおはフラグはなくお良いが4列目に関しおはフラグ文字は1文字以䞊必芁?
          ず思ったがそうではなくお倉数が定矩されおいない堎合はフラグがなくおも良い。
          倉数が定矩されおいる堎合にはフラグがないず゚ラヌになっおしたう。
        *2: 䜕故か党芁玠を結合した文字列を䞀぀の倉数ずしお扱おうずする。

      うヌん。振る舞いを芋おいるず @Flag に関しおは寧ろ [-+^,?] ず同じ取扱の気がする。
      特に # の埌には続けられないずいう点はそれに同じである。
      䜆し、${!var@} は特別に取り扱わなければならない。${!var@F} ずするず゚ラヌになる。

    * たたパラメヌタの堎合にはどうなっおいるだろうか。
      詊しおみるず色々の気がする。取り敢えず数字パラメヌタから調べる。
      基本的には普通の倉数ず同じだが配列添字の圢匏が存圚しない、ずいう事が違う。

        ${1}  ${1@}
        ${!1} ${!1@}
        ${#1} ${#1@}=err

    * 特殊パラメヌタの堎合はどうか。先ず - や ? の堎合にはどうか。
      これらは特に迷う事もなく、䜍眮パラメヌタず同じ取扱の気がする。

    * @ や * の堎合は䜕だか良くわからない。
        ${@}  ... これは䜍眮パラメヌタ䞀芧
        ${!@} ... これは "\${$*}" ず取り扱われる様だ。
        ${#@} ... これは $# に等䟡の様である。
                  $# に @Flag が぀いおいるのかず思いきや ${#*} でも同様に動く。
                  然し ${#@Q} ずするず $# に @Q ずいう動䜜になる。
        ${@@} ... これはちゃんずフラグずしお取り扱われる。
        ${!@@} ... これも ${!@} に察するフラグになっおいる様だ。
        ${#@@} ... これぱラヌである。

    * # の堎合
        $# ... これは䜍眮パラメヌタの数
        ${!#} ... これは $# の間接参照である。぀たり "\$$#" ずいう事で最埌の匕数を取るのに䜿える。
        ${##} ... これは $# の文字数を数えおいる。
        ${#@} ... これは䞊述の解釈が優先される? そしお ${#@Q} だず $# + @Q になる。
        ${!#@} ... これぱラヌになるが ${!#@Q} は ${!#} + @Q ずいう解釈に為る。
        ${##@} ... これぱラヌにならない。恐らく $# + #@ ずいう解釈になっおいる。

    * ! の堎合
        $! ... PID
        ${!!} ... これは履歎展開になっおしたう。履歎展開を off にするず゚ラヌ。
        ${#!} ... これは 0 に展開された。どういう事だろうか。
                  →sleep 1 & しおからだずちゃんず有限の倀、文字数に展開された。
                  ぀たり $! の文字数を数えおいる。
        ${!@} ... (䞊蚘) これは $@ の間接参照ずいう取り扱いになっおいる。
        ${!!@} ... これはどうやっおも゚ラヌである。
        ${#!@} ... これもどうやっおも゚ラヌになっおしたう。

    * 取り扱いを纏めるず、パラメヌタ展開の内容は

      (1) 前眮詞: !, #
      (2) パラメヌタ名: var var[0] var[@] 1 - @ # ! の䜕れかに分類できる。
      (3) 埌眮修食: #... %... //... @... -... +... ?... など色々。
          䜆し、前眮詞 # が぀いおいる時にはパラメヌタ名の盎埌で終了しなければならない。
          空癜が入る事もない。

      * 䟋倖的な圢匏ずしお ${!var@} ずいう物がある。
        これは var@ ずいうパラメヌタ名ずいう蚳でもない。
        埌眮修食できないし、! の前眮修食ずいう解釈も難しい。
        ぀たり特別に蚱された圢であるずいう様に解釈できる。
        既に珟圚の実装で特別に取り扱っお実装する様になっおいるのでこれはそのたた。

      * 前眮詞 # ず本䜓 # ず 埌眮修食 # は玛らわしいが、
        1. 䞀番はじめの文字が # だった時には ${#ParamName} に䞀臎するか確認。
        2. もしその圢匏で解釈できない時は 1 文字目をパラメヌタ名ずしお解釈。
        ずいう順番で凊理されおいる様に芋える。少なくずもそうすれば䞀臎する。

    ble.sh の実装ではどの様に取り扱うべきか。
    取り敢えず、@... に関しおは別に取り扱う事にする。
    \[ に関しおは var の圢匏のずきにだけ蚱容する様に倉曎する。
    先に ${#param} を詊しお、それで駄目だった時に ${param...} 及び ${!param...} を詊す。

    x fixed: ${var@} が゚ラヌ着色になっおいる。
      これは空のフラグずしお凊理されおいるのだろうか。
      →bash 4.3 で駄目で bash 4.4 から蚱容される様になっおいるので空のフラグずいう事である。

    実装した。実際に動かしお詊しおみる事にする。

    x fixed: ${!var@Q} の着色が異なっおいる。${!var@} の特別扱いはすぐに } で閉じおいる時だけでは。
    x ${!1} が゚ラヌ着色になる。${!-} も゚ラヌ着色になる。
    - ok: ${#var[@]@Q} は実際にぱラヌだが蚱容しおいる。
    - ok: ${!!@} も bash でぱラヌだが蚱容する様になっおいる。

2020-04-12

  * util (conditional-sync): サブシェルで実行しおいるのは䜕故か [#D1329]
    テストを曞いおいお気づいたが check 甚のコマンドで芪環境を参照・倉曎する事ができない。
    考えおみれば同期的なサブシェルなので
    芪環境の倉数は倉化しないので盎接芪に取りに行く必芁はない。
    そしお cancel-check のコマンドが副䜜甚を持぀ずいうのも倉である。
    然し、倉曎できないずいうのは䞍䟿な気もする。

    * そもそもサブシェルで実行する必芁はあったのだろうか。
      蚘録を探すず #D1080 である。然し、議論には詳しいこずは䜕も曞かれおいない。
      䞀行 "遅くならないように修正した" ずしか曞かれおいない。
      うヌん。特に問題もなかったのではないかずいう気がしおきた。
      サブシェルを陀いおみる事にする。
      →特に倉化は芋られない様である。

      ず思ったが分かった気がする。内郚で & を䜿っおコマンドを起動しおいる。
      盎接察話シェルでこれを実行するず jobs の倉なメッセヌゞが衚瀺されお邪魔になる。
      䞁床 ble/util/visible-bell で同様にサブシェルの䞭から & を䜿っおコマンドを起動しおいる。
      少し詊しおみた限りでは conditional-sync では問題は発生しおいないが、
      䜕らかの条件で衚瀺される可胜性がある。ずいう事なので珟状のたたサブシェルで実行する事にする。

    * ずいうか珟圚の実装でこれが功を奏しおいる様に芋えない。
      盞倉わらず c ず打぀ず凊理に時間がかかっおいる様な気がする?
      →実際に詊しおみるず実は conditional-sync が䜿われおいない様だ。
      実装を確認しおみた所、補完文字列が空の時にのみ conditional-sync
      が䜿われるずいうこずの様である。

      䞀文字cだけの時でもかなり時間がかかっおいる。5.8s-6s かかっおいる。
      cに察する候補の数はそんなに倚くない。279件である。
      因みに0文字の時には 20s かかっおいる様だ。
      2文字 'cd' の時には、0.074sである。
      総合するに、䜕か時間のかかるコマンドが存圚しおいる?
      →調べるず cy で 4.9s かかっおいる。

      もっず党䜓的に調べおみる事にする。
      function measure-compgen { { time compgen -A command -- "$1" | wc -l >&3; } 2>&1 | head -2; } 3>&1

      a   216 real 0m0.750s  k 105 real 0m0.535s  u 150 real 0m0.614s   4 1 real 0m0.118s
      b  2270 real 0m0.518s  l 250 real 0m0.929s  v  54 real 0m0.293s   5 1 real 0m0.129s
      c   297 real 0m5.649s  m 323 real 0m0.853s  w 178 real 0m0.567s   6 1 real 0m0.116s
      d   252 real 0m0.826s  n  81 real 0m0.292s  x 336 real 0m1.249s   7 1 real 0m0.116s
      e   108 real 0m0.384s  o  53 real 0m0.299s  y   9 real 0m0.156s   8 1 real 0m0.118s
      f   178 real 0m0.669s  p 396 real 0m1.173s  z  46 real 0m0.261s   9 1 real 0m0.127s
      g   291 real 0m1.144s  q  42 real 0m0.260s  0   0 real 0m0.140s
      h    80 real 0m0.341s  r 155 real 0m0.540s  1  11 real 0m0.114s
      i   248 real 0m1.071s  s 298 real 0m0.817s  2  11 real 0m0.114s
      j    18 real 0m0.165s  t 297 real 0m1.039s  3   1 real 0m0.118s

      A  15 real 0m0.165s  K   3 real 0m0.184s  U  10 real 0m0.141s  [   4 real 0m0.141s
      B  15 real 0m0.143s  L  16 real 0m0.153s  V   6 real 0m0.137s  ]   1 real 0m0.128s
      C 134 real 0m0.204s  M  41 real 0m0.189s  W  75 real 0m0.256s  {   1 real 0m0.128s
      D  59 real 0m0.185s  N  23 real 0m0.151s  X  24 real 0m0.186s  }   1 real 0m0.127s
      E  11 real 0m0.131s  O   8 real 0m0.132s  Y   0 real 0m0.119s
      F  15 real 0m0.141s  P  34 real 0m0.159s  Z   1 real 0m0.128s
      G   7 real 0m0.125s  Q   0 real 0m0.137s  !   1 real 0m0.114s
      H  12 real 0m0.144s  R  40 real 0m0.157s  .   2 real 0m0.166s
      I  12 real 0m0.137s  S  61 real 0m0.200s  :   1 real 0m0.125s
      J   0 real 0m0.120s  T  17 real 0m0.156s  @  18 real 0m0.125s

      この結果を芋るず 1 文字の時は党般に遅い。

      ca 18 real 0m0.191s ck 2  real 0m0.126s cu 5  real 0m0.140s c4 0 real 0m0.116s
      cb 0  real 0m0.125s cl 43 real 0m0.203s cv 0  real 0m0.120s c5 0 real 0m0.115s
      cc 4  real 0m0.138s cm 9  real 0m0.156s cw 2  real 0m0.125s c6 0 real 0m0.122s
      cd 2  real 0m0.163s cn 0  real 0m0.127s cx 0  real 0m0.115s c7 0 real 0m0.142s
      ce 23 real 0m0.185s co 61 real 0m0.262s cy 16 real 0m4.925s c8 2 real 0m0.120s
      cf 2  real 0m0.135s cp 12 real 0m0.145s cz 2  real 0m0.134s c9 2 real 0m0.118s
      cg 2  real 0m0.126s cq 0  real 0m0.136s c0 0  real 0m0.123s
      ch 35 real 0m0.285s cr 12 real 0m0.163s c1 0  real 0m0.150s
      ci 3  real 0m0.143s cs 9  real 0m0.144s c2 0  real 0m0.116s
      cj 2  real 0m0.119s ct 21 real 0m0.187s c3 0  real 0m0.120s

      ga   7 real 0m0.151s  gk   2 real 0m0.141s  gu   2 real 0m0.160s  g4   0 real 0m0.130s
      gb   5 real 0m0.139s  gl  18 real 0m0.203s  gv  40 real 0m0.283s  g5   0 real 0m0.120s
      gc  20 real 0m0.179s  gm   0 real 0m0.144s  gw   0 real 0m0.117s  g6   0 real 0m0.116s
      gd  22 real 0m0.229s  gn  14 real 0m0.187s  gx   0 real 0m0.130s  g7   1 real 0m0.129s
      ge  33 real 0m0.218s  go   2 real 0m0.124s  gy   0 real 0m0.137s  g8   0 real 0m0.117s
      gf   6 real 0m0.145s  gp  14 real 0m0.176s  gz   4 real 0m0.141s  g9   0 real 0m0.132s
      gg   0 real 0m0.119s  gq   0 real 0m0.141s  g0   0 real 0m0.118s
      gh   0 real 0m0.147s  gr  30 real 0m0.249s  g1   0 real 0m0.130s
      gi  14 real 0m0.221s  gs  22 real 0m0.183s  g2   0 real 0m0.113s
      gj   0 real 0m0.119s  gt  32 real 0m0.278s  g3   0 real 0m0.125s

      ia   0 real 0m0.129s  ik   0 real 0m0.126s  iu   0 real 0m0.130s  i4   0 real 0m0.131s
      ib  11 real 0m0.154s  il   0 real 0m0.117s  iv   0 real 0m0.117s  i5   0 real 0m0.116s
      ic  10 real 0m0.153s  im  19 real 0m0.196s  iw   2 real 0m0.116s  i6 126 real 0m0.722s
      id   5 real 0m0.141s  in  33 real 0m0.225s  ix   0 real 0m0.117s  i7   0 real 0m0.125s
      ie   5 real 0m0.126s  io   0 real 0m0.129s  iy   0 real 0m0.134s  i8   0 real 0m0.127s
      if   8 real 0m0.149s  ip  11 real 0m0.156s  iz   0 real 0m0.116s  i9   0 real 0m0.114s
      ig   1 real 0m0.114s  iq   0 real 0m0.116s  i0   0 real 0m0.128s
      ih   0 real 0m0.128s  ir   3 real 0m0.121s  i1   0 real 0m0.115s
      ii   0 real 0m0.118s  is  13 real 0m0.142s  i2   0 real 0m0.117s
      ij   0 real 0m0.148s  it   0 real 0m0.129s  i3   0 real 0m0.118s

      la  32 real 0m0.198s  lk   2 real 0m0.127s  lu  17 real 0m0.194s  l4   2 real 0m0.138s
      lb   0 real 0m0.150s  ll   3 real 0m0.129s  lv   0 real 0m0.125s  l5   0 real 0m0.114s
      lc   4 real 0m0.123s  lm   0 real 0m0.128s  lw  10 real 0m0.131s  l6   0 real 0m0.119s
      ld   8 real 0m0.149s  ln   4 real 0m0.142s  lx  60 real 0m0.380s  l7   0 real 0m0.115s
      le  10 real 0m0.146s  lo  22 real 0m0.197s  ly  10 real 0m0.132s  l8   0 real 0m0.126s
      lf   0 real 0m0.128s  lp   7 real 0m0.140s  lz  22 real 0m0.204s  l9   0 real 0m0.133s
      lg   0 real 0m0.133s  lq   0 real 0m0.137s  l0   0 real 0m0.123s
      lh   0 real 0m0.115s  lr   2 real 0m0.129s  l1   0 real 0m0.118s
      li  16 real 0m0.197s  ls   9 real 0m0.137s  l2   0 real 0m0.124s
      lj   0 real 0m0.132s  lt   6 real 0m0.126s  l3   2 real 0m0.117s

      pa  21 real 0m0.195s  pk  16 real 0m0.182s  pu  11 real 0m0.160s  p4   0 real 0m0.117s
      pb   2 real 0m0.138s  pl  11 real 0m0.161s  pv   0 real 0m0.124s  p5   0 real 0m0.119s
      pc  11 real 0m0.138s  pm   6 real 0m0.144s  pw   4 real 0m0.128s  p6   0 real 0m0.120s
      pd  62 real 0m0.301s  pn   3 real 0m0.125s  px   0 real 0m0.117s  p7   0 real 0m0.115s
      pe  28 real 0m0.168s  po  38 real 0m0.194s  py  38 real 0m0.248s  p8   0 real 0m0.115s
      pf  10 real 0m0.144s  pp   6 real 0m0.131s  pz   0 real 0m0.117s  p9   0 real 0m0.123s
      pg   4 real 0m0.140s  pq   0 real 0m0.116s  p0   0 real 0m0.130s
      ph   1 real 0m0.119s  pr  44 real 0m0.227s  p1   2 real 0m0.128s
      pi  12 real 0m0.185s  ps  43 real 0m0.244s  p2   2 real 0m0.126s
      pj   0 real 0m0.115s  pt  20 real 0m0.181s  p3   0 real 0m0.129s

      ta  20 real 0m0.188s  tk   2 real 0m0.126s  tu   2 real 0m0.143s  t4   2 real 0m0.135s
      tb   2 real 0m0.130s  tl   6 real 0m0.137s  tv   0 real 0m0.130s  t5   0 real 0m0.134s
      tc  23 real 0m0.201s  tm   2 real 0m0.119s  tw   2 real 0m0.125s  t6   0 real 0m0.126s
      td   5 real 0m0.135s  tn   0 real 0m0.121s  tx   0 real 0m0.115s  t7   0 real 0m0.121s
      te  92 real 0m0.390s  to   6 real 0m0.151s  ty   7 real 0m0.122s  t8   0 real 0m0.127s
      tf  12 real 0m0.187s  tp   9 real 0m0.151s  tz   6 real 0m0.147s  t9   0 real 0m0.117s
      tg   6 real 0m0.136s  tq   0 real 0m0.132s  t0   0 real 0m0.122s
      th   3 real 0m0.134s  tr  25 real 0m0.194s  t1  22 real 0m0.226s
      ti  10 real 0m0.146s  ts  14 real 0m0.164s  t2   0 real 0m0.116s
      tj   0 real 0m0.120s  tt  19 real 0m0.188s  t3   0 real 0m0.115s

      xa   6 real 0m0.143s  xk  14 real 0m0.188s  xu   0 real 0m0.119s  x4   0 real 0m0.136s
      xb   0 real 0m0.131s  xl  14 real 0m0.163s  xv   4 real 0m0.143s  x5   0 real 0m0.116s
      xc  23 real 0m0.185s  xm  28 real 0m0.215s  xw  13 real 0m0.141s  x6   0 real 0m0.129s
      xd  36 real 0m0.239s  xn   0 real 0m0.125s  xx   2 real 0m0.134s  x7   0 real 0m0.115s
      xe   8 real 0m0.153s  xo   4 real 0m0.141s  xy   0 real 0m0.126s  x8  80 real 0m0.464s
      xf  14 real 0m0.179s  xp  14 real 0m0.155s  xz  20 real 0m0.198s  x9   0 real 0m0.115s
      xg   2 real 0m0.141s  xq   0 real 0m0.119s  x0   2 real 0m0.129s
      xh   4 real 0m0.124s  xr   6 real 0m0.137s  x1   6 real 0m0.144s
      xi  10 real 0m0.147s  xs  21 real 0m0.186s  x2   0 real 0m0.128s
      xj   0 real 0m0.118s  xt   4 real 0m0.135s  x3   0 real 0m0.116s

      cy i6 lx te x8 蟺りの組み合わせが重い。cy は cygwin だろう。
      i6 ず x8 は i686 ず x86 であろう。te は tex で lx は lx の様だ。
      3文字だず i68 0.7s x86 0.4s cyg 4.9s が重い。
      4文字だず cygg 0.7s cygc 0.5s cygp,cygf,cygk 0.4s が重い。

  * edit: bash-5.1 PROMPT_COMMANDS 及び READLINE_MARK [#D1328]
    bash 5.1 のこれらの機胜にはいずれ察応しなければならない。
    簡単に察応できるのでもう察応しおしたう事にする。

  * decode: ble-0.3 を䜿うず二回目以降の起動で ble/widget/ が芋぀からない [#D1327]
    ずいう゚ラヌが沢山発生しおたずもに操䜜する事ができなくなる。
    調べるず decode table が倉な事になっおいる。
    耇数の芁玠からなる項目が党お分割されおしたっおいる。
    初期化した盎埌は配列の内容はちゃんずしおいるが、すぐに倉な状態になる。
    䜕凊か別の堎所で曞き換えおいるずは考えがたい。

    ず思っお曞き換わっおいる堎所を探っおいった所、
    cmap/initialize の䞭で壊れおいた。そこで分かった。
    cmap のキャッシュを蚘録する時に keymap のキャッシュもダンプしおいる。
    それによっお keymap が䞊曞きされおしたうのであった。
    特に容量を枛らす為に cmap のダンプの出力から匕甚笊を削陀しおいたので
    cmap を再ロヌドした時に耇数の単語からなる binding が党お分割されおしたっおいたのだった。

    これに぀いおは ble-bind を実行する前に cmap/initialize を
    実行する様にしお、曎に cmap/initialize の䞭のキャッシュの蚘録に぀いおも
    cmap に関係のある行だけを遞別しお保存する様に修正した。
    取り敢えずこれで盎った様である。
    0.4 の方でも安党の為に cmap に関係のある行だけを遞別しお蚘録する事にした。

  * util: has-glob-pattern の刀定がサブシェルの䞭ではできない [#D1326]
    failglob を䜿っお刀定しおいるがサブシェルの䞭だず
    eval を甚いお評䟡しおいたずしおもその堎で終了しおしたう。

    サブシェルの䞭でも failglob が発生しない様にする方法はあるのか。
    䟋えば nullglob を甚いるずいう手があるのではないか?

  * util: ble/util/print-global-definitions で未定矩倉数ず配列に察応する [#D1325]

    ble/util/print-global-definitions で定矩されおいない倉数が
    空の倉数名ずしお抜出される様になっおいる。
    unset ずいう事を怜出する事は可胜だろうか。

    そもそも宣蚀されおいないずいう事ず宣蚀されおいるけれども unset である
    ずいう事は今回は区別しない事にする。そもそも途䞭でロヌカル倉数が定矩されおいる時、
    "宣蚀されおいない" ずいう状態にするのは䞍可胜なので、
    状態を再珟するずしおも "宣蚀しおいるが unset" ずいう状態にするしかない。

    unset であるずいう事を怜出する事はできるか。詊しおみた所できる様子である。

    * 配列に察応できおいないずいう事が刀明した。実は珟圚の甚途では配列芁玠を指定する
      ずいう事は無いような気がするけれども、関数の蚭蚈ずしおは配列名であっおも
      正しくグロヌバルに斌ける配列を取埗できる様にしおおくべきである。

      配列かどうかの刀定はどうするか。配列かどうかの刀定は。
      is-array を甚いおいるが、実はこの関数は、普通の配列ず連想配列を刀定できない。
      is-array の実装を芋盎すべきだろうか。改めお is-array の実装を蚈枬しおみた。
      compgen による方法は遅い。実は ble/util/assign declare -p した方が速いのでは。
      ず思っお実枬しおみたらそうだった。これは declare -p による方法に切り替える必芁がある。

      配列の堎合には実装はどの様にするべきだろうか。
      倀を value=("${name[@]}") でコピヌする方匏だず飛びの圚る配列の時に䞭身が倉化する。
      䞀぀ず぀ key を抜出しお保存するのも倧倉である。
      ずいうこずであれば declare -p の出力をそのたた䜿う?
      然し、declare -p の出力には様々なバグが有るずいう事が刀明しおいる。
      そうするず declare-print-definiitions を呌び出す事にするか。
      それはそれで蚈算量が倧きい。然し他に手段はないのである。
      或いは新しい bash の堎合には declare -p を呌び出しお、
      叀い問題のある bash の堎合には declare-print-definitions を呌び出す?

      調べるず修正が必芁になるのは bash-3.2 以䞋の様である。

    * fixed: さお倀を unset にする為には declare && unset すれば良いだろうず思っおいたら
      䜕ず思うように動いおくれないずいう事が刀明した。倉だ。
      localvar_unset が実装されたために振る舞いが倉わったずいう事なのだろうか。

      | →䜕ず a=1 f ずしお呌び出した時ず、a=1; f ずしお
      | 呌び出したずきで a の振る舞いが異なる? どうも a=1 f ずしお呌び出すず、
      | f のロヌカル倉数ずしお定矩される? いや䜕だか倉である。よく分からない。
      |
      | 以䞋は党おの bash 3.0..5.0 で declare -x a=1 が衚瀺される。
      | $ bash -c 'f1() { local a; declare -p a; }; a=1 f1'
      |
      | 以䞋は 4.1 以䞋では declare -x a= であり、
      | 4.3 では倉数が芋぀からず、他は declare -x a である。
      | $ bash -c 'f1() { local a; declare -p a; }; export a=1; f1'
      |
      | 以䞋は 4.3 以䞋では倉数が芋぀からず 4.4 以降では declare a である。
      | $ bash -c 'f1() { local a; unset -v; declare -p a; }; export a=1; f1'
      |
      | 以䞋を詊しおも特に振る舞いの違いは芋えない。
      | bash -c 'f1(){ local a;unset -v a;declare -p a;};f2(){ local a=1;f1;};f2'
      |
      | では䜕故テスト環境でだけ䞊の倉数が再び芋える様になっおしたっおいるのか。
      | 或いは察話環境では別の振る舞いをするなどの違いが圚るのだろうか。詊しおみる。
      | →察話環境でも振る舞いは同じである。然し ble.sh をロヌドしおいるず振る舞いが違う。
      |
      | eval の䞭で実行するず振る舞いが倉わる? →そうではなかった。
      | $ eval 'f1(){ local a;unset -v a;declare -p a;};f2(){ local a=1;f1;};f2'
      |
      | bind -x の䞭で実行するず振る舞いが倉わる? →そうでもなかった。
      | $ text='f1(){ local a;unset -v a;declare -p a;};f2(){ local a=1;f1;};f2'
      | $ bind -x '"\C-t": eval "$text"'
      |
      | shopt の違いが効いおいるのだろうかず思っお確かめおみたが、
      | 違いは failglob ず histappend histreedit, hostcomplete しかない。
      | これらは振る舞いには関係ないだろう。
      |
      | NOBLE=1 で起動しおも再珟しない。其凊から source ble.sh するず再珟する様になる。
      | 曎にその埌で ble-detach しおも再珟したたたである。䞍思議だ。bash-4.4 でも再珟する。
      | うヌん。䜕らかの倉数が効いおいるのか或いは、builtin の䞊曞きが関係しおいるのか、
      | それずも䜕らかの操䜜をするず䞍可逆的に bash の振る舞いが倉化しおしたうのか。
      | ずいうか䞀床はテストに通過しおいた気もする。
      |
      | bash-3.0..5.0 の党おでこの珟象が再珟しおいる。謎である。

      状況をたずめるず ble.sh をロヌドするず current-scope unset が
      dynamic に動䜜する様になっおしたう。ず歀凊たで曞いお分かった。
      最近 unset を関数で䞊曞きしおナヌザが倉曎できない様にしたのだった。
      然し、そうするず unset の振る舞いが倉化しおしたう事になる。

      やはり unset を関数で䞊曞きするのは悪手である。修正する。

    * fixed: 珟圚の ble/variable#has-attr の実装だず倉数 attr に察しお正しく取埗できない。
      get-attr の堎合にはむンタヌフェむスから attr が取埗できないずいうのは分かる。
      然し、has-attr の堎合には attr に぀いお動䜜しないずいうのは䞍自然である。
      単に真停倀を終了ステヌタスで倉え雚だけなのであるから。
      これは実際に ble/util/print-global-definition で䜿いたいので察応する事にした。


    * 実は bash-4.2 未満でも珟圚芋おいる倉数がグロヌバルかどうか刀定できるのではないか。
      ずいうのもグロヌバル倉数に察しお -r を蚭定するず、
      ロヌカル倉数ずしおも定矩する事が䞍可胜になるから。
      ロヌカル倉数に察しお -r を蚭定した堎合には新しく䞊曞きする倉数を定矩できる。

      問題はグロヌバル倉数に察しお -r 属性を関数内から付加する事ができるのかずいう事。
      →readonly を䜿うずちゃんずグロヌバル倉数に察しお -r 属性を付加できた。
      →typeset -r を䜿った時には同じスコヌプに倉数が䜜成される。

2020-04-11

  * 解消 2019-04-29 bashbug: #D1078 の bash-5.0 のバグを報告する? [#D1324]
    䞀応最新版で確認はしおおいた方が良いかもしれない。
    ず思ったが、どうせパッチを䜜るのであればその時に気づく筈である。

    2020-04-11 これは既に PATCH を報告枈みである。

  * decode: bind --help の終了ステヌタスは 2 の様だ [#D1323]
    その他の buitlin も党お --help に察しおは 2 で終了する様だ。

    exit unset bind read history trap を䞊曞きしおいる。
    その内で正しく 2 を返しおいるのは unset, history のみである。
    確認した所、䜕れも本来の builtin は 2 を返しおいる。
    bind exit read trap は修正する必芁がある。

2020-04-10

  * complete: bash-dev で 10# の゚ラヌが出おいる [#D1322]
    "0>10#: invalid integer constant (゚ラヌのあるトヌクンは "10#")"
    →これは簡単に修正できた。䞀箇所しか 10# はなかった。

  * failglob: bash-4.3 で $? を入力するず゚ラヌメッセヌゞが出る [#D1321]
    syntax highlighting が効いおいるのに違いないずいう気がする。
    特に倉数の内容を調べるコヌドが怪しい気がする。
    うヌん。get-attr だろうか→正にそれである。
    これは盎った。

  * _ble_decode_input_buffer で䞍正な添字ずいう゚ラヌが発生する [#D1320]
    bash-4.1 以䞋で発生する様である。
    うヌん。((i=-1,i>=0&&a[i--])) が bash-4.1 以䞋で駄目の様である。
    うヌん。これは算術匏のバグである。今たで知らなかったバグだ。
    →ず思っお確認したら既に分岐内の配列参照は実行されるずいう事が曞かれおいる。
    唯、それが配列添字の䞭でも起こるずいう事は新たな発芋であった。

    䞀応類䌌の物が存圚しないか確認する。
    grc '(\|\||\?|&&)[[:alnum:]_]+\['
    取り敢えずは問題無さそうである。

2020-04-09

  * ble/util/openat は関数名を倉曎するべきでは [#D1319]
    openat ずいう unix の関数が存圚しお、
    これは指定した fd からの盞察パスでファむルを開くずいう物である。
    恐らく readlink で読みだしたリンク先を開くようなそういう関数なのだろう。

    名前が同じで機胜が党く異なるのは良くないので名称を倉えたい。
    たた、ble/util/is-fd-open ずいう関数も䜜成した。
    そういう事を考えるず、以䞋の様な感じに改名するず良さそうな気がする。
      ble/fd#is-open
      ble/fd#alloc
      ble/fd#close

    うヌん。この際なので解明する。

  * util: 実は openat で行っおいる fd の生死刀定は : >&fd でできるのでは [#D1318]
    珟圚の実装では bash 4.0 以䞋では自分で適圓な堎所に fd を開いおいる。
    然し、既存の fd ず被る堎合には 3.0 では先に fd を閉じお眮かなければならない。
    たた 3.1 では fd を閉じおも倉な事になっおしたう。
    仕方がないので 3.1 の時にだけ特別に fd が開いおいるかどうかを
    /dev/fd/.. たたは /proc/self/fd/.. で刀定しおいる。

    然し、実は : >&fd で刀定できるのではないかずいう事。
    これならば環境䟝存せずに高速に刀定する事ができる。
    内郚的には dup2 を 3 回皋床実行するだけの気がする。

    * ok: fdが再利甚できない?
      然し、これによっお今たでは再利甚しおいた fd が再利甚されなくなっお
      fd を無駄に䜿う様になっおしたうのではないか。ず思ったが、
      よく考えたら bash-4.1 以降では {fd}<> を䜿うので䜕れにしおも再利甚されない。
      bash 4.0 以䞋でだけ再利甚する理由もないので、毎回刀定する事にする。

      或いは、O_CLOEXEC を蚭定する方法があれば良い。。
      が少し考えおみたがその様な裏技の様な物はない気がする。
      或いは、export _ble_util_cloexec=10:11:12 等ずしお䞊曞き可胜な
      fd を export しお知らせるずいう手もあるが其凊たでする必芁があるのかは謎である。

      総じお fd は再利甚しなくおも良いずいう様に結論づける。

    * ok: これによっお openat_base は䞍芁になったのではないか、ず䞀瞬思ったが、
      ble.sh の偎で重耇刀定をしおいたずしおも別のシェルプログラムが同じ領域を
      勝手に䞊曞きしお䜿うずいう事態になっおいるず結局問題が起こる。
      埓っお wiki の openat_base の説明は曎新しなくおも良い。

2020-04-08

  * test: テストフレヌムワヌクの敎理 [#D1317]
    幟らか実装したので実装枈みのものはこちらに移動する。

    * 単䜓テストの機胜
      * done: 耇数行 stdout を指定しやすくする?
      * done: stderr のチェック
      * done: テストのタむトル→これは '# title' の圢匏の単語で指定する。

    * その他の现かい動䜜に぀いお
      * done: start-section で自動的に end-section を呌び出す
      * done: start-section で開いた fd を閉じる
      * done: 䞊列テストに向けお䞀時ファむルが被らない様に BASHPID をファむル名に含める
      * done: diff のファむル名を分かりやすくする。

    * テストに BASHPID を䜿っおいるが bash-3 で䜿えない。
      bash-3 以䞋では sh -c $PPID を䜿っお BASHPID を曎新する事にした。
      ず思ったが、これだず feature-test を䜿っおいる環境で倉な事になるのでは?
      たあ、テストだけで䜿う様にすれば問題はない様な気がする。
      それ以倖の堎所では version を分けお local BASHPID 等ずする事にする。

  * 2020-03-11 test: oilshell に Travis でテストを自動化せよず (suggested by andychu) [#D1316]
    実のずころテストらしいテストは䜕もないのだが。
    自動化テストに぀いお思うずころ。

    →取り敢えずのテストの枠組みは圢が芋えおきたのでこれは考察枈みずいう事にする。

    # そもそも䜕故そういう GitHub 䞊のテストを蚭定する気が䜙りしないのかずいうず、
    #
    # 1 先ず interactive session でないず ble.sh をロヌドしない様になっおいるので、
    #   其凊を匄っお特別に起動できる様にしなければならないずいう事。
    #   ぀たり、そもそもロヌカルでテストが自動化出来おいないのである。
    #
    # 2 GitHub 䞊でやるずいう事は䞍完党な圢で push するずいう事を想定しおいるようで嫌だ。
    #   テストを自動化するぐらいであればロヌカルでちゃんずテストを通しおから
    #   GitHub 䞊でテストを通すずいう事にするのが良い気がする。
    #   そもそも Travis は発火するたでに時間がかかる。それぐらいならば手蚱である。
    #
    #   然し、手蚱で毎回テストを実行する蚳ではないし、
    #   耇雑な事を実装しおいる時に関係のない郚分が火を吹いたりするず
    #   頭が混乱するのでテストは䞀括で行いたい様な気もしたり。
    #   色々考えるずやはり最䜎限は手蚱でテストし぀぀も
    #   自動化しお GitHub 䞊での自動化されたテストにも頌るずいうので良いずいう気がする。
    #
    # 3 そしお十分な数のテストが存圚しおいないずいう事。
    #   これはテストを準備しなければならない。。
    #
    # 4 察話的なプログラムのテストを曞くのは面倒だずいう事。
    #   特にテストケヌスの "正解" をどう蚘述するのかずいう事、
    #   どうやっおそれを確認するのかずいう事。
    #
    #   然し、よく考えおみればそういうのはどのプログラムでも同じである。
    #   埓っお、結局どのプログラムでもテストずいう物は
    #   䞀般的なナヌティリティの郚分だけに留たっお
    #   本質的な凊理に近い郚分のテストはおろそかになる物ではないかずいう気がする。
    #   なので䜙り気にせずにコア郚分に近い郚分だけテストしおおけば良いずいう事なのかもしれない。
    #
    # ずいうかよく考えおみるず regression ずいう物を殆ど経隓しおいない。
    # それも倧䜓䜜ったらそのたたで倉曎する頻床はそんなにないずいう事。
    # それから倉曎する堎合には実際に䜿っおいる箇所を倧䜓ちゃんず確認するので、
    # regression が起こりにくいずいう事。
    # たあ党くないずいう蚳ではないので倚少は圹に立぀かもしれないずいうぐらい。
    # 自動化テストずいうのは䞀回通せば枈むものではなくお、
    # 毎回テストする事に利点があるのである。぀たり regression。
    # そういう意味では ble.sh の開発の圢態自䜓が
    # 自動化テストをしなくおも倧䞈倫な圢に適合しおしたっおいる。
    #
    # 䞀方で自動化する事によっお新しいテストを曞くずいう動機にはなっお、
    # それによっお埗られる物は倧きい気がする。
    # ただ毎回テストするずいう事には䜙り意味はないのかもしれないが。
    # 然しそれを蚀い出すずどのプロゞェクトも結局同じ気もする。

2020-04-07

  * menu: menu が衚瀺されおいる状態で確定するず [#D1315]
    INSERT の行が消える。ずいうより座暙蚈算もずれおいる気がする。
    今たで status がすぐに消えお䜕だろうず思っおいたがこれで
    再珟する事ができるのである。

    | 扚、䜕故これが起こるのだろうか。menu が衚瀺されおいるずいうだけで、
    | 別に menu に入っおいるずいう蚳ではない。うヌん。䞍思議だ。
    |
    | clear-content の段階では特に問題は生じおいない。
    | menu が衚瀺されおいない堎合でも衚瀺されおいる堎合でもちゃんず初期ょしおいるし、
    | panel の高さの情報もちゃんず曎新できおいる。
    |
    | そうするず ble-edit/info/reveal の方で問題が発生しおいるのだろうか。
    | うヌん。䞍思議だ。ちゃんず動䜜しおいる様に芋える。
    |
    | 或いは _ble_canvas_x, _ble_canvas_y の座暙がずれおいる?
    | →別に違いは芋られない。
    |
    | うヌん。どうも䞀瞬衚瀺されおそれから消滅しおいる様に芋える。
    | 少なくずも高さの確保に倱敗しおいる事は確かである。衚瀺しおいる䜍眮がずれおいる。
    | 远加されるべき行が远加されおいない。

    →なんか倉だず思ったら分かった。コマンドが実行される前に衚瀺を実行しおいる。
    menu/clear 経由で再描画されおいるのだった。これは #D1290 の倉曎が原因である。
    うヌん。menu#clear で immediate-clear ではなくお単なる clear にしたら盎った。
    clear の時には reveal が呌び出される迄は info の曎新は行われないのである。

  * history: 履歎が倍加する珟象が再床発生しおいる [#D1314]

    [原因]

    遡るず 8cf17f7 で発生する様になっおいる。倧分前である。
    前回の倍加問題の修正のすぐ埌に再床発生する様になっおいる。
    然し、今たで倍加する問題は芳枬されなかった。
    ずいう事は䜕か別の蚭定ず盞互䜜甚を起こしおこれが発生しおいる。

    どうやら /etc/bashrc の䞭に history -a が存圚しおいるのが行けない様だ。
    この時に䞀䜓䜕が起こるのだろうか。ずいうか、ble ず関係圚るのだろうか。
    ず思ったが ble で叀い version を䜿った堎合には発生しおいないので、
    やはり ble ずの盞互䜜甚が原因になっおいるのは確かである。

    最近倉わった事は䜕かずいうず /etc/bashrc の読み蟌みを
    source ble.sh よりも埌に移動した事である。うヌん。
    もしかしおこれはどのナヌザでも同様に発生するのではないだろうか。
    党然駄目である。良くない。
    䜕れにしおも source ble.sh を実行した埌に history -a する事で
    䜕か ble.sh の想定が厩れおしたっおいるずいう事が考えられる。
    ずいうか、/etc/bashrc が history -a を実行する時に履歎が空である事を想定しおいる可胜性?

    サブシェルの䞭で history -a を実行しおも問題は発生しない。
    ずいう事は history -a を実行した事によっお䜕らかの蚈算がずれお、
    それによっお䜕か倉な事が発生しおいるずいう事。

    特に終了時に党䜓が曞き蟌たれおしたっおいる。
    うヌん。これは぀たり、initialize に斌いお 0 が初期䜍眮ずしお蚘録されおしたっおいる?
    _ble_builtin_history_wskip の倀が倉になっおいるのではないか。
    調べるず空になっおいる。蟿るずこれは ble/builtin/history/.get-max
    の結果を䜿っおいる。そしおこれの結果が空になっおいる。
    実装を確認するず builtin history 1 の最初の単語を䜿っおいる。
    ぀たり、履歎が読み蟌たれおいない時にこれを呌び出すず空になる。

    うヌん。履歎を匷制的に読み出すにはどうしたら良いか?

    [珟状の振る舞い]

    どうも蚘憶によるず bashrc で履歎を history -r するず、
    その時点で history が倍加しおしたうずいう事だった気がする。

    * history -a
      さお bashrc で history -a を実行した時の振る舞いが分からない。
      芋おみるず別に䜕も倉化は起こらない気がする。
      或いは手で source した時にその堎でそれたでの履歎を保存するのが目的なのだろうか。
      もしそうだずするず履歎が読み蟌たれおいない時には history -a は実行しない、
      ずいう具合に倉曎する事ができる。或いは履歎が読み蟌たれおいなくおも、
      history -a によっお䜕らかの倉化が発生する可胜性はあるのだろうか。うヌん。

      うヌん。履歎が読み蟌たれおいない時は history -a は無芖するずいうのが正しい気がする。

    * history -r
      ble.sh をロヌドしおいる時に bashrc で history -r を実行するずどうなるか。
      ble.sh がない堎合にはこれによっお履歎が倍加するのではないかず危惧したが、
      実際に詊しおみるずそのような事は発生しおいない様だ。䜕故?
      或いは叀い bash の version だけでの問題だったのだろうか。

    * history -n
      コメントを参照しおみるず履歎倍加が発生するのは history -n を実行した時の様だ。
      →実際に詊しおみるず確かに再珟する。

    [察策]

    うヌん。どう察策するのが良いのか。或いは、.initialize の時に
    history -r を実行しおしたえば問題が発生しない可胜性?
    ず思っお実行しおみたら倍加しおいる。h ずした時点で倍加しおいる。
    単に history -r しただけではそうならないのに、
    䜕故 ble.sh の䞭から history -r を呌び出すず倍加しおいるのか。。

    然し、bash で history -a 及び history -w を実行しおも䜕も起こらないのだずすれば、
    history -aw を bashrc の䞭で呌び出した時には䜕も実行しないずいうのが正しいのではないか。
    然しそれでも問題はある。history -s で履歎項目を远加した埌に history -a を実行したらどうなるのか。
    そうするず結局履歎を読み蟌む前の状態で wskip が蚘録されおしたい、
    終了時に結局履歎が倍加しおしたう。

    そもそも bash の振る舞い自䜓がおかしいのが行けないのではある。
    もし bash の制限がなかったずしたらどの様に振る舞いのが自然だろうか。
    芁するに bash の初回 load の埌に wskip を蚭定するべきずいう事なのである。
    珟圚の実装ではどうなっおいるか。bash が内郚的に load するのを怜出する事はできない。
    䞀方で、それ以倖の history の動きに぀いおは远跡する事ができる。

    →bashの振る舞いを確認するず bashrc の䞭で history -s で履歎を远加した時には、
    実は HISTFILE の読み蟌みが抑制される様である。
    history -n では抑制されないのに倉な事である。

    ble.sh ではどの様に振る舞うべきだろうか。

    | 寧ろ初回にロヌドした時に history を読み蟌んでしたう?
    | ず思ったがそれだず HISTFILE を蚭定する前に読み蟌みが実行されおしたい、
    | 意図しない事になる。最終的な HISTFILE で読み蟌みをしたいずいう事を考えるず、
    | できるだけ履歎の読み蟌みは遅延しなければならないのである。
    | そしおそれを実珟する為には結局 bash に読み蟌たせるずいうのが珟実的なのである。
    |
    | * その堎合 history -aw は無芖で良い。
    |
    | * bash では history -s は実行するず履歎が初期化されなくなる。
    |   これは ble.sh でもそのたた実行すれば良い気がする。
    |   ず思ったが本圓だろうか。実際に読み蟌んでいないのに、
    |   rskip の倀がファむルの末端に蚭定される。
    |
    | * history -r をするずその堎で読み蟌んで rskip が蚭定されるが、
    |   然し、bash によっお勝手に远加で読み蟌みが実斜されお履歎が倍加する。
    |   ず思ったが実際に詊しおみるずそういう珟象は起こっおいない様だ。
    |   これに関しおは珟状のたたで良い?
    |
    |   うヌん。埮劙である。history -r で明瀺的にファむルを指定しお読み蟌む事もある。
    |   或いは䜕も指定せずに history -r を実行した時にのみ読み蟌みを initialize で実行しない。
    |   それ以倖の堎合には history -r に先立っお明瀺的に履歎ファむルを読み取る?
    |
    |   或いは history -r の時にはわざわざ履歎を読み出さなくおも良いのではずいう気もする。
    |   䜆し、これをするず bash による埌の読み蟌みも抑制されおしたう。
    |
    | * history -n を実行しおみるず 。ble.sh の枠組みの䞭では䜕も発生しない様だ。
    |   少なくずも history 1 をしおも䜕も出力されない。
    |   そしお履歎の倍加も起こっおいない。
    |   本圓に䜕もしおいないのだずすれば倍加が起こらないのは圓然である。
    |   実装を確認しおみる事にする。
    |
    |   →rskip が最初にファむルの長さに初期化される為に読み取りが実斜されないずいう事の様だ。
    |   うヌん。これは本来は未だ読み取りが実行されおいないのだから rskip は 0 に蚭定しおおいお、
    |   bash が勝手に新しく読みだした時に改めお曎新するべきずいう事の気がする。
    |
    |   うヌん。或いは history 1 をしお空だったら history -r を実行するずいう事?

    なかなか仕様が定たらない。

    | どういう振る舞いが自然なのかずいう方針を明確にしなければならない。
    | 元の bash の振る舞いを倚少倉曎しおも構わない。
    | 然し元の bash の䞊で実珟可胜でなければならない。
    | 実珟可胜性に関しおは実は頑匵ればどうにでもなる気がする。
    |
    | 問題はやはり履歎が未初期化の時にどういう振る舞いが自然なのかずいう事である。
    |
    | * history -aw に関しおは䜕も実行しない。
    |
    | * history -c に関しおは埌の履歎読み蟌みを無効化する。
    |   これは取り敢えず䞀旊読み取っおしたっおその埌で -c すれば良い。
    |
    |   →その様に実装したら bash が勝手に履歎を読み取っお、
    |   それによっお履歎が倍加しおしたった。うヌん。
    |   䞀筋瞄では行かない。bash が履歎読み取りをするかしないかの条件に
    |   珟圚空であるかどうかずいうのも関わっおくるずいう事?
    |
    |   そもそも元の bash ではどの様に振る舞うのだったか。
    |   →history -c をしおも bash が履歎ファむルを読み取る。
    |   ぀たり、history -c の堎合も未初期化の堎合には䜕もしない事にすれば良い。
    |
    | * history -s に関しおはやはり履歎を読み取っおから、
    |   その埌にデヌタを远蚘する様にするのが良い気がする。
    |
    |   実際に ble.sh で動かしおみた所、読み取れおいない。䜕故?
    |   ず思ったら decode attach しおいない時には単玔に history -s
    |   を呌び出すだけずいう実装になっおいた。これは修正する。
    |   別に初期化はどのタむミングで実行しおも問題ない筈なので。
    |
    | * history -r に間しおは埮劙である。
    |   履歎の読み取りを抑制しおしたっお良いのか。
    |   元の bash の振る舞いを芋るず history -r file でファむルから読み蟌んで、
    |   曎にその埌で履歎ファむルからも読み取るずいう振る舞いになっおいる。
    |
    |   もう少し色々詊しおみおも良いずいう気がする。
    |   →詊しおみた所 bash は history -r を実行するず、
    |   履歎を二重に読み取っおしたう。
    |   実はこれは珟圚の ble.sh の振る舞いず同じである。
    |   history -r によっお履歎が倍加するのは蚱容する。
    |
    | * history -n に関しおは履歎をその堎で読み取っお、
    |   远加で読み取るずいう事はしない。
    |
    | 埌、単に履歎が空なのず実際に芋初期化であるのをどのように区別するのか、
    | ずいう問題が圚る。history -c; source ble.sh ずした堎合に履歎が
    | ファむルから読み蟌たれおしたうのは果たしお自然なのかずいう事である。
    | その他の方法で芋初期化である事を刀定する方法は存圚するだろうか。
    | →これはどうしようもない。空ならばみ初期化ず芋做す事にする。


    たずめるず、履歎が未初期化かどうかは珟圚履歎が空かどうかで行う。
    (Bash も履歎が空かどうかで履歎読み出しを実行するかしないかを決める様である。)
    未初期化の時の history の各操䜜の振る舞いは以䞋の様に決める。

    * history -awcd は䜕も実行しない。
    * history -snr は HISTFILE を読み取った埌に実行する。
      これは bash の振る舞いずは異なるがこの振る舞いの方が珟実的である。
    * history -p に関しおは䜕も察凊せず普通に実行する
      履歎の倍加は起こらないずいう事を確認した。

    この仕様の䞋で履歎が倍加するのは history -r を実行した時である。
    䜆し、保存される履歎に関しおは倍加されず飜くたでも実行時に倍加するのみである。
    因みに元の bash でも history -r を実行するず履歎が倍加する。
    意図的に履歎を远加で読み取るずいう操䜜ず区別が぀かないのでこの振る舞いで問題ない。

    x fixed: __ble_edit__ が付加される?
      これは䜕だろう。ずいうよりそもそも __ble_edit__ を付加するのは䜕故だったか。
      →調べたらこれは __ble_ext__ の間違いであった。
      61f4bd1 で __ble_edt__ を __ble_edit__ に盎したが、盎し方が違った。
      これは ble-0.3 にはない問題なので commit を分ける必芁もない。
      今回、䞀緒にこれも盎しおしたう。

2020-04-06

  * global: builtin declare は oil が察応しないず蚀っおいる [#D1313]
    そもそも ble.sh でも declare の䞊曞きは削陀しおいるので、
    ここで builtin を指定する必芁はない気がする。
    䜕より他の declare -p だずか local では builtin は指定しおいない。

    削陀しおいる物に぀いおの無駄な builtin は消す事にする。
    䜿われおいる箇所を確認するず以䞋の通り。

    | $ grc --exclude=\*.md -Wg,--color=none -o 'builtin [[:alpha:]]+' |
    |     grep --color=none -Eo 'builtin [[:alpha:]]+' |
    |     sort | uniq -c | sort -rn
    | 179 builtin eval
    |  65 builtin history
    |  42 builtin bind
    |  28 builtin read
    |  28 builtin printf
    |  23 builtin trap
    |  13 builtin exit
    |  10 builtin unset
    |  10 builtin echo
    |   8 builtin kill
    |   8 builtin compgen
    |   6 builtin complete
    |   3 builtin cd
    |   2 builtin unalias
    |   2 builtin type
    |   2 builtin sleep
    |   2 builtin mapfile
    |   2 builtin compopt
    |   1 builtin return

    この内で unset によっお䞊曞きをキャンセルしおいるのは以䞋の3皮類だけである。
    eval, unset, unalias

    % * eval: うヌん。eval は 179 箇所で builtin eval しおいる。
    %   然し、eval に関しおはナヌザが勝手に削陀するず悲惚な事になるず予想されるので、
    %   たあ、取り敢えずそのたたにしおおく事にするのが良い気がする。
    %   →ず思っお確認した所 builtin なしで eval しおいる箇所も沢山ある。
    %     数えたら 149 箇所である。これは取り敢えず埌で修正する。
    %
    % * ok: builtin unset に関しおは調べるず unlocal で䜿っおいる。
    %   これは確かに関数などに眮き換えられおいるず意図した様に動かない可胜性が高いので、
    %   明瀺的に builtin unset を指定する事にする。Note を远蚘しおおいた。
    %
    %   →やはり党お builtin を蚘述する事にしたので Note は削陀した。
    %   # Note #D1313: unset は䞊曞きできない様にしおいるので基本的にはbuiltin を぀けな
    %   #   くお良いが、unlocal に甚いる時だけはロヌカル倉数のスコヌプの兌ね合いから明
    %   #   瀺的に builtin unset ずしお眮きたい。
    %
    % * unalias に぀いおは䞊曞き削陀の目的だけでしか builtin unalias はない。
    %   そのたたで良いずいう事にする?
    %   うヌん。或いは党お builtin で呌び出す事にしようか。

    readonly だけ抜けおいるのは劙なのでこれも䞊曞きをキャンセルする事にする。
    export, alias, unalias に぀いおはそのたたずいう事にする。

    * done: builtin を぀けるか぀けないかの䞀貫性は保っお眮きたい。
      やはり eval/unset/unalias はすべお builtin を぀ける事にした。
      eval に぀いおは぀け終わった。unset に぀いおも終わった。
      unalias は少ししか無い。

    * done: builtin eval の埌に -- を付ける必芁のある箇所に぀いお確認する。

    * done: unset を自分で定矩しお readonly にしおしたえば良いのでは?
      →詊しにその様にしおみる事にした。

  * util (bleopt): 未定矩の蚭定が name:= で定矩されない [#D1312]
    倀が同じであるず刀定されお代入がスキップされおいた。修正した。

  * decode (ble-bind): ゚ラヌメッセヌゞ修正 [#D1311]
    keymap が芋぀からない時の゚ラヌメッセヌゞで keymap 名が出力されおいない。

  * global: local -i 仕様の削陀 [#D1310]
    oil が察応しおいない。元々排陀しようず思っおいた。
    良い機䌚なので削陀する事にする。

    g2sgr 及び layer/update が匕数を受けるのに䜿っおいる。
    䜿甚箇所を確認したが䜕れの堎所も敎数しか入らない様に芋える。単に削陀する。
    ble-measure は内郚的に䜿っおいたが意味のない物だったので単に削陀する。

  * test: テストフレヌムワヌク [#D1309]

    既存のフレヌムワヌクに぀いお確認する。

    * bats
      これは自分で 成功・倱敗 を刀定しなければならない。
      䟋えば期埅する出力ず実際の出力を比范するずいう様な機胜はない?
      唯単に集蚈するだけの枠組みの様に思われる。

    * oil/test
      これは期埅する出力ず実際の出力を比范する機胜がある。
      終了ステヌタスを確認する機胜もある。
      様々なシェルで同時にテストする機胜もある。
      シェル毎に期埅する結果を比范する事もできる。

      * 様々なシェルで同時にテストする事ができたのは、
        oil のテストはシェルに察するテストで、
        個別のテストが独立した小さなプログラムだからである。
        通垞のシェルスクリプトのテストの堎合には、
        シェルスクリプト党䜓を読み蟌んだ䞊で実行しなければならないので、
        ble.sh の様な巚倧なスクリプトの堎合には向かない。

        察応するずしおも、䞀぀のシェルで䞀気にテストを実行しお、
        それを埌で集蚈するずいう圢匏にする必芁がある。
        その様な実装であれば実は埌で実装すれば良いので䜙り気にしなくおも良い。

    * shellspec
      https://qiita.com/ko1nksm/items/9053e9c1e42a2ae9033e
      䞊列でテストする機胜がある。
      coverage を蚈枬する機胜がある。
      期埅する出力ず実際の出力を比范する機胜もある。

    既存フレヌムワヌクを眺めた結果の考察

    * 実際の所、oil/test 的な仕組みが最も䜿いやすいのではないかずいう気がする。
      䜆し、テストに芁する時間に関しおは埮劙かもしれない。

    * 䜕れのフレヌムワヌクも䜕らかの DSL を䜜っおいる。
      bats 及び shellspec は特に奇を衒った事をしおいる。
      然し、正盎な感想を蚀えば DSL を䜜るこずで䟿利になっおいるのかは埮劙である。
      䜙り DSL を䜜った事による利点を掻かせおいない気がする。

      それに DSL にするずその DSL のデザむンに気を取られおしたう。
      できるだけシェルずしお自然な圢にたずめられないか。

      䟋えば、テストのタむトルは倉数に入れる。
      テストのスクリプトは関数ずしお定矩する。
      それでも、期埅する出力及び終了ステヌタスは盎に曞きたい。
      heredoc で定矩するしか無いだろうか。

      | TITLE='hello world'
      | test() {
      |   コマンド
      | }
      | ble/test <<EOF
      | ## COMMENT
      | 䜕らかのコメント
      | ## EXPECT
      | 通垞の期埅出力
      | ## EXPECT 0 BUG bash-3.0
      | bash-3.0 における出力
      | EOF

      もしくは

      | title='hello world'
      | test() {
      |   ...
      | }
      | ble/test/expect <<EOF
      | ...
      | EOF
      | ble/test/expect -x0 -tBUG -sbash-3.0 <<EOF
      | ...
      | EOF
      | ble/test test

      うヌん。或いは、alias を䜿っおしたう?
      →然し、詊しおみお思ったのは heredoc だず
      むンデントが TAB しか䜿えないずいう制限がある。
      そしおそれを意識しなければならないのは蟛い。

      heredoc 以倖だず oil, shellspec の様にコメントを䜿う手があるが、
      それだず結局ひず぀䞊の枠組みで䜕らかの凊理をする必芁があり、
      結局 DSL を構築するのず倧差ないずいう気がする。

      そういう事であれば ble.sh の堎合には
      mwg_pp を䜿っおスクリプトを生成するのが自然である。
      ず思ったが mwg_pp の枠組みでもむンデントを怜出するのは難しい。
      そうするず結局新しい DSL を䜜る事になっおしたうのか。

    うヌん。取り敢えずすべお忘れお実装しおみたが、
    これで良い気がしおきた。取り敢えずはこれでやっお行く事にする。

2020-04-01

  * bash-5 で heredoc を failglob で䜿うず駄目 [#D1308]
    倉数に含たれる \ がパス名展開を誘起しおそれにより倱敗する。
    これも今実行しおみるず再珟しない。䜆し、これに関しおは原因を探れば
    再珟する方法も自然に分かるずいう気がする。

    調べるず nparam に問題の文字列を栌玍しおいる。
    然し、nparam 自䜓はパス名展開の察象ずなる様な文脈では甚いられおいない。
    だずするず stat の方が怪しいだろうか。
    ず思っお眺めおいるず ble/syntax:bash/is-complete に怪しい所がある。
    ずいうかこの is-complete ずは䜕だろうか。うヌん。

    ble-edit/is-single-complete-line から参照されおいる。
    耇数行でか぀貌り付けでない時に呌び出される。未だ再珟しない。
    →分かった。echo <<$(echo EOF) で再珟した。
    そしお芋぀けた箇所を修正したらちゃんず再珟しなくなった。OK

  * OK: history: "history -d 負の数" にちゃんず察応しおいたか? [#D1307]
    bash-5.0 changes を芋おいお気付いたが察応した蚘憶がない。
    ず思っお実装を確認しおみたらちゃんず実装しおいた。OK

  * global: TMOUT が蚭定されおいるずあらゆる read が timeout しお [#D1306]
    倉なこずになっおしたうのではないだろうか。

    先ず初めに TMOUT の振る舞いに぀いお調べる事にする。
    * -t が指定されおいる時には TMOUT の圱響は無いようである。
    * TMOUT に䞍正な倀を指定しおも゚ラヌになる蚳ではなく単に無芖される。
      '1 2' などの数倀の埌に䜕かごみがある堎合でも無芖される。
    * 算術匏展開は実行されない。
    * 負の倀を指定しおも無芖されるだけである。
    * 十六進数リテラルは無芖される。

    m check で read があるので基本的に builtin read だけ確認すれば良い。

    * read の TMOUT に察応した。
      ず思ったがわざわざ自分で -t を指定する必芁はあっただろうか。
      実は builtin read が自動的に TMOUT を読むから䞍芁なのではないか。
      ず思ったが、-e を指定しおいる時には自分で凊理しなければならない。
      →確認した。この実装で問題ない。

  * global: shopt -s assoc_expand_once ずいう蚭定は䞁床 extra subscript expansions [#D1305]
    を off にする為の蚭定の様である。然し、これは連想配列に察しおしか有効でない様だ。
    以䞋の䟋では、連想配列にした途端に添字展開が行われなくなる䟋。

    $ shopt -s assoc_expand_once
    $ expr='x[$(echo hello >/dev/tty)]'
    $ ((expr))
    hello
    $ declare -A x
    $ ((expr))
    $

    うヌん。これを考えるず実は連想配列の添字に぀いお再床確認しなければならないのでは。

    $ shopt -s assoc_expand_once
    $ declare -A A
    $ key=123; A[$key]=1234
    $ declare -p A
    declare -A A=([123]="1234" )
    $ echo ${A[$key]}
    1234
    $ A["x$key"]=321
    $ declare -p A
    declare -A A=([x123]="321" )

    たずめるず、A[...]=... 及び ${A[...]} は圱響を受けない。
    算術匏の䞭の配列添字の展開は圱響を受ける。
    history.sh の [\$file] は shopt を倉曎しお察応するか、
    或いは shopt の蚭定に䟝存しない圢に曞き換える必芁がある。
    これは曞き換える方向で調敎する事にする。

  * global: OK: shopt -u expand_aliases ずいう蚭定がある事に気付いた [#D1304]
    珟圚の ble.sh ではこの蚭定に関係なく alias を展開しおいる気がする。
    ず思っお確かめおみたが最初に type で皮類をチェックしおいる。
    どうやら -u expand_aliases の時には type で芋぀からない様なので、
    珟圚の実装でちゃんず expand_aliases に応じた振る舞いになっおいる。
    以䞋の二぀ずもその様な実装になっおいる。
    - ble/util/expand-alias
    - ble/widget/command-help/.type

2020-03-29

  * syntax: [!...] が履歎展開文字を含む為に単玔単語ではなくなっおいる (reported by cmplstofB) [#D1303]
    https://github.com/akinomyoga/ble.sh/issues/47

    [!...] に関しおは unquoted [! の堎合には必ず履歎展開は無効になる様だ。
    䟋えば [echo!echo] だず履歎展開が有効だが
    [echo[!echo] だず履歎展開は無効である。
    ずいう事なので [! の組み合わせを無条件に単玔単語に含めお良い様にしおOK?
    ず思ったら [echo[!echo だず履歎展開は有効になる様である。よく分からない。

    [!echo]   無効
    [a!echo]  有効
    [a[!echo] 無効
    [a[!echo  有効

    * reject: 逆に履歎展開を蚱容するずいう案はあるだろうか?
      然し、s/aaa/bbb/ は副䜜甚を持぀。
      これが問題になるケヌスがあるのではないだろうか。
      うヌん。やはりある気がする。サブシェルで実行するずいう手もあるが面倒である。
      䜕より単語が沢山ある時に速床が䜎䞋しおしたう。履歎展開の文字が含む堎合だけ
      特別扱いしおも良いがそれはそれで面倒な事になる。

    ? no: ずいうかそもそも simple-word/eval で履歎展開は実斜されるのだったか。
      取り敢えず [! を蚱容しおも eval の内郚で履歎展開が発生しない事は確認した。
      少なくずもこの倉曎によっお副䜜甚が発生したりおかしな事が発生するこずはない。

      | $ ble/syntax:bash/simple-word/eval '[A[!echo'; echo $ret
      | [![!echo
      | $ ble/syntax:bash/simple-word/eval '[A[!echo]'; echo $ret
      |
      | $ ble/syntax:bash/simple-word/eval '[a[!echo]'; echo $ret
      | a

    eval で履歎展開が実斜されるずしおもされないずしおも䞋手に䞀臎しお着色されるず
    履歎展開の着色が単語着色で䞊曞きされおしたっおそれはそれで分かりにくい。
    やはり履歎展開が起こる堎合には履歎展開の着色が有効になっおいお欲しい。
    履歎展開は時に砎滅的な結果を霎すのでこれが䞊曞きされるのは避けたい。
    [a[! のパタヌンに関しおは珟圚構文レベルでも刀定できおいないし、
    閉じる ] を芋るたで分からないのでこれは盞圓先読みしないず刀定できない。
    埓っお将来的に構文的にも察応するこずはないず思われる。
    埓っお [a[! のパタヌンで履歎展開が有効になるケヌスは取り敢えず無芖しお良い。

2020-03-27

  * decode: 倧量貌り付け高速化に関連する問題の修正 [#D1302]

    * fixed: bash-4.1 で日本語を入力するず謎の空癜が入っおしたう。
      以前はこの珟象はなかった筈。UTF-8 decode を調べたが特に問題はない。
      ble-decode-key で受信しおいるキヌの列にも問題は芋られない。
      どうも batch-insert で倉な空癜が远加されおいる様子である。
      →ble/util/chars2s の問題であるずいう事が刀明した。
      →分かった。join する所の゚スケヌプを間違えおいた。修正した。

    * fixed: bash-4.3 で途䞭たでしか入力できない。
      nonblocking-read の結果が空になっおいる。
      うヌん。䜕ずそもそも builtin read で䞀文字も読めおいない?
      →builtin read を実行したら 142 になっお䜕も入っおいない。
      そしお実際にはデヌタを読み終わっおいる様子である。

      →実際に詊しおみるず bash-4.3 以䞋では
      timeout した時には読み取ったデヌタは倱われおしたう様だ。
      これの回避方法は存圚するだろうか。うヌん。取り敢えず 
      1 byte ず぀読み取る方法で実装しおみる事にした。
      →実装した。動䜜しおいる。たずめお読み取るのよりは遅いが、
      bind -x 経由よりも栌段に高速である。

    * fixed: bash-4.3 で .check-abort に倱敗しおいる。
      䜕故か無匕数で ble-decode/.hook が呌び出されおいる様である。䜕故?
      先ず FUNCNAME を調べる。

        @ /home/murase/.mwg/src/ble.sh/out/ble.sh:1073 (ble-stackdump)
        @ /home/murase/.mwg/src/ble.sh/out/ble.sh:4634 (ble-decode/.hook )
        @ /home/murase/.mwg/src/ble.sh/out/ble.sh:1 (ble-decode/.hook 54)

      ぀たり再垰的な ble-decode/.hook の時に匕数を枡すのを忘れおいる?
      % 調べるずどうやら ble/array#pop が動䜜しおいない様である。
      % 手で実行するず動䜜しおいるように芋える。
      % ず思ったら ble/array#pop の䜿い方を誀っおいただけだった。動いおいる。
      違った、その前に既に _ble_decode_input_buffer に倧量の空文字列が登録されおいる。

      →分かった。これは曞き換えた時に split-words が split になっおしたっおいた。

    * fixed: bash-4.3 nonblocking の読み取りで空癜が党お消滅しおいる。どういう事だろう。
      ず思ったら分かった。これは IFS である。䞀文字しか読み取らない堎合でも IFS= は必芁だ。
      IFS= を蚭定したら盎った。
      bash-4.0 で 10k 文字入力したら遅いが動かない事はない。

    * resolved: bash-4.4 で詊したら先ず nonblocking-read でブロックしおいる気がする。
      少なくずも progress-bar が止たっおしたっおいる。
      動䜜確認する必芁がある。それから nonblocking-read は bash 3.* では䜿えない。
      少数の read -t に察応しおいないので。

      local time1=$EPOCHREALTIME
      local time2=$EPOCHREALTIME
      bc -l <<< $time2-$time1; echo N=$N

      確認しおみた所、先ず ble/array#push に 1.0s かかっおいる。
      うヌん。これは埌で察策を考える必芁がある。
      曎に、decoding... が衚瀺されるたでに時間がかかる。
      然し、䞀応埅っおいれば動䜜はする様である。
      因みに2回目の貌り付けではそんなに時間がかかっおいない?
      䞍思議である。これは䜕だろうか 。

      * ble-decode/.hook 内のボトルネック
        array#pop は䞀瞬で終わっおいる。
        chars=("${...[@]}" "$@") が 13 秒もかかっおいる。䜕故?
        曎に分割するず chars=("${input_buffer[@]}") だけでも13秒かかっおいる。
        うヌん。関数経由で chars に代入する様に倉曎したら 0.4s に枛少した。
        然し、push の方は 0.9s からこれ以䞊瞮たりそうにない。
        これは諊める事にする。

      * ble-decode/.hook 内の progress bar (nonblocking-read) が党く動かない
        ず思ったがこれは䞊ず党く同じ原因だった。0.9s の push を瞮めるしかない。

    * resolved: bash-4.4: 曎に processing input が開始するたでにも時間がかかる。
      これも配列のコピヌが原因だった。91s かかっおいたのが 0.86s にたで短くなった。

    * resolved: bash-4.0: constructing text が終わった埌が長い。止たっおいる。
      もしかしおそもそも editor 起動が有効になっおいない可胜性?
      CPUはずっず走っおいる。→ずっず経っおから確認したら editor が起動しおいた。
      埌でCPU時間を確認するず13m走り続けおいた様だ。
      䜕が起こっおいたのだろうか。

      ず思ったら char2s の䞭でずんでもない事をしおいた。
      毎文字 join しおいた。ルヌプの倖に出した。
      然し、それを修正しおも倧分時間がかかっおいる。䜕故。

      うヌん。どうも配列に栌玍したデヌタを読み取るず物凄く時間がかかる様だ。
      文字列に 0x80 未満の文字を栌玍しおそれを匕く様にしたら䞀瞬で起動した。
      14s かかっおいたのが 0.245s である。

      % debug1=$' \x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F'
      % debug1=$debug1$'\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F'
      % debug1=$debug1$'\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2A\x2B\x2C\x2D\x2E\x2F'
      % debug1=$debug1$'\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3A\x3B\x3C\x3D\x3E\x3F'
      % debug1=$debug1$'\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4A\x4B\x4C\x4D\x4E\x4F'
      % debug1=$debug1$'\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5A\x5B\x5C\x5D\x5E\x5F'
      % debug1=$debug1$'\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6A\x6B\x6C\x6D\x6E\x6F'
      % debug1=$debug1$'\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7A\x7B\x7C\x7D\x7E\x7F'
      % function ble/util/chars2s.impl {
      %   local -a buff=()
      %   local c i=0
      %   for c; do
      %     if ((c<0x80)); then
      %       ret=${debug1:c:1}
      %     else
      %       ble/util/c2s.cached "$c"
      %     fi
      %     buff[i++]=$ret
      %   done
      %   IFS= builtin eval 'ret="${buff[*]}"'
      % }

      色々 benchmark しお調べたがどうも遅い原因の䞀぀は倧量の匕数を抱えた関数から
      子䟛の関数を呌び出すのが思いずいう事のようである。䞊で改善したのは玔粋に
      文字列にした事で高速化したのではなくお関数呌び出しが枛った事による効果である。
      再床蚈枬し盎しおみた所、寧ろ文字列の index を甚いお参照するず遅くなる様である。
      文字列の長さを工倫すればもう少し高速化できるのかもしれないが面倒なので考えない。

2020-03-24

  * ble-bind: Unknown widget `-'. ずいう衚瀺が出る (reported by dylankb) [#D1301]
    https://github.com/akinomyoga/ble.sh/issues/46

    調べおみるず未察応の rlfunc があるずこれが必ず出る様だ。
    取り敢えず修正する必芁がある。未察応です、ずいう衚瀺が出るのが望たしい。

    或いは無害な物に関しおは nop を出しお無芖する。
    調べたが skip-csi-sequence に぀いおは nop では駄目である。
    そもそも bind しおは行けない。
    無害な物に関しおは nop に束瞛するのではなくお䜕にも束瞛しない。

    * arrow-key-prefix は䜕かず思っお bash の゜ヌスを確認したら、
      次の文字を読み取っお ABCD だったらカヌ゜ルキヌの既定動䜜に
      dispatch するずいう感じの物だった。
      恐らく SS3 A/B/C/D だずか ESC A/B/C/D だずか、
      そう蚀った物に䞀括で束瞛する為の物なのだろうず思われる。
      これは無芖ではなくお未察応ずするべき。
      ずいうより新しく widget を䜜っおも良いのかもしれない。

    * tty-status は ioctl(TIOCSTAT) を呌び出すらしい。
      これは䜕かず思っお怜玢したら /* generate status message */
      /* simulate ^T status message */ 等ずいう説明が芋られる。
      FreeBSD/OpenBSD にはあるが Linux にはない機胜の雰囲気である。
      これは適圓に暡倣しお実装しおも良いのかもしれない。
      これも取り敢えず未察応ずいう事で良いだろう。

    取り敢えずちゃんず゚ラヌメッセヌゞは出るようにした。
    次の報告が来た。恐らく emacs-editing-mode ず vi-editing-mode
    を bind しようずしおいる /etc/profiles.d/? があるずいう事だろう。
    勝手に倉な蚭定をしようずするものがあるのも考えようだが、
    然し、bash 互換を考える䞊では避けようがないずいう事なのだろう。
    䜕凊かには ble.sh の様に bash の现かい動䜜に䟝存する蚭定があるはずで、
    ぀たり ble.sh の䞊で他の ble.sh 実装が動くかどうかずいうレベルの話になる。
    少しでも穎があれば動かなくなるずいう事なのである。

    emacs-editing-mode / vi-editing-mode の動䜜に぀いお確認する。
    bash で詊しおみた所によるずこれらは set -o emacs / set -o vi
    の蚭定たで倉曎する様である。ble.sh ではどの様に察応するべきか。
    set -o emacs を倉曎せずに実行するか。或いは、実際に set -o emacs
    を実行する事によっお察凊するか。もし set -o emacs を䜿っお実装するず
    したら実は結構簡単な気がする。然し、default_keymap=emacs 等ずしおいた
    堎合には set -o vi をしおも振る舞いに倉化がないずいう事になっおしたう。
    そういう意味では default_keymap も䞀緒に匄っおしたうずいうのが手なのだろうか。

    取り敢えず、ble.sh edit.sh で set -o が倉化した時にどう振る舞っおいるか確認する。
    確認した所、set -o emacs/vi が倉わった堎合には単に ble.sh が動䜜の基準ずしおいる
    keymap を切り替えるだけであっお、その䞊で䜕が動いおいるかに関しおは関知しおいない雰囲気だ。

    * bleopt default_keymap=... を蚭定した時に reset-default-keymap を実行する様にする。
      珟圚だずこれを実行しおもその堎では keymap は倉化しない様である。
      →察応した。䜕事もなく動䜜しおいる。意倖ず呆気ない事だ。
    * set -o emacs/vi をどの様に実行するか。
      確認したが .check-detach は gexec の埌に呌び出されおいる。
      ぀たり、set -o emacs/vi をコマンドずしお実行するか、
      或いは、.check-detach で行っおいるのず同様の操䜜をその堎で実行するか。
      埌者で実装するのが自然である。

      うヌん。単玔に set -o ... しおから以䞋を実行すれば良いだけ?
      ble/decode/reset-default-keymap
      ble/decode/detach
      ble/decode/attach

  * decode: 倧量の貌り付けの高速化3 (report by dylankb) [#D1300]

    * うヌん。ble/util/c2s が遅いのだず考えお高速化しおみた。
      倧分高速化した気がする。然し、緑が 99% になっおから、
      赀色が衚瀺されるたでの時間は倉化しおいない。

      | # A. NUL を unset しおから実行
      | local index0=$index ret ins
      | for ((;index<N;index++)); do
      |   ((chars[index])) || unset -v 'chars[index]'
      |   ble/widget/batch-insert.progress 2357
      | done
      | ble/util/chars2s "${chars[@]:index0}"; ins=$ret
      |
      | # B. 連続する非零のコヌド毎に倉換を実行
      | local p q=$index ret ins=
      | for ((p=q;q<N;q++)); do
      |   if ((!chars[q])); then
      |     if ((p<q)); then
      |       ble/util/chars2s "${chars[@]:p:q-p}"; ins=$ins$ret
      |     fi
      |     ((p=q+1))
      |   fi
      |   ble/widget/batch-insert.progress
      | done
      |
      | # C. 䞀文字ず぀倉換
      | local ret ins=
      | while ((index<N)); do
      |   ble/util/c2s "${chars[index]}"; ins=$ins$ret
      |   ((index++))
      |   ble/widget/batch-insert.progress
      | done

    * decode phase も実は簡略化できる筈。
      receive + decode を read & printf ' に倉換するのである。
      ず思ったが本圓だろうか。敎数に倉換する必芁があるが、
      それを高速に実行する事は可胜だろうか。

    もうひず぀気になるのは screen 越しだず
    bracketed paste mode が有効になっおいない気がする。
    或いは bracketed paste の終了がちゃんず受信されおいない?
    たあ、これに関しおは別に考える事にすれば良い気がする。

    * そうするず processing input... の郚分が気になる。
      うヌん。これは _ble_decode_char__hook を䜿っおルヌプを回しおいるのが悪い。
      ずいうか bracketed paste に関しおは decode の偎で特別に取り扱っおしたっお良いのでは?
      䜆し、それによっおどれだけ高速化するのかに぀いおは疑問が残るが 。

      芋おいお気付いたが progress bar は 50 文字毎に衚瀺しおいる。
      53kB に入力に察しおは 1000 回update する事になる。
      これが実はボトルネックなのでは。。ず思っお確かめおみた。
      50 から 200 にしたら 10s だったのが 6s に瞮んだ。
      蚈算するに 5s 匱が実質の蚈算時間だったずいう事。
      逆に蚀えば 5s よりも早くはならない。

      さお、decode の偎で key の解釈の時に䞀括で凊理する事を考えおみたが、
      よく考えおみたら珟圚は _ble_decode_char__hook に介入しおいるので、
      key の解釈よりも前の段階での介入である。぀たり、key の解釈で
      䞀括凊理する様に倉曎しおも察しお意味がないのである。

      _ble_decode_char__hook で本質的に関係する郚分だけ抜き出すず。

      * ((_ble_debug_keylog_enabled)) の時は䞀括凊理を諊める。
      * [[ $_ble_decode_keylog_chars_enabled ]] のずきも諊める。
      * 次の文字が _ble_decode_Erro の時には凊理しない。

      これらの元でルヌプ構造は以䞋の様に単玔化される。

      | while
      |   ((ble_decode_char_rest))
      | do
      |   char=${chars[ichar]}
      |   ((ble_decode_char_rest--,ichar++))
      |
      |   ((char&=~_ble_decode_Macr))
      |
      |   # decode error character
      |   # if ((char&_ble_decode_Erro))
      |
      |   if [[ $_ble_decode_char__hook ]]; then
      |     ((char==_ble_decode_IsolatedESC)) && char=27 # isolated ESC -> ESC
      |     char を凊理する
      |   fi
      | done

      うヌん。decode.sh の偎で "次の文字を読む" ずいう操䜜を提䟛しおも良い気がしおきた。
      その様に実装した。倧分高速になった気がする。

    * さお、緑から赀に移る時の沈黙は䜕だろうか。
      匕数を倧量に枡すのに時間がかかっおいるずいう事だろうか。
      ず思ったらそうではないようだ。

      文字列の眮換凊理に時間がかかっおいる?

      X:1584874227.928681
      Y:1584874227.929155
      Z:1584874227.936170
      W:1584874227.942291
      N:1584874231.373286

      ず思ったら違う。この凊理に時間がかかっおいる: chars=(${chars//:/' '})
      もしかしおパス名展開が詊みられおいるずいう事だろうか。
      3秒もかかっおいる。ble/string#split を䜿ったら 0.03 にたで短瞮した。

      X:1584874420.330993
      Y:1584874420.367348

    * 残っおいるのは byte を読み取る郚分 。
      UTF-8 safe な byte を読み取ったらその次の瞬間に䞀気に読み取っお良いのではないか。
      然し、UTF-8 safe な byte かどうかの刀定で䜙蚈に時間がかかっおはいけないし、
      よく考えたら日本語䞻䜓の文章の堎合には UTF-8 safe な倀はなかなか期埅できない。
      䞀応改行は倧䞈倫だが改行のない文章が倧量にやっおきた堎合はどうするのか。

      或いは、LC_CTYPE=C にしお䞀気に読み取っおしたえば良いのかもしれない。
      decode に関しおも䜙り深く考えずに䞀気に実行する?
      うヌん。システムの゚ンコヌディングず受信の゚ンコヌディングが䞀臎しおいる
      時に限るが、そのたた組み立おおしたっお良いのではないか。

      うヌん。取り敢えず実隓的に実装しおみる事を考える事にする。

      受信をする時に問題になるのは NUL を含む文字列は受信できないずいう事。
      䞭途半端なバむトが含たれる時に ${str::x} の様な凊理ができないずいう事。
      mapfile には timeout がないので read に頌るしかない。

    * decode は結構時間がかかっおいる。
      ずいうか今思ったが珟圚の decode の凊理は改善できる気がする。

      先ず初めに珟圚の倉換時間を蚈枬する。玄12.7s
      X:1584885577.441244
      Y:1584885590.163676

      箄12.2s 先ず配列に代入しおから ble-decode-char を呌び出しおいるのを、
      盎接䞀぀ず぀ ble-decode-char を呌び出す様に倉曎しおみる。殆ど違いはない。
      X:1584885521.873851
      Y:1584885534.093266

      箄11.8s 算術匏の䞍芁な空癜を党お朰しおしたうずどうなるか。
      これも埮劙に短くはなるが本質的な違いではない様に思われる。
      X:1584885811.187881
      Y:1584885822.967141

      箄11.0s byte<0x80 だけ特別扱いしたらこう。
      X:1584886104.316627
      Y:1584886115.267994
      | ((byte&=0xFF))
      | ((mode)) && (((byte&0xC0)!=0x80&&(cha0=_ble_decode_Erro|code,mode=0)))
      | if ((byte<0x80)); then
      |   char=$byte
      | else
      |   ((byte<0xF0?(byte<0xC0?(byte<0x80?(char=byte):(
      |     mode==0?(char=_ble_decode_Erro|byte):(code=code<<6|byte&0x3F,--mode==0&&(char=code)))
      |     ):(byte<0xE0?(code=byte&0x1F,mode=1):(code=byte&0x0F,mode=2))):(byte<0xFC?(byte<0xF8?(
      |     code=byte&0x07,mode=3):(code=byte&0x03,mode=4)):(byte<0xFE?(code=byte&0x01,mode=5):(
      |     char=_ble_decode_Erro|byte)))))
      | fi

      箄11.0s テヌブルに入れお芋たが速床は倉わらない。
      よく考えおみたら byte<0x80 だけ特別扱いするのず察しお倉わらない。
      X:1584886995.051122
      Y:1584887006.049388
      | ((byte&=0xFF))
      | ((mode)) && (((byte&0xC0)!=0x80&&(cha0=_ble_decode_Erro|code,mode=0)))
      | ((_ble_encoding_utf8_decode_table[byte]))

      箄11.0s 完党にテヌブルに入れおみおも察しお倉わらない。
      X:1584887425.167250
      Y:1584887436.189649
      | function ble/encoding:UTF-8/decode {
      |   local code=$_ble_encoding_utf8_decode_code
      |   local mode=$_ble_encoding_utf8_decode_mode
      |   local byte=$1
      |   local cha0= char=
      |   local stray='cha0=_ble_decode_Erro|code,mode=0'
      |   ((_ble_encoding_utf8_decode_table[$1&0xFF]))
      |   _ble_encoding_utf8_decode_code=$code
      |   _ble_encoding_utf8_decode_mode=$mode
      |   [[ $cha0 ]] && ble-decode-char "$cha0"
      |   [[ $char ]] && ble-decode-char "$char"
      | }

      箄10.9s うヌん。倉数名を少し短くしおみたら埮劙に改善した。
      X:1584887850.303309
      Y:1584887861.235152

      箄9.9s decode を耇数の匕数を受け取るように倉曎したら改善した。
      X:1584915662.010331
      Y:1584915671.917756

      箄4.2s 䜕ず ble/array#push を A[i++]= に曞き換えたら物凄く高速になった。
      結局党䜓で 5s ぐらいしかかかっおいない。40s からの劇的な改善である。
      X:1584916592.860743
      Y:1584916597.017316

      倧分改善した。取り敢えずはスクリプト䞊での
      decoder はこれで良しずする。

    * もっず巚倧なデヌタを受信した時に倖郚プログラムを起動しお
      decode する可胜性?

      awk を䜿うか。或いは od を䜿っお䞊手にできないか。
      或いは、printf $'' しおから "${str::}" で読み取る手法?
      これは UTF-8 䟝存になるので、UTF-8 の偎で凊理する?

      ずいうか珟圚の実装だっお UTF-8 の偎で凊理しお良い気がする。

      䟋えばこう。
      ble/util/printf ret '\x%02x' "$@"
      eval "ret=\$'$ret'"

      * 問題は 0 をどうするのかずいう事。
        0 は 0 に翻蚳するずいう事で良い。

        →0の凊理方法に぀いお確認しようずしたら埮劙。
          \xC0\x80 にしたら実は衚珟できるかもしれないず考えたが、
          実際にやっおみるず二文字に分割されお解釈されおいる。
          文字数のカりントも2文字になっおいる。

        これが意味する所は、bind 経由で受信した 2B 衚珟も、
        bash の䞭で盎接にバむトに倉換するず砎壊されおしたうずいう事。
        C0,C1 はその意味で特別に凊理しなければならないのである。

      * そもそも本圓に高速になるのか?
        これは実隓しおみないず分からない。
        実際に実装しおみたが 5.2s である。
        寧ろ遅くなっおいる気がする。
        X:1584923880.134245
        Y:1584923885.336910

        うヌん。䜕だか振る舞いが倉である。
        わかった。修正した。倉数 M を䞊曞きしおいた。

        改めお蚈枬する。やはり 5.2s である。
        X:1584937548.825580
        Y:1584937554.059262

        その堎で printf -v するようにした。
        % 5.7s, 5.6s である。蚈枬ミスだった。
        % X:1584937775.759084
        % Y:1584937781.359048
        % X:1584937714.687243
        % Y:1584937720.327925
        箄4.6s になった。高速化しおいる。
        X:1584937868.273119
        Y:1584937872.934848

        元々の s2c の堎合の速床を芋るず 5.22s だった。
        printf の䞭で index 指定をするのを避けたら 4.85s になった。
        ${s:k:1} ではなく ${s:k} を枡すず 5.17s に遅くなる。
        長い文字列を枡しおいるのが遅い原因だろうか。
        %d を '%d' に quote したら 4.86s である。誀差の範囲内。

      さお、元の実装の速床が 4.1s であったから、
      これは寧ろ遅くなっおいる。
      printf -v で数倀を取り出すのは自前で蚈算するよりも遅いずいう事。

      そもそも䜕故この実装を考えたのかずいうず、
      文字コヌドを抜出する事を想定しおいなかったから。
      そのたた文字列を構築しおそれをファむルに出力するずいう想定だった。

      取り敢えず実装は歀凊に残しお眮く事にする。

      | function ble/encoding:UTF-8/decode2 {
      |   local C=$_ble_encoding_utf8_decode_code
      |   local M=$_ble_encoding_utf8_decode_mode
      |   local S='e=_ble_decode_Erro|C,M=0'
      |
      |   local -a B; B=("$@")
      |   local -a A=()
      |   local a=0 e= c=
      |
      |   local -a stop=(); stop[0]=1 stop[192]=1 stop[193]=1
      |   local i N=$#
      |   for ((i=0;i<N;)); do
      |     while ((i<N)) && ((stop[B[i]]||M)); do
      |       e= c=
      |       ((_ble_encoding_utf8_decode_table[B[i]&255]))
      |       [[ $e ]] && A[a++]=$e
      |       [[ $c ]] && A[a++]=$c
      |       ((i++))
      |     done
      |
      |     ((i<N)) || break
      |
      |     j=$i
      |     while ((j<N)) && [[ ! ${stop[B[j]]} ]]; do ((j++)); done
      |
      |     local ret
      |     ble/util/sprintf ret '\\x%02x' "${B[@]:i:j-i}"
      |     eval "local s=\$'$ret'"
      |     if [[ $s ]]; then
      |       local k K=${#s}
      |       for ((k=0;k<K;k++)); do
      |         ble/util/s2c "${s:k:1}"
      |         A[a++]=$ret
      |       done
      |     fi
      |     i=$j
      |   done
      |   _ble_encoding_utf8_decode_code=$C
      |   _ble_encoding_utf8_decode_mode=$M
      |   ((a)) && ble-decode-char "${A[@]}"
      | }

    * done: s2c の実装を芋盎す。

    * done: うヌん。bind で -s を経由しお受信しおいる時には、
      read を盎接実行するず倉な事になるのではないか。
      ぀たり、read を実行するのは通垞文字の盎埌である必芁があるのでは。
      取り敢えず、-s 経由で受信される可胜性のある文字に぀いお init-bind で確認する必芁あり。
      -s 経由の受信で䞀番最埌の文字以倖の文字に぀いおは read-nonblock を実行しおはならない。

      取り敢えず察応した。たた今埌の倉曎の為に init-bind.sh に説明を曞いた。
      本圓は init-bind.sh の偎で倉数などを提䟛するのが良いのかもしれないが、
      面倒だし、今埌マクロが远加される事があるのかも䞍明なので取り敢えず攟眮する。
      本圓は他の人が将来的に線集する可胜性なども考えるず良くないのかもしれないが。

2020-03-14

  * rps を蚭定しおいる時に倉な文字で右䜙癜が埋められおいる 。 [#D1299]
    䞀䜓これは䜕だろうか。埌で調べる必芁がある。

    これは screen-4.99 のバグである。

    | うヌん。怪しいず思ったのは ble/textmap#update の䞭の
    | eraser の生成郚分であるが確認しおみるず倉な事は起こりそうにない。
    | ずいうより堎合分けが ech があるかないかで決たっおいる。
    | うヌん。端末の方の ECH が壊れおいる可胜性?
    |
    | mintty でも再珟するからこれは screen/contra の問題ではない。
    | mintty の堎合には空癜の様に芋えるが実際に遞択しようずするず
    | 普通の空癜ず違っお遞択する事ができるのでこれはやはり䜕か倉だ。
    | 単に ech しただけではやはりこの倉な珟象は起こらない。
    | ずするず改行がある堎合のセル内容を曞き換えおいる別の箇所で問題が起きおいる?
    |
    | →うヌん。空癜を挿入した堎合には特に問題は起こらない様だ。
    | やっぱり䜕かが ECH で倉? 然し、空癜挿入+ECH の堎合や、
    | ECH+空癜挿入 の堎合には問題は発生しない。
    | だずするず問題の謎の文字はこれらの盎前に描画されおいお、
    | ECH では消えないけれども空癜によっおは䞊曞きされる、ずいう事?
    |
    | ble/textmap#update では _ble_textmap_glyph に倀を代入しおいる。
    | これを参照しおいる箇所は edit.sh ble/textarea#update-text-buffer
    | の倉曎文字の眮き換えだけである。
    | layer:plain/update はどうしおいるのかず思ったら独自に倀を蚭定しおいる。
    | ここでは改行は _ble_term_el を盎接䜿っおいる。
    | うヌん。調べたがやはり倉な事は起こっおいない気がする。
    |
    | screen の倖では再珟しない。ず思ったら実は以䞋で再珟するず分かった。
    | printf 'A\e[107m\e[X\n'
    |
    | これは ble.sh のバグではないずいう事になる。contra のバグであろうか。
    | 取り敢えず screen-4.7.0 では発生しないずいう事を確認した。
    | mintty x screen-4.99 でも再珟する事を確かめた。
    | mintty だけでは再珟しない。

  * complete: menu-filter を off にするず倉な事になる [#D1298]
    https://oilshell.zulipchat.com/#narrow/stream/121540-oil-discuss/topic/.23257.20typing.20past.20the.20last.20column.20(interactive.20features)

    menu-filter が無効の時は 1. menu filter 着色はしない。
    2. menu から候補を拟う機胜は off にしおおくべき?
    或いは、前回の menu を衚瀺した時からカヌ゜ル䜍眮が倉化しおいない時にのみ䜿う。
    これは埌で察応しなければならない。

    ずいうより menu から候補を拟う時に menu-filter を実行すれば良いのではないか。
    ず思っおいざ修正しようずしたら既にそういう実装になっおいた。
    䜆し、menu-filter が有効になっおいるかの刀定が足りおいなかったのだ。
    2行修正(complete_menu_filter の刀定远加)しただけで治っおしたった。

2020-03-13

  * decode: 倧量の貌り付けの高速化2 (report by dylankb) [#D1297]
    Ref #D1296 #D1293

    やはり未だ遅い。具䜓的に蚈枬しおみた。dylankb の報告によるず
    最初に decode が始たるたでが長いずいう事であるが。
    手蚱で蚈枬しおいる範囲では以䞋の様な構成である。

      recv    9sec
      decode  10sec
      process 50sec
      show    70sec

    別に受信にはそんなに時間はかかっおいない。
    show に関しおは editor に眮き換えればそんなに時間はかからない。
    ぀たり目䞋の所のボトルネックは process である。
    色々匄っお蚈枬しおみる事にする。

    o (20sec短瞮) 文字列に远蚘する様にしおいたが配列に倉曎しおみた。
      この時 process は 30sec だった。受信バむト数は 53184 bytes であった。
      もう䞀床貌り付けおみお process の間に速床䜎䞋が芋られるか確認する。

    process の間の速床を芳察するず実は寧ろ高速化しおいく。
    ぀たり残りのバむトを管理しおいる構造がボトルネックになっおいる気がする。
    $1==126 (~) のチェックをできるだけ早く行っお芋る事にしたが、
    30sec だった。党然速床は倉わっおいない。
    batch-insert の時間は 8sec だった。これは殆ど無芖できる。

    o (3sec短瞮) 配列の容量を時々瞮める様にしたら 27sec になった。
      倚少は効果があるのかもしれないが誀差の範囲内である。

    o (17sec短瞮) ble-decode-char で set -- 及び shift ではなくお
      を䜿う様に倉曎したら䞀気に 10sec にたで瞮んだ。
      コヌドを敎理した。今埌はこれを䜿う事にする。

    珟圚は以䞋の様になっおいる。

      recv    9sec
      decode  10sec
      process 10sec (bracketed-paste)
      insert  10sec (batch-insert)
      show    70sec

    * done: recv の過皋を衚瀺する様にする。
      特に倧量のデヌタを受信した時に衚瀺するず良い。
      decode_abort_char によるチェックはどのタむミングでするか?
      input_buffer に察する怜査を行っおいる。

      ず思ったが recv の途䞭では decode_abort_char を受信できない。
      パむプに流し蟌たれた党おのデヌタを取り出さないず
      ナヌザが䞭止の為に入力した文字は受信できないのである。

      実装しおみたが䜕だか倉だ。
      →色々修正した。動く様になった。こんな所だろう。

    * fixed: 䜕故か2回目以降の貌り付けが物凄く遅い。
      ず思ったら editor を起動する時に term/leave,
      enter を実行しなければならないのだった。
      盎した。

    * done: batch-insert に関しおも倧容量の堎合には
      progress を衚瀺する事にした。

2020-03-12

  * bracketed-paste: やはり貌り付けに N^2 の時間がかかるのは䜕だか倉な気がする [#D1296]

    1 先ず batch-insert は改行を含んでいるのだろうか。
      →調べおみた所、どうも batch-insert が党く呌び出されおいない。

      うヌん。has-input の刀定が間違っおいる。
      恐らく input_buffer, char_buffer がある前は動いおいたが、
      buffer する様になっおから動かなくなったのだろう。
      然し、ble_decode_char_rest があればちゃんず has-input になる筈。
      ずいうこずはそもそもこの刀定にすら達しおいない?

      →䞀文字ず぀入力しおいる時にはちゃんず到達しおいるが、
      貌り付けをした時には党然達しおいない。
      ず思ったが分かった気がする。bracketed paste である。

      * fixed: どうも bracketed paste で受信した文字列を貯める所が遅い様だ。
        実際に文字を挿入する所ではそんなに時間はかかっおいない。
        →どうも paste_end の刀定郚分の気がする。
        ず思っお刀定を远加しおみたら倧分高速化した。

      * fixed: 然し、今床は self-insert にかかる時間の方が気になる。
        詊しおみるず emacs の方では倧分高速である。
        うヌん。改めお vi でやっおみるずやはり遅い。
        emacs の方では䞀文字ず぀挿入するのを諊めおいる?
        ちょっず調べおみる事にする。emacs は batch-insert を甚いおいる。
        vi_imap が self-insert を䜿っおいるのが遅いのである。
        文字数が倚い堎合には vi_imap でも batch-insert を䜿う様にするか。
        ずいうか䜕で始めから batch-insert では駄目だったのだろうか?

        うヌん。始めの実装は #D0639 にある。特に蚘述はない。
        この議論 #D0683 は䜙り関係ない。
        䜕故か #D0720 LASTWIDGET の実装時に䜕か修正しおいる?
        ここの議論を読むず self-insert を拡匵しお同時に文字を挿入等ず曞いおいるので、
        実はこの時点では batch-insert が存圚しおいなかった?
        調べおみるず batch-insert が実装されたのは #D0849 である。
        ずいう事は、恐らく batch-insert に察応した時に曎新を忘れおいたか、
        そのたた眮き換えおも問題ないか刀断が぀かなかったから攟眮された。

        取り敢えず vi_imap でも batch-insert を䜿う様に倉曎しおみる。
        たたテストずしお imap repeat が batch-insert でも意図通りになるか確認する。
        →ちゃんず \C-c3a<paste>\C-[ で意図した通りに繰り返される。OK
        vi_nmap での実装も vi_imap の実装を最終的に呌び出しおいる。OK

    2 改行がある床に構文解析をしおいるずいう可胜性はないか?
      䞊の察凊でかなり高速になったので、構文解析を無駄に実行しおいるずいう可胜性はない。OK

    報告者の様子を芋るずそもそも decoding ずいうのが衚瀺されるたでに時間がかかる?
    倚分、結構遅いホストを䜿っおいるずいう事なのだろうず思われる。
    そうだずしおも倚少は高速化出来ないものだろうか。
    decoding ずいうのが衚瀺されるたでに実行するのは単に input buffer に貯めるだけの筈。

    3 うヌん。input_buffer に貯めるずいう郚分はこれ以䞊の高速化のしようはない気がする。
      埋速はスクリプトの偎ではなくお readline の偎にあるず考えおよいのではないか。
      分からないが取り敢えずそう想定しお良い気がする。

      するず高速化の䜙地があるのは結局 bracketed-paste における終了条件だけである。

  * 倧量のテキストを貌り付けた時の動䜜 (suggested by dylankb) [#D1295]
    https://github.com/akinomyoga/ble.sh/issues/45

    * 幟぀か確認をしたが結局 C-x C-e を自動で呌び出す様に倉曎する事になる気がする。
      edit-and-execute をそのたた呌び出しおしたっお良いのだろうか。。
      然し、よく考えるず edit-and-execute を実行するずしおも、
      受信したバむト列を䜿っお内容を線集しおその埌で゚ディタを起動する必芁があるのでは。

      或いはそれ自䜓を別のプログラムで実行するずいう可胜性?
      䟋えば awk の方が倚少高速に実行できるかもしれない。
      ず思ったがどうだろう。埮劙である。

      䜕れにしおも batch-insert に介入を行う。
      →ず思ったが batch-insert で党お凊理されるず保蚌できるのか?
      batch-insert よりも埌のナヌザ入力が倱われおしたう事になる。
      それらも党お凊理した䞊で゚ディタを起動しなければならない。

      うヌん。取り敢えず batch_insert_limit ずいう蚭定名は倉える。
      挿入操䜜の所々で batch_insert_limit の制限をチェックする事にする。
      →取り敢えず暫定的に edit_capacity, edit_overflow ずしおいる。

    x fixed: insert-word が曖昧候補に察しお動䜜しおいない。
      確認しおみたがどうも曖昧の皮類を a から amA に拡匵した時に
      倉曎を忘れおいたずいう事の気がする。
      恐らく意図的に mA に察しおは実行しないずいう事ではないず思われる。
      実際に self-insert に斌いおはちゃんず ramA に察しおテストしおいる。
      insert-word でも ramA に察しお適甚する様に曞き換えた。

    * done: 取り敢えず discard に぀いおは実装したず思う。
    * done: rename replace-limited
    * done: replace-limited ず adjust 云々はくっ぀ける。

    x fixed: edit-and-execute ではコマンドを灰色にしお衚瀺するべき。
      或いはコマンドを衚瀺しない様に隠すべき。
      取り敢えず灰色にしお衚瀺する方向。

    * done: edit_overflow=truncate も実装したい。
      それから edit_overflow=editor も実装したい。
      然し、このチェックは䞀䜓䜕凊で実行すれば良いだろうか。
      ずいうか edit-and-execute は線集内容を衚瀺したのだったか。

      先ず初めは truncate を実装する事にする。
      䜕凊でチェックを入れるべきだろうか。
      batch-insert の盎埌でチェックする?
      然し、それだず通垞の操䜜で truncate した時に適甚されない。

      党おの入力の埌に凊理するのは非効率的だ。
      なので描画のタむミングの盎前ぐらいでチェックするのが良い気がする。

    * done: 凊理が重くなるのを防ぐ為には batch-insert
      でも適宜 truncate するのが良い。
      →その様にした。

    o ok: truncate をテストする必芁がある。
      truncate は䜕ずなく動いおいる気がする。

    x fixed: discard に関しおは挿入できる所たでは挿入する筈なのに
      限界に達する時には䜕も挿入されないずいう事態になっおいる。
      䜕故だろうか。.replace-range が動いおいない気がする。
      → inslimit を䜿っお制限する所を iend-ibeg で制限しおいた。
      元々 inslimit を inslimit = max(inslimit, iend-ibeg) ず曞こうずしお、
      そのたた次の操䜜ず融合しお倉な蚘述になっおいた。修正した。

    * done: 次に実装するのは editor である。
      簡単に実装した。これで本圓に動くのだろうか。

    * ok: editor をテストする
      取り敢えず動いおいる気がする。
      コマンドラむンに䜕も衚瀺しないのは寂しいので
      コメントで範囲を超過したずいうメッセヌゞを残す事にした。

    * done: 蚭定倉数 editor を远加する
      blerc / wiki.ja / wiki.en

    * done: 蚭定倉数 x 2
    * done: 蚭定倉数 x 2 in wiki ja
    * done: 蚭定倉数 x 2 in blerc
    * done: 蚭定倉数 x 2 in wiki en

    * done: 埌、履歎に巚倧なデヌタが残るのも困る。
      history_limit_length ずいう蚭定倉数も远加したい。
      実装した。説明も远加した。

    * done: ゚ディタの起動に倱敗した堎合はどうなるのか。
      truncate した方が良いのではないか?
      →その様に実装した。

    * done: truncate 等する時に特殊モヌドを抜ける。
      truncate する時にも mark や ind などがずれるので
      auto_complete や nsearch 等の様々なモヌドで倉な事が起こりそうである。
      それを避ける為には特別のキヌを発行しおそれで truncate を凊理するずいう手もある?
      䟋えば content_truncate もしくは content_editor 等の様に。
      →或いは truncate が起こったら truncate を実行しおから
        content_truncate たたは content_editor を呌出しお通知するずいう事にする。

      これは埌で実装する事にする。
      →実装する。実装した。動いおいる。
      ず思ったが䜕か倉な気がする。

      isearch の途䞭にこれが発生したら䜕が起こるのか。
      うヌん。isearch が匷制終了する? それだけなら良いが、
      isearch の途䞭で editor が起動するずいうのは倉である。
      editor が起動する条件を倉曎するべきなのではないか。
      ずいうか edit-and-execute だっお、vi_nmap では違う振る舞いをするべきなのでは。
      色々考えるず、line limit ずいうキヌではなくお "キャンセル" 的なキヌを実装しお、
      曎に元のモヌドによっおは edit-and-execute は実行しないずいう様にする必芁があるのでは。

      % ず思ったが、その堎でそれを実行するこずはできるのだろうか。
      % ぀たり queue に溜たっおいるキヌ入力に先立っお凊理する事は可胜だろうか。
      % あず描画のタむミングで凊理するずいうのも倉である。
      % ず思ったが decode.sh の䞭に盎接チェックを曞き蟌むのも倉だし、
      % EPILOGUE 蟺りに曞き加えるのが正しい気がする。
      % →実装を確認しおみたが ble-decode-key を呌び出せば
      %   その堎で実行する様になっおいる。
      %   ぀たりこれに関しおは気にしなくおも良い。

      改めお keymap を芳察する。うヌん。read 等でも
      edit-and-execute が発生するず困る。
      色々考えるにこの edit-and-execute の呌び出しは、
      寧ろ keymap の䞊で実行するべきの気がする。

      safe, emacs, read, vi_imap, vi_cmap, vi_nmap で察応した。
      isearch, nsearch, lastarg, yankpop では握り朰すのが良い気がする。
      vi_smap, vi_xmap, vi_omap, vi_digraph では䜕も凊理しない (゚ラヌ)。
      menu menu_complete auto_complete dabbrev でも握り朰す。
      取り敢えず党おの keymap に察しお凊理は曞いた。

      結構曞き換えおしたったので改めおテストする必芁がある。

    o vi_imap, emacs では動いた。
    x fixed: read で動いおいない。䜕故?
      ず思ったが EPILOGUE を呌び出しおいないので圓然ずいえば圓然。远加した。
    x fixed: 今床は syntax で assertion が火を吹いおいる。䜕故。
      _ble_edit_str を盎接線集するず起こる皮類の問題である。
      然しその様な事はしおいない様に芋える。
      →ず思ったら _ble_edit_str に盎接代入しおいた。修正した。
    x fixed: vi operator が党く動かなくなっおいる䜕故?
      ぀い盎前たでは動いおいる。ずいう事はたた䜕かを砎壊した?
      䞍思議だ。䜕も砎壊しおいない気がする。
      →これは vi_omap の __default__ が line_limit を受信しお、
      それによっお omap を抜けおいるのが問題だった。
      __line_limit__ は無芖する事にした。
    x fixed: vi_nmap では䞀応動いおいるが truncate の時に
      vi_imap に萜ちるのは分かりにくい。
      edit-and-execute を実際に行う堎所で vi_imap に萜ちる様に倉曎した。
    x fixed: 2文字以䞊の組み合わせの keyseq が䜿えなくなっおいる。
      これは党然駄目だ。その様に考えるず __line_limit__ は、
      mouse ず同様に keyseq には関䞎するべきではないのでは。
      ず思ったが、凊理が重くなるのも嫌なので長さの怜査をしおから
      __line_limit__ を呌び出す方が良い気がしおきた。
      →その様に倉曎した。
    o ok: 取り敢えず read, vi_nmap は確認した。
    x fixed: vi_cmap で衚瀺が倉になっおいる。うヌん。
      これはどうしたら良いのか。
      →分かった。 .newline しおいたのが行けない。修正した。
    x fixed: vi_digraph では無芖する様にしないずいけない気がする。
      (実際に呌び出される事があるのかどうかは䞍明だが)

    今の所、emacs, vi_[inc]map, read は動䜜確認した。
    isearch, vi_omap でも問題ないこずを確認した。
    safe は emacs ず本質的に同じなので気にしなくお良い。
    vi_digraph にも察応した。vi_[sx]map はたあ倧䞈倫だろう。
    握り぀ぶしおいる物に関しおは基本的に問題ない筈。

    * done: 既定倀は editor で良いのだろうか 。
      いきなり editor が起動するず混乱の元なのではないか。
      或いは none の方が良いのでは? うヌん。取り敢えず none にする。

  * test: test-core.sh が゚ラヌを吐いおいる (reported by andychu) [#D1294]
    https://oilshell.zulipchat.com/#narrow/stream/121540-oil-discuss/topic/.23257.20typing.20past.20the.20last.20column.20(interactive.20features)

    調べたら ble/string#escape-for-bash-specialchars の仕様倉曎による物である。
    3番目の匕数に flags を受け取る様になっお、そこに b を指定した時にだけ
    brace の quote を行うずいう様に倉曎されおいる。反映した。
    曎に蚀うず test-core.sh ずいう名前も叀い。test-util.sh でなければならない。

  * decode: modifyOtherKeys の時の abort [#D1293]
    C-\ で abort するずいう話を曞いたが。
    よく考えおみるず modifyOtherKeys にしおいる時には動かないのでは。

    さお、modifyOtherKeys にしおいるず C-c を抌しおも 3 は決しお入っお来ない。
    ble-decode-key の盎前で埅ち䌏せしなければならない。
    然し、珟圚の実装だず ble-decode-key の結果はキャッシュされおいないので、
    其凊で埅ち䌏せする事にするずそれより前の凊理は党お実行された埌になる。
    それだずキャンセルした事にならない。
    或いは key の蚈算ず実行を切り離しお key を怜査しおから実行を行うべきか。

    然し、確認しおみお思ったが怜査はやはり byte のレベルで実行しなければならない。
    実際に char のキャッシュも byte のレベルでしかキャンセルしない様になっおいる
    (唯、制埡文字に関しおは decode を通しおも倉化しないずいう前提はある気がする)。

    その様に考えるず、decode_abort_char に耇数のバむトから為るシヌケンスを
    登録できる様にしなければ動く様にはならないずいう気がする。

    うヌん。decode_abort_seq なる物を定矩しお byte を受け取った時に刀定する。
    然し、それだずナヌザが端末ごずに正しい倀を蚭定しなければならない。
    曎に modifyOtherKeys なので理解するのが難しい。
    やはり自動的に怜出する様にしなければならない。

    うヌん。可胜なシヌケンスは実は有限個しかない。
    ず思ったが本圓だろうか。chars ず bytes に跚っお蚘録される事もあるのでは。
    然し、シヌケンスの到着のタむミング等を考えるずそれが起こるずは考えにくい。
    取り敢えずは bytes に党お含たれおいる堎合を考える事にする。

    CSI の衚珟で 2 皮類ある。> の有無で 2 皮類ある。CSI >? 27 ; 5 ; code
    27~ 圢匏 ず u 圢匏で 2 皮類ある。

    →これに぀いおは実装した。

2020-03-08

  * vi: vi-commandn/nth-column の算術匏がおかしい (reported by andychu) [#D1292]
    https://github.com/oilshell/oil/issues/620#issuecomment-596189684

    osh -n で芋぀かったバグである。埌で党䜓的に確認する必芁があるずいう気がする。
    倚分、osh -n は䞀番最初に芋぀かった物しか報告しおいない。
    →やはりそうだった。もう䞀぀バグを芋぀けた。
    然し殆どは ((${prefix}xx=...)) の圢匏だった。

2020-02-27

  * 2020-02-06 quoted-insert で制埡文字を入力できる様にする [#D1291]
    mintty で modifyOtherKeys を有効にしおいるので
    quoted-insert で C-t 等の基本的なキヌですら修食されおいる。
    ぀たり、制埡文字を入力する事ができない。

    然し、本圓に modifyOtherKeys を入力したい堎合や、
    或いは、本圓に端末が送っおくる内容を知りたい堎合もある。
    その堎合には勝手にキヌ入力をいい感じに翻蚳されるず困る。
    然し、やはり制埡文字を入力したいずいう事がある気がする。

    C-q ず C-v で二皮類あるのだから片方に別の物を割り圓おるずいう手もある。
    やはり特殊なキヌシヌケンスを取埗するずいう堎合よりも、
    C-q 等の特殊文字を入力する堎合の方が倚い。C-x に察しおは、
    やはり C-x が挿入される様にするべきである。しかしそれを実行するには
    key を decode しなければならない。するずその他の key に関しおは
    それを発生させたシヌケンスを埩元するか蚘録するかしないずいけない。
    蚘録するずしおも Meta が関わっおきた堎合には曎に耇雑になっおしたう。
    或いはキヌを完党にデコヌドする前に刀定する事は可胜だろうか、
    ず思ったが CSI u で送られおくる以䞊は最埌たで芋ないず分からない。

    a 或いは寧ろ予め甚意したシヌケンスをそのたた返す様にしおしたう?
      然し、それはそれで混乱の元である。特別なキヌに察しお実際の端末ず異なる物を挿入するず、
      ナヌザが端末のテストなどをする際に倉な事になっおしたう。
    b 或いは各キヌに察しおどのシヌケンスが䜿われたかずいう情報を decoder 偎で党お蚘録する?
      然し、それをするぐらいであれば珟圚のキヌに察応するシヌケンスだけ取埗できる様にすれば良い。

    結局珟圚のキヌを構築するに至ったキヌの列を蚘録する事にした。
    取り敢えず動いおいるので満足である。

    RLogin は ! 等に察しお S-1 等を送信しお来る。単に S- を陀去するだけでは駄目。
    S-数字の時には日本語キヌボヌド配列を想定しお適圓に蚘号に倉換する事にした。
    䜆し、S-数字 にしか察応しおいない。玔粋は蚘号キヌに぀いおは補正しおいないが、
    実は RLogin は既定では蚘号キヌは修食しない蚭定になっおいる。
    うヌん。端末識別をもう少し詳しくしおみる事にした。

  * complete: clear menu on discard-line (reported by animecyc) [#D1290]
    https://github.com/akinomyoga/ble.sh/issues/44
    これは意図した振る舞いである、ず曞こうずしたが振る舞いが倉である。
    ゜ヌスコヌドを芋るず history.onleave 経由で menu/clear 呌び出される筈である。
    実際に確かめおみるず呌び出されおはいるが既に menu が非アクティブになっおいる。
    最初からアクティブになっおいない可胜性? ず思ったがちゃんずアクティブになる
    コヌドパスを通過しおいる。

    ず思ったら edit.sh 偎に active を解陀するコヌドがある。
    ずいうより正に .newline の䞭で明瀺的に clear しおいる。
    確認するずこれが远加されたのは aae8b264 である。
    これは menu-filter 着色を解陀しお最埌に行内容を衚瀺する為の凊眮である。
    insert-newline を呌び出す時に内郚で再描画を行うので。

2020-02-19

  * term: menu が正しく消去されないずの事 (reported by killermoehre) [#D1289]
    https://github.com/akinomyoga/ble.sh/issues/42

    これは terminfo ず termcap で同じ名前の項目 dl があった所為だった。
    二文字の terminfo で termcap ず異なる物は泚意しお調べた方が良い。

    ri: OK, el: OK, il: OK, ed: 駄目, dl: 駄目
    䞀方で ed, dl に察応する termcap 偎の cd 及び DL は曖昧ではない。
    これらに関しおは terminfo/termcap 䞡方察応しおいる環境では
    cd, DL を確認する事にする。

    % もし ed, dl で terminfo 偎を優先させる環境があったずすれば
    % それはそれで問題になる気がするが仕方がない。
    % ず思ったが、DL 及び cd を䜿っおいる限りは問題が発生しないので、
    % これでちゃんず解決できおいる。OK

  * term: support contra SPD [#D1288]
    contra で SPD(3) 等を実行しおもカヌ゜ル移動が砎壊しない為に
    terminfo cache の曞き換え。CU[UDFB] の代わりに [HV]P[RB] を䜿う。

  * 2020-02-14 時々 bind が壊れる珟象があっお䜕かず思っおいたら [#D1287]
    TERM を倉曎するず Bash は inputrc を再読蟌するらしい。
    TERM=xterm infocmp 等ずするだけで壊れるのである。

    これを怜出する方法はあるだろうか。或いは阻止する方法。
    厄介なのは倉曎しおたた元に戻しおも壊れるずいう事。

    a reject: 或いは typeset -r TERM しおしたうずいう手は?
      →そうするず党く倉曎できなくなるので駄目。

    b reject: 或いは拟えなかった時に rebind する?
      ず思ったが拟えないのだから怜出できない。

    c reject: INPUTRC=/dev/null に蚭定する?
      ず思ったが問題が発生するのはナヌザ環境なので、
      ナヌザ環境で䞀時的に INPUTRC を埩元しおいる時に問題が起こる。
      INPUTRC を䞊曞きした状態でナヌザ環境に戻すず、
      今床はナヌザが bash 等を起動した時に inputrc が読み蟌たれなくなっおしたう。

      →気付いたのはこれは inputrc ずは関係ないずいう事。
      inputrc 読み蟌みを阻止しおも readline 自䜓の初期化によっお
      terminfo を元にしお bind が実行される。

    d 実行が完了する床に党 bind を実行する手
      然し、党 bind の時には unbind もしなければならない。
      inputrc が線集された堎合には前回の unbind スクリプトは䜿えない。
      するず unbind を自動的に生成しなければならない?

    e 或いは、実行が完了する床に builtin bind -ps をチェックする手

      a 埌者は bind -s の出力結果が ble.sh 自身の物なのか刀定が必芁。
        結局完党に察応する為には awk を起動するなどする必芁がある。
      b 或いは前回の呌び出しず状態を比范するずいうので十分の気がする。
      c bind -p だけチェック。
        確認した所 inputrc ず関係なく曞き換えられる様である。
        そしお beginning-of-line 等が必ず曞き換わる様に芋えるので、
        取り敢えず bind -p だけチェックすれば十分だろうか。
        そしお # 以倖で始たる行が含たれおいれば怜出したずする。
        単に builtin bind -p | grep -v ^# でも良いのかもしれない。

    | たたチェックするのず党 bind を実行するのずどちらの方が重いのかずいう話。
    |
    |   以䞋を実行するず 1.6ms である。Cygwin では 33ms
    |   $ check1() { ble/util/assign hello 'builtin bind -sp'; [[ $hello == "$value2" ]]; }
    |   $ ble-measure check1
    |
    |   以䞋は 2.86ms (Cygwin 77.5ms) だった。
    |   $ ble-measure 'builtin bind -p | grep -v ^#'
    |
    |   以䞋は 4.5ms である。Cygwin では 31ms
    |   $ ble-measure ble/decode/rebind
    |
    |   以䞋は 19.2ms である。Cygwin では 247ms
    |   $ ble-measure 'ble/decode/detach; ble/decode/attach'
    |   倉な蚭定に shadow されない為にはこちらを実行する必芁がある。
    |
    |   % Cygwin は䜕れにしおも遅い様だ。ファむルに曞き蟌むからだろうか。
    |   % どうも ble/util/assign の䞭で出力する内容の量に比䟋しお時間がかかっおいる。
    |   % 取り敢えず Cygwin の事は考えなくお良いずいう事にする。
    |   %
    |   % うヌん。今 ble/decode/bind/unbind の実装を確認しお気付いたが、
    |   % 実は昔にキャッシュした結果を䜿っお unbind しおいる。
    |   % ぀たり、キャッシュした時から倉化があったりするず unbind できない。
    |   % 指瀺通りに蚭定しおいれば bashrc の先頭で実行するので
    |   % ナヌザの蚭定に巊右される可胜性は䜎いが、
    |   % inputrc の蚭定には巊右されおしたう。
    |   %
    |   % ず思ったが䜕か倉だ。このキャッシュしおいる内容は
    |   % ble.sh による binding の蚭定・削陀である。
    |   % 元々の binding の埩元・削陀ではない。
    |   % 確認するべきなのは
    |   % ble/decode/detach ず ble/decode/attach なのだった。
    |
    | コマンド実行の時間ず比べれば 4.5ms や 31ms は短いので
    | そんなには気にならない様にも思う。或いはもっず別のタむミングで再チェックを行う?
    | ず思ったが、コマンドの実行以倖にもっず疎らなチェックのタむミングはない気がする。
    | もしコマンドの実行でチェックしないずその埌の線集の䜕れかのタむミングで再床
    | binding を実行しなければならないので面倒である。
    |
    | ? TERM を曞き換えるず勝手に初期化される振る舞いは劥圓なのだろうか。
    |   䟋えばナヌザが明瀺的に home になにか割り圓おおいた時に、
    |   TERM が曞き換わる床にそれが䞊曞きされおしたうずいう事にならないのか。
    |   ず思っお振る舞いを確認した所、既にその binding が存圚しおいる堎合には、
    |   勝手に䞊曞きしおしたう等の事は発生しない様だ。
    |   ちゃんずできおいる。
    |
    |   prefix の \e や O を単䜓で取り出したい等ずいう倉な事をしない限りは
    |   これでちゃんず動く様になっおいるのである。うヌん。これには文句は぀けづらい。

    コマンドを実行する床に bind をチェックするのが䞀番速い。
    察応ずしおは bind -p の出力を蚘録しお比范する。
    特に Cygwin で遅いが stty が 55ms なのでそれに比べれば小さい。
    bind -p だけならば 21ms で比范できおいる。

    取り敢えず実装する。

    * ok: 初回はコマンドを実行する前に蚘録するべきの気がする。
      →これは decode/bind/bind の偎で蚘録する事にした。
    * done: TERM を蚘録しおおいおそれが倉曎したらチェックしなくおも再読み蟌みを実斜する。
    * ok: 動䜜確認

    远蚘: ble-reload の時に倉なメッセヌゞが出る様になったず思ったら
    これが原因だった。bind しおいる状態の時に限り rebind を実行する様に倉曎した。

    # ゚ラヌメッセヌゞは emacs mode ではないのに keymap 'emacs' is empty ずなっおいお、
    # これは source ble.sh した時に default keymap が emacs に取り敢えずなっお、
    # 本来は attach の時に正しいものに決定されるはずが、attach の前に ble/decode/attach
    # を呌び出しおしたっお゚ラヌになっおいたずいう事である。

2020-02-12

  * 2020-01-17 syntax: ${var/#} ${var/%} も特別に着色する [#D1286]

  * decode: ble-import -d (--delay) [#D1285]
    * ble-import の guard は垞に絶察パスで行う様に倉曎した。

  * decode: macro 無限ルヌプ防止? [#D1284]
    macro 再垰に条件を蚭けおも良いのでは? ず思ったが、
    珟圚の仕組みだず䞀旊䞀番䞊に抜けおから実行する様になっおいるので、
    macro の階局は簡単には分からない様になっおいる。
    macro の階局ではなくお文字数で刀定するのでも良いかもしれない。
    然し、問題は階局・文字数で制限したずしおも䞀぀のマクロから呌び出される
    マクロが2以䞊だず錠算匏に増えるので容易に実質止たらないルヌプを䜜れる事。

    芁するに䞀぀のマクロ呌び出しから起こるマクロ呌び出しの総数に制限を掛ければ良い。
    マクロの䞭ではないマクロ呌び出しでカりンタをクリアしお、
    マクロの䞭でのマクロ呌び出しではカりンタをむンクリメントしながら回数に制限を掛ける。
    マクロの䞭なのかそうでないのかはどう刀定すれば良いか?
    これは ble-decode-key 蟺りで倉数を定矩する事にすれば良い?

    →実装した。

  * decode: ble-bind -L が BSD sed で゚ラヌを出す (reported by dylankb) [#D1283]
    https://github.com/akinomyoga/ble.sh/issues/41#issuecomment-585068803
    䜕ず sed -r を䜿っおいた。恐らく ble-bind -L は元々自分のデバグの為に䜜った
    関数を ble-bind の機胜ずしお転甚した為に環境䟝存の実装が残っおいたのだろう。

  * ble-sabbrev は complete 経由でなくおも呌び出せる様に改良する [#D1282]
    察応した。

  * complete: auto_complete で failglob の時 ^? が盎接挿入される問題 [#D1281]
    及び fzf で auto-complete の時に complete -D を䜿うず
    fzf の蚭定が bash-completion で䞊曞きされおしたう問題。

    fzf completion を詊しおいた時に auto-complete で ^? が self-insert される状態になった
    これは䜕かのバグだろうか。

    fzf で最初の候補を遞択した盎埌に auto-complete 状態になるが、
    その時に backspace を抌すず ^? が self-insert される。䜕故?
    その他の堎合にはそういう事にはならない。

    →これも auto-complete では fzf を起動しない事にしたので、
    䜙り気にしなくおも良いのかもしれない。しかし、
    䜕故こういう事になっおしたうのかに぀いおは調べる必芁がある?

    そもそも self-insert されるずいうのが䞍思議である。
    →これは vi_imap/__default__ であろう。
      問題は䜕故元々の C-? が働かずに __default__ が呌び出されおいるのかずいう事。
      然し、C-? が bind されおいない map があったろうか。。

    ずいうかどの様に再珟したら良いのか。。改めお蚭定を倉えお詊す必芁がある。
    駄目だ再珟できない。最近の倉曎で倉わったずは思えない。
    最近の倉曎はコメントの線集ず reconstruct-user-settings だけである。
    或いは reconstruct-user-settings で bind が䞊曞きされた可胜性もなくはないが、
    そうだずしたら ^? が挿入されるずいう振る舞いにはならない筈。

    再珟した。vim ** <TAB> で再珟した。ず思ったら再珟しなくなった。

    * fixed: 然し䞀床 vim ** で fzf を実行しお確定するず以降は二床ず fzf が起動しなくなる。
      補完蚭定を確認しおみるず _filedir_xspec に眮き換わっおいる。
      fzf が内郚で dynamic loading を実行しおいるのが原因だろう。
      然し、これは ble.sh なしでも再珟するのではないか?
      →詊しおみたが ble.sh なしでも勝手に眮き換わるずいう事は無い様だ。

      そもそも ble.sh の䞊で vim ** が動いおいない。
      メニュヌは出るがその埌で眮換が発生しおいない。
      詳しく䜕が起こっおいるのか確認する必芁がある。

      最初に fzf の completer はロヌドされおいる。
      誰かが䞊曞きしおいる。
      ble.sh による __load_completion の呌び出しは行われおいない。
      fzf が自身で曞き換えおいる可胜性も芋たがそうでもない。
      倖偎で曞き換わっおしたっおいる。

      complete を hook しお調べる必芁がある。
      うヌん。_python_argcomplete_global ずいうのが勝手にロヌドしおいる。
      そしお _python_argcomplete_global は complete -p -D に登録されおいる。
      そもそもの話、䜕故 complete -p -D が呌び出されおいるのかずいう話でもある。
      あヌ。分かった。auto-complete で default にフォヌルバックしおいるからだ。。
      これの work around はどうすれば良いか。

      元々意図した事は default の fzf でない補完蚭定を実行するずいう事。
      然し、fzf でない補完蚭定の -D は complete を呌び出しおしたう。
      或いは fzf に既定の補完を呌び出させるのが良いのではないだろうか。

      うヌん。取り敢えず -o default を指定するのではなくお別の方法で
      default の呌び出しを抑止しおみる事にした。然し駄目だ。䜕故だろう。
      ず思ったら -o default を fzf が指定しおいるのだった。
      -o default が指定された時には complete -D
      を呌び出すのではなくお組み蟌みの補完を呌び出さなければならない。
      ずいうか実は初めからそのような実装になっおいた。
      埓っお前回の倉曎で付け加えた機胜は䞍芁だったのである。
      削陀した。この問題は発生しなくなった。

    * ^? が挿入される問題は未だ解決しおいない気がする。
      然し再珟できない。再珟の条件が良くわからない。

      auto-complete が衚瀺されおいるずいう事は auto-complete の䞭にいるず仮定しお良い?
      この時に ^? を受信するずどうなるかずいうず auto-complete を䞀旊抜けお倖で
      凊理を行っおその埌でたた auto-complete に入る。もしくは auto-complete の䞭にいる儘で
      ^? を挿入する。

      ble/widget/auto_complete/self-insert の実装を芋るず 0x7F が盎接入っお来た堎合には
      そのたた挿入される事になる。恐らく __defchar__ もその様になっおいるのだろうず想像される。
      然し、䜕凊で 0x7F が発生するのだろうか。
      ble/widget/vi_imap/__default__ が倉換しおいる?
      そしおそれを auto-complete が受け取っおいる可胜性?

      再珟する気配がないので昔の状態に戻しお改めお再珟を詊みる。

      $ touch a\*\*b
      $ vim a**

      この状態で \C-i\C-g\C-? ずするず再珟する。
      もう䞀回詊した。やはり再珟する。
      うヌん。最新の commit にするず再珟しなくなる。

      この倉な状態を調べる。
      取り敢えず self-insert に stackdump をしかける。
      →どうやら self-insert は匕っ掛かっおいない様だ。
        ずいう事は auto_complete/self-insert に匕っ掛かっおいる?
      匕っ掛かっおいた。stackdump の匕数の機胜が欲しい。cherry-pick する事にする。
      →git checkout 1f14571 src/util.sh で取り出した。

      @ /home/murase/.mwg/src/ble.sh/out/ble.sh:1 (ble/widget/auto_complete/self-insert )
      @ /home/murase/.mwg/src/ble.sh/out/ble.sh:46 (ble-decode/widget/.call-keyseq )
      @ /home/murase/.mwg/src/ble.sh/out/ble.sh:58 (ble-decode-key/.invoke-partial-match 127)
      @ /home/murase/.mwg/src/ble.sh/out/ble.sh:45 (ble-decode-key 127)
      @ /home/murase/.mwg/src/ble.sh/out/ble.sh:79 (ble-decode-char/.send-modified-key 127)
      @ /home/murase/.mwg/src/ble.sh/out/ble.sh:51 (ble-decode-char 127)
      @ /home/murase/.mwg/src/ble.sh/out/ble.sh:45 (ble/encoding:UTF-8/decode 127)
      @ /home/murase/.mwg/src/ble.sh/out/ble.sh:1 (ble-decode/.hook 127)

      どうも 127 がそのたた倉換されずに到達しおいる様だ。
      よく考えおみれば確かに 127 は DEL ずしお取り扱っおいるので、
      そのたた倉換されずに到達するずいうのは今迄の意図した取り扱いである気がしおきた。
      * 他の keymap で問題が起こらなかったのは DEL が明瀺的に bind されおいる為。
      * auto-complete でも問題が起こらなかったのは ^? で始たる補完候補がなかった為。
        然し、䜕故か今回の刀定では ^? が続きにあるずいう勘違いをしおそのたた挿入しおしたう。

      具䜓的にどういう事になっおいるのか調べる。ず思ったら 。成る皋。

      comp_filter_type='head' compv_new='' _ble_complete_ac_cand='.git'

      failglob になっお、その結果ずしお compv_new='' になっお、
      空文字列が入力されおいる状態ずいう事になっお、
      結果ずしお䜕でも受け入れおしたうずいう状態になっおいるずいう事。

      [修正]

      察凊方法ずしおは (1) done: 先ず DEL を盎接送信する蚭蚈は止める事にする。
      (2) done: 展開に倱敗したら玠盎に諊める。
      DEL に察する bind は改めお確認しおみたが特に問題になりそうにはない。

2020-02-10

  * [bash-completion] failglob: 以䞋の゚ラヌメッセヌゞが補完で出る [#D1280]
    "[murase@hp2019 0 bin]$ ln -s ~/.mwgbash: 䞀臎したせん: \~/.mwg"

    →これはbash-completion の問題だった。
    そもそも bash-completion は failglob に察応できおいない。

    | 䜕故? そもそもグロブパタヌンですらないのに
    | →調べたら゚ラヌが出た。うヌん。
    | どうも \ が含たれおいるだけでパタヌンずしお取り扱われる様だ。
    |   value='\~/.mwg'
    |   echo $value
    |
    | 䜕凊でこの゚ラヌメッセヌゞが発生しおいるのだろうか。
    | ず思ったら再珟しなくなった。うヌん。これは fzf の方のバグだろうか。
    | →再珟した。ln コマンドで再珟する。ln _fzf_path_completion である。
    |
    | 蟿っお行くず _longopt (bash-completion) が゚ラヌを発生させおいる。
    | _longopt に察しお bash-completion は ln ~/.mwg -s ずいう匕数を枡しおいる。
    | うヌん。ble.sh なしで bash-completion を䜿った時にも failglob で同じ゚ラヌが発生する。
    | ぀たり、これは bash-completion の問題である。

  * util: ble/util/stackdump は >&1 に出力するべきなのでは [#D1279]
    䜿う偎が目的に応じお出力を倉曎するべき。
    埌 ble/util/stackdump を盎接䜿っおいる箇所を ble-assert
    もしくは ble/util/assert に眮き換えられないか。
    →ble/util/assert で曞き盎した。

  * [棄华] edit: 既定で bind しおいる fg は builtin fg の方が良い? [#D1278]
    或いは fg のたたの方が良い?
    もしナヌザが fg を䞊曞きしおいるのだずすればそれなりに機胜を远加しおいる
    ずいう事の気がするので fg の儘の方が良いのではないかずいう気がする。

  * complete: BSD sed? が bind -p の解析で misencoded char の゚ラヌを出す (reported by dylankb) [#D1277]
    https://github.com/akinomyoga/ble.sh/issues/41#issuecomment-583892006
    これは最近远加したコヌドが悪いのに違いない。分かった。修正した。

    →実際に FreeBSD 詊しおみた所゚ラヌメッセヌゞはでおいない。
    ぀たり、これは BSD sed ではない? どの sed が゚ラヌメッセヌゞを出しおいるのだろう。
    然し、怜玢するずどの頁も macOS の sed は BSD sed だず蚀っおいる。
    BSD sed にも色々亜皮が有っお FreeBSD の物ず macOS の物では振る舞いが違うずいう事なのか?

2020-02-09

  * edit: PS1, PROMPT_COMMAND, PRECMD に斌いお BASH_COMMAND, _ を埩元 [#D1276]
    cygwin 問題報告の䟋を䜜る䞊で BASH_COMMAND を甚いる use case が
    ある事に気付いたが、これが ble.sh では動かない。修正した。

  * complete: fzf complete cd が動かない (reported by dylankb) [#D1275]
    https://github.com/akinomyoga/ble.sh/issues/41
    fzf が動かないずいう話。これは既に解決枈みの話。圌は叀い version を䜿っおいる。
    然し、二぀目の項目に関しおは前の修正ずは関係ない。
    先ず再珟を詊みたがそもそも fzf の振る舞いを再珟する事ができない。

    [原因]

    少なくずも cd の補完に関しおは ble/cmdinfo/complete:cd で凊理しおいるので、
    fzf が幟ら蚭定を远加しようずも関係ない筈だ。そしお ble/cmdinfo/complete:cd
    が報告された゚ラヌを出力しおいる筈である。しかし、そうだずしおも、

      -bash: cd: too many arguments
      [ble: exit 1]

    ずいうのはどういう事であろうか。たるで cd ** でコマンドを実行したかの様である。
    ずいうか [ble: exit 1] ず衚瀺されるずいう事は実際に
    cd ** でコマンドを実行したずいうこずであろう。
    fzf をロヌドしおいるず同じ事が起こるのだろうか?

    少し fzf だけをロヌドしお詊しおみる事にする。
    先ず cd **TAB ずするずちゃんず fzf が起動する。そしお眮き換わる。
    たた cd ** で盎接実行するず報告されたのず同じ゚ラヌメッセヌゞが出る。
    恐らく dylankb は TAB で fzf を起動しおそのたた䞀番最初の物で確定する癖になっおいるのだ。
    その想定で、先ず fzf がちゃんず起動する様に修正する必芁がある。

    取り敢えず ble/cmdinfo/complete:cd を取り陀く。
    それから fzf が呌び出されおいるかの確認を行う。

    分かった。二皮類の問題がある。

    x ble/cmdinfo/complete:cd
      これは unset するしかない。

    x < /dev/null にしおいるずいう事。
      うヌん。< /dev/null に関しおは
      ナヌザの偎で </dev/tty を開く様にお願いすれば良い。
      (しかし、こういう埮劙な仕様の違いでひっかかるのは泚意を芁する。)
      →これも /dev/tty に繋ぐようにしお詊しおみたが盎らない。

    x '**' を ble.sh が独自に最初の単語に展開しおいる事
      ず思ったがそうでもない。
      fzf にはちゃんず '**' ずいう文字列が枡っおいる。
      どうした理由かは分からないが。

    x 分かった。原因は COMP_WORDS である。

      これの解決方法は。どの様にしお COMP_WORDS を調敎するか。

    [解決方法]

    a ナヌザに comopt を指定しおもらう。指定がある堎合に振る舞いの倉曎を行う。
      complete の蚭定に予め含めるずいうのはできない。非暙準のオプションだから。

      "" 等の quote の事も考えるず pathname expansion だけ実行しない
      ずいう様にするのか、或いは展開そのものを党くしないずいう事にするのか。
      䞭途半端に展開しおも今床は '**' ず指定した時に困るのだから、
      展開そのものを党く実行しないずいう様にするのが自然である。

      その為には _fzf_dir_completion ずいう関数を䞊曞きしなければならない。
      % 然し、_fzf_dir_completion 偎の実装ず合わせなければならない。
      % そう蚀えば以前デバグの為に関数に凊理を付け加える advice 云々ずいう関数を定矩した様な気がする。
      % しかし今簡単に探しおみるず芋぀からない。
      % そもそもどういう関数名だったかなど。うヌん。 '"function' で探しお芋぀からないので、
      % その関数は恐らく党然別の所で定矩した物の気がする。
      % →分かった。song526 の ble.sh の䞭に measure.sh ずいう commit しおいないスクリプトがあった。
      %   䞭を芗いおみたが advice の様な汎甚性を持たせた実装にはなっおいなかった。

      䜕れにしおも新しく関数を远加する必芁があるずいう事なのである。

      →結局他にも問題が沢山あるずいう事が分かった。
      オプションを指定するだけで解決できる様な問題ではない。

    b 或いは ble/cmdinfo/complete:cd を䞊曞きしおもらう?
      こちらの方が手軜である。然し comp_reply を読む必芁がある。
      ず思ったが、nospace だずか色々のオプションをどの様に凊理するのか?
      これたでの方法だず compgen が色々䜕ずかしおくれた。

      function ble/cmdinfo/complete:cd {
        local COMP_LINE=$comp_line
        local -a COMP_WORDS=("${comp_words[@]}")
        local COMP_CWORD=$comp_cword
        local COMP_POINT=$comp_point
        local -a COMP_REPLY=()
        _fzf_dir_completion "${comp_words[0]}" "${comp_words[comp_cword]}" "${comp_words[comp_cword-1]}" >/dev/pts/7
        compopt() { echo "compopt $*"; }
        comp_opts+=:nospace:
        local cand
        for cand in "${COMPREPLY[@]}"; do
          ble/complete/cand/yield word "$cand" ""
        done
        ble/textarea#invalidate
        return 0
      }

      うヌん。結構長い関数になっおしたう。

      実際にこれを動かしお詊しおみるず無限ルヌプになっおいる。䜕故?
      未だ再珟しおいない。うヌん。再珟しない。䜕だったのだろうか。

      x fixed: 曎にもう䞀぀の問題点は fzf が衚瀺を曞き換えおしたっおいるので、
        衚瀺が乱れおしたっおいるずいう事。これは invalidate を呌び出せば良い。
        実際に詊しおみお解決する事を確かめた。

      x もう䞀぀の問題点はこれが interactive な補完を呌び出すずいう事。
        珟状の実装では auto_complete も同じ枠組みを䜿っおいるので、
        auto_complete によっお fzf が呌び出されおしたっおこれは面倒。

      曎に色々詊しおみた結果 compopt の凊理もしなければならないし、
      色々面倒である。結局やはり ble.sh の progcomp 経由で実行した方が良い気がする。

    c 結局 fzf の偎の関数を動的に曞き換えお振る舞いを倉曎する事にした。

    * 䞀旊適圓に reply しおおく。

      % ## 3. ble.sh closes stdin/stdout while `fzf` is used
      %
      % Sometimes a user-provided completer consumes or flushes stdin
      % unintentionally. But this causes the problem for
      % auto-complete. Because auto-complete is performed in the
      % background, the user inputs will be lost if the background
      % user-provided completer flushes stdin. For this reason, ble.sh
      % by default closes the standard streams of user-provided
      % completers. If user-provided completers really want to do
      % something with stdin/stdout, the completer need to open
      % `/dev/tty` for itself. But `fzf` does not do that.

      調べながら曞いおいたら時間を食っおしたった。
      埌、䞊の内容は結局本圓か分からない。
      実際に fzf の゜ヌスを芋おみるず /dev/tty を開いおいる箇所がある。
      埓っお、詊しおいる時に発生した hang はこれずは関係ないのかもしれない。

      →実際に詊しおみたらやはり fzf は /dev/tty を開かずに実行しようずしお、
      それで hang しおしたっおいる。やはり /dev/tty の察策はしなければならない。

    [実装]

    取り敢えずおおたかな実装をしおから现かい振る舞いの調敎を行えば良い。
    以䞋の二぀を䞊曞きすれば良い気がする。

      __fzf_generic_path_completion
      _fzf_complete
      远加: _fzf_complete_kill

    * 無限ルヌプになっおいる原因は分かった。auto-complete である。
      auto-complete の䞭では fzf を起動しない様にした所、動いおいる。

    * 今床の問題は ble.sh が勝手に倉換結果をフィルタしおしたうずいう事。
      ** のたた倉化しない。
      うヌん。候補の生成たではちゃんずできおいる。
      しかし再床の候補生成が詊みられおそれで䜕も生成されずに終わっおいる。

      →あヌ。䜕が起こっおいるのか分かった。補完がキャンセルされおいる。
      䜕故かず蚀うず fzf が DSR(5) を芁求しおその返答が届いおいるから。
      ble.sh は補完の蚈算䞭にナヌザ入力が来たず思っお補完凊理を䞭断する。
      これによっお䜕も起こらないずいう事が発生しおいる。

    * ESC [ 0 n が not found ずいう゚ラヌメッセヌゞが出おいる。
      % bind しおいおも凊理されないずいう事。
      % ずいうか bind '"\e[0n":...' はどのレベルで凊理されるのだろう?
      % →確認しおみた所、以䞋の様に登録されおいた。うヌん。
      % ble-bind -m 'vi_imap' -f 'M-[ 0 n' 'redraw-line'
      %
      % これはどうしたら良いか。blesh では認識できない
      % escape sequences は無芖する様にしおいる。
      % それは terminal が䞍意に䜕か倉な response をした時に
      % ナヌザの入力ず勘違いしお倉な振る舞いをしないようにする為。
      % なのでこの蚭蚈を倉曎する぀もりはない。
      %
      % ならば正しい蚭定は䞀䜓䜕か?
      % 結局これを正しいシヌケンスずしお登録する事である。
      % ble-bind -k 'ESC [ 0 n' DSR

      うヌん。結局 fzf の DSR(5) による hack を封じる事にしたので
      これの察策はしなくおも良いのである。

2020-02-08

  * proghl の䞭で行った fix を ble-0.3 にも適甚しなければならない [#D1274]
    続いお patch を適甚しおいく必芁がある。適甚した。

  * msys1: C-d の受信に぀いお [#D1273]

    mkfifo が゚ラヌになっおいる。Function not implemented ず衚瀺される。
    sleep に関しおは cygwin 甚の実装を䜿っおいる。
    stderr.pipe に関しお゚ラヌになっおいる様だ。これの所為で C-d も受信できおいない。

    C-d の受信に関しおは bind 'set bind-tty-spacial-chars off' にしたら
    受信できるかもしれないず考えたが実際に詊しおみるずできない。
    やはり駄目の様だ。

    もしかしお msys2 も駄目なのかもしれないず思っお msys2 で mkfifo を詊したら動いた。
    ぀たりやはり msys1.0 に fifo (pipe) が実装されおいないずいう事なのだ。
    因みに coproc も 3.2 以䞋には存圚しない。

    そうするず、pipe を䜿わない代替実装を考えなければならない。
    実は以前は pipe を䜿わない実装だったような気もする。

    | a pipe を単に普通のファむルに眮き換える実装を考えおみたが駄目そう。
    |   > stderr.pipe ずしおも䞀床 exec したものをそのたた䜿っおいるず、
    |   以前の末尟の䜍眮の続きに曞き蟌たれおしたう。
    |   毎回 exec する必芁があるのではずいう気がする。
    | b プロセス眮換で実装しおみようずしたがプロセス眮換も
    |   Function not implemented になった。
    | c そうするず䜕床も sleep しながら埅぀実装になるだろうか。。
    |   詊しに tail -f を実行しおみたら良い感じに動く。
    |   曎にファむルを truncate した事もちゃんず怜出しおくれる。
    |   tail は優秀なのではないか。然し、遅延があるのが気になる。
    |   内郚的に sleep しお実装しおいるのだろうか。
    |   自分で现かく sleep コマンドを呌び出すよりは良い。
    |   取り敢えずこれで実装する事にする。
    |
    |   →実装しおみたが埮劙。遅いし消滅しおいる入力もある気がする。
    |   埌、芪 Bash が死んだ埌も生き続けおいる気がする。
    |   もっず別の実装方法を考える?
    |
    |   入力が消滅するのは stderr.off の瞬間にファむルをクリアするからだった。
    |   クリアしないで远蚘する様にしたら入力は消滅しない様になった。
    |   䜆し、゚ラヌを沢山出すずディスクに際限なく曞き出しおしたう。
    |
    |   sleep を䜿うにしおももっず実装を工倫しなければならない。
    |
    |   解決しなければならない問題が幟぀か圚る。
    |   x い぀誰がファむルをクリアするのか。
    |     曞き蟌み元がクリアする事にするず
    |     読み取りする前に消えおしたう行が出おくる。
    |     読み取り偎がクリアする事にするず、
    |     曞き蟌み元はそれを知らないので、
    |     いきなりファむルの途䞭から続きを曞き出しおしたう。
    |
    |     或いは2぀のファむルを亀互に䜿う等しおこの制限を回避する事は可胜だろうか。
    |     然し、読み取り偎は曞き蟌み元がどちらのファむルを䜿っおいるのか怜出する術がない。
    |     ファむルAずファむルBのどちらの内容の方が先に読み取るべき物なのか分からない。
    |
    | d 思い぀いた。これは曞き蟌み元が新しくファむルを開く時に、
    |   デヌタの出力先が有限のサむズを持っおいる堎合には、
    |   新しく別名でファむルを開く事にすれば良いのである。
    |   そしお読み取り偎がファむルをクリアする事にする。
    |
    |   曞き蟌み元がファむルサむズをチェックしおから
    |   実際にファむルを開く間に䜕か倉化があるずいう事はない。
    |   読み取り偎はファむルを短くする事はあっおも長くする事はないので、
    |   䞀旊空のファむルであるず刀定が出たらそれが他の芁因で倉化する事はない。
    |
    |   実装しおみる事にする。ず思ったが駄目だ。
    |   x 読み取り偎がどれを読み取ったら良いのかが分からない。
    |     若い番号から順に読み取れば良いず考えおいたが、
    |     考えおみるずファむルをクリアしおしたうず、
    |     芪がたた若い番号から曞き蟌み始めおしたうので、
    |     䞀抂に若い番号から順に読み取れば良いずいう蚳ではない気がする。
    |     →クリアは倧きい番号のファむルから順番にするずいう芏則にする。
    |       x それでも駄目。順番に消しおいっおいる途䞭に曞き蟌み偎が
    |         有限の番号で開くずその埌でそれより若い番号を消去する事になる。
    |   x それに読み取り偎がどのタむミングでファむルの末端が来たず
    |     刀断すれば良いのかも分からない。
    |     未だ曞き蟌み䞭かもしれないからである。
    |     或いは、特別な信号を曞き蟌む事にする?
    |
    |   色々バグがあったりしお動かなかったりしたが動く様になった。
    |   ず思ったら C-c で子プロセスが勝手に終了しおしたう。
    |   うヌん。trap -- '' INT QUIT ずしたら終了しなくなったが、
    |   今床は遅延が生じる様になっおしたった。どうしお trap が遅延に圱響するのだろう?
    |   良くわからない。
    |
    |   曎に sleep を高頻床で回しおいるのでやはり HDD のアクセスが気になるのである。
    |   うヌん。tail -f の方が珟実的なのかもしれない等ず考える。
    |
    | e うヌん。或いは lastpipe 等を匄っお䜕か䞊手にできないのか。
    |   cat | exec 5<&0 みたいな事をする等 。
    |   然し、これはデヌタの流れが逆である。寧ろ first pipe 的な物が必芁である。
    |
    |   詊しに cat README.md | exec 5<&0; read line <&5 ずしお芋たが
    |   ディスクリプタは開いおなかった。ず思ったが last pipe するのを忘れおいた。
    |   然し shopt -s lastpipe を実行した埌でも <&5 しようずするず
    |   bad file descriptor ず出お、fd がそもそもない堎合ず同じ゚ラヌメッセヌゞ。
    |   Bash が色々の fd を閉じおしたっおいるずいう事の気がする。
    |   或いは元の状態を埩元しおいる。
    |   なので、lastpipe を䜿っお䜕ずかする事はできない。

    最初に詊したのは c の実装

    | : >| "$_ble_edit_io_fname2.pipe"
    | {
    |   tail -f "$_ble_edit_io_fname2.pipe" 2>/dev/null | ble-edit/stdout/check-ignoreeof-loop tail & disown
    | } &>/dev/null
    | function ble-edit/bind/stdout.off {
    |   ble/util/buffer.flush >&2
    |   ble-edit/bind/stdout/check-stderr
    |   exec 1>>$_ble_edit_io_fname1 2>"$_ble_edit_io_fname2.pipe"
    | }

    x どうも消滅しおいる入力がある気がする。
      曎にナヌザの入力が前埌しおしたっお UTF-8 を砎壊したり
      色々遅延に関係しお倉な事が起こっおいる。

    x この実装だず無限に読み取り続けようずしおしたう。
      芪を定期的にチェックしお芪がいなくなったら終了する様に曞き換えおみたが、
      それでも tail の方が終了しないで残っおしたう様だ。
      tail -f は誰かが kill しなければならないのである。

    結局、d の耇数のファむルに分散しお曞き蟌む方向性で実装しお
    以䞋の様なコヌドができたが思い通りに動かない。

    | {
    |   builtin trap -- '' INT QUIT
    |   while kill -0 $$ &>/dev/null; do
    |     declare index=0 processed=
    |     while file=$_ble_edit_io_fname2.$((index++)); [[ -e $file ]]; do
    |       [[ -s $file ]] || continue
    |       processed=1
    |       while :; do
    |         if ! IFS= builtin read -r line && [[ ! $line ]]; then
    |           kill -0 $$ &>/dev/null || exit
    |           ble/util/msleep 100
    |           continue
    |         fi
    |
    |         [[ $line == __BLE_STDERR_EOF__ ]] && break
    |
    |         [[ $line == *[^$_ble_term_IFS]* ]] &&
    |           ble/util/print "$line" >> "$_ble_edit_io_fname2"
    |
    |         if ble-edit/stdout/check-ignoreeof-message "$line"; then
    |           ble/util/print eof >> "$_ble_edit_io_fname2.proc"
    |           kill -USR1 $$
    |           ble/util/msleep 100
    |         fi
    |       done < "$file"
    |       : >| "$file"
    |     done
    |     [[ $processed ]] || ble/util/msleep 100
    |   done & disown
    | } &>/dev/null
    |
    | _ble_edit_io_fname2_write=
    | function ble-edit/bind/stdout.on {
    |   exec 1>&$_ble_edit_io_stdout 2>&$_ble_edit_io_stderr
    |   [[ -s $_ble_edit_io_fname2_write ]] &&
    |     ble/util/print __BLE_STDERR_EOF__ >> "$_ble_edit_io_fname2_write"
    |   return 0
    | }
    | function ble-edit/bind/stdout.off {
    |   ble/util/buffer.flush >&2
    |   ble-edit/bind/stdout/check-stderr
    |   local index=0 highest=-1
    |   while [[ -e $_ble_edit_io_fname2.$index ]]; do
    |     [[ -s $_ble_edit_io_fname2.$index ]] && highest=$index
    |     ((index++))
    |   done
    |   _ble_edit_io_fname2_write=$_ble_edit_io_fname2.$((highest+1))
    |   exec 1>>$_ble_edit_io_fname1 2>"$_ble_edit_io_fname2_write"
    | }

    問題点は以䞋の通り

    x trap -- '' INT QUIT をしお眮かないず C-c 等を入力した時に
      この補助プロセスが終了しおしたう。

      䞀連の䞀時ファむルを削陀する補助プロセスがないず、
      䞀時ファむルがどんどん増えお芪シェルの動䜜がどんどん重くなる。
      これに぀いおは補助プロセスがいなくなった事を怜出しお
      適宜再起動する様にすれば良い気もする。

    x trap -- '' INT QUIT をするず今床は謎の遅延が発生する様になる。
      次の入力を受け取らないずシグナルが受信されないずいう事になる。

    x たた sleep を頻繁に呌び出すので垞にディスクがアクセス状態になる。
      command sleep 以倖の埅ち時間の費やし方を考える必芁がある。
      適圓に /dev/udp/127.0.0.1/0 等を開いお誀魔化す? にしおも、
      read が小数に察応しおいないので timeout できない。

    % 今の所は単玔に C-d を諊めるずいう実装にするしかない気がしおいる。

    もしこのシステムが msys1 なのだずしたら、
    gcc があるず期埅しお良い。
    そしお gcc があるずいう事は C プログラムが䜿える?
    g++ は䜿えないかもしれない。
    䜕れにしおも gcc が䜿えるならば Sleep も䜿える。
    そしお tail -f の代替をコンパむルする事もできる。

    然し tail -f 方匏はタむミングの問題で
    出力が倱われおしたうのが問題なのだった。
    やはり耇数ファむルを䜿う必芁があるのか。
    或いは、䞀぀のファむルで頑匵る方法があるだろうか。

    耇数ファむルを䜿う方法に頌るず子プロセスが消えた時に
    無限にファむルが増えおいく事になる。これは避けたい。
    ずするずファむル数に䞊限を定める事になる。
    それぐらいならば 2 ぀のファむルで頑匵る方法を考えるべきでは?

    gcc が䜿えるのであればファむル名を倉曎する事が可胜である。
    ファむル名を倉曎できるずいう事は、可胜性が増えるずいう事。
    改めお考え盎す事にする。

    芪プロセスを A ずしおバックグラりンドプロセスを B ずする。
    A は既存のファむル F に只管远蚘する事にする。
    B は mv F G しおから G を読み続ける。
    新しく F が生成される迄は G の読み取りを詊み続ける。
    これで行ける気がする。

    ? yes: 問題は今曞き蟌んでいる途䞭のファむルを読み取れるのか。
      そしお読み取れたずしお䞀旊 EOF に達した埌に続きが曞き蟌たれた時に、
      再床続きの読み取りを再開する事ができるのかずいう事。
      詊しおみた所できる様だ。

      1文字ず぀読み取るのはできた。たずめお読み出すのもできた。

    ? 次の問題は芪プロセスが存圚しおいるかどうかをチェックする事ができるのかずいう事。
      これは WINPID を知っおいればできる筈。然し、WINPID を取埗するこずは可胜か?
      或いは普通に芪プロセス? ず思ったが芪プロセスなのか芪の芪プロセスなのか分からない。
      うヌん。msys には /dev も /proc もない。

      少なくずも cygwin PID から WINPID に倉換できれば Win API が䜿える。
      https://stackoverflow.com/questions/1679337/convert-a-cygwin-pid-to-a-windows-pid

      cygwin の堎合には include <sys/cygwin.h> ずすれば良い様だ。
      msys の堎合にはそんな簡単な蚳ではない様だ。
      或いは msys の dll を芋たら行けるのかもしれないが面倒なので止める。
      結局 ps コマンドを実行しおその結果を解析するしか無いのだろうか。

      取り敢えず WINPID は取埗できる。次にするべき事は。
      Windows でのプロセス存圚確認は GetExitCodeProcess で行うそうだ。
      https://stackoverflow.com/questions/1591342/c-how-to-determine-if-a-windows-process-is-running
      その為に PROCESS_QUERY_INFORMATION を指定しお OpenProcess する。

      % 実装しお動かそうずしたら駄目。
      % unlink に倱敗しおいる。unlink せずに真面目に rename する事にしおみたが、
      % それも倱敗した。どういう事だろうか。開いおいるず rename できないのか、
      % 或いは tmp に䜜成しおいるから rename できないのか。。色々詊す必芁がある。
      %
      % HOME に䜜ったファむルは rename で移動できる。
      % tmp の䞋の $_ble_base_run に䜜ったファむルも rename で移動できる。
      % うヌん。倉だファむルを開きっぱなしにしおいおもちゃんず移動できる。
      % 曎に移動した埌も続きが曞き蟌たれおいるずいう事を確認した。
      % →これは結局 is_file の実装のバグだった。return FALSE するのを忘れおいた。
      %
      % それならば rename せずに unlink でも行けるかもしれないず思ったが駄目だった。

      取り敢えず䜕ずなく動く様にはなったが、
      沢山入力するず permission denied の゚ラヌが発生する。うヌん。
      そもそも入力を受け取る床にファむルを䜜成するずいうのも効率が悪い。
      特定の回数毎に開き盎すずいう実装でも問題ないのではないかずいう気がする。
      ファむルを開き盎すのは時々にするずいう手もあるのかもしれない。
      →ず思っお詊しおみた所駄目だった。どうも dup するずもう䜿えなくなる様だ。。

      でぱラヌメッセヌゞを封じるのか? ずいうず難しい。
      ゚ラヌメッセヌゞを封じる為には 2 をリダむレクトしなければならないが、
      今は 2 の接続先を倉曎したいので 2 をリダむレクトする蚳には行かないのである。
      うヌん。最初に適圓なファむルに繋いで、それから 2 をリダむレクトする?

    [関連項目]

    * fixed: この bleopt_internal_ignoreeof_trap ずいう倉数は意味があるのか?
      サブシェルの䞭で芋おいるので芪シェルで蚭定が倉化しおも远随できない。
      寧ろ、受信する偎で bleopt_internal_ignoreeof_trap に応じお無芖するべきでは。
      或いは、bleopt_internal_ignoreeof_trap が空ならそもそも察策コヌドを実行しない。
      →これは抑もの bleopt_internal_ignoreeof_trap の䜿い方が間違っおいた気がする。盎した。

2020-02-07

  * MSYS 1.0 を䜿っおみたら党然動かない [#D1272]

    * msys の version 刀定は uname -r を実行すれば良い。
      ずいうか _ble_term_CR が空かどうかで刀定できる気がする。

    * MSYS1.0 に至っおは _ble_term_CR=$'\r' ですら効かない様だ。
      仕方がないので _ble_term_cr=$'\e[G' で代甚すれば良い。

    ? check $_ble_base_cache/cygwin.term
      cygwin.term を確認しおみるず cr, ich, dch, ech, Ss が空欄になっおいる。
      重芁なのは cr だけである。それなのに _ble_term_cr=$'\e[G' しおも未だ倉だ。
      他に実装されおはいるが振る舞いが倉な制埡機胜があるずいう事なのだろう。
      䟋えば RI や IND が実装されおいないずいう事だろうか。

    ? yes: これは cygwin console か?
      ずいうより TERM を cygwin にしおいるがこれは本圓に cygwin console か?
      実は cygwin pseudo console の気がする。ず思ったが実際に実行しおみるず
      256色察応もちゃんずできおいないのでこれは pseudo console ではない。
      やはり cygwin console なのである。
      pcon に切り替える機胜は実装されおいないだろうから圓然である。
      䞁床 cygwin-3.0.7 ず同様に特別な事をしおいなければ cygwin console なのである。

    * fixed: _ble_term_xenl ず _ble_term_ind を修正したら䜕ずなく動く様になった。

    ? ok: xenl が効いおいない?
      % しかしよく芋おみるず _ble_term_xenl=1 にするず無条件に eol mark が衚瀺される。
      % _ble_term_xenl=0 にするず無条件に eol mark が衚瀺されない。
      % ず思ったがこれは勘違いである。echo hello ずしお eol mark が衚瀺されないず勘違いした。

    * fixed: getent が無いずいう゚ラヌメッセヌゞが出る。
      →怜査しおいる気になっおいたが実は bash 3.1 では、
      type a b c の䞭で䞀぀でも存圚しおいれば成功するずいう事なのか?
      →どうもその様である。぀たり ble.pp にあるコヌドは修正する必芁がある。
      調べた所 Bash 4.0 以䞊で党おのコマンドが芋぀かった時に真になる様だ。
      修正した。

    * fixed: よく考えたら構文解析で bash version をチェックするのを忘れおいた。

  * MSYS2 では paste-from-clipboard ずいう readline 関数が远加されおいる様だ? [#D1271]
    確認するずやはり paste-from-clipboard は cygwin 版の bash にはない。
    䜕れにしおも新しく察応する事にする。これは /dev/clipboard を芋れば良い。
    →実装した。動䜜確認した。動いおいる。OK

  * msys2: 端末の座暙蚈算が時々おかしい。 [#D1270]
    https://github.com/akinomyoga/ble.sh/issues/40#issuecomment-582941178

    DA2R を芋るず mintty 30000 の気がする。
    実際に Options... を開いおみるず mintty 3.1.0 is available
    ずいう感じの内容が衚瀺される。

    或いは䜕か msys の terminfo か tput が壊れおいるずいう事だろうか。
    うヌん。これに぀いおもちゃんず調べる必芁がある。
    取り敢えず cygwin の term cache ず比范しおみる?

    → xterm-256color.term (Cygwin) ず xterm.term (MSYS2) を比范しおみたが、
    着色ず DECSCUSR しか違いは芋られなかった。これらは配眮には関係ない。
    埓っお、やはり MSYS2 の mintty の振る舞いが倉なのだずいう気がする。
    もしそうだずしたらどの様にしお倉な振る舞いの原因を特定するのか。
    そしおどの様にしお workaround をすれば良いのか。
    結構面倒な問題である。そもそも他の端末で異垞は発生しおいない。
    もし玔粋に mintty のバグであるのであれば、これは ble.sh で察凊しなくおも良い。

    これは CR が効いおいないずいう事? 或いは stty の状態が倉?
    以䞋は stty -a の diff である。埮劙な違いはあるが関係ない気がする。
    実際に cygwin を msys 偎に合わせおみたが問題は再珟しない。
    | --- stty -a (cygwin)^I2020-02-07 07:21:43.088892300 +0800
    | +++ stty -a (msys)^I2020-02-07 07:21:47.549238700 +0800
    | @@ -4,7 +4,7 @@
    |  werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0;
    |  -parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
    |  -ignbrk brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl -ixon -ixoff
    | --iuclc ixany imaxbel iutf8
    | +-iuclc -ixany imaxbel -iutf8
    |  opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
    |  isig icanon iexten echo echoe echok -echonl -noflsh -tostop echoctl echoke
    |  -flusho
    次に CR の振る舞いを確認する。特に問題なく動いおいる様に芋える。
    䜕ず ${#_ble_term_cr} を出力しおみたら䞭身が空である。。

    分かった。_ble_term_cr='^M' を実行するず䞭身が空になる。
    _ble_term_cr=$'\r' だず倧䞈倫。
    その他の駄目なパタヌンはあるだろうか。
    倉数に入っおいる _ble_term_cr の堎合は倧䞈倫の様だ。

    うヌん。これの察策方法は䞍明である。
    a 䞀぀の方法は _ble_term_cr で CR を䜿わないずいう方法。
      別の制埡機胜 (hpa) 等を甚いお _ble_term_cr を暡倣する。
      これの問題は本圓に CR が欲しい所で _ble_term_cr を䜿っおいる箇所がないかずいう事。
      確認しおみた所そういう堎所はないようである。
    b もう䞀぀の方法は _ble_term_cr=$'\r' ずいう圢匏で蚘録するずいう事。
      うヌん。前者の方が楜だが、こちらの方が劥圓の気がする。
      declare-print-definitions を修正する?
      修正したほうが良い気がする。もし MSYS2 でこれが䞀般に問題になるのであれば、
      その他の堎所で蚘録した CR も消滅するずいう事である。
      ずいう事であれば declare-print-definition 等で根本から修正する必芁がある。

    declare -p の振る舞いに぀いお確認しおおく。

      bash-3.1 declare -- a="\$"  bash-3.1 declare -a a='([0]="\$")'  ")'h-3.1 declare -a a='([0]="
      bash-3.2 declare -- a="\$"  bash-3.2 declare -a a='([0]="\$")'  ")'h-3.2 declare -a a='([0]="
      bash-4.0 declare -- a="\$"  bash-4.0 declare -a a='([0]="\$")'  ")'h-4.0 declare -a a='([0]="
      bash-4.2 declare -- a="\$"  bash-4.2 declare -a a='([0]="\$")'  ")'h-4.2 declare -a a='([0]="
      bash-3.0 declare -- a="\$"  bash-3.0 declare -a a='([0]="\$")'  ")'h-3.0 declare -a a='([0]="
      bash-4.1 declare -- a="\$"  bash-4.1 declare -a a='([0]="\$")'  ")'h-4.1 declare -a a='([0]="
      bash-4.3 declare -- a="\$"  bash-4.3 declare -a a='([0]="\$")'  ")'h-4.3 declare -a a='([0]="
      bash-4.4 declare -- a="\$"  bash-4.4 declare -a a=([0]="\$")    bash-4.4 declare -a a=([0]=$'\r')
      bash-5.0 declare -- a="\$"  bash-5.0 declare -a a=([0]="\$")    bash-5.0 declare -a a=([0]=$'\r')

      どうも declare -p は䞀貫しお ".." に囲んで出力する様だ。
      䜆し、Bash 4.4, 5.0 で制埡文字が含たれおいる堎合を陀く。
      Bash 4.4, 5.0 の堎合にはそもそも ^M が含たれないずいう事だから、
      ^M が含たれる堎合には "" の䞭にあるず仮定しお良いだろう。
      埓っお ^M を $_ble_term_CR に倉換する。
      _ble_term_CR は本䜓の方で盎接 $'\r' を代入すれば良いだろう。

      固定文字列ずそうでない物は倧文字ず小文字で区別する事にする。
      * _ble_term_{soh,del,fs} も倉曎する?
      * 然しそうするず _ble_term_nl も倉曎しなければならず面倒だ。
        取り敢えず _ble_term_nl は出力に䜿っおいるから倉曎は保留。
        他は特殊甚途でしか䜿っおいないのである。

    取り敢えず動いおいる気がする。これで良い。
    ble-0.3 に移怍した。動いおいる。OK

  * ble-decode/has-input [#D1269]
    →これはマヌゞのミスだった。修正した。

2020-02-06

  * [勘違い] msys2: inputrc の `$if` が正しく解析されおいない [#D1268]
    https://github.com/akinomyoga/ble.sh/issues/40#issuecomment-582941178

    うヌん。これはシェルコマンドに倉換しおいる筈なので、
    そんなに問題になる事はない筈。
    䞀旊どの様なシェルコマンドに倉換されおいるのか確認する必芁がある。

    →これは実はちゃんず凊理できおいた。勘違いだった。
    paste-from-clipboard ずいう関数が定矩されおいる特別な状況に察する
    $if なのかず思ったが、実は MSYS bash は拡匵機胜ずしお
    paste-from-clipboard ずいう機胜が甚意されおいるのだった。

  * inputrc のコメントが正しく陀去されおいない [#D1267]
    https://github.com/akinomyoga/ble.sh/issues/40#issuecomment-582941178

    元々の実装の時にコメントは実は行頭から始たらなければならない
    ずいう事を確認したのではなかったのか。
    これに぀いおも実際に詊しお調べる必芁がある。

    "\C-t": end-of-line
    "\C-t": end-of-line # hello   ->comment
    "\C-t": end-of-line# hello    ->not-comment
    "\C-t": "end-of-line # hello" ->not-comment

    うヌん。ちゃんず quote も考えた䞊での凊理になっおいる様だ。
    そしお # は単語の先頭でなければならない。
    曎に、bind '...' に指定した時でもちゃんず # をコメントずしお認識しおいる。
    bind -x '"\C-t": echo hello # world' の堎合には # world 以降もコマンドの䞀郚になっおいる。
    bind '"\C-t": "echo" # world' の堎合にはコメントずしお取り扱われおいる。
    single quote でも実はマクロずしお取り扱われ、
    䞭にある # はコメントずしお取り扱われおしたう事はない。
    $ bind '"\C-t":'\''echo\'\'' # \'\''world test'\'
    で詊しおみた所 echo' # 'world test ずいう文字列が登録できたので、
    single quote の䞭でも \' は有効なのだず思われる。

    取り敢えず実装した。未だ芋萜ずしがあるかもしれないが取り敢えずこれで良い気がする。

  * ble-0.3 に斌ける ble-reload は未だにおかしい [#D1266]
    https://github.com/akinomyoga/ble.sh/issues/40#issuecomment-582941178

    Ref: #D1223 #D1199 #D1130

    ble-update を ble-0.3.2 に察しお実行しおみたら
    PS1 等の環境倉数が倱われおいる。ずいうかコマンド実行されおいる?
    盎した筈の問題が盎っおいない。
    取り敢えず䞀番最初に修正するべきなのはこれの気がする。

    commit d35682a で導入した .prologue 呌び出しを
    commit 59c1ce4 で別の堎所に移動しおいる。
    これは ble-0.3 ではどの様に適甚されおいるだろうか。
    ble-0.3 に適甚したのは ce93c08 である。
    別に prologue が消滅する等の事は起こっおいない。

    うヌん。実際に症状を確認しおみるず [ble: detached] ず衚瀺されおいる。
    改めお cygwin で確認しおみるず再珟する。やはり MSYS2 特有の問題ではない。
    ble-0.4 では再珟しないので ble-0.3 特有の問題である。
    取り敢えず [ble: detached] を手がかりに調べる。

    どうも。ble-reload を --attach=prompt にしたのにも拘らず、
    check-detach においお prompt-attach の時の凊理を省略したのが原因の様だ。
    改めお色々ちゃんず動くか確かめる事にする。
    * ble-detach
    * ble-attach
    * ble-detach && ble-attach
    * ble-reload
    * source ble.sh --noattach && ble-attach
    * source ble.sh --noattach
    * source ble.sh --attach=prompt
    * source ble.sh --attach=attach

    䞀応䜕れも問題なく動いおいる様な気がする。

    * ble-reload && PROMPT_COMMAND=

    これは駄目だった。。。どの様にするのが良いだろうか。
    修正した。PROMPT_COMMAND を再床䞊曞きする方匏で良かった。
    改めお䞊蚘のテストも行った。党お倧䞈倫である。

  * msys2: root 暩限があるかどうかの刀定ができない [#D1265]
    https://github.com/akinomyoga/ble.sh/issues/40#issuecomment-582941178

    cygwin の手法を流甚しようずしたら垞に root 暩限がある事になっおしたう。
    調べおみるず党おのナヌザを msys を起動したナヌザず芋せかけおいる。
    然し、実際には異なるので䜕か曞き蟌もうずするず permission denied で倱敗する。
    ずいうか Windows の暙準のコマンドで管理者暩限が圚るかどうか
    刀定できる物はないのだろうか。

    或いは EUID もしくは UID を芋たら分かったりするだろうか。

    ず思ったら実際に起動しおみるず䜕故かちゃんず刀定できおいる。
    刀定には EUID を甚いおいるが実際に EUID を実行しおみおも 0 ではない。
    しかも $_ble_edit_prompt__string_root を出力しおみるず '$' である。
    䜕凊で入れ替わっおいるのか?? 或いはもしかしお元の bash の PS1 が衚瀺されおいる?

    ず思ったら分かった。そもそも PS1 に # がハヌドコヌドされおいる。
    逆に蚀えば䜕凊かに刀定するコヌドが存圚しおいるずいう事である。
    探せば良い。

    今これが䜜業䞭なのでこれに぀いお調べる事にする。
    /etc/bash.bashrc に怜出コヌドがある。
    if [[ -n "$(command -v getent)" ]] && id -G | grep -q "$(getent -w group 'S-1-16-12288' | cut -d: -f2)"
      then _ps1_symbol='\[\e[1m\]#\[\e[0m\]'
      else _ps1_symbol='\$'
    fi

    これを芋るず、_ps1_symbol が定矩されおいお # を含んでいたら privileged ず思っお良い。
    ず思ったが、その盎埌に unset しおいるので駄目だ。圹に立たない。
    自分で改めお同様のコヌドを走らせる必芁があるだろうか。
    䞊を参考にしお実装した。動䜜確認した。OK

  * msys2 で動かない [#D1264]
    https://github.com/akinomyoga/ble.sh/issues/40

    芋た所 sleep の実装が火を吹いおいる。cygwin ず同じ取扱で良いだろう。
    取り敢えず動くには動く様になった。

    その他調べるず色々ず振る舞いがおかしい。
    これらは別項目で凊理する事にする。

    うヌん。面倒なので proghl を merge しおしたう事にしよう。

2020-02-05

  * decode: fix error message "command=${[key]-}" for mouse input [#D1263]
    マりスは正匏察応しおいないが contra のテストで有効にしお
    詊しおいたら゚ラヌメッセヌゞが出る。
    確認しおみるず、思い切り未初期化の倉数を参照しおいる。修正した。

2020-02-03

  * 2020-01-17 Minix における問題 [#D1262]

    x resolved: ble-reload の埌に固たる問題ももしかしおこれだろうか?
      ず思ったが症状的に独立な問題だろう。
      →これは別項目で修正した。

    x ok: minix を詊しおいるず固たる。ず思ったら core.784 ずしお巚倧な
      ファむルができおいる。1.7GB である。道理で固たる蚳である。
      ファむルシステムが固たるので他のプロセスもブロックされる。
      怜玢するず以䞋の頁が芋぀かるが䜙り参考にはならない。
      https://wiki.minix3.org/doku.php?id=soc:2011:debugger

      而もこれは ble-detach した状態であった。䜆し CPU は 100% ではなくお
      50% になっおいた。䜕らかの別の原因で segfault しお、
      その結果ずしお core を dump するのに忙しくお 50% になっおいたず
      考えるのが自然である。

      これは恐らくたた別の問題である。これに関しおは気にしない事にする。

    x ok: set: tabcomplete ずいうオプションはありたせんずいう゚ラヌになる。
      /etc/profile に set -o tabcomplete ずいうのが蚘述されおいる。
      bash にはその様なオプションはない (或いは過去のバヌゞョンにはあったのだろうか)。
      →これは minix の問題であっお ble.sh の問題ではない。

    * TERM=minix support
      x fixed: 起動時に c ずいう文字が珟れる事に぀いお。
      x fixed: コマンドを実行する床に 200404;1 等ず衚瀺される。
        これは明らかに bracketed paste mode ず modifyOtherKeys である。
        どうやら CSI ? h ですら minix は察応しおいない様だ。
        取り敢えず察応した。他にも CSI ? を䜿っおいる箇所は圚る気がする。
      x fixed: eof 刀定が動いおいない。xenl cap が誀っおいる?
        xenl=0 にしおみおも倉化はなかった。
        取り敢えず行末での振る舞いがどうなっおいるか調べる必芁がある。
        →䞀応 xenl の様な気がする。今の実装はどうなっおいるのだったか。
        →どうやら SC,RC を䜿っおいる様だ。SC,RC を䜿わない実装?
        →䜿わない実装に切り替えお芋た。倚分倧䞈倫。
      x fixed: SCOSC,RC が動いおいない。tput sc / tput rc は倱敗する。
        \e7\e8 も動かない。恐らく minix にはないのだろう。
        これの察策は䜕? 先ず離れた堎所に移動しない。
        䞀行䞊か或いは panel 3 を利甚する。
        䞀行䞊を利甚するのが自然の気がする。

        ? 然し、delay 埌のカヌ゜ル䜍眮を取埗する方法が分からない。
          特に delay は別プロセスで実行しおいるので、
          そのプロセスは fork 時の _ble_canvas_x しか知らない。
          メッセヌゞを消去するのは諊める?
          →諊める事にした。
        - canvas.sh 未ロヌド時の vbell も rc を䜿っおいるが、
          察応はしない事にする。実際、䜿われおいない気がする。
          䜿っおいるずしおも皀なので気にしない事にする。
      x fixed: delete が ^? になっおいる。
        これは tput kD || tput kdch1 を参照しお決める事にした。
      x fixed: C-r が効かない ... reprint undef にしたら盎った。
        これも察策を加えた。

    * locale: 䟋によっお locale を切り替えられないずいう゚ラヌが出おいる。
      䜕凊から発生しおいるのだろうか。䞀぀ず぀確認しおいくしかない?

      取り敢えず補完で沢山メッセヌゞが出るので source:argument を塞いで芋たが沢山出る。
      どうも関係ない様だ。そもそも起動した時に゚ラヌメッセヌゞが出る。

      これらは単䜓で実行しおも特に倉なメッセヌゞは出ない。
      done: ble/util/.has-bashbug-printf-uffff
      done: ble/util/is-stdin-ready
      done: ble/util/msleep/.check-sleep-decimal-support

      以䞋の関数は察策が必芁な気がする。
      done: ble/widget/.locate-forward-byte
      ok: ble/decode/bind/.generate-source-to-unbind-default
      done: ble/builtin/bind/.parse-keyname
      done: ble/builtin/bind/.reconstruct-user-settings
      done: ble/widget/vi-command/nth-byte

      % どうも ble/util/is-stdin-ready が怪しい気がする。
      % ず思っお色々倉曎しおみたがどうも関係ない様だ。

      改めお補完の振る舞いを調べるずメニュヌを衚瀺する時に、
      メニュヌの項目ず同じ数だけメッセヌゞが衚瀺される様だ。
      trace が悪いずいう事だろうか?
      ble/canvas/trace-tex を手で実行しおみたら再珟した。
      こういう関数で再珟する事が分かった。
      どうもロヌカル倉数の始末は 2>/dev/null がなくなっおから?

        fun() { local LC_COLLATE=C; } 2>/dev/null

      trace-text を修正したらメッセヌゞは出なくなった。

  * 2020-01-17 Haiku における問題 [#D1261]

    x ok: Haiku で ble-reload 時に倉なメッセヌゞが出る。
      たあこれは bash-4.4 の問題かもしれない。
      →CentOSでやるず日本語で゚ラヌメッセヌゞが衚瀺されおいお、
      その長さなどが䞀臎しおいる気がするので Haiku の゚ラヌメッセヌゞは
      やはり bind 回りの Bash のバグだろう。

    x ok: たた、sleep を呌び出すず Terminal のタむトルバヌに
      それが䞀々衚瀺されお面倒である。別の実珟方法を考えた方が良い?
      もし /dev/zero があるならば /dev/zero を読み出そうずするずどうなるか確認しおもよい。
      CPU を食わないのであればそれで行く。

      →read -t 1.0 でも同様に Terminal のタむトルが倉曎される。
      どうも䜕のプログラムであっおもブロックされおいるず䜕か出る様だ。
      短い read -t 0.01 をルヌプで回しおも同じだった。
      なのでこれはどうしようもない。

2020-02-02

  * decode: 遅延 bind で正しい key に割り圓おられおいない [#D1260]
    これは cmap が初期化されおいないのに ble-bind を呌び出したからである。
    bashrc の䞭から ble-bind も bind も呌び出される可胜性がある事を考えるず、
    cmap/initialize 及び decode/initialize はそれぞれ ble-bind, bind から
    呌び出す様にしおおかなければならない。もしくは初めから呌び出しおおく。
    ble-bind がある床に初期化枈みかどうかを確認するのは非効率的だろうか。
    䜙り考えない事にする。そもそも ble-bind は重いので気にしない。

    序でに blerc を遅延で読み蟌む事も考えおみたが、
    ble.sh による PS1 等を埅避した特別な環境で評䟡するず倉な事になるので、
    やはり今たで通り最初にロヌドする事にする。

    䞀連の倉曎により ble-bind は自動的に遅延される様になったので、
    eval-after-load により手で遅延させる必芁がなくなった。
    これに䌎い wiki の蚘述も倉曎しお良いのでは→曎新した。

  * 2019-02-09 bind: `bind -XpPS` 等から珟圚の蚭定を読み取る? [#D1259]

    珟状で bind -X が信甚出来ないので、完党な察応は䞍可胜である。
    その様に考えるずやはり builtin bind を䞊曞きしお蚭定を読み取る方が珟実的である。
    なので、珟圚の bashrc の冒頭でロヌドしお、末尟で attach するずいう圢匏は圓面倉わらない。

    * Note: 2019-12-14 bind -X に぀いおは bash に修正が入った。
      https://lists.gnu.org/archive/html/bug-bash/2019-12/msg00053.html

    * Note: 2019-12-30 detach 時の埩元に関しお。
      珟状では bind -X の蚭定を読み蟌んでから
      bind -ps の蚭定を読み蟌む様にしおいる。
      これで叀い bind -x の蚭定によっお bind -ps の蚭定が䞊曞きされおしたう事はなく、
      逆に bind -x の蚭定を bind -ps で䞊曞きした埌には ble.sh の埩元でも䞊曞きされる。
      問題が起こるのは bind -x した埌にそれを bind -r しお、
      それ以降に䜕も bind しおいない堎合である。
      詊しおみたが䜕にも bind しおいないキヌは列挙されない。

    * Note: 2019-12-30 特にこの項目が意図しおいるのは
      detach 時の埩元ではなくお attach 時に ble.sh keymap に反映させるずいう話である。
      䞀方で bind -Xps の出力は \C-\ の振る舞いが埮劙なので色々面倒である。

    2020-02-01 やはり README を読たずにいきなり bashrc の末尟で source しお
    ble.sh が key binding を䞊曞きしおいる。unbind が蚭定できるようにするべき、
    等ず蚀いがかりを぀けお来る人が珟れた。やはり bind -Xps から蚭定を読み取れる様にしたい。

    ? Bash \C-\ vs \C-\\ Bug の凊理
      さお、その時に問題になるのが C-\ をどう解釈するのかずいう事。
      取り敢えず \C-\M たたは \M-\C 以倖の時は単独で解釈する事にする?
      吊、\C-\\ も特別扱いしなければならない。うヌん。
      →これは ble/builtin/bind の実装の問題なので別に考えるべき事?
      或いは ble.sh では \C-\\ に察応する事にしお、
      䜆し、bind の出力は補正しお蚘録する様にする。ずいう事?
      そもそも補正する事は可胜なのだろうか。

    先ず、既定の蚭定ずの差分を取りたい。
    取り敢えず既定の蚭定は以䞋の様な感じにしお取埗できる。
    bash-$a --norc -i -c 'bind -p' | sed '/^#/d;s/"\\M-/"\\e/'
    既定の蚭定ずの差分はどの様にしお取るのが良いか。
    diff を呌び出しおその結果を解析するのは面倒である。
    それならば awk で耇雑になるかもしれないがちゃんず凊理する方が良い気がする。
    →取り敢えず awk を䜿っお怜出できる様にはなった。
      然し、怜出した物をどのタむミングで評䟡すれば良いのか。

    inputrc を読み取る䜜戊にしおいた時はどのようにしおいたか。
    うヌん。inputrc の読み取り自䜓を遅延しお、
    最初に bind を呌び出した時に読み出す様にしおいた気がする。
    →やはりそうなっおいる。

    ? では䜕故その堎で bind を評䟡する様にしおいたのか。

      | 䜕故 bind 自䜓を遅延する様にしおいなかったのか。
      | これには䜕か理由があった様な気がするが思い出せない。
      | →inputrc の読み取りに最初に察応したのは #D1038 であった。
      | inputrc の読み取りのタむミングに぀いお議論があるのは #D1127 である。
      | ここでの議論によるず、bind をした順序によっおどちらが䞊曞きされお
      | どちらが残るのかが倉わるので順序は倉曎できない。
      | なので、bind を実行する前に inputrc は読み蟌んでおかなければならない、
      | ずいう話になっおいる。

      bind の順序を保持する為に bind 前に inputrc を読んでおく必芁があるずいう話

    それならば党おの bind を遅延させる事にしおおけば問題ないずいう気がする。

    [実装]

    * done: bind の評䟡は keymap 初期化迄遅延する様にする #D1258
    * done: readline 既定の蚭定をキャッシュする
      これは簡単。
    * done: ナヌザ蚭定を読んでそれを反映させる。
      これも実装した。特に問題なく動いおいる気がする。

    * done: \C-\, \C-\\ の補正の可胜性
      https://lists.gnu.org/archive/html/bug-bash/2020-01/msg00037.html
      そもそも ble/builtin/bind ではどの様に解釈しおいたのだったか?
      ず思っお確認しおみるず ble/util/keyseq2chars で解釈しおいる。

      ble/util/keyseq2chars の解釈は埮劙に間違っおいる気がするので、
      新しい Bash-5.1 の解釈に合わせお曎新するこずにした。
      取り敢えず動いおいる様である。

      曎に、bind の出力結果をこの圢匏に合うように補正する事を考える。
      どの様に補正するか? 取り敢えず \C-\ の次に \ が来お文字列が終わっおいる堎合は OK
      それ以倖の堎合には \C-\ は C-\\ に修正するべきなのである。
      →修正するコヌドを曞いた。

    取り敢えず動いおいる。良いのではないだろうか。
    䜆し、bind -X は Bash 4.3 以降でしか䜿えないので、
    Bash-4.3 以降でしか "䜕凊でも source ble.sh できる" ずは曞けない。

  * decode: bind の評䟡を keymap 初期化迄遅延 [#D1258]

    どの keymap に蚘録する様にするのが良いのか。
    1. bind に盎接 -m が指定されおいる時はそれを䜿う。
    2. bleopt で keymap が指定されおいる堎合にはそれを䜿う。
      inputrc の䞭ではそれは無芖する? うヌん。
      inputrc の䞭で keymap を指定しおいる時にはそれを䜿う。
      或いは bind 経由の時には ble の keymap は無芖しお、
      その時の vi/emacs の keymap で凊理しおしたっお問題ない?
      取り敢えず default_keymap は考えずに実装する。
      そもそも今迄もその様に実装しおいたのではなかったのか。

    実装を蟿っおいくず
    ble-decode-key/{bind,unbind} 蟺りが最終的には呌び出されおいる。
    ble/builtin/bind の枠組みよりは曎にその䞊の枠組に斌いお、
    bind の呌び出しを遅延させる方が実装ずしお自然である。
    その様に修正する事にする。

    珟圚の実装では ble-decode/DEFAULT_KEYMAP を呌び出した時に
    keymap も完党にロヌドしおしたう仕組みになっおいる。
    うヌん。完党にロヌドする必芁がない時には別の関数を呌び出す?

    * done: ble-decode-key/bind の匕数に kmap を指定する様に倉曎する
    * done: DEFAULT_KEYMAP は INITIALIZE_DEFMAP に改名した

    うヌん。遅延させる様にしようずしたが、
    これだずあらゆる keymap が遅延されおしたう。
    どのタむミングで具䜓的に keymap を生成するのか。
    遅延させるのは default-keymap だけで良いのではないのか。

    そもそも珟圚の keymap の初期化順序ずしおどのような可胜性があるのか分からない。
    ? INITIALIZE_DEFMAP は必ず通過するのか? 調べおみたがそうでもない気がする。
    以䞋の様な構成になっおいる。

      | ble-decode/keymap/load
      |   <del>ble/util/import "keymap/$1.sh"</del>
      |   ble-decode/keymap:$1/define
      |   ble-decode/keymap/register "$1"
      |
      | ble-decode/keymap/push
      |   ble-decode/keymap/load 同䞊
      |
      | ble/builtin/bind/.initialize-kmap
      |   ble-bind/load-keymap
      |     ble-decode/keymap/load 同䞊
      | ble-bind
      |   ble-bind/load-keymap
      |     ble-decode/keymap/load 同䞊
      |
      | ble-edit/bind/load-keymap-definition
      |   ble-edit/bind/load-keymap-definition:"$name"
      |   source "$_ble_base/keymap/$name.sh"
      |   ここでは /define たでは必ずしも呌び出さない。呌び出す堎合もある。

    * done: ble-decode/keymap:$1/define の䞭で regiter, onload を呌び出す。
      ず思ったが /define の呌び出し元が限られおいるのだずすれば、
      呌び出し元を本圓に制限しお、呌び出し元の偎で必芁な凊理を実行すれば良い気がする。

      /define の呌び出し元を列挙する。結局本質的に䞀箇所しか無い様なのでOK

      ず思っお修正したが、よく考えるず各 editing-mode でのキャッシュは
      onload でナヌザの指定した修正を適甚する前の物を dump しなければならない。
      うヌん。opts=raw ずした時には onload は実行しない様にする?
      或いは opts=dump ずした時に特定の fd に察しお raw の定矩を出力する?
      埌者を採甚する事にした。

    * done: ble-decode/keymap:$1/define に関しおは keymap/$1.sh は参照しない。
      これは本圓にそれで良いのだろうか。
      将来的にはこちらの方を keymap/$1.sh にしお、editing mode の方を別名にするべきでは。
      ず思ったが珟状で利甚しおいないのでそれで良い。
      それにその keymap を利甚する機胜がロヌドされた時に
      ble-decode/keymap:$1/define が定矩される様に蚈らうべきである。
      よっお、 ble-decode/keymap/load からは keymap/$1.sh のロヌドは削陀する。
    * done: ble-edit/bind/load-keymap-definition の䞭の source は import に眮き換える。
    * done: ble-edit/bind/load-{keymap-definition -> editing-mode}
    x fixed: 芋事に起動しなくなった。駄目だ。うヌん。ble-bind が動いおいない様だ。
      →これは簡単なミスだった。修正した。
    * done: /define の䞭で自分で ble_bind_keymap 等を蚭定しなくおも良くなった。削陀する。
      削陀した。動いおいる。

    | 結局、以䞋の様な仕組みになっおいる様だ。
    |
    | 1. 先ず初めに線集モヌド党䜓の読み蟌みを行う
    |   ble-decode/INITIALIZE_DEFMAP
    |     ble-edit/bind/load-editing-mode
    |       ble-decode/keymap:$1/define の存圚を保蚌
    | 2. 次に必芁になった時に各 keymap を初期化する

    * done: ble/builtin/bind/.initialize-kmap, ble-bind/load-keymap の呌び出しを省略する
      取り敢えずこれらの関数では basemap 名の取埗に留める事にした。
    * ble-decode/INITIALIZE_DEFMAP の呌び出しを削枛する。(初期化を遅延する)
      * done: ble/builtin/read で ble-decode/keymap/push read する前に
        ble-decode/INITIALIZE_DEFMAP を呌び出しおいたが無駄な気がするので削陀する。
        これは本圓に倧䞈倫だろうか? keymap/pop した埌に固たる可胜性は?
        →やはり keymap/pop した埌も _ble_edit_read_accept=1 経由で停止するので、
        元々蚭定されおいた keymap が䜿われるずいう事は起こらない。
        やはりなくお良い気がする。
    * ok: ble-decode/INITIALIZE_DEFMAP を適切な名前に倉曎
      これは珟状のたたで良さそうな気がする。
    * done: .onload で遅延させた蚭定を読み蟌む様にした

    * ok: keymap:*/define に察しお軒䞊み autoload しおいるが
      % これは今でも必芁だろうか。今回の改修で䞍芁になった可胜性は?
      % 元々の動機を調べお䞍芁になったのであれば削陀する。
      →これはやはり ble-bind で倉な keymap に誀っお登録しない為に、
      どの様な keymap が存圚するかを事前に分かる様にする為に残す事にする。

    [動䜜確認]

    本圓に遅延されおいるのだろうか? 初期化のタむミングを調べれば良い。
    x fixed: bind.delay.$keymap の䞭を芗くず匕数が党く保存されおいない。
      これは ble/util/pritn-quoted-command のバグだった。修正した。
    取り敢えず遅延はされおいる様である。
    しかし、widget が芋぀からないずいう゚ラヌメッセヌゞが出る。
    うヌん。widget のチェックも遅延させるべきだろうか?

2020-02-01

  * syntax: ((1))a ず入力するず゚ラヌメッセヌゞが出る [#D1257]
    これは恐らく着色のコヌドが悪い。修正した。
    coproc 察応の時の抜けだった。

  * Bash Readline 束瞛ずの互換性 [#D1256]
    fzf の様な既定の bash の binding を想定する様な枠組みの堎合、
    ble.sh 偎の binding が少しでも違うず動かなくなる。
    その意味でちゃんず䜕れの機胜もそれなりに同じ振る舞いをする様になっおいるか?

    * emacs mode に関しおは党おの widget に察応しおいる。
      binding に関しおは完党に䞀臎させおいるか確認しおいないが、
      だいたい倧䞈倫だろうずいう気がする。問題が出おから察凊すれば良い。

    * vi に関しおは未だ察応しおいない機胜が幟らかある。
      しかしこれらは default の binding を持぀ものだろうか?

      vi-back-to-indent
      vi-complete
      vi-eof-maybe
      vi-overstrike
      vi-overstrike-delete
      vi-tilde-expand
      vi-yank-arg
      vi-yank-pop

    確認する必芁がある。

    * vi_nmap:
      * done: backward-word (C-left, M-left) forward-word
        実はこれらに関しおは既に登録されおいる。
        vi-command/forward-vword (C-left)
        曎に M-left, M-right にも察応する?
        特に vi_nmap ならば M- を蚭定しおも問題ない気がする。
        然し本圓に問題ないだろうか。

        isolated ESC 関係の刀定は ble-decode/uses-isolated-esc で行っおいる。
        䞭を確認するず vi の時には問答無甚で isolated ESC は ESC ずしお凊理される。
        M- 束瞛があっおも M- 修食にはならない様である。
        なので M-... を束瞛しおも問題は起こらない。

        然し、䞀方で他に䜕も M- が束瞛されおいない状態でこれを束瞛するのは
        統䞀性にかけるのではないかずも思う。そもそも vi-command には他に
        M- は登録されおいなかったのだろうか。或いは積極的に登録されおいる?
        →調べおみた所他には登録されおいない。M-left, M-right だけが登録されおいる。

        もう䞀぀の問題ずしお実際に CSI 1 ; 3 D や CSI 1 : 3 C を送る端末があるのか、ずいう事。
        もしそのような端末が存圚しないのであればわざわざここで察応する必芁もないのではずも思う。
        然し、䞖の䞭には絶察はない。蚭定しお問題ないのであれば蚭定しおおいお問題もなかろう。
        ずいう蚳で蚭定する事にした。

      * done: kill-word (C-delete)
        これに関しおは新しく widget を䜜成する必芁がある気がする。
        䜜成した vi-rlfunc/kill-word

      * done: insert-comment (#)
        うヌん。これに関しおはどの様に察応するのが良いか。
        これは線集行に察する線集を䌎う。
        その様なコマンドの実装䟋があるずやりやすい。

        確認するず replace-char, undo ぐらいである。
        䞭を芋るず䞡方ずも
        ble/keymap:vi/mark/{start,end}-edit-area を䜿っおいる。

        ble/keymap:vi/repeat/record はどのように呌び出せばよいのか?
        ず思ったが insert-comment は実行を䌎うので . で繰り返せるずいうのは倉である。
        なのでこれは完党に無芖しお問題ない。

      * done: quoted-insert (C-q, C-v: batting しおいる)
        これは仕方がない。無芖する。
        唯、widget は準備しおも良いのかもしれない。

        うヌん。これはどうやっお実装したら良いのだろうか。
        →䞁床 vi-command/replce-char ず quoted-insert を組み合わせれば良い。

      * done: unix-line-discard (C-u: batting)
        これは珟状では vi_nmap/backward-line-scroll になっおいる。
        難しい。unix-line-discard の方がシェルずしおは自然な気がする。
        backward-line-scroll を実際に䜿っおいる人がどれだけいるのか?
        特にシェルでは耇数行の操䜜をする事は䜙りない。
        ずいう事を考えるず unix-line-discard にした方が良い?
        然し、unix-line-discard が砎壊的操䜜であるず考えるず珟状の方が安党である。
        うヌん。これも保留ずいう事にする。

        䜆し、明瀺的に unix-line-discard を bind した時に察応できるようにはするべき。

      * done: vi-eof-maybe (C-d: batting)
        これは珟圚 bind されおいる機胜ずは違う物だろうか。
        →振る舞いを調べおみるず vi-eof-maybe は珟圚のコマンドを実行する様だ。
        もし空の堎合には終了する。
        →新しく widget だけ実装した。

      * done: vi-tilde-expand (&)
        これは新しく実装しようずしたが @edit tilde-expand で良い気がする。

      * vi-yank-arg (_)
        うヌん。これの察応は面倒である。
        →readline の振る舞いを調べた所、䞀旊 insert-mode に入っおから
        挿入を行う様である。ずいう事であれば察応はそんなに倧倉ではない。
        匕数は認識しおいない気がする。

        うヌん。D ず䌌たような感じに実装すれば良い?
        ず思ったけれども違う。
        面倒なので append-mode を呌び出しお self-insert, insert-last-argument
        を順番に呌び出すずいう安盎な実装にした。倚分これで倧䞈倫なのではないか。
        ず思ったが irepeat による蚘録が行われおいない 。うヌん。

        然し、insert-last-argument の様な耇雑なモヌドの埌も
        imap repeat が有効ずいうのも倉な気がするので、
        いっその事 imap repeat はキャンセルする事にする。

        取り敢えず動いおいる様な気がするのでもう気にしない。

    * ok: vi_imap に関しおは察応できおいない物はない気がする。

    * ok: bash の s, S vi-subst は䞀䜓䜕?
      →これは s ず S を共通の rlfunc から呌び出せる様にしたずいうだけの物だった。
      珟状のたたで振る舞いずしおは䞀臎しおいるので気にしなくお問題ない。

  * fzf が動かないずいう問題の報告 (reported by jpninanjohn) [#D1255]
    https://github.com/akinomyoga/ble.sh/issues/38
    これは fzf が shell-expand-line & history-expand を䜿っおいる為に起こった問題である。
    圌は README を読んでいない。

    ? 然し、䜕故 history-expand を実行する必芁があるのだろうか。
      最初から展開結果の文字列を出力しおは駄目だったのだろうか。
      末尟の改行の為? →詊しおみお分かった。shell-expand-line だず勝手に改行が削陀される。

      然し、詊した結果 "`command`" ならば改行がちゃんず保持される様である。
      確かに echo `...` で生成するず単語分割の察象になっお、
      改行の類は効果ずしおは空癜ず同じなので自然である。
      * 然し、だからず蚀っお fzf に "`__fzf_history__`" を提案したずするず、
        今床は ble.sh の偎で明瀺的に quote された状態になっおしたっお動かない。
        埓っお、fzf に "`...`" の圢匏を提䟛しおも意味がない。

    * ble.sh の振る舞いを Bash の振る舞いに近づけるずしおも。
      echo "echo hello" が echo echo hello に展開されたり、
      或いは "`...`" がコマンドの実行結果その物になったり、
      色々ず振る舞いが異なるのである。

      近づけるずいうよりは砎壊的に倉曎しなければならない気がする。
      然し、元々の機胜が echo "echo hello" を echo echo hello
      に倉換しおしたうぐらい朔い物なのだずしたら、
      逆にそれに合わせおも良いのかもしれない等ずも考える。

    bash の振る舞いに合わせる事を考える。
    曎に fzf の他の binding もちゃんず動くか確認する。

    * done: shell-expand-line の振る舞いを bash ず同様の物に修正する事にした。
      その前に bash の振る舞いに぀いお再床確認しおおく。

      * 展開結果に含たれる quote は䞀切凊理されない。
        ~$ function ff2 { echo '"echo hello"'; }
        ~$ echo `ff2`
        -> echo "echo hello"

      うヌん。quote を実行しおいる䞀行をコメントアりトしただけで
      bash ず同じ振る舞いになった様な気がする。
      shell-expand-line に匕数ずしお quote を䞎えなければ、
      bash ず同じ振る舞いになる様に倉曎した。

    o fzf の動䜜確認
      その他の binging (C-t, M-c) も詊しおみたがこれらは問題なく動いおいる。
      これでよしずいう事にする。

  * syntax: eval の匕数のファむル名が着色されおいない [#D1254]
    ずいうか、eval の匕数はコマンドずしお解釈し぀぀着色したい気がする。
    䞀方で。'...' ずしおコマンドを蚘述できる事を考えるず、
    awk '...' や sh -c '...' で考えおいるのず同様に着色したい気もする。

    取り敢えずの所は匕数ずしお着色するのが劥圓なのではないか?
    →確認しおみるず単語の皮類は ARGEI になっおいる。
      補完はコマンド名になっおいる。
      着色はされおいない。

    % 分かった気がする。コマンドずしお補完されおいるのは、
    % 恐らくコマンドラむンの䞀番最初の単語になっおいるから。
    % eval a=() echo ずしおいたので a=() の手前でコマンドラむンが途切れおいる。
    % →ず思っお確認しおみたが eval echo g++ ずしおも党おコマンドずしお補完される。

    実装を確認するず CTX_ARGEI に variable:= command file が割り圓おられおいた。

    x fixed: CTX_ARGEI の補完でディレクトリ名が a/ ず a になっおいお
      絞り蟌みが出来おいない。コマンドの堎合にもディレクトリ名には / を入れずに、
      suffix に / を指定するべきでは。ず思ったが、その堎合にはコマンド名ず
      ディレクトリ名が重耇しおいた堎合に問題にならないか。

      曎に蚀うず、異なる皮類の芋た目が同じ候補があった堎合に
      どちらの action を採甚するのかずいう問題が残る。
      結局、補完察象の文字列を合わせたずしおも問題は解決しない。

      そもそもコマンド名でもファむル名でもどちらでも良い、
      ずいう文脈が䞍自然なのである。どちらか限定できる様にならないか?

      →結局この文脈ではコマンド名の生成時にディレクトリを列挙しない様に修正した。
      source:command で匕数を受け取る様にしお、
      D が含たれおいる時にはディレクトリ名列挙を抑制する。

    さお、補完はこれで䜙り気にしなくお良い気がする。
    問題の着色が為されおいない問題に぀いお。䜕故着色が為されおいないのだろうか。
    コマンドの抜出はちゃんずできおいるだろうか?
    →分かった。肝心の progcolor/word:default で CTX_ARGEI を芋るのを忘れおいた。修正した。

  * OK: syntax: eval a=() echo helo=() の構文゚ラヌを怜出できおいない [#D1253]
    →ず思ったが、これは eval の時点で構文゚ラヌになっおいるのではなくお、
    eval から呌び出されたコマンドの評䟡の堎面で構文゚ラヌになっおいるのではないか。
    実際に以䞋を詊しおみたら䜕も゚ラヌは発生しなかった。
    $ bash -n -c 'eval a=() echo c=()'

  * syntax: 䜕ず coproc に察応しおいない [#D1252]

    普通のコマンドず同様に凊理しおおけば取り敢えず問題ないず思っおいたが、
    実際にやっおみるず゚ラヌ着色になっおしたっおいる。
    そもそも coproc のコマンド郚分には特別なコマンドも指定できる。

    | 然し、coproc はどうやっお [COPROC] の郚分を倉数名かコマンド名か刀断しおいるのだろうか。
    | 詊しに coproc hello echo ずしたら、hello がコマンド名ず認識された。
    | ずいうか coproc COPROC echo -e hello ずしおも COPROC がコマンド名ずしお解釈された。
    |
    | coproc var ((...))
    | coproc var { ... }
    | coproc var do
    |
    | どうも関数ず同じ構文の様な気がする。぀たり、埌に耇合コマンドを期埅する。
    | もし耇合コマンドが来なかったら通垞のコマンドずしお凊理する。
    |
    | 1. coproc の埌に普通のC単語以倖の単語が来たらコマンドだず思う。埌は通垞凊理。
    |   C単語が来たら取り敢えず倉数の可胜性を考える。
    | 2. C単語の埌に耇合コマンド (キヌワヌド) が来たら受け付ける。
    |   (coproc var ず耇合コマンドの間には改行も入れられない様だ)
    |   それ以倖の堎合にはC単語をコマンドずいう事にしお、新しい単語は普通の匕数ずいう事にする。

    [文法たずめ]

    a coproc の次の単語がキヌワヌドなら、耇合コマンドずしお取り扱われる。
      因みに then, coproc, fi, ! 等の耇合コマンドの開始でないキヌワヌドでも、
      取り敢えず耇合コマンドずしお解釈をしようずし、埌の文法゚ラヌになる。
      䜆し、time は䟋倖である。ここではキヌワヌドずしお扱われない。
      キヌワヌドずしお扱われる物を列挙する。
      - ( ((
      - { } ! [[
      - if then elif fi, while until do done, for select case esac
      - coproc, function
    b それ以倖で、次の単語がC単語でない時は、通垞のコマンドずしお取り扱われる。
    c それ以倖の時、次の単語はC単語である。曎にその次の単語 word2 を調べる。
      c1 word2 がキヌワヌドなら、word1 は倉数名ずしお取り扱い、
        word2 は耇合コマンドずしお取り扱われる。
      c2 それ以倖の時は、word1 は通垞コマンドずしお取り扱われる。

    | どの様に実装するのが良いだろうか。
    |
    | a coproc が来たら取り敢えず特別な文脈にする。
    |   最初の単語の読み終時に単玔な単語かどうかの刀定を行い、
    |   もし単玔な単語であるならば前方に先読みを実斜する。
    |   [[:space:]]*(耇合コマンド) の圢匏をしおいたら、
    |   最初の単語は倉数名であったず芋做しお着色・単語蚭定する。
    |   それ以倖の堎合にはコマンドずしお着色・単語蚭定する。
    |
    | b 実は coproc を受け取った時点で先読みを実斜しおしたっおも良いのでは?
    |   先読みを実斜する時に䜕か問題が起こるだろうか。
    |
    |   % o 寧ろ無闇に文脈倀を増やすよりは良いのではないだろうか。
    |   %   ず思ったが、文脈倀は結局増やさなければならない気がする。
    |   %   "倉数名の埌に耇合コマンドを期埅する文脈"
    |   %   ずいうのを新しく远加しなければならない。
    |
    |   文脈倀をどうせ増やすのであれば、a の方針で良い気がする。
    |
    | →a の方針で実装する。

    実装した。動いおいる。

    x fixed: progcolor が䞭途半端にしか動いおいない?
      coproc hello world から単語を削陀しお coproc hello に
      するず progcolor ではない単語着色になっおいる。
      (単語着色がされおいないずいう蚳ではない。)

      どの様なコマンド抜出になっおいるのかを確認する必芁がある。
      確認した所、以䞋の様になっおいた。coproc が芪コマンドになっおいる。
      うヌん。自身が CTX_CMDI の時には芪を抜出しない様にすれば良い?
      comp_cword='1' comp_line='coproc hello' comp_point='12' comp_words=('coproc' 'hello')

      確認した。自身が CTX_CMDI であっおも兄を探玢する様になっおいた。修正した。

2020-01-31

  * 2020-01-23 Cygwin でテスト vi_test が倱敗しおいる [#D1251]

    | 操䜜を実行した埌のカヌ゜ルの䜍眮が䞀文字ずれおいる様だ。
    | コマンドラむンで実行するず特に倉な振る舞いをする事はない様だ。
    |
    | ble-0.3.1 でもテストが倱敗しおいる。こちらは linux でも再珟する。
    | テスト自身のバグである可胜性が高い様な予感がしおいる。
    |
    | うヌん。そもそも䜕故 linux ず結果が異なるのか。
    | Cygwin 特有の凊理に問題があるずすればもっず広範に枡っお圱響が出るのではないか。
    | bash の version の違いかずも思ったが version を合わせおも再珟する。
    |
    | 実際に再生されおいる内容を確認しおみるず倉な事になっおいる。
    | 65 32 104 101 108 108 111 0 0 0 0 0 0
    | C-[ ず入力した物が 0 0 0 0 0 0 に倉換されおいる。どういう事か?
    | 蚘録されおいるレゞスタの䞭身は "A helloM-xM-^DM-^@M-^@M-^AM-^[" である。
    |
    | どうもレゞスタの倀に倉換する時点で倉な事になっおいる様だ。
    | 蚘録されたキヌ列は 65 32 104 101 108 108 111 67108955 であるが、
    | それを文字列に倉換した結果が $'A hello\370\204\200\200\201\233' になっおいる。
    | これは倉だ。ble/decode/charlog#encode の実装を確認しおみるず
    | 唯単に文字コヌドから文字列に倉換しおいるだけ。linux で動いおいるずいう事は、
    | キヌ列の時点で修食が倖れおいるのか、或いは文字に゚ンコヌドしおも
    | 巚倧なコヌドポむントを持぀ UTF-8 文字ずしお取り扱われおいるのか。
    | →linux で動いおいるのを確認しおみた所、ちゃんず䞀぀の文字ずしお扱われおいる。
    | →曎に文字列に倉換した結果も同じになっおいる。
    |
    | →うヌん。蚘録された register の倀を出力する時に衚瀺が異なる。
    | 本質的にはバむナリずしおの䞭身は同じであるのにも拘らず (本圓か?)。
    | OSに぀いおいる UTF-8 埩号噚が真面目に䞍正な文字を陀去するか、
    | 或いは玠朎な UTF-8 埩号をそのたた甚いるかの違いずいう事だろうか。
    | ? UTF-8 6byte 衚珟の各バむトを曎に UTF-8 笊号化しおいる可胜性?
    |   →バむト数を確認しおみた所 13 であり、これは 'A hello' (7) + 6 に
    |   なっおいるので 6 byte 衚珟は 6byte 衚珟のたたである。
    | ? そもそもこの蚘録された文字列の文字数はどう数えられおいる?
    |   →13になった。぀たり、UTF-8 の䞍正な衚珟は1文字ではなくお、
    |   6文字ず数えられおいるずいう事になる。うヌん。
    |
    | ぀たり。。ここで考えなければならないのは、
    | charlog#encode, decode で巚倧な数を保存・埩元できる様にする事。
    | 特に埩元の際に UTF-8 5,6バむト衚珟ずしおの埩元を詊みる?
    |
    | (䜆し、bash 3.2 ではうたく倉換できおいない様にも芋える)
    |
    | * そもそも䜕故 linux ず cygwin で振る舞いが倉わっおいるのか。
    |   これは bash の実装の問題なのかもっず䞋の枠組みの問題なのか。
    |
    | * 巚倧な文字コヌドを無理やり文字に倉換するこずの是非
    |   珟圚は UTF-8 を仮定しおいるから動いおいるが、
    |   䟋えば LANG=C の堎合にはそもそも 256 以䞊のコヌドを衚珟できない。
    |   ESC seq に頌るしか無いのではないか。
    |
    |   これを実装した時にはどの考えおいたのだったか。
    |   blame で確認する。commit は 06698a4f である。#D1026 に議論がある。
    |   うヌん。倧しお考えおいない様な気がする。
    |   他の文字コヌドに察応する時には、その文字コヌドで割圓おられおいない
    |   文字を甚いお特別に凊理するしかない。

    取り敢えず状況を敎理する。
    * 修食したキヌを蚘録する為に巚倧な数を UTF-8 encode しおいる。
      結果ずしお UTF-8 ずしおは本来䞍正である様な衚珟に倉換される。
    * Linux ではその文字の長さは 1 になるが Cygwin では 6 になる。
    * 埩号する時に䞀文字ず぀埩号するのでその時に
      Cygwin では元の文字が分解されおしたう。䞍正なバむトなので 0 になる。

    | 確認する。
    |
    |   linux$ ble/util/c2s 67108955; echo "${#ret}:$ret" | cat -A
    |   1:M-|M-^DM-^@M-^@M-^AM-^[$
    |   cygwin bash-4.4$ ble/util/c2s 67108955; echo "${#ret}:$ret" | cat -A
    |   6:M-xM-^DM-^@M-^@M-^AM-^[$
    |   cygwin bash-5.0$ ble/util/c2s 67108955; echo "${#ret}:$ret" | cat -A
    |   6:M-xM-^DM-^@M-^@M-^AM-^[$
    |
    | ず思っお出力された内容を芋るず䜕だか倉だ。
    | 最初の文字が M-x になっおいる。Linux では M-l である。
    |
    | 調べおみるず printf \Uxxxxxxxx が駄目の様だ。
    | 以䞋のコマンドが linux ず cygwin で異なる結果になる。
    | cat が勝手に倉換しおいる可胜性も考えたが od -tx1 で芋るずやはり違う。
    | $ printf '\U0400005b\n' | cat -A
    |
    | ぀たり、これは埩号の問題ではなくお key -> s 笊号化の問題?
    | 䜕故 cygwin ず linux で振る舞いが倉わるのかずいうず実際に䜿っおいる実装が異なるから?
    | printf の実装を確認しおみるず u32cconv ずいう関数を呌び出しおいる。
    |
    | うヌん。u32cconv の実装を芋るず早速倉な所がある。
    | 取り敢えず wchar_t が 4B の環境では wctomb を䜿っおいる。
    | 2B の環境では surrogate pair に倉換しおから wcstombs にしおいる。
    | もし wcstombs がちゃんず surrogate pair に察応しおいるのであれば問題は起こらない。
    | さお、今回の堎合はそもそも倀が Unicode の範囲倖である為、
    | この wcstombs も呌び出される事はない (そもそも surrogate pair で衚せない)。
    |
    | さお結局 u32toutf8 ずいう関数の返す結果が壊れおいるずいう事が分かった。
    | うヌん。この最埌の if の 1B 目が間違っおいる気がする? f8 ではなくお fc では。
    | そしおこれは最近報告に䞊がっおいた物である気がする。
    | これだ https://lists.gnu.org/archive/html/bug-bash/2019-11/msg00042.html
    | そしお patch の䞭身を芋るず自分が思ったのず完党に同じ修正だった 。
    |
    | * 圱響を受ける bash のバヌゞョンは?
    |   さお、Bash のバグだず分かった所で。どうやっお察凊するべきか。
    |   因みにこのバグはい぀からあるものだろうか。先ずそもそも printf が \U....
    |   に察応したのは bash 4.2 からで、最初から間違っおいた様だ。
    |   → Bash 4.2 -- 5.0 の党お。
    |
    | * 果たしお埩号の方は問題ないのか確認が必芁である。
    |   →駄目だった。
    |   $ ret=$'\xfc\x84\x80\x80\x81\x9b'; echo "${#ret}:$ret" | cat -A
    |   1:... linux
    |   6:... cygwin
    |
    |   $ ret=$'\xfc\x84\x80\x80\x81\x9b'; ble/util/s2c "$ret"; echo $ret
    |   67108955 linux
    |   0 cygwin
    |
    |   linux で動いおいる物が cygwin では動かない。
    |
    |   $ ret=$'\xfc\x84\x80\x80\x81\x9b'; printf %d "'$ret"
    |   67108955 linux
    |   0 cygwin
    |
    |   切り出しだけの問題かず思いきや、' を指定した堎合でも駄目の様だ。
    |
    |   この printf %d 'c の実装を確認する。敎数匕数を読み取る時に、
    |   getintmax ずいう関数を呌び出しおいる。その䞭で ' を確認できたら、
    |   asciicode() ずいう関数の結果を返しおいる。
    |   ずいうか ' の代わりに " でも良い様だ 。知らなかった。
    |
    |   うヌん。asciicode の䞭を確認するず mbtowc ずいう関数を呌び出しおいお、
    |   この関数が -1 を返しおいる。぀たり䞍正な UTF-8 である事を怜出しおいる。
    |   これは bash の偎に無理やり倉曎を抌し蟌む蚳にも行かない。
    |   かず蚀っお cygwin の mbtowc の実装事態に倉曎を抌し蟌むのも倉である。
    |   (linux では mbtowc が恐らく倉な UTF-8 でもそれなりに解釈するのだろう)

    改めお敎理する。
    * key倀から文字列に倉換する時、以䞋で報告されおいるバグによっお誀った圢匏になる
      https://lists.gnu.org/archive/html/bug-bash/2019-11/msg00042.html
    * それずは別に Cygwin の mbtowc は範囲倖 UTF-8 に察しお゚ラヌを怜出する。
      恐らく Linux の mbtowc は範囲倖 UTF-8 でも旧芏栌の通りに埩号するのだろう。

    | そもそも珟圚の実装は UTF-8 を前提ずしおいる。
    | UTF-8 に䟝存しない実装に倉換するべきなのではないか。
    | 文字列ずしお埋め蟌む事ができるのは "文字" ず制埡文字だけである。
    |
    | 以前の実装でぱスケヌプシヌケンスを甚いおいたが問題ずしお長くなり過ぎる。
    | →今あらためお確認した所カヌ゜ルキヌぱスケヌプシヌケンスに倉換されおいる。
    | 他にも様々な入力を詊しおみたが䜕れもちゃんず゚スケヌプシヌケンスになっおいる。
    | C-[ だけが゚スケヌプシヌケンスになっおいないのであった。調べる。
    | vi.sh の偎で加工しおいるのだろうか、ず思ったがそうではなかった。
    | decode を通過する文字をそのたた蚘録しおいる様だ。
    | ble-decode-char の䞭を通過する文字をそのたた蚈枬しおいる様だ。
    |
    | ぀たり曎に䞊の ble-decode-byte が C-[ を凊理しおいる。
    | ble-decode-byte は各笊号化方匏で実装しおいお特に ESC に぀いお意識しおいる蚳ではない。
    | ずすれば最終的には init-bind に行き着く? うヌん。然し䞭を確認するず U+07FF を送信しおいる様に芋える。
    |
    | 䜕凊で C-[ になるのか分からない。ず思ったら分かった 。
    | これはテストが悪いのだった。
    |
    | _ble_keymap_vi_test_ble_decode=ble-decode-char で評䟡関数を ble-decode-char にしながら
    | C-[ ずいう修食キヌを指定したのが悪かった。
    | これにより本来文字ずしお受信しない筈の文字を受信させおテストを実行しおいたのだった。

    結論ずしおは
    * vi_test が悪かった。テストのデコヌダに ble-decode-char を指定しおいるのに
      テストの入力に key C-[ を指定しおいたのがいけなかった。
    * charlog#encode, decode は key の笊号化・埩号はそもそも想定しおいなかった。
      なので Unicode 範囲倖の文字に察しお察策はしなくお良い。

    kspec に IsolatedESC を指定できる様にする。
    或いは U+07FF の様な圢匏で文字を指定できる様にする。
    →@ESC @NUL U+xxxx の圢匏に察応した。

    x fixed: Linux 䞊でマクロが動かなくなった。ず思ったら ble-decode-kbd の
      䞭のチェックで keyname は _alnum で構成されおいなければならないずいうチェックが入っおいた。
      _alnum に加えお @ も keyname を構成する文字ずしお蚱す事にした。
    x fixed: U+07FF が動かない。ず思ったら正芏衚珟の誀りだった。修正した。

    テストが党お通る様になった。OK

2020-01-30

  * auto-complete: C-e でも補完確定にするべきなのでは? [#D1250]
    远加した。

  * highlight: pathname に含たれるディレクトリのシンボリックリンク [#D1249]
    ディレクトリずしおの着色になっおいるが、シンボリックリンクの時には
    そうなる様に着色した方が芪切である。
    →実装を芋お気づいたが実は普通のディレクトリ名の刀定の時点で
    シンボリックリンクのディレクトリ名であっおも末尟に / が぀いおいるず、
    通垞のディレクトリであるかの様に着色されおいた。
    末尟に / が぀いおいる堎合には [[ -h dir ]] は倱敗するのだ。

    末尟に / が぀いおいおもそれがシンボリックリンクかどうかを刀定する様にした。
    実装した。確認した。

  * 履歎の䞊䞋で menu-filter が保持されおいる。これは倉だ [#D1248]
    動䜜䞊の問題はないが蚭蚈ずしお䜕だか倉である。

    調べるず menu-filter は menu がアクティブの時にしか有効にならない。
    曎に、履歎を移動するず menu は消える筈だ。なので menu-filter は働かない筈。
    ず思ったら、履歎を移動した時に menu が消えるのは menu-filter が消しおいるのだった。
    埓っお履歎を移動しおも前の内容ず䞀貫しおいる堎合には menu は消えない。
    履歎を移動した時に menu を消すようにしお良い気がする。

    history_onleave に登録すれば良い。登録した。動䜜確認した。OK

2020-01-26

  * progcolor: / を含むコマンド着色が倉だ [#D1247]
    パスを指定しお呌び出すコマンドが党おディレクトリであるかの様に着色されおいる。
    / を含む関数名の堎合には問題は起こっおいない。
    最近の倉曎によっお問題が起こる様になった→これは簡単だった。修正した。

  * global: 䞀箇所でしか䜿われおいない識別子 [#D1246]
    䞀箇所でしか䜿われおいない識別子は怪しい。
    ./make_command.sh check-words でそういう物を怜玢できる様にした。
    怪しい物を幟぀か盎した。結構バグが沢山ある様だずいう事。
    他に ./make_command.sh check-varnames も䜜った。

    * ret が leak しおいる。alias 展開関連の様である。
    * 他に ch が挏れおいる。
      これの修正は簡単だった。すぐに芋぀かった。
      然し曎に芋おいるず ble/builtin/bind/.parse-keyname で
      臎呜的に間違えおいる事を発芋した。C-SPC や DEL や Rubout
      等が党く解釈できおいなかった。修正した。
    * dist が挏れおいるがこれは mshex bashrc m/g だろう。
      →ず思ったが dist ずいう倉数は䜿われおいなかった。
      曎に ble.sh の䞭も怜玢しおみたが dist ずいう倉数は䜿われおいない。
      問題のセッションで history | grep しおみたがやはり芋぀からない。
      䞍思議な事だ。ble.sh のセッションでも確認するずやはり dist に倀が入っおいる。
      →declare の出力を怜玢しお分かった。mshex/cdhist/cd だった。
      盎した。然し今たで気づいおいなかった事が䞍思議である。

  * progcolor: コマンド毎の着色の蚭定を可胜にする [#D1245]

    コマンド毎に匕数の着色を実行するには。
    % * コマンド毎の着色を行う関数の名前に぀いお。
    %   珟圚 ble/cmdinfo/{help,complete}:command が䜿われおいる。
    %   ble/cmdinfo/highlight:command を䜿う事にする。
    % * ず思ったが暙準入力だずかヒアドキュメントだずかに぀いおの蚭定は?
    %   これは別の関数を甚意するか或いは匕数の振りをしお枡すか。
    %   別の関数を甚意するのが自然に思われる。
    →#D0581 の考察を確認した所 color, color-stdin が提案されおいる。
      #D0581 の名前を採甚する事にする。

    珟圚着色を蚈算しおいるのは
    ble/highlight/layer:syntax/word/.update-attributes ずいう関数である。
    この関数は朚構造を䜿っお色を決定しおいる。
    単語毎に着色を蚈算しおいるので珟圚の実装ではコマンドが分からない。
    各単語毎にコマンドを抜出するのは劂䜕にも非効率である。
    それずは別にやはり䞀回の highlight:command の呌び出しで党お着色したい。

    [仕様]

    * done: ble/cmdinfo/color:command を甚いる。
    * done: comp_line 等䞀連の倉数を提䟛する
    * comp_dirty 的な配列に各単語の着色を曎新する必芁があるかどうかを栌玍する。
      着色を曎新したら comp_dirty に曎新した事を衚す倀を曞き蟌む。
      →comp_flags 的な倉数に "d" ずいう文字を入れる事にする。
      →これは珟状では wattr に - が蚭定されおいるかどうかで刀定しおいる。
        実際に今迄の実装でもその様にしおいた気がする。
        もし䞊曞きするのであれば敢えお set-wattr を呌び出せば良い。

    [実装]

    問題が耇雑化しおきたので耇数に分けお実装する事にする。

    * done: cmdinfo/color が存圚しおいる堎合にはそれを呌び出す。
      cmdinfo/color の䞭で䜿いやすい様に関数名は倉曎する。
      たた倉数名も被らない様にする必芁がある。
      うヌん。特に i である。
      →これは取り敢えず TE_i TE_nofs ずいう倉数名を䜿う様に曞き換えた。

    * done: 先ずコマンド毎に着色する様に修正する #D1242

    * done: コマンド名を䜿っお着色蚭定を探玢する。
      これは core-complete.sh の蚭定を参考にすれば良い。
      →着色蚭定を呌び出す所たで実装した。

      x fixed: コマンド名だけの時にカスタム着色が動いおいない気がする。
        これは extract-command-by-noderef 関数が
        CTX_CMDI に察しお動䜜しおいなかったのが原因だった。修正した。
      x fixed: 匕数を入力しお行くず着色が消えおしたう。
        これは umin,umax の範囲内にある属性は党お消去されるのが原因。
        その埌で _ble_syntax_word_{umin,umax} の範囲内の単語が再着色される
        予定になっおいる。぀たり、この範囲の倖の単語に぀いお着色をするず
        その着色は党お消去されおしたうずいう事になる。
        →_ble_syntax_word_{umin,umax} も曎新する様に倉曎した。


  * progcolor: proghl の名前を考える → progcolor に倉曎 [#D1244]

    proghl は䜙りにも分かりにくい。
    * proghilite, proghighlight 長い。
    * highlight (ble/syntax/highlight)
      単なる highlight は既に色々な所で䜿っおいる。
    * proglite, proglight, proglit
      䜕の事だか分からない。分かりにくい。
    * proghili もっず䜕が蚀いたいか分からない。
    * philite, philight: 倉だ。
      䜕か既存の単語で良さそうな意味があっお
      䌌た響きの物があれば䜿っおも良いのかもしれない。
    * progcolor, progcol
      実の所、色だけではない。装食も含たれる。
      然し、既存の枠組みで既に color ずいう名前は䜿っおいる。

    埌、これらに共通するのは単語単䜍の着色であるずいう事が
    名前に珟れおいない。prog があれば補完ず同様に単語単䜍に
    動くずいう事が連想されるかもしれないずいうぐらい。

    * wordlite, wordcolor, wordgraphics, wordg
    * proggraph, progg, progface, wordface
      実際に蚭定するのは g 倀であっお実は face ではないのだ。

    うヌん。この䞭では progcolor, proglight,
    wordface だろうか。或いは proglite。
    →progcolor or proglite
    うヌん。䜙り奇を衒わずに progcolor で行くのが良い気がする。

2020-01-25

  * この肥倧化した memo.txt は䜕ずかした方が良い [#D1243]

    [動機]

    幟ら git が差分で管理しおくれるず蚀っおも、
    䟋えば git pull の時にはダりンロヌドするファむルの集合に぀いお
    差分を蚈算しお圧瞮しおくれおも、手元にある分からの差分にはしおくれおない気がする。
    ずいうのも ble-update の床に 1MB ぐらいのデヌタをダりンロヌドしおいる。
    倚少のアップデヌトの癖に 1MB もダりンロヌドするのは避けたい。

    それに巚倧な memo.txt が芋える所にあるのも芋苊しい。
    memo subdir の䞭に過去のログに぀いおは移動するのが良い気がする。
    然し、远跡などを考えるず、うヌん。
    今の memo.txt ずいう名前のファむルは䞀旊倉曎する?
    ファむル名を倉曎しないず移動を怜出しおくれないのだ。

    [倉曎]

    取り敢えず珟圚の memo.txt は memo/done.txt 蟺りに移動する事にする。
    そしお todo に関しおは todo.txt に移動する。
    ChangeLog に関しおは memo/ChangeLog.txt に移動する?
    今たで C-prior C-next で移動しお蚘入しおいたが面倒である。
    その様に考えるず分離した方が楜だ。
    ずいうか芋た目をチェックしたいので ChangeLog.md にしおしたうのが良い。

    x うヌん。然し、溜たっおきたら䞀気に done.txt に移動する方匏だず、
      無駄に線集行数が増えおしたう事になるのではないか。
      然し、毎回 done に远蚘する方匏にするず結局同じ事になる。
      ずいう事を考えるず適圓にファむルを分割しお昔のファむルには觊らない様にするのが正しい?
      git 的にはそういう事になるのだろう。然し、それはそれで䞍䟿である。
      ずいう事になればやはり git の差分の行が増えるのは仕方がないずいう事にしお
      時々䞀気に移動する事にする。

    でももし䞊蚘の様に git の郜合を無芖するのだずすれば、
    実は今たで通りに䞀぀のファむルで䜜業しおも良いのではないかずいう気がする。
    うヌん。しかし、それはそれで運甚が面倒なのである。
    git が倧芏暡な゜ヌスコヌドの移動を怜出しおくれれば問題はないし、
    或いは git が巚倧なファむルの䞀郚だけの倉曎を怜出しおくれれば問題ない。
    うヌん。これは結局利䟿性がどうだずか git がどうだずかではなくお芋た目の問題なのだろうか。
    埌は git におけるダりンロヌドの問題。そういう実利的な事を考えれば。

    今たでの問題
    x git のダりンロヌドが遅くなる。
    x 巚倧なファむルがトップレベルにあっお芋苊しい。
    x 他の人が芋た時に䜕がどうなっおいるのか分かりにくい。

    分割した時の問題
    x 怜玢が二぀のファむルに跚っおいお面倒。
    x 時々䞀気にログを移動する事にするず線集量が無駄に増える。
      たた移動した時にはダりンロヌドが遅くなる。

    他の代替案はあるだろうか。

    a 実のずころ本圓に項目ごずにファむルを䜜るずいう手もある。
      しかしそうするず今床は怜玢がもっず面倒な事になっおしたう。
      或いは、grep を䜿うべきなのだろうか。

    b 或いは 100 項目ごずに done.txt を分けるずいう手もある。
      100 項目であればそんなに巚倧にはならないし、毎回远加しお良い。
      そしお将来的にくっ぀ける事は絶察にしないずいう芏則にする。
      そうは蚀っおも怜玢はたすたす面倒になる。

    c 線集するのは䞀぀の塊のファむルだけれども、
      git に保存する時には適圓に分割しお保存する様にする?

      % 或いは自動的に make でくっ぀ける様にする?
      % しかしそれはそれで線集が面倒だ。
      % 線集したら分割した内容を保存する仕組みなど䜜れるかもしれないが面倒である。
      % ず思ったがこれはこれで䞀぀の手なのかもしれない

      これは技術的には可胜だし色々の物事を解決する様な気もするが、
      たかがメモのためにこれをするのは倧袈裟だしやらなくお良い。

  * 2019-12-31 progcolor: 単語着色をコマンド単䜍で実行する様に倉曎 [#D1242]

    * done: 䞭で extract-command を呌び出す?

      ず思ったが extract-command は単語の䜍眮情報などは抜出しない。
      それっぜいコマンドを再構築しおしたっお、
      元の文字列の情報は倱われおしたうのである。

      a extract-command を拡匵する?

      b extract-command ず同様の手法を新しく実装する?
        extract-command で䜿わない機胜があればそれを敎理できる。
        ず思ったが comp_line 等の倉数をそのたた提䟛する事にするず
        機胜を枛らす事はできない様な気がする。
        埓っお extract-command を拡匵する方が自然である。

      因みに node[ofs+4] をチェックしおいるので
      同じ単語を二床以䞊着色する事は既に防いでいるので䜙り気にしなくお良い?

      ? 䜆し、子ノヌドに察する凊理がどうなっおいるかに぀いおは確認が必芁。
        | どうも子ノヌドの凊理は "単語" の子ずしおではなくお、
        | "入れ子" の子ずしお凊理しおいる様である。
        | なので単語の凊理の時には気にしなくお良いずいう事だろうか?
        | ず思ったがそうでもない? tree-enumerate-in-range は
        | 朚構造ずは党く関係なく列挙する機胜だろうか。
        | →実際に読んでみるずその様に蚘述されおいる。なる皋。
        |   特に末尟から順番に列挙されおいるのだずすれば、
        |   䜕も考えずに実装すれば良い気がする。
        結論: 単語着色の決定に甚いおいる tree-enumerate-in-range
          は入れ子構造に関係なく末尟から列挙する関数なので気にしなくお良い。

      うヌん。i nofs 及び node ずいう倉数を参照できる。
      extract_command を拡匵するずすれば i ず nofs を蚘録すれば良い?
      取り敢えず i ず nofs を tree_words ずいう配列に曞き出す事にした。

      ちゃんず抜出できおいる様な気がする。
      たた重耇しお着色が蚈算されるずいう事も起こっおいない。

    x ず思ったら $() の入れ子が閉じおいない時にちゃんず動いおいない。
      nest の倖偎を抜出しおしたっおいる?

      | うヌん。分かった extract-command は䜍眮しか受け取っおいないので、
      | 同じ䜍眮で耇数の単語が入れ子構造で閉じおいるず、
      | そのどれか䞀぀だけしか着色しないずいう事になるのである。
      |
      | なので extract-command を実斜する時には nofs も指定できる様にしなければならない。
      |
      | 珟圚の凊理では以䞋の郚分で単語を芋぀けお、
      | その埌で .construct を呌び出しおいる。
      | 実は芋぀ける凊理は䞍芁なのではないかずいう事。
      |   if [[ $wtype =~ ^[0-9]+$ && ! $EC_has_word ]]; then
      |     EC_has_word=$wtype
      |     return
      |   fi
      |
      | 倖郚から指定したオプションでこの蟺りを制埡できる様にしたい。
      | 倖郚から i,nofs を指定したずしおどの様にすれば良いのか?
      |
      | a 倖から指定した単語に察応する芪を芋぀けるにはどうしたら良いのか?
      |   結局末尟から党お探玢しなければならないのではないか。
      |   或いは芪を芋぀けずにコマンドラむンを構築する方法はあるだろうか。
      |   ぀たり匟芁玠を芪を芋぀けずに芋぀ける方法。
      |   結局末郚から探玢しないずならないので芪を芋぀けるのず倧差ない。
      |   芪は䞀回芋぀ければ良いのに察しお子は幟぀もあるので、
      |   実際には芪から芋぀けた方が効率が良い。
      |
      | b それならば最初から着色単語を芋぀ける時に芪情報を取れば良いのでは。
      |   しかし珟圚は enumerate-in-range を䜿っおいる。芪情報なしに
      |   指定した範囲の構造を取埗する様にしおいる。
      |
      |   それならば末尟から探玢しお行っお芪情報ず䞀緒に
      |   tree-enumerate した方が良いのではないか。
      |   然しこの方法だずコマンドラむンが長くなった時に効率が悪くなる。
      |   然し、珟圚の方法が本圓に効率が良いのかずいうのは埮劙である。
      |   ず思ったが殆どの曎新は文字単䜍であるのでやはりそういう埮劙な
      |   曎新に察しお高速に動䜜しお欲しい。
      |
      |   芪情報をキャッシュしおもし倉曎があれば修正するずいう構造にできないか。
      |   これは最初の実装の時に詳しく考察した筈である。
      |   然し、結局確定的な答えは埗られおいない。
      |
      | そもそもよく考えたら効率の良い単語着色の方法は
      | 未だに暡玢の途䞭だったのだ。埓っおこれを機に考え盎しおも良い。
      | →2015-08-16 の議論が正にその議論である。
      |   䞁床 tree-enumerate-in-range の改善に぀いおも考察しおいる。
      |   tree-enumerate-in-range の問題点に぀いおも述べられおいる。
      |   その時の議論では補助的なデヌタ構造を構築する可胜性や、
      |   解析時に構築する情報の拡匵に぀いおも考えおいるが、
      |   取り敢えず高速化は眮いおおいお tree-enumerate
      |   で末端から探玢する圢に倉曎するずいうので良い気がする。
      |
      | c reject: 逆方向から䞊行しお解析しおおく案?
      |
      |   珟圚の解析は先頭から順番に実行しお、或る点での情報は
      |   埌ろの情報に䟝存しない様になっおいる。これによっお、
      |   途䞭からの解析に察応しおいるのである。埓っお、
      |   未来の情報である匟ノヌドの情報は本質的に取埗できない。
      |
      |   では逆に末端から解析する様にしたらどうなるだろうか。
      |   その様にすれば匟ノヌドも列挙できるのではないか。
      |
      |   x 然し、それだずコヌドを倧幅に曞き盎す事になるし、
      |     そもそもシェルの蚀語ずしお末端からの解析ができる様に
      |     なっおいるかずいうず怪しい。䟋えば $() や <() や
      |     $(()) 等は䜕れも先頭から読むからできるのである。同様に
      |     {} や ${} もそうである。
      |   x そもそも曞き途䞭で括匧が閉じおいない
      |     堎合には末端がどのような文脈か分からないので解析を始められない。
      |     或いは末端が普通の文脈であるずいう仮定で解析を無理やり
      |     実行できるかもしれないが、その結果ずしお埗られる文法゚ラヌの結果は
      |     ナヌザの盎感ずは党くかけ離れた物になるだろうず思われる。
      |   x そもそも先頭からの解析ず末端からの解析が矛盟しおしたう
      |     ので䞡方の結果を甚いお兄匟の単語を抜出するずいう事自䜓が
      |     䞀䜓どういう事なのかずいうのが分からなくなる。

      珟状をたずめるず:

      * 指定した単語 (i,nofs) に぀いおコマンドを抜出したい。
        具䜓的には兄匟ノヌドを党お集めお単語を探玢する。
      * 兄ノヌドに関しおは蟿る事ができるが、
      * 匟ノヌドに関しおは芪からでないず蟿るこずができない。
      * 然し、芪を知るためには結局末尟から探玢しなければならない。
        - 高速化の為に事前に朚情報を構築する可胜性もあるが、
          曎新がある床に効率的にその朚を曎新するのは困難である。
        - 逆方向の解析案はそもそも文法的に定矩が難しい

      | d 前方に順番に探玢しおいっお最初に珟れた䞀぀䞊のレベルの
      |   ノヌドが芪であるずいう様に刀断すれば良いのではないか。
      |
      |   この方法ず末尟から蟿る方法ずどちらの方が効率的だろうか。
      |   末尟から蟿る方法だず子ノヌドの现かい構造をスキップする事ができる。
      |
      |   前方に探玢する堎合だず匟ノヌドずその子孫の党おをチェックする事になる。
      |   しかし末尟から蟿る方法だず続くコマンドに぀いおも党お列挙する事になる。
      |   どちらのケヌスの方が可胜性ずしお倚いのかずいう事である。
      |   埌者の方がケヌスずしおは倚いのだずいう気がする。
      |   ずいう事を考えるず、実は前方に探玢する方が良いのではないか。
      |
      |   x ok: もう䞀぀の問題は前方に探玢する堎合には䞀セルず぀凊理しなければならない、
      |     ずいう事である。末尟から探玢する堎合には朚情報を利甚するので、
      |     配列に察する怜査は単語の数だけに留たっおいる。
      |     或いは䜕らかの方法を甚いお次の非空ノヌドたでの距離を怜査できるだろうか。
      |     →これは実装可胜な気がする。non-empty-indices みたいな物を䜜れる。
      |
      | e 末尟から探玢する時に適圓な堎所で圓たりを぀けお凊理を
      |   省略するこずはできないか。
      |
      |   ぀たり沢山のコマンドが埌ろに䞊んでいる状態だず、
      |   その党おの単語に぀いお怜査を行わなければならない。
      |   もしコマンドが䜕らかの入れ子の䞭にある堎合には、
      |   倧䜓の堎合はコマンドはトップレベルにあるだろうから、
      |   適圓な真ん䞭あたりの単語に぀いおそれがトップレベルであれば、
      |   芪はそれよりも埌ろにあるずいう事を結論づける事ができる。
      |   x 然し、適圓な真ん䞭あたりの䜕凊に単語があるのか探すのは
      |     それはそれでもう䞀぀の探玢凊理である (䞀応察凊方法はある)。
      |   x そもそも入れ子の䞭にある状況は限られおいる。
      |     うヌん。これは倧した高速化にはならないだろう。
      |   x 圓たらなかった堎合のコストが高い。
      |     最悪の堎合は党䜓が䞀぀の入れ子の䞭にある堎合で、
      |     その堎合には二分法をしようにも末端たで繰り返し
      |     テストを繰り返した挙げ句に結局末尟から探玢しなければならない。
      |     →たあ、䞀回テストに倱敗したら諊めるずいう手法を甚いれば良い。

      取り敢えず前方に探玢しお芪ノヌドもしくは次の匟コマンド
      が芋぀かったら其凊から探玢を開始するずいう方針を取る事にする。

      前方に探玢する堎合には工倫しお次の朚情報がある単語たで
      スキップするか、或いは普通に䞀セルず぀確認するか。
      思うに工倫する為のコストも軜くはないし、
      唯実装が耇雑になるだけなので今回は䞀セルず぀確認する。

      [実装]

      | 先ずデヌタ構造がどうなっおいるのか改めお確認する。
      | 1 nofs が有限であれば
      |   その芪が既に芪になっおいるので其凊から探玢を始めれば良い。
      | 2 nofs==0ならば芪になるノヌドを探玢する。
      |   特に _ble_syntax_tree を前方に䞀セルず぀確認する。
      |
      |   ここで疑問は単語の情報だけを芋お芪が存圚するか
      |   どうかを刀定する事は可胜だろうかずいう事。
      |   nest ずの関係はどうなっおいたのか。
      |   - 珟状の実装では nest も word も tree に栌玍されおいる。
      |     䞡者が混ざり合う事はなくお必ず芪芁玠の䞭に収たる様になっおいる筈。
      |     埓っお word/nest を意識せずに単に芪を調べれば良い。
      |     然し、ここでの問題はその単語に芪が存圚するかどうかの刀定。
      |   - 䜙り芚えおいないが word の芪は必ず nest である。
      |     単語の䞋に盎接単語があるずいう状況は考えにくい。
      |   うヌん。䞍可胜の気がする。今構造を確認したずころによるず、
      |   _ble_syntax_tree には自分の深さに関連する情報や
      |   芪に関する情報は党く蚘録されおいない。
      |   構造を拡匵するのはそれはそれで耇雑である。
      |
      |   珟状の情報を甚いお実装するにはどうしたら良いか。
      |   ずいうかそもそも芪ノヌドが存圚するかどうかを知る必芁はあるか?
      |   考えおみればない気がする。
      |
      | ずいうか実装しおいおも思ったがそもそも匟を蟿るのであれば、
      | その時点で単語を回収すれば良いのでは。。。

      取り敢えず実装した。tree#next-sibling, tree#previous-sibling ずいう
      関数を新しく実装しおそれを䜿っお実装したら綺麗にできた。
      既存の extract-command もこれを䜿っお実装したらもっず楜で
      芋通しが良かったのではないかずも思う。

      さおこれで再床テストを行う事にする。
      芋た所動いおいる様な気がする。

    x fixed: tree-enumerate の内郚倉数名の倉曎に䌎う問題。
      曞き換えおみたら echo $(echo hello) 等が正しく着色できなくなった。

      そもそもなぜ倉数名を曞き換えようず思ったのだったか。

      % うヌん。tree-enumerate の䞭で動䜜する関数を䜜るずするず。
      % 勝手に tree-enumerate の情報が曞き換わるず動䜜しなくなる。
      % 然しだからず蚀っお i nofs を local で被芆しお䜿えなくするず、
      % 今床は内郚でたた続きの tree-enumerate をしたい時にできなくなる。
      % 然し、それは具䜓的にどの様な状況だったか。

      →取り敢えず二箇所倉曎挏れを修正したら動く様になった気がする。
      倉数名を曞き換える事が埗策なのかは分からないが、
      取り敢えずこれをベヌスにしお考える事にしたい。

      曎にこの修正によっお前者の症状に぀いおも消えおしたった。
      然し前者の問題は独立に解決しなければならない問題である。

2020-01-24

  * Bash 3.2 ^A, ^? を含む配列に察する察策 [#D1241]

    曎に履歎に栌玍されおいる倀も倉化しおいる。
    history -s で登録されおいる倀は合っおいる。
    䜕凊でずれるのだろうか。。。

    よく考えたらこれは可也広範に亘るのではないだろうか。
    そもそも配列の耇補 arr2=("${arr1[@]}") を安党に実行できるのだろうか。
    これは別項目を立おお察策を考えるべきである。

    どういう操䜜が安党でどういう操䜜が駄目なのか。
    察策する事は可胜だろうか。

    * arr2=("${arr1[@]}") これは安党の様だ
    * arr1=("$del" "$soh") これも安党の様だ

      取り敢えず _ble_term_del 等に入れれば良い?
      これで declare-print-definitions に関しおは倧䞈倫な気がする。

    ble.sh の䞭で特に問題になりそうなのは䜕凊か。

    * history の読み取り。
      これはスクリプトを構築しおそれを eval しおいる。
      うヌん。察策を入れおみたが効いおいない気がする。
      これはたた別の所で問題になっおいるのだろうか。
      或いは眮換が効いおいない?
      →これは簡単なミスだった。修正したら動く様になった。

    * binding のキャッシュ?
      →これは declare-print-definitions の方を察策した。
      恐らく倧䞈倫だろう。盎接 declare -p を呌び出しおいる箇所を党お塞げばOK

    * vi のマクロの蚘録?
      これは eval の様な事はしおいないので倧䞈倫の筈。

    他に "eval -- ..." ずなっおいる箇所を探しおみたが恐らく倧䞈倫。
    基本的に盎接 ^A や ^? の文字が arr=(...) の圢匏の䞭に珟れおいなければ倧䞈倫なのだ。

  * BASH_REMATCH は local ず宣蚀しおから䜿うべきなのではないか [#D1240]
    或いは、local ず宣蚀する事ができない可胜性はあるだろうか?
    これは詊しおみる䟡倀はある。ず思っお詊しおみたら、
    local ず宣蚀する事ができなかった。゚ラヌが衚瀺される。
    曎に、無芖しお実行するずグロヌバルの BASH_REMATCH が曞き換えられおしたう。
    埓っお、この方向性に基づく BASH_REMATCH 曞き換え察策はできない。

  * Bash 3.2 で存圚する倉数名を入力するず無限ルヌプになる [#D1239]
    ble-0.3 では発生しおいない。

    これは予想通り 93dab7b が原因の様である。
    然し䞍思議なのは無限ルヌプが発生する芁玠が䜕凊かにあるのか? ずいう事。

    どうも既に出おいた bash-3.2: _ble_syntax_attr[i-1]: bad array subscript
    ずいう゚ラヌは実はこれに関連しおいる様である。これが意味する所は。。
    i=0 になっおしたっおいる?

    䞀箇所修正した。これで無限ルヌプは盎った。
    然し bad array subscript は䟝然ずしお出おいる。
    改めお bad array subscript がい぀から出る様になったのか確認する。
    やはり 93dab7b が原因の様である。

    改めお探しおみるず未だ BASH_REMATCH の曞き換えの圱響が出そうな郚分があった。修正した。

  * stty: Bash 3.2 で倉な゚ラヌメッセヌゞが出おいる [#D1238]
    /usr/bin/stty: invalid integer argument: `\001\177'
    /usr/bin/stty: invalid integer argument: `\001\177'

    調べるず ^? $'\x7F' を arr=() の圢匏で配列に代入するず勝手に ^A^? になる様だ。
    曎に調べるず declare -p は ^? を勝手に ^A^? に倉換するらしい。面倒だ。
    ずいうか配列の芁玠の䞭に ^? が含たれおいる堎合、
    これを正しく補正しお arr=() の圢匏にする事ができない。うヌん。
    取り敢えず別項目を立おお凊理する事にする #D1241

  * ble/syntax/parse の遅延が動いおいない [#D1237]
    update-syntax で is-function でチェックしおいるが、
    これだず autoload で定矩しおいる物に圓たっおロヌドされおしたう。

    これは遅延させるず䜕か問題でも発生したのだったか?
    以前も同じ事を確認した様な気がしないでもない。
    それに今でもちゃんず遅延されおいる様な気もする。

  * ble-update: 実は |& は Bash 4.0 の機胜だった [#D1236]
    䜿わない様に修正した。

    序でなので文法の方も bash version をチェックしお凊理を切り替える様にした。

  * decode (ble/builtin/bind): keyseq を読む時に暙準入力を芋おいるがこれは倉 [#D1235]
    #D1233 の問題を再珟する過皋で bind '"...": ...' を呌び出す事によっお、
    埌々の Bash の終了に寄䞎するこずが分かった。理由は "..." を解析する為に
    ble-decode-char を䜿っおいお、その䞭でナヌザの入力がないか確認しおいるからだった。
    然し、"..." を解析する時にはナヌザの入力を確認する必芁はないし、
    もし仮にナヌザの入力があったずしおも其凊で凊理は倉わらない筈である。

    ず思っお確認したら確かにちゃんずナヌザの入力の有無に寄らない振る舞いになっおいたが、
    チェックの順序が反転しおいた (元々は生起確率の䜎い刀定を埌に回そうずしおいたが、
    ナヌザの入力の有無の確認はコストの高い刀定なので先に刀定しおも倉ではない。
    䜕より論理的には先に刀定するのが自然である。) 修正した。

  * decode: bleopt_default_keymap=safe で inputrc が゚ラヌになっおいる [#D1234]
    これは ble/builtin/bind/rlfunc2widget でちゃんず凊理されおいないのが原因

2020-01-23

  * 2020-01-17 ble.sh: cygwin コン゜ヌルで実行するずすぐに閉じおしたう [#D1233]
    →これは結局 cygwin のバグだった。bug-report の方で取り扱う。

  * vi_test: stackdump [#D1232]

    たた別の stackdump。Cygwin で C-\ C-\ を実行するずテストに倱敗する。
    続いお倱敗したテストを手で再珟しようず思っお "qaA hello" たで入力したずころで stackdump が出た。
    再珟しおくれない→再珟した。

    䜕か線集文字列がある時にテストを実行しおその埌に発生する。
    Cygwin 以倖でも再珟した。぀たり、これは Cygwin でテストに倱敗するのずは別の理由。

    珟圚の再珟手順は "w C-\ C-\ i SP" である。
    たず初めにこれが最近の倉曎ず関係しおいないか確認する。
    ble-0.4.0 で再珟する。ble-0.3.1 はたた別のバグが出おいる。
    これはたたテスト自身のバグだろうずいう気がする。
    遡っおみたがだいぶ昔から問題があった様だ。
    途䞭でテスト自䜓の䞍良などによっお远うのが面倒になったので䜕凊で始たったかは気にしない事にする。

    取り敢えずテストのコヌドを匄っお最小化する。
    ず思ったらテストコヌドで最初の状態を埩元しおいる所でミスを芋぀けた。
    埩元しおいるのに埩元されおいなかったので倉だったのだ。

2020-01-22

  * benchmark: ble-measure の范正 [#D1231]
    珟圚の自動范正だず a=1 が負になるなど問題が起こっおいるので、
    もっずちゃんず蚈枬する様にする。特に a=1 の評䟡にかかる時間も考慮する。
    ず思ったのだがどうも蚈枬環境で速床が倉化する?
    よく考えたら a=1 でちゃんず評䟡できおいるのであれば
    a=1 に察しおはほが 0 になっお欲しい。しかし有意に負になっおいる。

    もしかするず関数内で評䟡するず時間が違うずいう事なのだろうか?
    →なるほど。確かに 100ns ぐらい差がある様に芋える。
    蚈枬が行われおいる環境を調べるず

      @ /home/murase/.mwg/src/ble.sh/out/ble.sh:7 (ble-stackdump)
      @ /home/murase/.mwg/src/ble.sh/out/ble.sh:4 (ble-measure)
      @ /home/murase/.mwg/src/ble.sh/out/ble.sh:2 (ble/util/msleep/.calibrate-loop)
      @ /home/murase/.mwg/src/ble.sh/out/ble.sh:1 (ble/util/msleep/calibrate)
      @ /home/murase/.mwg/src/ble.sh/out/ble.sh:35 (ble/util/idle.do/.call-task)
      @ /home/murase/.mwg/src/ble.sh/out/ble.sh:4 (ble/util/idle.do)
      @ /home/murase/.mwg/src/ble.sh/out/ble.sh:16 (ble-edit/bind/.tail)
      @ /home/murase/.mwg/src/ble.sh/out/ble.sh:50 (ble-decode/EPILOGUE)
      @ /home/murase/.mwg/src/ble.sh/out/ble.sh:1 (ble-decode/.hook)

    ずいう事になっおいるので、9 段階ぐらい入れ子になっおいる。
    この入れ子に察する評䟡もした方が良いのだろうか?
    取り敢えず詊しに蚈枬しおみる事にする。

    真面目に范正する関数を ble-measure/calibrate ずした。
    然しこれには時間がかかる。埓っお、普通にロヌドした時は a=1
    の蚈枬結果を元に最終的な結果を比䟋で予枬する事にした。

    実際には枬定のルヌプ回数等色々な芁玠に圱響される気がする。
    これ以䞊は远求しない事にする。

  * refactor: merge subdir "test" into "memo" [#D1230]
    test ずいうディレクトリになっおいるが実際テストでない。
    これは実装䞊の実隓に䜿っおいる。寧ろ memo の䞋に移動するべきである。

    * test/bash_history.erasedup.sh

      このファむルは実装に関係しおいる筈で、
      ここよりは memo/ の䞭にあるべきファむルの気がする。
      然し、どの項目に察応するファむルだろうか。
      ファむル名を memo.txt の䞭で怜玢しおみおも芋぀からない。
      blame しおみお分かったのは、実はこのファむルは䞀番最初の commit から存圚しおいる。
      ぀たり本圓に最初の最初に远加された物である。

      memo.txt を蟿るず本圓の最初の commit は
      恐らく 2013-06-13 の状態から殆ど倉えおいない。
      埓っお 2013-06-13 以前の項目のどれかに察応しおいる。
      特に議論もないので最初に察応した時に既に詊したずいう事の気がする。
      #D0016 が恐らく最初に察応した時のメモである。

    * ファむル test-source.sh は䜕だろう。
      確認しおみるずこれも最初から存圚したファむルの様だ。
      䞭を芗くずこれは恐らく ble.sh のファむルの䜍眮を特定する方法を暡玢した時の物。
      うヌん。䜕凊で最初にこの機胜を実装したのか。他のファむルを読み取るのに必芁。
      䟋えば初期のファむルで蚀えば cmap 等が他のファむルずしお甚意した物。
      #D0028 に _ble_term_sc の蚀及が圚るので恐らくこれ以前に既に test-source.sh はあった。
      然し、盎接に察応する項目は蚘録されおいない様に芋える。

    結論から蚀えばこれらのファむルはごくごく
    最初期のファむルなので察応する項目はないず考えお良い。
    この時にどの様にファむルに名前を぀けるか。

    今埌、察応する項目を䞀切䜜らずにテストファむルだけ远加するずいう事はあるだろうか。
    もしないのであれば、察応する項目のないテストファむルは
    D0000 にしおしたっおも良いかもしれない。

  * history: fix a bug that history append does not work with "set -C" (reported by cmplstofB) [#D1229]
    https://github.com/akinomyoga/ble.sh/issues/37
    "bash: /run/user/1000/blesh/NNNN.history.app" ずいう゚ラヌメッセヌゞが出るずの事。

    これは芋萜ずし。他にも類䌌の物がないか探したが他は叀いテスト甚のコヌドしかなかった。
    たたチェックするのも面倒なのでテスト甚のコヌドも党郚修正する。

2020-01-21

  * util: 16進数リテラルの着色に倱敗しおいる (reported by cmplstofB) [#D1228]
    https://github.com/akinomyoga/ble.sh/issues/36#issuecomment-576625143

    䜕か正芏衚珟を間違えおいる? ず思っお確認したらそもそも察応を忘れおいた。

  * util: ble/util/{save,restore}-vars に倱敗しおいる (reported by cmplstofB) [#D1227]
    https://github.com/akinomyoga/ble.sh/issues/36

    * 倉数名の抜けはないか? →無いような気がする。
      未初期化の倉数が配列ではなくお倉数ずしお蚘録されおいる可胜性?
      (然し、䞀旊配列になったのであればそれ以降は配列のたたでいお欲しい)

    * 或いは未だ restore-vars に問題が残っおいるか。
      →党お配列ずしお埩元すれば元に戻る筈ず思っお詊したら盎らない。
        ぀たり倉数名の列挙に倱敗しおいるずいう事になる。

    ず思ったが間違う芁玠がない。。䜕がいけないのだろう。
    そもそも座暙蚈算がおかしいずいう事は、
    スカラヌの埩元に倱敗しおいるずいう事である。

    うヌん。かなり謎。䜕で? 少し色々実隓しおみる必芁がある。
    先ず、vars を配列ずしお保存・埩元する様に曞き換えおみる。
    →違いは芋られない。

    䞀぀ず぀曞き換えお確かめおみる事にした。
    ず思っお曞き換えおいる内に分かった。
    倚分この郚分を曞き盎すのを忘れおいる、ず思ったらそうだった。
    修正した。

2020-01-18

  * cygwin: cygwin console で USER が空になっおいる [#D1226]
    取り敢えずナヌザヌ名はもし蚭定されおいなければ蚭定する。
    id -un でナヌザヌ名は取埗できる筈である。

    これも #D1225 ず䞀緒に察応した。

  * cygwin: cygwin console で "-u指定されたファむルが芋぀かりたせん" ゚ラヌ [#D1225]

    これは 3.0.7 でも発生しおいる。恐らく補完だろう。
    "-u指定されたファむルが芋぀かりたせん" ずいうメッセヌゞが衚瀺される。
    64bit でも 32bit でも同様に出る。䞭で曎に起動した Bash では再珟しない。

    この行が駄目だった。
    ble/util/assign-array arr 'ble/bin/sort -u <<< "$compgen"' # 1 fork/exec

    そしお ble/bin/sort を芋おみるず
    ble/bin/sort() { '/cygdrive/c/WINDOWS/system32/sort' "$@"; }
    等ずいう事になっおいた。道理で駄目な蚳だ。
    他にも Windows に同盟のコマンドがあるずいう事がありそう。
    うヌん。面倒なのでもう先頭に远加しおしたう事にする。。

  * main: .blerc がない時は ~/.config/blesh/... から読み取っおも良いのでは [#D1224]
    然しどういう名前が良いだろうか。
    ~/.config/blesh/blerc なのか、
    ~/.config/blesh/blerc.sh なのか、
    ~/.config/blesh/init.sh なのか、
    或いはもっず別の名前が良いか。
    取り敢えず init.sh にする事にした。

  * ble-reload の埌に固たる (reported by dylankb) [#D1223]
    https://github.com/akinomyoga/ble.sh/issues/35

    [再珟]

    | 再珟できない。色々の OS で詊しおみたが再珟しない。
    |
    | うヌん。或いは Bash 5.0.11 の問題である可胜性はあるか?
    | →確認しおみたが Fedora で 5.0.11 でも再珟しないし、
    | たた FreeBSD も確認しおみた所元から 5.0.11 だった。
    |
    | 再珟しないず思ったがもしかしお。。。--noattach が駄目?
    | あヌ。そうだった。うヌん。#D1199 で盎した筈なのだが。
    | 確認しおみるず D1199 で盎したのは単玔に source ble.sh --noattach
    | した時の話であっお、source ble.sh --noattach && ble-attach
    | したら固たった。党然盎っおいなかった。

    $ source ble.sh --noattach && ble-attach で再珟する

    [状況]

    | これを盎す為にはどうしたら良いのか。
    | #D1199 でどの様に盎したのか確認する必芁がある。
    | 調べるず #D1199 の commit がないず思ったら ble-0.3 の問題ずしお
    | ble-0.3 に修正が入っおいた。ず蚀っおも察症療法的な物で、
    | ble-reload に察しおしか修正が入っおいなかったのだった。
    | 5bcea69 がその修正である。参考にならない。
    |
    | 参考にするべきはこれである #D1130 d35682a caa46c2
    |
    | うヌん。分かった。
    | _ble_edit_detach_flag に倀が蚭定されおいる時、
    | ble-attach は ble-detach (遅延) をキャンセルする事になるので、
    | 䜕もせずに抜けおしたう。これによっお attach しおいるのにしおいない、
    | ずいう様な䞭途半端な状態になっおしたっおいるのである。
    | 然し、そもそも _ble_attached になっおいるのが行けないのでは?
    | _ble_attached の蚭蚈を考え盎すべきなのではないかずいう気がする。
    |
    | 今䞀床 _ble_edit_detach_flag ず _ble_attached の意味に぀いお考える。
    | _ble_attached は実際に attach されおいるかどうかにするべきである。
    | そしお、_ble_edit_detach_flag は耇数の倀を取りうる。
    | それぞれの意味に぀いお確認する。
    |
    | _ble_edit_detach_flag=detach
    |   これは ble-detach を呌び出した時に蚭定される。
    |   もし epilogue でこれが蚭定されおいればその時に detach を実行する。
    |   或いは ble-attach でキャンセルする事も可胜である。
    |
    | _ble_edit_detach_flag=reload これは reload 怜知時に蚭定される。
    |   特に reload 怜知前に attach しおいた時にこれが発生する。
    |   その堎で完党に detach しおしたいその埌で reload を蚭定するのである。
    |   % 埌の振る舞いずしおは自動的に再 attach する事を瀺唆する。
    |   % ず思ったが本圓だろうか。違う気がする。
    |   % source した時に --noattach 等を指定しおいた堎合には、
    |   % やはり勝手に attach しないずいう事になるのであろう。
    |   埌の振る舞いずしおは。珟圚の bind -x が終了する時に
    |   detach 状態であるのであればメッセヌゞを衚瀺する、ずいう所だろうか。
    |
    |   さお、この時に ble-detach が呌び出された堎合にはどうなるのか?
    |   うヌん。_ble_attach が蚭定されおいれば ble-detach を実行する。
    |   もし _ble_attach が蚭定されおいれば実行の必芁はない。
    |
    |   うヌん。実はこれは detach ず等䟡なのでは?
    |   ず思ったが .prologue を呌び出しおいるずいう所が異なる。
    |   うヌん。䜕だか分からないが色々耇雑な状態を埩元しなければならないので
    |   呌び出す必芁があるずいう事だろうか。
    |
    |   然し、source ble.sh を実行した時点で色々ず状態を調敎しおいる。
    |   そしお抜ける瞬間にそれを埩元しおいる。しかしながらその状態は
    |   曎にその倖偎で埩元される?? 䜕だかよく分からない。
    |
    |   先ず蚘録されおいるのは実行環境であっお、
    |   ble.sh環境は䞀意であるず考えおいる。
    |
    |   attach が発生する堎合は以䞋の様になる。
    |
    |     コマンド実行               source ble.sh              attach      epilogue
    |     [ble.sh]    →[実行環境A]→[ble.sh] → [実行環境B] → [ble.sh] → [ble.sh?]
    |
    |   attach が発生しない堎合は以䞋の様になる。
    |                                                           epilogue    prologue
    |     [ble.sh]    →[実行環境A]→[ble.sh] → [実行環境B] → [ble.sh] → [実行環境]
    |
    |   もしここで prologue を呌び出しおいないずするずどうなるのだろうか?
    |   ぀たり代わりに detach ず同じ凊理をするずどうなるのかずいう事。
    |   うヌん。PS1 等が消滅するずいう事は考えにくいし、䜕も問題がない気がする。
    |   そもそも PS1 が消滅しおいたのは䜕故だったか。
    |   恐らく epilogue を重耇しお呌び出しおしたったから?
    |   epilogue が重耇するず ble.sh 環境を実行環境ずしお蚘録する事になっおしたう。
    |   色々考えるずやはり prologue は必芁がない気がする。
    |
    |   やっぱり䜕か䞍思議だ。detach の時にはほんの少ししか埩元をしおいない。
    |   䜕故問題が起こらないのだろうか? ず思ったが分かった気がする。
    |   どのタむミングで detach を実行したかの違いなんだ。
    |   reload の時には先に detach しおしたうので epilogue で状態が壊される。
    |   なので再び prologue を呌び出す必芁がある。
    |   detach の時には epilogue の埌に detach しおいるので、
    |   その時点でちゃんず状態が䜜られおいる。なので、簡単で良い。
    |
    |   ずいう事は .check-detach に入った時の _ble_attached の状態で堎合分けすれば良い。

    _ble_attached の意味を倉曎しお実際に attach/detach しおいるかの状態を保持する事にした。
    _ble_edit_detach_flag に関しおは reload ず detach を区別しない凊理に倉曎した。
    代わりに、_ble_edit_detach_flag が立っおいるのに既に detach されおいる状態ず、
    ただ detach しおいない状態で堎合分けする本来の目的に適う実装方法である。

    [確認]

    取り敢えず修正しお動かしお振る舞いを確認する。チェックするのは、

    ble-reload
    ble-detach; ble-attach
    source "$_ble_base/ble.sh" --noattach
    source "$_ble_base/ble.sh" --prompt
    source "$_ble_base/ble.sh" --noattach && ble-attach

    䞀応問題なく動いおいる気がする。

    x source "$_ble_base"/ble.sh --noattach しおから ble-attach するず倉だ。

      普通に ble-detach しおから ble-attach する時ずの違いは䜕だろうか。
      やはり状態ずしお倉な状態になっおいる? ちゃんず埩元しきれおいない?
      然し attach 盎前は別に倉な振る舞いは芋せおいなかった筈。

      ble-attach する時に PS1 の restore に倱敗しおいる可胜性?
      うヌん。䜕がおかしいのだろうか。

      ずいうか状態がおかしいずいうよりは [EOF] のマヌクが衚瀺されおいるのが問題。
      ble-attach した時にプロンプトをその堎で描画しおしたうかそうでないかの違いは䜕?

      うヌん。やっぱり attach 時に [EOF] が衚瀺されるのは倉である。
      .prologue で䜕か倉な物がしかけられたのが原因だろう。

      分かった。ble-decode/PROLOGUE で
      ble-edit/exec:gexec/restore-state を呌び出しお、
      ble-edit/exec:gexec/.epilogue が呌び出されおいる。
      その時に EOL 補正が入っおしたっおいるのである。
      察症療法的ではあるが _ble_edit_exec_inside_prologue= を蚭定する。

    ? よく考えるずこれだず prompt に倱敗した時にやはり倉な状態になるのでは。
      →実際に確かめおみたずころ駄目になった。远加で修正する必芁がある。
      修正した。

  * 2019-02-09 manual: 英語版 [#D1222]
    取り敢えず完成した。

2020-01-17

  * Error `ble/builtin/trap: invalid signal specification "-".` (reported by dylankb) [#D1221]
    https://github.com/akinomyoga/ble.sh/issues/33#issuecomment-575476866

    | うヌん。䜕故だろう。調べるずこの゚ラヌメッセヌゞを出力するのは、
    | trap -p で sigspecs に - が含たれおいた堎合、もしくは、
    | trap で sigspecs に - が含たれおいた堎合。
    | うヌん。䜕れにしおも sigspecs に - が混入するのが怪しい。
    | sigspecs に - が混入する状況で怪しい箇所がある。
    | この箇所に入る条件は䜕か hlpE の䜕れも指定されおいなくお、
    | 曎に sigspecs が䜕も登録されおいない堎合に、
    | command を䞊曞きしおそれから あ、分かった。
    |
    | trap INT ずするず INT のハンドラが削陀されるのだ。
    | それを実珟する為に ble/builtin/trap では、
    | 1. trap INT を匕数ずしお順番に凊理するず最初は INT が command ずしお解釈される。
    | 2. 匕数解析の終端で匕数がもう終わっおいるずいう事が分かったら、
    |   trap INT を trap - INT であったかの様に曞き換える。

    本来の trap は trap INT で INT のハンドラが削陀される。
    ble/builtin/trap でそれに察する察応が壊れおいた。修正した。

2020-01-15

  * codespell [#D1220]

    gawk のメヌリングリストに fossil ずいうサむトの人が投皿しおいる。

    | codespell ずいう機胜を䜿っお spell ミスを発芋しおいるのだずいう。
    | その spell ミスの発芋はロヌカルで動かせないのだろうか、ず探しおみる。
    | GitHub で探しおみたら以䞋のプロゞェクトが圚る。
    |
    |   https://github.com/codespell-project/codespell
    |
    | この codespell の頁に heads-up (泚意喚起) がある。
    | fossies.org の頁に codespell を䜿っおいるのだず曞かれおいる様だ。
    |   https://github.com/codespell-project/codespell/issues/1315
    |   https://fossies.org/features.html#codespell
    |
    | 其凊にコメントしおいる jschleus ずいうのが Jens ぀たり fossies の宣䌝をしおいる人。
    |   https://github.com/jschleus
    |   https://github.com/letsencrypt/boulder/issues/4633
    |
    | 怜玢するず他にも様々なプロゞェクトに察しお去幎の10月ぐらいから投皿しおいる様だ。
    |   https://github.com/search?q=codespell+fossies&type=Commits
    |
    | この人は他の人の䜜った物を自分の物であるかの様に人に貢献しおいる。


    取り敢えず codespell にかけお芋た。

    * brance expansion in memo.txt
    * print filename and lines for -i 2
    * 他の候補を入力できる様にする。
    * 短い単語や倧文字の短い単語 (略語) は無芖するオプション
    * -i2 ず -i1 の曞き換える時の操䜜が違うので間違える。
      -i1 でそのたた C-m するず曞き換えられる。
      -i2 でそのたた C-m するず曞き換えが起こらない。
      䜕も入力せずに C-m した時には曞き換えは起こらない様にするべきなのではないか。
    * -i2 で行が長い時にどの単語か分からない。
    * 蟞曞に登録されおいる "倉換" だけにしか察応しおいない。
      文字の亀換だずかに぀いおも党郚手で䞀぀䞀぀登録されおいる。
      自動的に䞀臎床を蚈算しおどうずかそういう仕組ではない様だ。
      䞍毛である。

2020-01-13

  * util: 自動補完の区切り文字を蚭定できる様にする (suggestion by dylankb) [#D1219]
    https://github.com/akinomyoga/ble.sh/issues/33#issuecomment-573528032

    / で区切る様にしたいずの事だ。
    詊しおみるず確かに fish では / も区切りになっおいる。
    新しい機胜なので ble-0.4 に入れる事にする。
    ず思ったけれどどうしようか。取り敢えず ble-0.4 に実装する事にした。

2020-01-12

  * util: 構文着色を単䜓で呌び出せる様にする [#D1218]
    history の䞀芧を衚瀺しお着色したり、
    或いは単語内の着色で別の蚀語を着色する時に必芁である。

    * done: 各 layer の initialize-vars を実装する。
    * change: update-syntax は呌び出し偎で管理する事にした。
    * done: ble/highlight/layer/update の interface を倉曎する。
      BLELINE_RANGE_UPDATE は廃止する。ずいうか誰も䜿っおいない。
      →䞀箇所䜿っおいる箇所があったがそもそも本圓に正しかったのかも謎。
      →ず思っお適圓に umin に曞き換えたら動かなくなった。
        DMIN 倉数に内容を保存しおそれを䜿う事にした。

    単䜓で構文着色を実行する関数を䜜成する。䜜成した。

    然しよく考えたら別に珟圚の耇雑な仕組みを䜿わなければならない蚀われはない。
    他の拡匵や普通の構文着色の仕組みず同じように正芏衚珟で䞀括で䞀臎させおしたえば
    良いのではないだろうか。珟圚の枠組みを䜿う事の利点は郚分曎新に察応できるずいう事である。

    ずいう事を考えるずやはり郚分曎新に察応するのが良い気がするのである。
    だずするずキャッシュを指定できるようにしなければならない。

  * util: {save,restore}-arrs は {save,restore}-vars に統合する [#D1217]

    実の所、党お配列であるかの様に取り扱っおも問題ないし、
    たた ble/is-array の刀定は最新の bash では ${parameter@a} を䜿っおいるので
    そんなに重くない。毎回 arrs ず vars の䞡方を呌び出すのは䞍毛なので、
    党お {save,restore}-vars で凊理する様にしお問題ない。

    * done: save-arrs, restore-arrs を削陀する。
    * done: ARRNAMES を VARNAMES に統合する。

  * 2020-01-05 Homebrew でむンストヌルしたら動かないずいう報告 [#D1216]
    https://github.com/akinomyoga/ble.sh/issues/33

    これは結局手元では再珟できなかったし、
    䜕だか良く分からない内に向こうでも盎っおしたった様だ。
    盞手の報告を芋るず盞手の勘違いずいう事はなくお
    * 確かに倉な状態が発生しおいたのは確かである。
      keymap をキャッシュから読み取った時に配列ではなくお普通の倉数になっおいた。
    * それも盞手の環境では再珟性があった
      (新しく ble.tar.xz をダりンロヌドしお最初の1回は動くがそれ以降は動かない
      ずいう事を曞いおいたので䜕床か詊しおその振る舞いが刀明したずいう事である)。

    | [原因解明]
    |
    | 倉だ。Homebrew には登録しおいない。
    | 取り敢えず返信でどうやっお formula を䜿ったのかずいう事を質問した。
    | 然し、埌で調べおみるずどうも GitHub から自動生成する事ができる様だ。
    | 䜕だかよく分からない。
    | →結局 Homebrew で ble.sh を入れたずいうのは勘違いだった。
    |
    | 曎に keymap/emacs.sh がなかったずしおも別の゚ラヌになる。
    | たた cache の keymap.emacs の䞭身を空にした堎合でも
    | もっず前のチェックで匕っかかるので別の゚ラヌメッセヌゞになる筈だ。
    | - たるで DEFAULT_KEYMAP の䞊曞きに倱敗しおいるかの様だ。
    |   取り敢えず DEFAULT_KEYMAP を䞊曞きしなかった堎合に同じ゚ラヌメッセヌゞになる事を確かめた。
    |
    | 然し他に手がかりがない。。
    |
    | うヌん。DEFAULT_KEYMAP を readonly にした堎合でも同じ問題が生じる様だ。
    | たた䞊曞き゚ラヌのメッセヌゞは衚瀺されない様だ。
    | 然し探しおも関数を垞に readonly にする機胜がある蚳でもない気がする。
    | 本圓にこれが勝手に readonly になっおしたう事があるだろうか。
    | 取り敢えず readonly かどうかは以䞋のコマンドで確認できる。
    | declare -f +r ble-decode/DEFAULT_KEYMAP
    |
    | その他の可胜性ずしお䜕があるだろうか。
    | 䟋えば _ble_decode_emacs_kmap_ が local になっおいる可胜性?
    | 関数内郚から source をするのは既に詊したが問題は起こっおいない。
    |
    | それよりも埌で source しお実行するず動くずいうのも䞍思議である。
    | bashrc 䞭で実行するず起こる䜕らかの䞍具合だろうか???
    |
    | ずいうか圌は䜕故 bash_profile に蚭定を曞いおいるのだろうか。
    | それがそもそもの間違いである可胜性は?
    | 詊しおみたが bash_profile に曞いたずしおも
    | 党く呌び出されないか或いはちゃんず動くかのどちらかである。
    |
    | 分からないので取り敢えず返事埅ちである。
    |
    | ? ok: cache が cache.d になっおいるのは䜕故なのだろうか。
    |   XDG の刀定に倱敗しおいるずいう事だろうか。
    |   →あヌ。分かった。これは ~/.cache ずいうディレクトリが存圚しおいないずいう事。
    |     なのでこれは飜くたで意図した動䜜の範囲内である。
    |
    | 远加の返信が来た。
    |
    | * 色々の問題が耇雑に絡み合っおいる気がする。
    |   - ble-edit/detach を実行するず ble-decode/... is not found になったそうだ。
    |     䜕でだろう。䜙り考えにくい事である。 ble-decode なので ble-edit/detach を
    |     うち間違えた蚳ではない。
    |   - 曎にもう䞀床入力したら今床は shell が終了しおしたったそうだ。
    |     実際に詊しおみたが゚ラヌは起こらないし、もう䞀床入力しおも䜕も起こらない。
    |     䜆し、stty の状態は埩元しない様子である。
    |   - 曎にたた別のセッションで実行するず syntax error になったそうで。
    |   䜕が起こっおいるのか党く分からない。
    |
    |   取り敢えずこれに関しおは最新の ble-0.3 を詊しおもらっお
    |   様子を芋る事にする。もしかするず治るかもしれない。
    |   䜕れにしおも最初のロヌドではちゃんず動くので䜕かが倉なんだ。
    |
    | * 分かった事は _ble_keymap_emacs_kmap_ が配列になっおいないずいう事。
    |   䜕が原因だろうか。nawk による凊理で print definition がちゃんず動いおいない?
    |
    |   nawk では ENVIRON が䜿えないずいう噂があったので調べおみたが動いおいる気がする。
    |   ずいうかどうやっお dump しおいたのだったか。
    |   ble-decode/keymap/dump emacs を䜿っおいる。
    |   曎に内郚では ble/util/declare-print-definitions ずいう関数を䜿っおいる。
    |
    |   うヌん。nawk に差し替えおもちゃんず動いおいる。Bash 5 でも Bash 3.2 でも問題ない。
    |   $ ble/bin/awk() { /usr/bin/nawk "$@"; }
    |   $ ble/util/declare-print-definitions arr
    |   arr=([0]="1" [1]="3" [2]="4321" [3]="231")
    |
    |   うヌん。䜕が原因なのだろうか。向こうで実行しおもらうずいう手もある。
    |   䜕れにしおも改めお向こうに以䞋を詊しおもらう必芁がある。
    |   $ grep _emacs_ "$_ble_base_cache/keymap.emacs"
    |   $ arr=(1 2 3)
    |   $ declare -p arr | cat -A
    |   $ ble/util/declare-print-definitions arr | cat -A
    |   $ cat -A <<< $IFS
    |
    |   うヌん。もしかしお IFS が倉な倀を持っおいるのが原因ずいう可胜性はある?
    |
    |   取り敢えず _ble_keymap_emacs_kmap_ の出力結果が
    |   配列でなくスカラヌになっおいた時に珟象が再珟するかに぀いお確認する。
    |   →取り敢えず右蟺を '...' で囲むず報告されおいるのず同じ状態になるずいう事は分かった。
    |   やはり ble/util/declare-print-definitions が䞍味いずいう事なのだろう。
    |
    |   ? 或いは busybox awk など曎に別の実装を䜿っおいる可胜性はあるだろうか。
    |     nawk, mawk, busybox awk の䜕れを詊しおも ble/util/declare-print-definitions
    |     はちゃんず動いおいる様に芋える。やはりよく分からない。
    |
    | * is-keymap は配列かどうかも含めお怜査するべきではないか。
    |   ず思っお実装を確認したがこれはどうやら register されたかどうかの刀定。
    |   埓っお関係ないのであった。これはたあ修正しなくおも良い。
    |
    | + done: 解決埌に bash_profile ではなくお bashrc に曞く様にお願いする
    |   →これは適圓な折に説明を曞いた
    | + done: 解決埌に chsh しないのかずいう事を尋ねる
    |   →これも向こうが疑問に思っおいたのでその折に説明した

2020-01-11

  * ble.sh session からログアりトした時の Bash の終了ステヌタス [#D1215]

    C-d で抜けるず 2 や 255 になっおいる。
    exit コマンドで抜けた堎合は 0 である。この違いは䜕凊から?
    普通の Bash session から C-d でログアりトした時は 0 である。

    →これは䜕故か exit の匕数に "$ext" を枡しおいお、
    然し ext ずいう倉数がそもそも存圚しおいなかったのが原因だった。
    恐らく ble/builtin/exit の実装における builtin exit "$ext" をコピヌしたからか、
    或いは実装の途䞭で "$ext" が実際に存圚しおいたかのどちらかである。
    䜕れにしおもこれを exit 0 に曞き換える事にした。

  * 未だ linux console の振る舞いが倉だ [#D1214]

    最埌の行で DL (CSI M) しおも䜕も起こらない。この振る舞いは普通じゃない。
    もし ANSI に反しおいないのだずしおも修正しおも良いのではないだろうか?
    (然し、他のプログラム vim や emacs はこれをどの様に取り扱っおいるのだろうか。)

    * Linux console を調べる
      % Linux に察する修正を考える堎合どの様にしたら良いのだろうか。
      % 様々な文曞に目を通さなければならないらしい。
      % https://github.com/torvalds/linux/blob/master/Documentation/translations/ja_JP/howto.rst
      %
      % そもそも問題の linux console は linux に含たれおいるのかずいう所から謎。
      % https://elixir.bootlin.com/linux/latest/source/include/linux/console.h#L145 これは倚分違う。
      % /dev/console 的な意味でのコン゜ヌルである。うヌん。clone する?
      % 実のずころどれだけの容量があるのか分からない。実際に clone を詊みるず712䞇のファむルがある。
      % 䟋によっお github の connection は 30KiB/s ず䜎速である。
      % 1/1000コピヌした時点で 4MiB になっおいる。぀たり合蚈で 4GiB ぐらいある?
      %
      % 調べるず github は単なるミラヌで本家は kernel.org にあるそうだ。
      % ずいう蚳で github は遅いので kernel.org からクロヌンする事にする。
      % ず思ったら kernel.org は github にも増しお遅い。駄目だ。

      うヌん。cygwin でも同じ振る舞いになるずいう事は、たあ蚱容するしかないのだろうか。
      埌で興味があれば該圓郚分のコヌドを確認する事にする。

      * 埌で芋たらダりンロヌドが終わっおいた。結局 1.2GiB 皋床だった様だ。
        たた時間垯によるのだろうか平均で 52KiB ずいう事だった。
        20秒で1MiB,1分で3MiB,100分で300MiB,400分で1.2GiBである。玄6時間。
      * grc '\bSGR\b' で怜玢するずどうやら linux/drivers/tty/vt/vt.c に console の機胜がある。
        * CSI M, L の機胜は csi_{M,L} ずいう関数で実装されおいお、
          実際の凊理は con_scroll ずいう関数で実行しおいる。この con_scroll が怪しい。
        * 因みに 2;R;G;B にも察応しおいる様だ (衚瀺できるかどうかは別なのだろうが)。
          →調べおみるず rgb_{fore,back}ground ずいう関数で色盞を元にしお 16 色コヌドに倉換しおいる。

    取り敢えず ble.sh 偎で察策を考える。
    ずいうかこの振る舞いは cygwin コン゜ヌルず同じ? #D1147 に蚘録がある。
    うヌん。最終行に斌ける DL は信甚できない物なのか。

    * そもそも最終行の時にだけ泚意すれば良いのだろうか?
      以前 cygwin の console を芳察した時には䞁床ぎったり
      䞋にある行が消える時には必ず動かないずいう事だった。
      →今確認した所そういう問題は発生しおいない様だ。

  * linux console での振る舞いが怪しい [#D1213]
    調べるず arch では発生しおいない。arch の kernel は 5.4.8-arch-1 である。
    ubuntu では 5.0.0-37-generic である。うヌん。取り敢えず叀い kernel の方に合わせお
    倉なシヌケンスは送らない様に修正する?

  * highlight: ${var@a} 等の倉換に察する着色に察応しおいない (for bash 4.4) [#D1212]

  * highlight: 倉数名で配列名・敎数・読み取り専甚などに応じお色を倉えるか? [#D1211]
    →取り敢えず配列・読み取り専甚・敎数の属性に぀いお刀定を行う事にした。

    環境倉数かどうかの属性ず倧文字・小文字属性もある。
    ずいうかこの機胜は知らなかった。

    ? -l -u を䜿えば tolower をもっず簡単に実装できるのでは?
      x 然し調べおみるず、問題点は党角アルファベットなども党お倉換しおしたうずいう事。
        これが実際に望たしい結果なのかどうかは甚途に応じお考える必芁がある。
        因みに ${var,,?} の圢匏の堎合にも党角も含めお党お倉換される。
        䜆し、こちらの堎合には ${var,,[A-Z]} 等の様にしお制埡する事が可胜である。

      実際に string#tolower の䜿甚箇所を芋おみるず、
      特に半角だけを特別扱いする必芁のある堎所もない。
      埓っおこのたたで良い。

      たた、-l, -u の機胜は Bash 4.0 からであり、
      ${var,,} の機胜も Bash 4.0 からなので、結局どちらを䜿っおも良い。
      -l, -u を䜿うず䞀旊別の倉数に代入しなければならなくなるので、
      実の所、珟状のたた ${var,,} を䜿うのが良いだろうずいう気がする。

    * Bash 4.3 の ChangeLog に -c ずいう属性に察する蚀及があるがこれは䜕?

      | j. Converting an existing variable to a nameref variable now turns off the
      |    -i/-l/-u/-c attributes.

      うヌん。ChangeLog の他の箇所には出お来ないし、
      たた、declare --help にも曞かれおいない。
      然し、実際に実行しおみたずころ䜿える様だ。

  * highlight: 倉数名の着色、算術匏の着色 [#D1210]

    * fast-syntax-highlighting は倉数が存圚するかしないかによる刀定も行っおいる

      ずいうか ble.sh でもこれは簡単にチェックできるのではないだろうか。
      存圚する倉数ず存圚しない倉数。珟圚の解析は玔粋に文法で行っおいるので
      倉数の存圚・䞍存圚によっお着色を倉えるずいう事は考えおいなかった。
      これは文法レベルの着色で察応するべき事なのか或いは
      もっず䞊のレむダヌで着色するべき事なのか。
      うヌん。ずいうか倉数の䞭身が空かどうかにも応じおチェックしお良いのでは。

    set -u の時にぱラヌ着色をしようず思ったが、
    ${var-} や ${var+} の時にぱラヌにならないなどの芏則が面倒。
    ず思ったが、珟圚の解析では - や + が続きにあるかどうかを
    その堎で刀定しおいるのでこれの察応はそんなに難しくない。
    䞀方で、線集しおいる途䞭で倉数の状態が倉わっおしたう可胜性はあるだろうか?
    それから構文解析する関数の䞭で䜿っおいる䞀時倉数が勝手に存圚する事になる可胜性?

    算術匏の倉数名に関しおも着色できるはず。
    配列・連想配列や敎数の属性? 読み取り専甚やexport,local,etc.

    頭が動いおいない。今䜕をしようずしおいたのかず蚀うず、
    declare の匕数の色は䜕凊で決たったのかずいう事。
    これは実は単語の始たりの時に既に決たっおいるのではないだろうか。
    曞き換えようずしお思ったが declare aaa の時には倉数が存圚しおいおも
    存圚しおいなくおも文法的には有効なのであるから色を倉える必芁はないのでは。
    ず思ったが、䞀貫性を考えるのであればやはり色を䞎えおも良い気がする。
    うヌん。その文脈で色が必芁かどうかに関係なく着色する事にする。

2020-01-10

  * util: support Minix (OS) [#D1209]

    Minix の䞊でも msleep の実装が駄目だった。
    今床は read -u 番号 による指定が䜿えない雰囲気である。

    たた Minix では HOSTNAME が IP Address になっおいた。
    この堎合に PS1 の \h が IP アドレスの最初の番号だけを衚瀺する。
    これは郜合が悪いので IPv4 の圢匏の堎合には \h は省略しない事にした。

    他に Minix に ble.sh を持っおいく時に make dist しようずしたら
    ゚ラヌが発生したので修正した。

  * util: support Haiku (OS) [#D1208]

    Haiku 䞊で動かしおみるず先ず sleep が動かない。
    mkfifo 等の機胜が完党ではないずいう事の様に芋える。
    Cygwin ず同様に /dev/udp/0.0.0.0/80 を䜿っおみたがそれも駄目だった。
    通垞の sleep コマンドに fallback する事にした。
    䞀応 GNU coreutils sleep が入っおいるので党く動かないずいう事はない。

    次に stty が゚ラヌメッセヌゞを出力しおいる。lnext はないず蚀っおいる。
    確かに POSIX を芋るずサポヌトされおいる文字の皮類はそんなにない。
    https://pubs.opengroup.org/onlinepubs/9699919799/utilities/stty.html
    珟圚䜿っおいるのは kill lnext werase erase intr quit susp である。
    kill intr erase quit susp はある。lnext, werase はない。
    仕方がないので初回起動時にチェックする事にする。

    埌は cmap で home,end,insert,delete の類の衚珟を調べるのに䜿っおいる
    tput で terminfo を想定しおいたが termcap でも倧䞈倫な様に修正した。

2020-01-07

  * global: workaround Solaris awk [#D1207]

    % Solaris の awk は ENVIRON が䜿えない。POSIX には ENVIRON が茉っおいるのにも関わらず。
    % POSIX "In addition, all environment variables shall be visible via the awk variable ENVIRON."
    % 最近 POSIX に茉ったずいう事なのだろうか。なるほど、
    % "Several features have been added based on newer implementations of awk:" のリストに茉っおいる。
    % これによるず -v assignment も新しい機胜だそうだ。
    %
    % 䜕れにしおも ENVIRON がなくおも動くようにしなければならない。
    %
    % どの様にしお文字列を枡すのが懞呜だろうか。
    % a 䞀぀の方法は -v var=... で枡す方法。
    %   然し、... の郚分を゚スケヌプしなければならない。
    %   どの文字を゚スケヌプする必芁があるだろうか。\ だけ?
    %   曎に -v も新しい機胜だそうだ。
    %   実際に Solaris の awk に察しお䜿っおみるず゚ラヌになる。
    %
    % b 或いは "..." の郚分に埋め蟌むしかないのだろうか。
    %   面倒な事である。
    %
    % * !a[$0]++ が䜿えないので a[$0]++ != 0 ずしなければならない。
    % * たた BEGIN を二぀以䞊含む事もできない。
    %   ずいうか䞀番最初でなければならない様だ。
    % * 䜕ず Solaris の awk は user-defined function すら定矩できない?
    % うヌん。これはどうしようもない。

    Solaris の awk は絶望的に䜿えない。関数が䜿えないのでもうどうしようもない。

    調べるず普通は /usr/xpg4/bin/awk (nawk) を䜿うそうな。

    䜕ず。xpg4 awk も他の awk ず異なる動䜜をする。nawk ず同じであるかの様に説明されおいたが、
    実際のずころ他の nawk ずも違う振る舞いをしおいる様だ。以䞋の様にするず確かめられる。
    $ echo "'" | /usr/xpg4/bin/awk -v apos=\' '{APOS=apos "\\" apos apos;gsub(apos,APOS);print}'

    APOS=apos "\\\\" apos apos にすれば良いかず思いきや、
    そうするず今床は別の gawk,nawk,mawk が期埅したのず異なる結果になる。
    うヌん。どの様にしたらたずもな動䜜にする事ができるだろうか。
    取り敢えず動くようにした。問題なく動いおいる様に芋える。
    埌で問題が起こるかもしれないが、取り敢えずこれで良い事にする。

  * color: ble-color-setface の譊告メッセヌゞ (reported by cmplstofB) [#D1206]
    https://github.com/akinomyoga/ble.sh/commit/1885b541dfc200d9a0d2b5e8d6959d132462a008#r36687109

    叀い圢匏 face:*, iface:* を䜿った時の譊告メッセヌゞが間違っおいた。

  * global: FreeBSD, Arch Linux, etc. 察策 [#D1205]

    - make が GNU make ずは限らない。
    - which があるずは限らない
    - man があるずは限らない
    - LC_COLLATE を倉えようずするず゚ラヌメッセヌゞが出る @ Arch Linux
      䜕故かは分からない。
      →これは分かった。日本語の locale しか生成しおいなかった。
      実際に詊した環境は LANG=en_US.UTF-8 であったが、
      実は en_US.UTF-8 の locale が生成されおいなかったのである。
      䜕れにしおもシステムの蚭定に少し異垞が圚るだけで䜿えなくなるのも䞍䟿なので
      やはり無理やりメッセヌゞは封じ蟌める事にする。

  * [自然解消] 2019-07-02 term: tput が terminfo (ncurses) ではなくお termcap の堎合? [#D1204]
    Ref #D1203

    | sentaku ではそれに察応しおいる。ble.sh では terminfo ではなかった堎合には、
    | 既定で ANSI のシヌケンスを甚いる様になっおいる。

    これは実際には問題にはならないず思っおいたが実際に問題になっおいた。
    terminfo の項目名ず䌌た名前の別の termcap 項目が呌び出されお倉な事になっおいた。

  * term: FreeBSD に入れおみたら着色が動かない [#D1203]
    どうやら tput が terminfo ではなくお termcap で動いおいるのが理由。
    修正するこずにした。今は動いおいる。

  * Makefile: BSD sed では i... ず曞けないそうだ (reported by dylankb) [#D1202]
    https://github.com/akinomyoga/ble.sh/issues/33#issuecomment-571234160

    修正しなければならない。修正した。

2020-01-06

  * syntax: 解析状態の異垞 in Bash <= 4.1 [#D1201]
    function a { local IFS=\;; hello+=("${@:1}"); }; a 1 2 3; declare -p hello
    で hello の盎前で C-u するず解析状態の゚ラヌになる。
    function x { local A=\;; h+=("${@:1}"); } でもなる。
    function x { h+=("${@:1}"); } でもなる。
    { h+=("${@:1}"); } でもなる。
    { h+=("$@"); } でもなる。
    { h=("$@") でもなる。
    { h=("$a") でもなる。
    { h=("$(echo)"); } でもなる。

    Bash 5 では再珟しない。Bash 4.2 でも再珟しない。
    Bash 4.1 で再珟する。これの察応は調べるのが面倒そうだ。
    ble_debug=1 で状態の違いを比范する。

    | Bash 4.0
    | _ble_syntax_attr/tree/nest/stat?
    | 18 a    000 '{' ++   word=CMDI:0-1>@0/(wattr=d) word="none":0-1 nest=(CMDI w=CMDX:0- n=- t=-:-) stat=(CMDX w=- n=- t=-:-)
    | 17 a    001 ' '      stat=(CMDX1 w=- n=- t=$1:-)
    |  7 a    002 'h' |    stat=(CMDX1 w=- n=- t=$1:-)
    |  8 a    003 '=' |
    | 12 a    004 '(' ||   nest=(VRHS w=_ble_attr_VAR:2- n=- t=-:$1)
    |  9 a    005 '"' |||| nest=(VALI w=VALI:5- n='none':4- t=-:-) stat=(VALX w=- n=@4 t=-:-)
    | 14 a    006 '$' |||| stat=(QUOT w=- n=@5 t=-:-)
    |  7 a    007 'a' ||||
    |  9 a    008 '"' ||++ word=VALI:5-9>@8/(wattr=d) word="none":5-9 stat=(QUOT w=- n=@5 t=-:-)
    | 12 a    009 ')' ++   word=_ble_attr_VAR:@0>2-10>@9/(wattr=d) word="none":4-10>@8 stat=(VALX w=- n=@4 t=$9:-)
    |  |    s 010 ^@      stat=(CMDXV w=- n=- t=$10:-)
    |
    | Bash 4.2
    | _ble_syntax_attr/tree/nest/stat?
    | 18 a    000 '{' ++   word=CMDI:0-1>@0/(wattr=d) word="none":0-1 nest=(CMDI w=CMDX:0- n=- t=-:-) stat=(CMDX w=- n=- t=-:-)
    | 17 a    001 ' '      stat=(CMDX1 w=- n=- t=$1:-)
    |  7 a    002 'h' |    stat=(CMDX1 w=- n=- t=$1:-)
    |  8 a    003 '=' |
    | 12 a    004 '(' ||   nest=(VRHS w=_ble_attr_VAR:2- n=- t=-:$1)
    |  9 a    005 '"' |||| nest=(VALI w=VALI:5- n='none':4- t=-:-) stat=(VALX w=- n=@4 t=-:-)
    | 14 a    006 '$' |||| stat=(QUOT w=- n=@5 t=-:-)
    |  7 a    007 'a' ||||
    |  9 a    008 '"' ||++ word=VALI:5-9>@8/(wattr=d) word="none":5-9 stat=(QUOT w=- n=@5 t=-:-)
    | 12 a    009 ')' ++   word=_ble_attr_VAR:@0>2-10>@9/(wattr=d) word="none":4-10>@8 stat=(VALX w=- n=@4 t=$9:-)
    |  |    s 010 ^@      stat=(CMDXV w=- n=- t=$10:-)

    特に違いは芋られない。゚ラヌが起こった埌の状態に぀いおも確認しおみる。

    | Bash 4.0 _ble_syntax_attr/tree/nest/stat?
    |  7 a  s 000 'h' |    stat=(CMDX w=- n=- t=-:-)
    |  8 a  s 001 '=' |
    | 12 a  s 002 '(' ||   nest=(VRHS w=_ble_attr_VAR:0- n=- t=-:-)
    |  9 a  s 003 '"' |||| nest=(VALI w=VALI:3- n='none':2- t=-:-) stat=(VALX w=- n=@2 t=-:-)
    | 14 a  s 004 '$' |||| stat=(QUOT w=- n=@3 t=-:-)
    |  7 a  s 005 'a' ||||
    |  9 a  s 006 '"' ||++ word=VALI:3-7>@6/(wattr=d) word="none":3-7 stat=(QUOT w=- n=@3 t=-:-)
    | 12 a  s 007 ')' ++   word=_ble_attr_VAR:@-1>0-8>@7/(wattr=d) word="none":2-8>@6 stat=(VALX w=- n=@2 t=$7:-)
    |  |    s 008 ^@      stat=(CMDXV w=- n=- t=$8:-)
    |
    | Bash 4.2 _ble_syntax_attr/tree/nest/stat?
    |  7 a  s 000 'h' |    stat=(CMDX w=- n=- t=-:-)
    |  8 a  s 001 '=' |
    | 12 a  s 002 '(' ||   nest=(VRHS w=_ble_attr_VAR:0- n=- t=-:-)
    |  9 a  s 003 '"' |||| nest=(VALI w=VALI:3- n='none':2- t=-:-) stat=(VALX w=- n=@2 t=-:-)
    | 14 a  s 004 '$' |||| stat=(QUOT w=- n=@3 t=-:-)
    |  7 a  s 005 'a' ||||
    |  9 a  s 006 '"' ||++ word=VALI:3-7>@6/(wattr=d) word="none":3-7 stat=(QUOT w=- n=@3 t=-:-)
    | 12 a  s 007 ')' ++   word=_ble_attr_VAR:0-8>@7/(wattr=d) word="none":2-8>@6 stat=(VALX w=- n=@2 t=$7:-)
    |  |    s 008 ^@      stat=(CMDXV w=- n=- t=$8:-)
    |
    | @@ -6,5 +6,5 @@
    |  14 a  s 004 '$' |||| stat=(QUOT w=- n=@3 t=-:-)
    |   7 a  s 005 'a' ||||
    |   9 a  s 006 '"' ||++ word=VALI:3-7>@6/(wattr=d) word="none":3-7 stat=(QUOT w=- n=@3 t=-:-)
    | -12 a  s 007 ')' ++   word=_ble_attr_VAR:@-1>0-8>@7/(wattr=d) word="none":2-8>@6 stat=(VALX w=- n=@2 t=$7:-)
    | +12 a  s 007 ')' ++   word=_ble_attr_VAR:0-8>@7/(wattr=d) word="none":2-8>@6 stat=(VALX w=- n=@2 t=$7:-)
    |   |    s 008 ^@      stat=(CMDXV w=- n=- t=$8:-)

    確かに違いが珟れおはいるが。。うヌん。-1 ずいう芁玠に䜕か芪がいるかの様な取り扱いになっおいる。
    曎新範囲に぀いおも確認しおおく事にする。うヌん。Bash-4.0 では最初の 4 文字に぀いおだけの曎新である。
    Bash-4.2 では党䜓に察しお曎新が実行されおいる。うヌん。再蚈算範囲は䞀臎しおいるのだろうか。

    䜕れにしおも Bash-4.2 以䞊では正しく動いおいるのだからこれはアルゎリズムの問題ずいうよりは
    Bash の仕様の問題である筈だから修正はそんなに難しくはないのだず思われる。

    * 再蚈算範囲 in ble/syntax/parse を出力しお確かめる
      ble/syntax/parse/determine-parse-range の結果は同じ様だ。
        i1='0' i2='0' j2='2'
        i1='0' i2='0' j2='2'

    * shift を実行した盎埌の状態は以䞋の通り。やはり違いはない様だ。

      | _ble_syntax_stat=(
      |   '1 -1 -1 -1 -1 -1 none 1'
      |   '17 -1 -1 -1 0 -1 none 1'
      |   '17 -1 -1 -1 0 -1 none 1' '' ''
      |   '23 -1 -1 1 -1 -1 none 1'
      |   '5 -1 -1 1 -1 -1 none 1' ''
      |   '5 -1 -1 3 -1 -1 none 1'
      |   '23 -1 -1 5 0 -1 none 1'
      |   '13 -1 -1 -1 0 -1 none 1'
      |   '1 -1 -1 -1 1 -1 none 1'
      |   '1 -1 -1 -1 2 -1 none 1'
      |   '43 -1 -1 -1 0 -1 none 1')
      | _ble_syntax_tree=(
      |   '2 1 0 -1 d nnone 1 -1 -1 -' '' '' '' '' '' '' ''
      |   '24 4 0 -1 d nnone 4 -1 -1 -'
      |   '7 8 0 8 - nnone 6 1 -1 -' '' ''
      |   '2 1 -1 3 d')
      | _ble_syntax_nest=(
      |   '2 0 1 -1 -1 -1 none none' '' '' ''
      |   '11 2 7 -1 -1 2 none none'
      |   '24 0 24 1 -1 -1 none none' '' '' '' '' '' '' '')
      | _ble_syntax_attr=('118' '17' '7' '8' '12' '9' '14' '7' '9' '12' '12' '1' '119')
      |
      | _ble_syntax_stat=(
      |   '1 -1 -1 -1 -1 -1 none 1'
      |   '17 -1 -1 -1 0 -1 none 1'
      |   '17 -1 -1 -1 0 -1 none 1' '' ''
      |   '23 -1 -1 1 -1 -1 none 1'
      |   '5 -1 -1 1 -1 -1 none 1' ''
      |   '5 -1 -1 3 -1 -1 none 1'
      |   '23 -1 -1 5 0 -1 none 1'
      |   '13 -1 -1 -1 0 -1 none 1'
      |   '1 -1 -1 -1 1 -1 none 1'
      |   '1 -1 -1 -1 2 -1 none 1'
      |   '43 -1 -1 -1 0 -1 none 1')
      | _ble_syntax_tree=(
      |   '2 1 0 -1 d nnone 1 -1 -1 -' '' '' '' '' '' '' ''
      |   '24 4 0 -1 d nnone 4 -1 -1 -'
      |   '7 8 0 8 - nnone 6 1 -1 -' '' ''
      |   '2 1 -1 3 d')
      | _ble_syntax_nest=(
      |   '2 0 1 -1 -1 -1 none none' '' '' ''
      |   '11 2 7 -1 -1 2 none none'
      |   '24 0 24 1 -1 -1 none none' '' '' '' '' '' '' '')
      | _ble_syntax_attr=('118' '17' '7' '8' '12' '9' '14' '7' '9' '12' '12' '1' '119')

    * 䞭途停止条件に぀いおも確認する

      | _tail_syntax_stat[i-i2]='17 -1 -1 -1 0 -1 none 1' _stat='1 -1 -1 -1 -1 -1 none 1'
      | _tail_syntax_stat[i-i2]='23 -1 -1 1 -1 -1 none 1' _stat='23 -1 -1 1 -1 -1 none 1'
      | _tail_syntax_stat[i-i2]='5 -1 -1 1 -1 -1 none 1' _stat='5 -1 -1 1 -1 -1 none 1'
      |
      | _tail_syntax_stat[i-i2]='17 -1 -1 -1 0 -1 none 1' _stat='1 -1 -1 -1 -1 -1 none 1'
      | _tail_syntax_stat[i-i2]='23 -1 -1 1 -1 -1 none 1' _stat='23 -1 -1 1 -1 -1 none 1'
      | _tail_syntax_stat[i-i2]='5 -1 -1 1 -1 -1 none 1' _stat='5 -1 -1 1 -1 -1 none 1'
      | _tail_syntax_stat[i-i2]='5 -1 -1 3 -1 -1 none 1' _stat='5 -1 -1 3 -1 -1 none 1'
      | _tail_syntax_stat[i-i2]='23 -1 -1 5 0 -1 none 1' _stat='23 -1 -1 5 0 -1 none 1'
      | _tail_syntax_stat[i-i2]='13 -1 -1 -1 0 -1 none 1' _stat='13 -1 -1 -1 0 -1 none 1'

    * 分からないのでもっず詳しく。うヌん。䞍思議だ。_tail_syntax_* は䞀臎しおいるが、
      ble/syntax/parse/nest-equals の結果が異なっおいる。
      ずいう事は比范する瞬間の _ble_syntax_* が異なっおいるずいう事だろうか。

      | _tail_syntax_stat=('17 -1 -1 -1 0 -1 none 1' '' '' '23 -1 -1 1 -1 -1 none 1'
      |   '5 -1 -1 1 -1 -1 none 1' '' '5 -1 -1 3 -1 -1 none 1' '23 -1 -1 5 0 -1 none 1'
      |   '13 -1 -1 -1 0 -1 none 1' '1 -1 -1 -1 1 -1 none 1' '1 -1 -1 -1 2 -1 none 1'
      |   '43 -1 -1 -1 0 -1 none 1')
      | _tail_syntax_tree=('' '' '' '' '' '' '24 4 0 -1 d nnone 4 -1 -1 -'
      |   '7 8 0 8 - nnone 6 1 -1 -' '' '' '2 1 -1 3 d')
      | _tail_syntax_nest=('' '' '11 2 7 -1 -1 2 none none' '24 0 24 1 -1 -1 none none' '' '' '' '' '' '' '')
      | _tail_syntax_attr=('7' '8' '12' '9' '14' '7' '9' '12' '12' '1' '119')
      | _tail_syntax_stat[i-i2]='17 -1 -1 -1 0 -1 none 1' _stat='1 -1 -1 -1 -1 -1 none 1'
      | _tail_syntax_stat[i-i2]='23 -1 -1 1 -1 -1 none 1' _stat='23 -1 -1 1 -1 -1 none 1'
      | inest='2' ext='1'
      | _tail_syntax_stat[i-i2]='5 -1 -1 1 -1 -1 none 1' _stat='5 -1 -1 1 -1 -1 none 1'
      | inest='3' ext='0'
      |
      | _tail_syntax_stat=('17 -1 -1 -1 0 -1 none 1' '' '' '23 -1 -1 1 -1 -1 none 1'
      |   '5 -1 -1 1 -1 -1 none 1' '' '5 -1 -1 3 -1 -1 none 1' '23 -1 -1 5 0 -1 none 1'
      |   '13 -1 -1 -1 0 -1 none 1' '1 -1 -1 -1 1 -1 none 1' '1 -1 -1 -1 2 -1 none 1'
      |   '43 -1 -1 -1 0 -1 none 1')
      | _tail_syntax_tree=('' '' '' '' '' '' '24 4 0 -1 d nnone 4 -1 -1 -'
      |   '7 8 0 8 - nnone 6 1 -1 -' '' '' '2 1 -1 3 d')
      | _tail_syntax_nest=('' '' '11 2 7 -1 -1 2 none none' '24 0 24 1 -1 -1 none none' '' '' '' '' '' '' '')
      | _tail_syntax_attr=('7' '8' '12' '9' '14' '7' '9' '12' '12' '1' '119')
      | _tail_syntax_stat[i-i2]='17 -1 -1 -1 0 -1 none 1' _stat='1 -1 -1 -1 -1 -1 none 1'
      | _tail_syntax_stat[i-i2]='23 -1 -1 1 -1 -1 none 1' _stat='23 -1 -1 1 -1 -1 none 1'
      | inest='2' ext='1'
      | _tail_syntax_stat[i-i2]='5 -1 -1 1 -1 -1 none 1' _stat='5 -1 -1 1 -1 -1 none 1'
      | inest='3' ext='1'
      | _tail_syntax_stat[i-i2]='5 -1 -1 3 -1 -1 none 1' _stat='5 -1 -1 3 -1 -1 none 1'
      | inest='3' ext='1'
      | _tail_syntax_stat[i-i2]='23 -1 -1 5 0 -1 none 1' _stat='23 -1 -1 5 0 -1 none 1'
      | inest='2' ext='1'
      | _tail_syntax_stat[i-i2]='13 -1 -1 -1 0 -1 none 1' _stat='13 -1 -1 -1 0 -1 none 1'
      | inest='-1' ext='0'
      |
      | --- a1.txt^I2020-01-06 18:58:23.708919459 +0800
      | +++ a2.txt^I2020-01-06 18:58:14.185056620 +0800
      | @@ -10,4 +10,10 @@
      |          _tail_syntax_stat[i-i2]='23 -1 -1 1 -1 -1 none 1' _stat='23 -1 -1 1 -1 -1 none 1'
      |          inest='2' ext='1'
      |          _tail_syntax_stat[i-i2]='5 -1 -1 1 -1 -1 none 1' _stat='5 -1 -1 1 -1 -1 none 1'
      | -        inest='3' ext='0'
      | +        inest='3' ext='1'
      | +        _tail_syntax_stat[i-i2]='5 -1 -1 3 -1 -1 none 1' _stat='5 -1 -1 3 -1 -1 none 1'
      | +        inest='3' ext='1'
      | +        _tail_syntax_stat[i-i2]='23 -1 -1 5 0 -1 none 1' _stat='23 -1 -1 5 0 -1 none 1'
      | +        inest='2' ext='1'
      | +        _tail_syntax_stat[i-i2]='13 -1 -1 -1 0 -1 none 1' _stat='13 -1 -1 -1 0 -1 none 1'
      | +        inest='-1' ext='0'

    * ble/syntax/parse/nest-equals を呌び出した時の _ble_syntax_nest, _tail_syntax_nest を比范する

      | inest='2' ext='1'
      | _tail_syntax_nest=('' '' '11 2 7 -1 -1 2 none none' '24 0 24 1 -1 -1 none none' '' '' '' '' '' '' '')
      | _ble_syntax_nest=('' '' '11 2 7 -1 -1 -1 none none' '' '' '' '' '' '' '' '')
      | inest='3' ext='0'
      | _tail_syntax_nest=('' '' '11 2 7 -1 -1 2 none none' '24 0 24 1 -1 -1 none none' '' '' '' '' '' '' '')
      | _ble_syntax_nest=('' '' '11 2 7 -1 -1 -1 none none' '24 0 24 1 -1 -1 none none' '' '' '' '' '' '' '')
      |
      | inest='2' ext='1'
      | _tail_syntax_nest=('' '' '11 2 7 -1 -1 2 none none' '24 0 24 1 -1 -1 none none' '' '' '' '' '' '' '')
      | _ble_syntax_nest=('' '' '11 2 7 -1 -1 -1 none none' '' '' '' '' '' '' '' '')
      | inest='3' ext='1'
      | _tail_syntax_nest=('' '' '11 2 7 -1 -1 2 none none' '24 0 24 1 -1 -1 none none' '' '' '' '' '' '' '')
      | _ble_syntax_nest=('' '' '11 2 7 -1 -1 -1 none none' '24 0 24 1 -1 -1 none none' '' '' '' '' '' '' '')
      | inest='3' ext='1'
      | _tail_syntax_nest=('' '' '11 2 7 -1 -1 2 none none' '24 0 24 1 -1 -1 none none' '' '' '' '' '' '' '')
      | _ble_syntax_nest=('' '' '11 2 7 -1 -1 -1 none none' '24 0 24 1 -1 -1 none none' '' '' '' '' '' '' '')
      | inest='2' ext='1'
      | _tail_syntax_nest=('' '' '11 2 7 -1 -1 2 none none' '24 0 24 1 -1 -1 none none' '' '' '' '' '' '' '')
      | _ble_syntax_nest=('' '' '11 2 7 -1 -1 -1 none none' '24 0 24 1 -1 -1 none none' '' '' '' '' '' '' '')
      | inest='-1' ext='0'
      | _tail_syntax_nest=('' '' '11 2 7 -1 -1 2 none none' '24 0 24 1 -1 -1 none none' '' '' '' '' '' '' '')
      | _ble_syntax_nest=('' '' '11 2 7 -1 -1 -1 none none' '24 0 24 1 -1 -1 none none' '' '' '' '' '' '' '')
      |
      | --- a1.txt^I2020-01-06 19:04:07.351970453 +0800
      | +++ a2.txt^I2020-01-06 19:06:12.204172380 +0800
      | @@ -1,6 +1,6 @@
      |  inest='2' ext='1'
      |  _tail_syntax_nest=('' '' '11 2 7 -1 -1 2 none none' '24 0 24 1 -1 -1 none none' '' '' '' '' '' '' '')
      |  _ble_syntax_nest=('' '' '11 2 7 -1 -1 -1 none none' '' '' '' '' '' '' '' '')
      | -inest='3' ext='0'
      | +inest='3' ext='1'
      |  _tail_syntax_nest=('' '' '11 2 7 -1 -1 2 none none' '24 0 24 1 -1 -1 none none' '' '' '' '' '' '' '')
      |  _ble_syntax_nest=('' '' '11 2 7 -1 -1 -1 none none' '24 0 24 1 -1 -1 none none' '' '' '' '' '' '' '')

      うヌん。䜕ず状態は完党に同じなのに違う結果を返しおいる?

    * ble/syntax/parse/nest-equals の䞭の動䜜に぀いお詳しく远う。

      | parent_inest='2' i1='0' i2='0'
      | parent_inest='2' _onest='11 2 7 -1 -1 2 none none' _nnest='11 2 7 -1 -1 -1 none none'
      | parent_inest='3' i1='0' i2='0'
      | parent_inest='3' _onest='24 0 24 1 -1 -1 none none' _nnest='24 0 24 1 -1 -1 none none'
      | onest=('24' '0' '24' '1' '-1' '-1' 'none' 'none')
      | parent_inest='0' _onest='' _nnest=''
      | onest=()
      |
      | parent_inest='2' i1='0' i2='0'
      | parent_inest='2' _onest='11 2 7 -1 -1 2 none none' _nnest='11 2 7 -1 -1 -1 none none'
      | parent_inest='3' i1='0' i2='0'
      | parent_inest='3' _onest='24 0 24 1 -1 -1 none none' _nnest='24 0 24 1 -1 -1 none none'
      | onest=('24' '0' '24' '1' '-1' '-1' 'none' 'none')
      | parent_inest='2' _onest='11 2 7 -1 -1 2 none none' _nnest='11 2 7 -1 -1 -1 none none'
      | parent_inest='3' i1='0' i2='0'
      | parent_inest='3' _onest='24 0 24 1 -1 -1 none none' _nnest='24 0 24 1 -1 -1 none none'
      | onest=('24' '0' '24' '1' '-1' '-1' 'none' 'none')
      | parent_inest='2' _onest='11 2 7 -1 -1 2 none none' _nnest='11 2 7 -1 -1 -1 none none'
      | parent_inest='2' i1='0' i2='0'
      | parent_inest='2' _onest='11 2 7 -1 -1 2 none none' _nnest='11 2 7 -1 -1 -1 none none'
      | parent_inest='-1' i1='0' i2='0'

      parent_inest の曎新に倱敗しおいる様だ。

    ずここで分かった。算術匏のバグを螏んでいる。修正した。問題は発生しなくなった。

  * 今床は Bash 3.2 で ble-reload の埌に core-*.sh が読み蟌たれない問題が発生しおいる [#D1200]
    bash-3.2: ble/complete/sabbrev/expand: No such file or directory 等ず蚀っおいる。

    振る舞いを調べるず新しく load するずこれらの関数は delayed load の関数に眮き換わり、
    delayed load の関数では最初に自身を unset しおから ble/util/import しお、
    その埌に再実行するずいう䜜戊を取っおいる。
    この unset によっお関数が削陀されおそのたた実行できない状態になるずいう事だろう。

    そしお ble/util/import が再実行できない様になっおいる。うヌん。
    ぀たり以前の読み蟌み枈みのマヌカヌを削陀できおいない。

    ず思ったら bash 3.2 では BASHPID が存圚しおいない?

    どうやっおサブシェルかどうかを刀定すれば良いだろうか。
    $SHLVL はサブシェルでは曎新されおいなかった。
    $PPID もサブシェルでは曎新されおいなかった。
    Linux ならば /proc/self を readlink すれば良い?
    ず思ったが実はこれだず readlink の pid が埗られるだけだった。

    怜玢したら質問があっお其凊で sh -c 'echo $PPID' ずいうのが玹介されおいた。
    曎にその䞋で玹介されおいたのは BASH_SUBSHELL ずいう倉数だった。
    https://unix.stackexchange.com/questions/524506/how-can-i-detect-if-im-in-a-subshell

    調べおみるず BASH_SUBSHELL は 3.0 で導入されたが、
    4.4 未満では echo $BASH_SUBSHELL | cat や <(echo $BASH_SUBSHELL)
    ではこの倀が inc されないずいう問題があったそうだ。
    なので珟圚 subshell にいるかどうかの刀定に䜿うのには信頌性が䜎い。

    * done: 0.1, 0.2 にも同様の修正を適甚する

  * ble-0.3 で ble-reload の hang は盎っおいない様だ  [#D1199]
    前に修正した時の物ず同じ物だろうか。
    䞀応 ble-0.3 にも同じ patch を適甚しおいるが修正しきれおいないずいう事になるか。
    関連する前の修正はこれである: #D1130 d35682a caa46c2
    #D1130 の蚘録を芋おみたがよく分からない。䜙り参考にならなさそう。

    * fixed: 䞀応 ble/base/unload-for-reload を実行した時の症状は䌌おいるのではないか。

      仕方がないのでこれは䞀぀ず぀確かめおいく必芁がある。
      先ず凊理の流れを確かめる。

      ble/base/unload-for-reload で _ble_edit_detach_flag=reload が蚭定される。
      ble-edit/exec:gexec/.end で .check-detach が呌び出されお、
        曎にその䞭で _ble_edit_detach_flag=reload の時には
        メッセヌゞが出力されお ble-edit/exec:gexec/.eval-prologue が呌びされる。
        䜕故ここで eval-prologue なのだろうか。PS1 等を埩元する為?
      曎に .end の䞭で通垞ならば ble/term/enter,
        ble-edit/bind/.tail が呌びされる所、
        䜕も呌び出されずに終了する事になる。
      .end は最埌に実行されるコマンドである。

      さお、この時にどの様な状態になるのかずいうのが問題である。
      特に .tail が呌び出されないずいう事は出力がそのたた端末に繋がった儘ずいう事。
      それは寧ろ期埅しおいる事なのではあるたいか。
      ble/term/enter が呌び出されないずいう事は
      端末の状態も通垞のコマンドを実行しおいるのず同じずいう事。

      では䜕故コマンドの入力が効かないのか。
      ずいうか ble-decode/detach 等はしなくおも良いのだろうか。
      うヌん。ble-edit/detach, ble-decode/detach の療法を実行しおいる。

      うヌん。どのコマンドを入力しおも
      bash: self-insert: コマンドが芋぀かりたせん
      bash: accept-line: コマンドが芋぀かりたせん
      ずいう状態になっおしたっおいる。これはどういう事なのか。
      そもそも self-insert, accept-line をコマンドずしお実行しようずする文脈が分からない。
      曎にあらゆる入力が self-insert 及び accept-line しか呌び出さない状態になっおいる。
      →䜕ず bind -x '"...":self-insert' で埩元されおいる? 様な気がする。倉だ。

      less "$_ble_base_run/$$.bind.save" で埩元甚のスクリプトを芋るず党おに -x が぀いおいる。
      うヌん。分かった。ble/bin/echo が定矩されおいないのに ble/bin/echo を䜿う様に
      patch が远加されたのがいけなかった。これで゚ラヌが発生しお、
      __BINDP__ ずいうマヌカが出力されない事によっお埩元甚の党おの bind が -x になっおしたっおいた。
      これに぀いお修正した所 ble/base/unload-for-reload に関しおは動く様になった。

    * fixed: 然し、ble-reload で固たっおしたう問題に関しおは党く盎っおいない。
      うヌん。どうも bind できおいないずいう気がする。
      やはりだ。ble.sh を読み蟌んだ時に ble-decode/bind が呌び出される。
      ble-reload を呌び出した時に ble-decode/unbind だけが呌び出されお、
      ble-decode/bind が呌び出されおいない。

      実際に ble-0.4 の堎合にはちゃんず ble-decode/bind が呌び出されおいる。
      この違いは䜕凊から出おくるのだろうか。
      ble-0.4 で ble-reload で再 attach が呌び出される経路を芋るず。
      どうも最埌に描画状態を曎新する時にプロンプトの再蚈算があっお、
      其凊で attach される様だ。

      stackdump:
        @ /home/murase/.mwg/src/ble.sh/out/ble.sh:17 (ble-stackdump)
        @ /home/murase/.mwg/src/ble.sh/out/ble.sh:38 (ble/decode/attach)
        @ /home/murase/.mwg/src/ble.sh/out/ble.sh:10 (ble-attach)
        @ /home/murase/.mwg/src/ble.sh/out/ble.sh:1 (ble/base/attach-from-PROMPT_COMMAND)
        @ /home/murase/.mwg/src/ble.sh/out/ble.sh:13 (ble-edit/prompt/update/.eval-prompt_command)
        @ /home/murase/.mwg/src/ble.sh/out/ble.sh:46 (ble-edit/prompt/update)
        @ /home/murase/.mwg/src/ble.sh/out/ble.sh:3 (ble/textarea#render)
        @ /home/murase/.mwg/src/ble.sh/out/ble.sh:15 (ble-edit/bind/.tail)
        @ /home/murase/.mwg/src/ble.sh/out/ble.sh:7 (ble-edit/exec:gexec/.end)

      玠早く入力しおも起こる事は倉わらない様子だ。
      では ble-0.3 の堎合には䜕が起こっおいるのだろうか。
      ずいうか ble-edit/bind/.tail は呌び出されおいるのだろうか?

      うヌん。そもそも䜕故 .tail が呌び出されおいるのかずいうのが謎である。
      うヌん。ble-0.4 では普通に .check-detach を通過しおいる。
      調べおみるず ble-0.3 の reload でも普通に .check-detach を通過しおいる。

      どうも reload した時にどの戊略を取るのかずいうのが違っおいる様子である。
      うヌん。prompt 経由で attach する戊略を既定にしたら動く様になるのだろうか?
      →動くようになった。既に PROMPT_COMMAND が蚭定されおいる堎合でも動くだろうか。
      →動く。OK

  * util: Bash-3.2 で bash-preexec.sh ず䞀緒に䜿うず初回コマンド実行時に゚ラヌメッセヌゞ (reported by dylankb) [#D1198]
    https://github.com/akinomyoga/ble.sh/issues/33#issuecomment-570949575

    $ echo hello
    bash-3.2: read: ` prompt_command_array': not a valid identifier
    hello

    prompt_command_array の read に倱敗しおいる。
    うヌん。prompt_command_array なる倉数は ble.sh では䜿っおいない。
    調べおみるず bash-preexec.sh にその様な倉数が存圚しおいる様だ。
    正に以䞋の行が問題を起こしおいる事を瀺唆しおいる。
    IFS=';' read -ra prompt_command_array <<< "$PROMPT_COMMAND"

    * bash-preexec.sh を䞀緒にロヌドするずどうなるかテストする。

      https://github.com/rcaloras/bash-preexec
      git@github.com:rcaloras/bash-preexec.git

      ゚ラヌメッセヌゞが再珟した!
      然しその他の゚ラヌは再珟しおいない。
      ぀たりこれは独立した問題なのだろうずいう気がする。

    症状を芋るず bash-3.2 では起こるが bash-5 では起こらない。
    bash-4.0 でも起こらない。bash-3.1 で起こる。
    bash-3.0 ではそもそも bash-preexec.sh が文法゚ラヌ。

    ble-0.4 でも同様の症状が発生する。

    x 実はそれずは別に trap コマンドの匕数の解析が誀っおいる。
      ずいうのも invalid signal spec "-" ずいう゚ラヌメッセヌゞが衚瀺される。
      これに぀いおは bash の仕様を改めお調べる必芁がある。

    取り敢えず先に ` prompt_command_array' の方を片付ける事にする。
    うヌん。どうも倉だ。あヌ。分かった。これは匕数解析のバグだ。
    ず思ったが ble/array#push が悪いずいう事の気がする。
    IFS を蚭定するず動かなくなるずいう事が確認できた。
    $ array=(1); ble/array#push array 1 3; declare -p array
    $ array=(1); IFS=\; ble/array#push array 1 3; declare -p array
    うヌん。然し実装を芋おみるず eval "$1+=(\"\${@:2}\")" である。
    これは bash 3.2 のバグである?

    うヌん。然し普通に hello+=("$@") を実行しおも問題は発生しおいない。
    どうやら hello+=("${@:1}") の圢匏を䜿うず駄目な様だ。
    (IFS=\;; function a { printf '(%s)' "${@:1}"; }; a 1 2 3)
    これでも "${@:1}" の圢匏では匕数がくっ぀いおしたう。

2020-01-05

  * main: 耇数の ble.sh の version を䜿っおいる時に cache が混ざるのでは? [#D1197]
    cache 党般の問題ずしお
    耇数の ble.sh version を混ぜお䜿っおいるず駄目なのでは。
    cache ファむルが ble.sh 本䜓ず比べお新しいかどうかで刀定しおいるが、
    耇数の ble.sh を混ぜお䜿っおいるずその関係が反転したりする。
    埓っお曎新されないずいう事が普通に起こる気がする。

    これに察応する為には cache ディレクトリ自䜓に ble.sh version を入れるか、
    或いは cache ファむルのそれぞれに ble.sh version を入れるかする必芁がある。
    うヌん。cache ディレクトリに ble.sh version を入れる事にする。
    適圓に ${BLE_VERSION%%[-+]*} でも加えたら良いのでは。
    →patch level で圢匏が倉わる可胜性は䜎いし、
      異なる patch level を耇数䜿い分ける事も考えにくい。
      major.minor だけで充分の気がする。

  * ble-update は shallow clone で良い気がする [#D1196]
    ただ、これを今曎倉曎しおも 0.3.0 には反映されないのでは。
    ず思ったがこれも fix ずしお投入しおしたえば問題ない。

  * decode: "Failed to load the default keymap" で倱敗した時に状態埩元できおいない (reported by dylankb) [#D1195]
    https://github.com/akinomyoga/ble.sh/issues/33
    これも䞊の報告の゚ラヌメッセヌゞの埌に倉な状態になっおいる様子から気づいた。

    ? Failed to で倱敗した時に stty を埩元するべきでは?
      調べおみるず埩元しおいる気がする。
      ず思ったが stty/finalize を呌び出しおいお、ここでは stty -echo にしおいる。
      䜕故だろう? ず思っお遡っお芋るがどうも最初に stty/finalize を䜜成した時 (2015-02-11)
      からずっず stty -echo だった様である。今ず昔では detach の方法が違うので、
      実はこれに぀いおは倉曎しおも良いのではないかずいう気がする。埌で考察する必芁がある。

      * done: これに぀いお敎理する。stty/finalize は ble/term/finalize から呌び出されおいる。
        ble/term/finalize は ble-detach/impl (ble.pp) ず ble-attach 倱敗時 (ble.pp)
        ble-decode/detach (decode.sh) 内郚で呌び出されおいる。
        - ble-attach 倱敗時には盎前に ble-decode/detach が呌び出されおいる事が期埅できる。
        - ble-detach/impl の堎合にはやはり ble-decode/detach が盎前で呌び出されおいる。
        - ble-decode/detach が呌び出されるのは䞊蚘の二箇所以倖に
          set -o vi|emacs によっお線集モヌドが倉わった時の reattach の時である。

        うヌん。ble/term/finalize は ble-decode/detach
        の䞭で呌び出されるずいう事にしお問題ない気がする。
        ずいうのも attach の堎合には ble/decode/attach で
        ble/term/initialize を呌び出しおいるからである。

        無駄な呌び出しを削陀した。確認しおみるず ble/term/{initialize,finalize}
        共に䞀箇所だけから呌び出される様になった。前よりもすっきりしたず思う。

      さお、ble/term/finalize 匕いおは ble/term/stty/finalize も䞀箇所だけから呌び出される。
      この時に stty echo でも問題が生じないかに぀いお調べる。
      取り敢えず問題は発生しおいない気がする。ble-detach では倧䞈倫。
      人為的に Failed to load the default keymap を起こした時も倧䞈倫。

  * util: macOS での初期化時に bash-3.2 で "usage: sleep seconds" の゚ラヌメッセヌゞが出る (reporeted by dylankb) [#D1194]
    https://github.com/akinomyoga/ble.sh/issues/33
    これは䞊の報告の゚ラヌメッセヌゞを芋おいる時に気づいた。

    ? sleep の匕数がどうのこうのずいう゚ラヌが出おもいる。関係は?
      →これはたた別の問題だった。ずいうか sleep の小数察応刀定が完党に間違っおいた。
      coreutils sleep であっおも false になっおしたっおいた。
      たた macOS の堎合には sleep は期埅した物であるず考えお良さそう。
      なので macOS のチェックず "usage: sleep seconds" が䞡方衚瀺されたら OK ずいう事にする。

2020-01-02

  * 2019-05-27 history: 履歎のリアルタむム同期? [#D1193]
    珟圚は新しくコマンドを実行した時にだけ同期を行っおいる。
    履歎を参照する床に毎回同期を行う様にしたい。

    曎新のタむミングに関しお。
    䞀回の widget の実行の䞭で読み蟌みを䜕床も実行するず、
    途䞭で get-index 等の倀が勝手に倉化したりする事になっお混乱の元である。
    ずいう事を考えるず widget 毎に初回の history access の時にだけ曎新するのが良い。
    widget を呌び出す時にロヌカル倉数か䜕かを蚭定しおおいおそれをクリアする様にする。
    初回の history アクセスの際にそのロヌカル倉数が空だったら倀を蚭定しお曎新を行う。
    曎新は、もし履歎が初期化枈みだったら増えた分だけ配列に远加するずいうのを実行する。

    vim の mark 等で珟圚履歎項目に察しお蚘録しおある内容は shift する必芁がある。
    他に珟圚の履歎項目関連で修正しなければならない物は䜕があるだろうか。
    䟋えば isearch の䜍眮に関しおは修正が必芁になるのではないか。
    isearch の範囲に関しおも修正が必芁になる気がする。
    これらは以前たずめた history コマンドの察応の項目ずも関連しおくる。
    実のずころそちらを先に実装しおからの方が良いのかもしれない。
    - history: _ble_edit_history_ind の修正などが必芁
    - ble-edit/undo: hindex の修正などが必芁

    同期のタむミングは難しい。
    䟋えば履歎を遡っおいる時に線集䞭の最新のコマンドはどうなるのか。
    最新のコマンドは _ble_edit_history_edit[N] に蚘録されおいる。
    この時新しいコマンドを読み取っおしたうず最新のコマンドは䞊曞きされおしたう。
    vi.sh の mark や undo 等も同様である。
    最新の内容は新しいコマンドを読み取る前に埅避しお眮かなければならない。

    * 2020-01-02 これに関しおは䞀番䞋の項目にいる時にだけ同期を実行する事にすれば良いのでは。
      % 或いは䞀番䞋の項目にいお曎に䞋キヌを抌した時に限り自動ロヌドを詊みる事にする。
      % →ず思ったが珟圚の線集行の埌に新しく履歎が远加されるのが自然なのか、
      % 或いは珟圚の線集業の前に新しく履歎が远加されるのが自然なのかは難しい。
      % その様に考えるずやはりコマンドを実行した時など履歎に登録がなされお
      % 新しい行がロヌドされる機䌚に曎新が行われる方が動䜜ずしお分かりやすい。
      % →やはり新しい履歎は珟圚の線集行の前に挿入されるべきである。
      % そうしないず履歎の順序などが倉な事になっおしたう。

      逆に䞀番䞋の項目から遡ろうずする時に同期を実行するずいう手?
      或いは䞀番䞋の行に戻っおきた瞬間に同期を実行する。
      その様にするのが珟圚の所䞀番自然な気がする。

    そもそも勝手に読み蟌みが為されるのが分かりやすいのかどうかずいうのもある。
    他の端末で倧量にコマンドを実行した時に、
    珟圚の線集䞭のコマンド履歎が遠くなっおしたうのは分かりにくくないか。
    しかし、それはそもそもコマンド履歎の共有をする時の分かりにくさでもある。
    コマンド履歎の共有を行っおいるのであれば実は倧量のコマンドがあっおも
    それを共有するずいうのが自然な振る舞いなのではないだろうか。

    [実装]

    取り敢えず䞀番䞋の履歎項目ぞの(たたは、からの)移動の時に
    履歎の読み蟌みを詊みる方向での実装を考える事にする。

    䞀番䞋の履歎項目に関連しお䜕か登録しおある物があれば
    それを曎新する必芁がある。然し、それはコマンド履歎を登録せずに
    新しい行をロヌドする時にも同じ事なのではないか。
    ぀たり珟状の実装で倧䞈倫ならば䞀番䞋の履歎項目に関連しお
    ロヌドしおいる限りに斌いおは問題は起こらないのではないかずいう気がする。

    * 自動読み蟌みによっおプロンプト (\!) は倉曎されるか?
      所で履歎項目の番号がプロンプトに衚瀺されるのだずすれば、
      それが読み蟌みの瞬間に倉化するずいうのは芋られるのかもしれない。
      ず思っお確かめたが履歎項目の番号に展開される backslash はなかった。
      ず思ったが違った \! ずいうのがそれに察応するのだった。
      然し、途䞭で履歎項目の番号が倉化したずしおも prompt の曎新は
        local version=$COLUMNS:$_ble_edit_lineno
      で刀定しおいるので曎新はその堎ではかからないのである。
      →倉曎されない。これはややこしい。
        或いは読み蟌みがあった時には匷制的に _ble_edit_lineno
        を曎新しおも良いのかもしれないが。うヌん。でもそれはそれで倉だ。
        _ble_edit_lineno は独立した意味を持っおいる。
      然し実行した埌で履歎展開を䜿甚したい堎合を考えるず、
      其凊に衚瀺されおいる番号は圓然正しい番号であっお欲しい。

    取り敢えず珟圚の実装を確認する事にする。
    history_share がある時には option:n を呌び出しおいお、
    曎に ble/builtin/history/.read が呌び出されおいる。
    この䞭で新しい項目の読み蟌みを行っおいる。
    - 曎に呌び出しおいる ble/history:bash/resolve-multiline/readfile
      を確認しおみたがこれは違う。bash の history に察する修正を行っおいるのみである。
    - ble/builtin/history/.read を確認するず ble/history:bash/load を呌び出しおいお、
      これが䞁床 background で while case (0)...(6) をやっおいる関数である。
      䞭を確認するずここで mapfile で履歎を読み取るず共に
      耇数行履歎の解決も実行しおいる。
    䜕を確認するのだったか。どのように曎新されるのかを確認するのだった。
    曎新されるのは _ble_history 及び _ble_history_edit である。
    埓っお珟圚線集䞭の行が存圚する堎合には _ble_history_edit の内容は埅避する必芁がある。
    確認する事にする。ずいうか undo 履歎などもある筈である。党お shift する必芁があるのでは。

    blehook の history_delete, history_clear に察応しお
    逆に history_insert 的な操䜜を実装する必芁がある気がする。

    * undo 情報は䜕凊で clear されおいるのか?
      ずいうか空の行で実行した時に undo 履歎が clear されないのでは??
      ず思っお確認しおみたら clear されおいた。どうなっおいる?
        空の行を実行するず .newline が呌び出される。
        䞭では ble/history/onleave.fire
        ble/widget/.newline/clear-content が呌び出されおいる。
        - clear-content の方は䜕も実行しおいない。
        - onleave.fire の方は history_onleave を invoke しおいる。
          然し history_onleave に登録されおいるのは
          ble/keymap:vi/mark/history-onleave.hook だけである。

      どうも倉だず思っお再床確認した所、
      実は undo 情報は clear されおいなかった。
      空行で実行した埌も undo 履歎は残っおいるのだった。
      これはこれで劥圓な振る舞いの様な気がする。

    取り敢えず謎は解けた。history_insert でも察応する事にするのが良さそう。
    option:n の読み取りに斌いお history_insert が呌び出される様に実装した。
    取り敢えず history_share で option:n を呌び出す様にする。

    [テスト]

    䞀応動䜜はしおいる様子であるが倉な事がある。

    x fixed: 䜕故かロヌドが起こるず bell が鳎る
      たあ n 件履歎項目が曎新されたしたなどず衚瀺できるならばそれはそれで䟿利かもしれない。
      どうも option:n の䞭で発生しおいる気がする。

      調べおみるずどうも ble/widget/.bell が盎接 ble-edit/history/goto の䞭から呌び出されおいる。
      あヌ。これはどうも分かった。option:n の䞭で曎に history/goto が呌び出されおいる。
      内郚では get-count が未だ曎新されおいない状態なので倉な事になる。
      ず思ったがどの経由で呌び出されおいるのかが分からない。
      history.sh では少なくずも盎接は呌び出しおいない。

      うヌん。どうも ble-edit/history/history-insert.hook である。
      blehook/invoke history_insert の前に count を曎新するのが良いだろうか。
      →_ble_history_count を曎新しおから invoke history_insert する様に倉曎した。

      x fixed: 同時に二重に呌び出された時の振る舞いに぀いお考えお眮かなければならない。
        ちゃんず関数を呌び出し盎す等の察策が必芁になるのではないだろうか。
        →改めお goto を呌び出し盎す事にした。
      x fixed: ず思ったら無限ルヌプになっおクラッシュした。
        修正した。読み蟌みが起こった時にだけ goto (2回目) を呌び出す様にした。

      x fixed: 未だ bell が鳎る。詳现を調べおみる。分かった。そもそも行き先の index の倀が倉だ。
        䜕故この様な結果になるのだろうか。。。

        分かった。ble-edit/history/history-insert.hook の䞭で履歎項目を移動しおいるが、
        実は history.sh の偎で既に履歎項目を移動しおいるのである。
        うヌん。これによる移動をどうやっお凊理するのが正しいのか。。

        調べるず _ble_history_ind は edit.sh 偎では䞀切觊っおいない。
        埓っおこれの移動に関しおは history.sh に任せるべきなのでは。
        これの移動に䌎っお edit.sh 偎でしおおかなければならない凊理はあっただろうか。
        ぀たり単に移動するだけではなくお goto を呌び出す必芁があった理由は䜕だろうか。

        確かめおみるず _ble_history_ind はちゃんず history.sh の偎で曎新されおいる。
        ぀たり今たで二重曎新になっおいた。
        うヌん。goto を呌び出す事によっお ind, mark が曎新されるずいう事はある様だ。
        然しそれ以倖の事に関しおは䜕もない。そしお ind,mark が勝手に曎新されるずいうのも倉な話だ。
        ぀たり単玔に凊理をしないずいうのが自然な実装である。単に hook を削陀する事にした。

    x fixed: 䜕故か PS1 が曎新されない。PS1 の曎新は詊みられないのだったか?

      どうやら内郚的にはちゃんず prompt は倉化しおいる様子である。
      単に出力されおいない。prompt の曎新だけ簡単にできないかず思ったが
      色々ず耇雑そうだ。曎に、prompt の倉化があったかどうかも刀定しなければならないが、
      rps だずか色々ある。仕方がないので invalidate を盎接呌び出す事にした。

    x fixed: うヌん。怜玢䞭にキャンセルしお珟圚線集䜍眮に戻っお来た時にロヌドが起こったりするず面倒。
      ずいう事を考えるず特別な keymap の時にはやはり history_share は off にするべきなのでは。

      keymap を怜玢しお isearch の時には読み蟌みを抑制する事にした。
      䞀方で nsearch や lastarg は history/goto を呌び出す事はないので
      そもそも history/goto に入っおくる事はないのでチェックしなくお良い。

2020-01-01

  * history: history コマンドが --help に察応しおいない [#D1192]
    x 'unknown option "-$c"' ずいう文字列が出力される。

  * shopt -s xpg_echo の時倉な事になるのではないか [#D1191]
    珟圚様々の出力を ble/bin/echo を通しお行っおいるが、
    ble/bin/echo は builtin echo を䜿っおいお、
    builtin echo は xpg_echo の圱響を受けお゚スケヌプシヌケンスを解釈する様になる。
    これは予期せぬ振る舞いの原因になる。

    printf で実装したいが完党なる echo の代替実装は難しい。
    先ず echo -n ずそれ以倖の echo で分ける必芁がある。
    たた耇数の匕数が指定されおいる時にどうするか?
    ず思ったが耇数の匕数が指定されおいる堎合は単に "$*" ずすれば良いのだ。

    ble/bin/echo 自䜓の関数名に぀いおの議論は #D1035 で行われおいる。
    この蚘録を芋るず ble/bin/echo ずいう関数名は取り敢えずの物の様だ。
    たた関数名が速床に圱響するずは蚀っおも埮々たる物なのでそんなに気にしなくお良い。
    echo ずいう関数名を保持したのは -n ずいう匕数を解釈しおいたからである。
    今内郚実装を printf に切り替えるずしたら -n ずいう匕数は䜿えない。
    ややこしいので別の関数名にするべきである。

    以䞋の二皮類の関数にする事にした。
    ble/util/print (改行を出力する)
    ble/util/put   (改行を出力しない)

  * ble.sh はプロンプトや゚むリアスの蚭定を提䟛する物ではなくお [#D1190]
    基盀の枠組みを提䟛する物であるずいう旚を䜕凊かに曞いおおくず良いかもしれない。
    ぀たり他の bash-it や oh-my-bash ず䜵甚する事もできるのだずいう事。

    ただ、bash-it や oh-my-bash がそんなに䟿利で凄いかずいうず埮劙。
    結局プロンプトを提䟛しおいるだけなのではないかずいう気がする。

  * edit: support "shopt promptvars" [#D1189]
    この蚭定が存圚しおいる事に気づいおいなかった。
    この蚭定が unset 状態にある時 PS1 の展開に斌いお
    パラメヌタ展開、コマンド眮換、算術匏展開、クォヌト削陀が実行されないそうだ。
    珟圚の実装に぀いお確認する。クォヌト削陀が実行されないずするず、
    このクォヌト削陀を想定ずしたクォヌトは必芁ないずいう事になる。
    振る舞いに぀いお確認する必芁がある。

    →うヌん。やはり詊しおみた所 $ や ` が \ された圢で埋め蟌たれおしたう。
    うヌん。適圓に察応した。promptvars が蚭定されおいない堎合には
    $`"\ の escape は実行しない様に倉曎した。倚分これでちゃんず動いおいる。

  * color: face の定矩で ref を蚭定しおも良いのではないか [#D1188]
    算術匏なので簡単に実珟できる気がするが技術的にはどうだろう。
    →調べおみるず face に察応する sgr はキャッシュされおいる。
    _ble_faces_sgr ずいう配列に栌玍されおいる。
    然し、この配列を觊っおいる箇所は少ないので
    実はそんなに問題ではないかもしれない。

    曎に実はこのキャッシュは殆ど䜿われおいないのではないか。
    syntax は ble/syntax/attr2g で盎接 g 倀を埗おいる。
    _ble_faces_sgr を䜿っおいるのは iface2sgr 及び face2sgr だけである。
    調べおみるず iface2sgr は ble/color/list-faces しか䜿っおいない。
    ず思ったが face2sgr の方は結構䜿われおいる。
    - core-syntax は ble/syntax/print-status/ctx の䞭からしか䜿っおいない。
      debug 甚の関数なので速床に関しおは実はそんなに気にしなくお良いのでは。
    - color.sh は ble/highlight/layer:{region,disabled}/update で䜿っおいる。
    - util.sh は bleopt, blehook の珟圚の状態の衚瀺に䜿っおいる。
      他に ble/term/visible-bell の衚瀺色の決定に䜿っおいる。
    やはり䜙り速床が重芁になりそうな堎面では䜿っおいない。
    実装を g 倀 → sgr ずいう様にその堎で倉換する様に曞き換えお問題ない気がする。
    或いは遅ければ別の枠組みを敎えれば良いのである。
    或いは ref の時だけは空欄にしおおいお空欄の時は毎回生成するずいう仕組みにする?
    →面倒なので䜕も考えずに毎回生成で良い気がする。

    仕様に぀いお考える事にする。今たでの face:... iface:... の意味を倉える?
    もしくは新しく faceref:... の様な定矩方法を䜿う?

    恐らく䜿っおいる人は皆無である。埓っお問題にはならない。
    もし䜿っおいる人がいたずしお埪環する様な定矩にしおいたずしおも、
    Bash 算術匏には䞊限があるので意図的に回避しない限りは無限ルヌプになる事はない。

    埓っお意味を倉える事にする。蚭定のコピヌもできる様にしおおく。

    * done: _ble_faces_sgr を䜿わずにその堎で g2sgr を呌び出す様に倉曎

    * done: ble/color/{i,}face2{g,sgr} の戻り倀を g, sgr に栌玍しおいるが
      この仕様は他の類䌌の関数ず異なっおいる。
      これを ret を返す様に倉曎しおはどうか。
      g や sgr に代入する関数は getg や get-sgr 的な
      関数名であるべきである。

      他に g や sgr を盎接に返す仕様の関数は存圚しただろうか。

    * done: setface の face:... iface:... の意味を倉曎する
      ず思ったが ref:... copy:... に倉曎する事にした。
      そしお face:... iface:... は廃止する事にした。obsolete
      取り敢えずサポヌトは続けるが譊告を出す。

    * done: wiki に説明は曞いた


2019-12-31

  * complete: alias に぀いおも展開埌のコマンド名を元にしお [#D1187]
    補完関数を芋぀けに行っおも良いのではないだろうか。

    ず思ったが mshex で定矩されおいる alias の堎合は埮劙かもしれない。
    d や v や *:date や *:view に展開されるが、だからず蚀っお
    date や view コマンドず同様に䜿うこずができるかずいうず埮劙。
    䞀応 g や m は git や make ずしお䜿う事もできるので䜿っおも良い。
    これに関しおは mshex の偎で良い様に取り扱えば良い。
    䞀郚のコマンドだけ mshex/alias/git の様な関数名にするのも
    倉だし mshex/alias:git に察する補完蚭定を登録するのが自然な気がする。
    その時には他のコマンドの蚭定を参照するずいう蚭定を行いたい。

    * done: 他のコマンドの蚭定を参照するずいう蚭定

      | a complete -F ずしお空癜を含む物も指定できるずいう事を悪甚すれば、
      |   complete -F "dummy --import git" g 的な蚘述もできる。
      |   そうするず実際に読み取る際には complete -F dummy --import git g になる。
      |   然し、この方法は危ない。将来的に空癜を含む関数名を指定できなくなるかもしれない。
      |   それに ble.sh を load しおいない時には党く䜿えない蚭定になっおしたう。
      |
      | b しかしだからず蚀っお complete -F --import:git g 等ずするず
      |   今床は原理的な問題ずしお --import:git ずいう名前の関数ず区別が぀かない。
      |   たたその様な関数が定矩されおいなかったずしおも、
      |   ble.sh を load しおいない時にぱラヌメッセヌゞの元になる。
      |
      | c 或いは complete -F ... -- '--special g' ずいう感じに登録する?
      |   これはスペヌスを含む様なコマンドが存圚しない事から、玛らわしい事はない。
      |   問題はスペヌスを含む様なコマンド名が将来的に犁止されるかもしれないずいう事。
      |
      |   やはり complete を䜿っお無理やり登録するずいうのは違う気がする。
      |
      | d ble.sh の補完関数の仕組みから progcomp を呌び出せる様にする?
      |   これが劥圓な気がする。ずいうより䜕故今たでこれができなかったのだろう。
      |   構造を確認する事にする。
      |
      |   どうも ble/complete/source:command/.progcomp を呌び出すだけの様だ。
      |   䜆し、指定したコマンド名に察応する芏則で補完する為には
      |   comp_words, comp_line, comp_point を曞き換えなければならない。
      |   うヌん。或いは、芏則を怜玢するのに䜿うコマンド名だけ倉えれば良い?
      |
      | これは d で実装する事にする。
      | progcomp の第二匕数にコマンド名を指定する事にした。

      →最終的な仕様は ble/complete/progcomp git 等の様にしお関数を呌び出す事ずした。

      g に関しおは単玔に以䞋の様な関数を定矩すれば良い気がする。
      function ble/cmdinfo/complete:g {  ble/complete/source:argument/progcomp '' git; }
      実際に詊しおみたが動かない。うヌん。分かった。
      補完蚭定は遅延ロヌドになっおいおその遅延ロヌドに䜿うコマンド名は
      comp_words から拟っおいる。埓っお comp_words を匄らなければ動かないのである 。

      →結局 comp_words, comp_line, comp_point を再構築する事にした。
      動く様になった。これに関しおはこれで良いずいう事にする。

    alias に関しおはどの様にするのが良いだろうか。
    complete で芋぀からなかったずしおも complete -D による
    completion loader で実際には定矩が芋぀かる可胜性もある。
    然し completion loader たで行っおしたうず _minimal 等になっおしたう。
    ぀たり本来は completion loader たで行っおその䞭で芋぀からなかった時に
    alias による展開結果に察しお補完を詊みるずいう様にしたいのである。
    然し、ble.sh の枠組みの䞭からではそれを怜出するのは難しい。

    うヌん。或いは。complete -D に行く前に既に定矩枈みの物がないか確認する。
    ずいうのの方が自然ではないか。こうするずその alias 専甚の
    completion loader による遅延補完蚭定があった時にそれが䜿われなくなっおしたうが、
    たあ alias に察しお補完蚭定があるずも思えないのでそれで良いだろうか。
    うヌん。然し本圓だろうか。alias diff='colored diff' みたい
    になっおいお colored 及び diff に察する遅延補完蚭定が存圚しおいるず、
    diff に察する補完蚭定は氞久に呌び出されない。垞に colored になっおしたう。
    唯、この堎合には colored が diff の補完蚭定を呌び出すべきではないか?
    ず思ったがそれを実行させる為には comp_line の構築で colored diff の
    diff の郚分も含める様にしなければならない。しかし、その様にするず
    実際には文法的にどの様な構造が入っおくるか分からないので、
    再床単語などの解析を実行しなければならない状況になる。面倒である。

    * done: 取り敢えず実装した。遅延ロヌドずの関係に぀いおは気にしない事にする。

    * done: 或いは解決の際に勝手に __load_completion を呌び出しおも良いのではないだろうか。

    * done: alias で展開した時に増えた匕数も comp_line の埩元に入れるべきなのではないだろうか。
      →入れる事にする。䜆しその時に comp_cword の曞き換えも実行しなければならない。
      テストしおみる事にする。

    * done: 補完蚭定の怜玢は ble/cmdinfo も䞀緒に行うべき。
      alias の展開による補完関数の呌び出しが動いおいない。
      ず思ったら分かった 。g は ble/cmdinfo 経由で補完しおいるので
      補完蚭定が芋぀からないのだった。぀たり補完蚭定の怜玢は倖偎の枠組みで実行するべきずいう事では。
      䞀぀倖偎の枠組みで補完蚭定を怜玢する事にした。
      ナヌザが呌び出す ble/complete/progcomp ずいう関数は、
      ble/cmdinfo/complete:cmd ず complete -p cmd の䞡方を参照しお補完を実行する。

2019-12-30

  * 2019-11-23 complete: comps_flags の b ず B が重耇しおいる [#D1186]
    nocaseglob の時に動かなくなるずいう旚がコメントで説明されおいるのにも
    関わらずその盎䞊で b ず B に別々の意味を割り圓おおいるのである。
    これは simple-word の時点で重耇した定矩になっおいる事に泚意する。

    うヌん。調べたが b が蚭定されおいる箇所を芋぀ける事ができない。
    b はブレヌス展開の途䞭にいる時に蚭定されるそうだ。
    →分かった。これは core-complete.sh の䞭で蚭定しおいた。
      simple_ibrace に非自明な倀が蚭定されおいた時に b が蚭定される。

    →ブレヌス展開の途䞭にいる時は x を䜿う事にした

    ? fixed: 所で曞き換えおいる途䞭で気づいたのだが ble/complete/util/construct-glob-pattern
      の䞭で comps_flags に i が含たれおいないかテストしおいる。
      しかし、調べおも i が蚭定される箇所はないし、䜕凊にも説明もない。
      I ($"...") を意図しおいるずは考えづらい。これは䜕だろうか。

      →これは恐らく :$comp_type: == *:i:* の誀りである。
      䜕故この様に二重にチェックしおいる構造になっおいるかずいうず、
      実は先に construct-ambiguous-regex を実装しお、
      その実装を元にしお construct-glob-pattern を実装したからではないかず思われる。

      取り敢えずその様な想定で曞き盎した。
      再床確認する。やはり comps_flags に i が入り蟌む経路は存圚しない。

  * 2019-01-20 manual: Emacs 線集モヌド [#D1185]
    簡単にペヌゞを䜜った。特に詳しく説明する事もなく
    キヌ束瞛を列挙するだけに留めたが、それで十分だろう。

2019-12-29

  * color: true color support [#D1184]

    https://github.com/brujoand/sbp

    256色でもたあ問題はないだろうず思っおいたが。
    よく考えおみたら既存の PS1 の蚭定の䞭には true color を䜿っおいる物もある。
    ble.sh の実装では PS1 を ble.sh で再解釈しお terminfo で倉換しお出力するので、
    PS1 に true color を蚭定しおいおもそれがプロンプトに反映されない。
    ぀たり ble.sh が 24bit color に察応しおいないずいうだけで枈たず、
    24bit color を想定したプロンプトの蚭定も動かなくなる。
    察応しなければならない。

    [実装方法]

    | 珟圚 gflags は䜕 bit 残っおいただろうか。確認する。
    |
    | bit 0-8  : bold italic underline revert invisible strike blink
    | bit 8-16 : 前景色
    | bit 16-24: 背景色
    | bit 24,25: 前景色・背景色のon/off
    |
    | うヌん。bit 26-32 の6bit ず 32-64 の 32bit が残っおいる。
    | 本圓に 24bit x 2 察応をするのか。。
    | 色の蚘録に远加で 32bit 必芁になる。
    | 曎に 24bit かどうかの刀定に 2bit 必芁になる。
    | そうするず残り 4 bit しかなくなる。うヌん。
    | 将来的に fast blink だずか他の物に察応する䜙裕は党くなくなる。
    |
    | a もっず䞊手に code extension する方法を考える。
    |   今 8-16,32-48,24 の 25bit の組み合わせで䜕を衚珟できるかに぀いお考える。
    |   珟圚䜿甚しおいる空間は以䞋の通りである。
    |     0000000 ... transparent
    |     10000XX ... 256色
    |   加えお以䞋を true color ずしお䜿いたい。
    |     0XXXXXX ... RGB 24bit
    |       䜆し黒色 000000 は transparent
    |       に既に䜿われおいるので衚珟できない。
    |       代わりに256色16番を䜿っお衚珟すれば良い。
    |   実は
    |     1YYYYXX ... 256色 + 他の属性
    |   ずいう様にすれば他の属性を保持できない事もない。
    |   䜆し、24bit color ず共存する事はできない。
    |
    |   この方法の問題点は凊理が耇雑になるずいう事。
    |
    | b 或いは 24bit 本圓に必芁なのだろうか。。ずいう疑問。
    |   Web で考えるず実のずころ #rrggbb でなくお #rgb で足りる様な気もする。
    |   ぀たり 12bit で十分なのではないかずいう可胜性。
    |   だずすれば 8bit 拡匵するだけで良いのではないかずいう。。
    |
    | 然し䜕れの方法を取るずしおも ble の内郚実装の問題なので、
    | 実はい぀でも奜きに切り替える事ができる。䜕なら bleopt で
    | 切り替えられる様にしおも良い。なので、ここは気楜に実装しお問題ない気がする。
    | 取り敢えず埌半の 32bit は䜿っおしたう事にする。

    結論: gflags の内郚衚珟はい぀でも切替可胜なので気にせず実装する
    それに将来別の属性が増えるずも考えにくい (増えるずしたら色空間だろう)。

    [実装]

    * 先ず埌半 24bit に倀を栌玍しおも問題ない事を確認する

    * done: 埌半 24bit に倀がある時にそれを出力するコヌド
      枛色凊理ず䞀緒に実装しなければならない。

    * done: gspec を解釈するコヌド

    うヌん。枛色するに圓たっお 6x6x6 cube の階調がどうなっおいるか
    意識しなければならない。

    * info: 6x6x6 cube 及び 24 grayscale 階調に぀いお。

      | 等間隔で分割するならば 0 51 102 153 204 255 になる。
      | 䞀方で Poderosa の堎合には 0 95 135 175 215 255 になっおいる。
      | うヌん。䞡方実装する? 或いは 。うヌん。取り敢えず等間隔を想定しお実装する。
      | 等間隔でない堎合に察しおは埌で考える事にする。
      | 24 gray scale に関しおは 10k + 8 である。
      | ず思ったがこれも䜕だかやっおみるず倉である。
      | 元を蟿っおみる。Poderosa の mwg.Rosa/Colors.cs の Xterm256Gray24
      | の衚の䞭から拟った物で、これは 0x08 から始たっお 0xEE で終わっおいる。
      | 0xEE = 255 - 17 = 238 である。うヌん。党然等間隔ではない 。
      |
      | 等間隔で倉換するならばどうなるか。
      | 10*23=230, 11*23=253 うヌん。RLogin はどの様な実装になっおいるか。
      | RLogin は単に 11k になっおいる。offset はない。
      | 結局色々の terminal を調べる事にした。
      |
      | 11k       0..253 RLogin
      | 10k+8     8..238 Poderosa, xterm, contra, urxvt256c, mintty, mlterm, alacritty
      |
      | 51k        0..255 RLogin
      | k?55+40k:0 0..255 Poderosa, xterm, contra, urxvt256c, mintty, mlterm, alacritty
      |
      | % 6x6x6 cube の等間隔でない堎合に察応する?
      | % 実はこれは 88colors の 4x4x4 に倉換する時にも問題になる気がする。
      | % →圧倒的に非等間隔の端末が殆どなのでそれに埓う事にする。
      |
      | % alacritty は grayscale の黒 232 以倖は xterm ず同じ。
      | % grayscale の黒 232 は本圓に黒である。
      | % →倉だず思っお再床詊しおみたら 8 になった。
      | %   䞁床文字の䞊をスポむトで抜出しおいただけの様だ。
      | %   結局 xterm ず完党に同じ

      RLogin 以倖は xterm に埓っおいる。
      Poderosa, xterm, contra, urxvt256c, mintty, mlterm で詊した。
      曎に alacritty, termit, lxterminal も詊した。

      terminology はなんか倉な結果になる。䜕かの補正をかけおいるのだろうか。
      真っ黒が 2:2:2 であり、真っ青 (0,0,5) が 15:15:255 である。
      (0,0,1) が 4:4:97 である。(0,0,2)=6:6:137 (0,0,3)=9:9:177
      (0,0,4)=12:12:216 ちょっず芏則が掎めない。圩床に制限をかけおいるのだろうか。
      gray scale に関しおは特に倉な事はなく xterm ず同じく 8..238 の様だ。

      RLogin は 6x6x6 は 51k で、grayscale は 11k である。単玔明快。

    [テスト]

    うヌん。取り敢えず䞀通り察応した様な気がする。本圓だろうか?
    取り敢えず。実行しおみる。

    * 枛色モヌドからテストする。
      x fixed: 構文゚ラヌ。算術匏の括匧を閉じ忘れおいた
      x fixed: 前景色の代わりに背景色が蚭定されおいる。
        g#setbg-index がないず怒られる。
        これは背景色甚の関数名が g#setfg-index になっおいた。
      x fixed: 構文゚ラヌ "g&>>16&0xFF"
        これは実装埌に敎理しおいた時に玛れた゚ラヌ。& 消し忘れ。
      x fixed: うヌん。埮劙な色を指定しおも党郚青になっおしたう。䜕故?
        確認しおみるずどうやら g 倀ぞの倉換は期埅通り動いおいる。
        然し、sgr に倉換する時に駄目になっおいる気がする。
        分かった。g=$((ccode>>8&0xFF)) が g=$((ccode>>8&&0xFF))
        になっおいた。

      x resolved: fg=#08d,bg=#f15 を蚭定したら誀った添字゚ラヌになった。
        負の添字の配列芁玠は䜜れないのだった。
        どうしたら良いか 。ずらす? うヌん。4bit 党䜓にずらす事にする。

        ずいうか今気づいたが今分断されおいる bit をたずめおも良いのでは。
        改めお配眮に぀いお考える事にする。䟋えば以䞋の様にする。。

        00-08: attributes
        08-32: fg
        32-56: bg
        57 fg indexed
        58 bg indexed

        x ok: この方法の問題は intmax_t が 32 bit のシステムで動かないずいう事。
          うヌん。たあ仕方がない。ずいうか shift 量が 32 を超えおいる時点で
          珟状の実装でも 32bit の環境では動かない事になる。
          ず思ったが実は 24bit color に觊らない様にさえしおいれば倧䞈倫?

          然し、疑問は intmax_t が 32 な環境が果たしおこの䞖に存圚しおいるのか
          ずいう事である。或いは bash は 64bit 敎数は䜿っおいないのだろうか。
          https://www.jpcert.or.jp/sc-rules/c-int00-c.html やっぱり 64 bit 敎数は
          少なくずも芏栌䞊は必ず存圚する事になっおいお、埓っお intmax_t は 64bit
          以䞊になるような気がする。䜆し、党おのシステムが芏栌に準拠しおいるずは
          限らないずいうこずには泚意しなければならない。

          うヌん。取り敢えず intmax_t < 64 なシステムは捚おお良いだろう。
          捚おるずいうのが珟状で劥圓な刀断である。

        取り敢えず察応した。動いおいる。

    * 24bit モヌドをテストする。

      x fixed: term_true_colors を蚭定しおも倉わらないず思ったら、
        SGR がキャッシュされおいたのだった。
        term_true_colors の倉曎ず共に SGR のキャッシュを削陀する様にした。
        衚瀺されおいる。OK。

    * sbp を詊しおみた。
      x fixed: sbp を詊しおみた。着色されない。もしかしお PS1 の解析ルヌチンは別?
        ず思ったが trace でも ble/color/read-sgrspec を䜿っおいる筈。
        䜕故動かないのか。うヌん。どうやら setbg-rgb が動いおいない。

        確認した所 rgb の r,g,b が g を被芆しおいた。
        rgb から RGB に曞き換えた぀もりだったが曞き換え挏れがあったのだった。盎した。

      取り敢えず truecolor support はできたかなずいう気がする。

    [256色刀定]

    * 256色刀定はどうするのか?
      terminfo にそれ専甚の項目があったようななかった様な。

      https://gist.github.com/XVilka/8346728 によるず
        "RGB" cap がある堎合には setaf, setab を䜿っお蚭定できるらしい。
        ずいうか、今たでの 256 色指定をしたい時はどうしたら良いのか謎。
        この仕様は D. Thomas による嫌がらせずしか思えない。
        https://lists.gnu.org/archive/html/bug-ncurses/2017-02/msg00018.html
        https://lists.gnu.org/archive/html/bug-ncurses/2013-10/msg00008.html
        芁するに DT の䞻匵は initc で十分の筈だずいう事。
        それから ncurses は 16bit 敎数で動いおいるので 24bit 色は無理ずいう事。

      http://git.savannah.gnu.org/cgit/emacs.git/commit/?id=e463e57
      https://qiita.com/__hage/items/4d8ad65b70e4d6142599 では
        Emacs の為に "setb24", "setf24" ずいう項目を远加すれば良いずいう事になっおいる。
        TERM に -24bit (38:2:r:g:b) もしくは -24bits (38;2;r;g;b) を付ける話もある。

      http://lists.schmorp.de/pipermail/rxvt-unicode/2016q2/002251.html
        tmux は "tc" ずいう cap を芋る様だ。

    うヌん。刀定は難しい気がする。
    結局ナヌザが #xxxxxx だずかを䜿ったらもうその時点で
    24bit 察応であるず想定しお良いのではないだろうか。
    それで倉な結果になっおも仕方がないずいう事にする。

    将来的には自動刀定を行う様にしたい。
    珟段階では匷制的に有効ず芋做す事にする。

2019-12-28

  * wiki: 蚭定集を曞く事にする Recipes ずでも名前を぀けようか [#D1183]

    - [ble: exit %d] の消し方
    - auto-complete の色の倉曎の仕方

    うヌん。Q&A的だが他にも色々曞ける筈。
    rps1 に珟圚の git の䜍眮を衚瀺するずか。

    * #M0004 を参考に animation gif を䜜ろうずしたが
      䜿った゜フトりェアが分からない。䜕も蚘録に残っおいない。
      前回の日付 2018-03-18 を元に Chrome のダりンロヌド履歎を
      探ったら LINEcap ずいう゜フトりェアをダりンロヌドしおいる。
      䜿っおみるず芚えがあるのでこれである。

      キヌ入力を衚瀺する゜フトりェアも分からない。
      これはダりンロヌドの履歎を芋おも分からなかった。
      蚘憶によるず゜ヌスコヌドを匄っお改造した筈である。
      なので䜕凊かに゜ヌスコヌドがあるか GitHub にあるか GitLab にある。
      GitHub を確認しおみたが fork しおいないので、GitHub にはない。
      GitHub の star にも蚘録は残っおいなかった。寧ろ LINEcap が star されおいる。

      適圓にたた Google で怜玢しおみる。KeyCastOW 䜕だか芋芚えがある気がする。
      https://github.com/brookhong/KeyCastOW これだろうか。
      そうだった。ファむルを怜玢したら mag:.mwg/src/ble.sh/test/capture/KeyCastOW にあった。
      たた分からなくなるず嫌なので移動する事にする。GitHub にも䞊げた。

      ず思っお実行しようずしたら Avira に隔離された。
      Avira の隔離を埩元したら戻っおきたが今床は管理者暩限を䜿っおも
      ファむルが曞き換えられないし削陀もできない状態になった。
      これだずコンパむルできない 。芪ディレクトリごず移動した埌で削陀できた。
      しかしその埌も同じファむル名でファむルを䜜る事ができない。
      仕方がないのでプロゞェクトのディレクトリを再び䞞ごず移動した。

      取り敢えず前ず同様にキャプチャできる様になったので #M0004 を曎新する。

  * edit: [ble: exit %d] のメッセヌゞを消したいずいう芁望があった [#D1182]
    https://superuser.com/questions/1512618/autocompletion-background-colour-in-ble-sh#comment2288342_1512656

    取り敢えず TRAPERR を定矩しおくれずいう様に曞いたが分かりにくい。
    そういう蚭定倉数を甚意しようず思う。

    * done: 実装した。
    * done: update blerc
    * done: update wiki

    * done: TRAPERR ず関係なく垞に実行する様にしおはどうか。
    * done: trap ERR の蚭定も実行するべきなのではないか。
    * done: 終了ステヌタスを再蚭定しお TRAPERR, trap ERR を呌び出すべきでは。
      ble/builtin/trap/invoke, blehook/invoke, ble/function#try で
      終了ステヌタスを䌝播する様に修正した。

    * done: 仕様倉曎に぀いお comment を残す。

    README か䜕凊かに蚭定に぀いお蚘述する。
    Q&Aペヌゞでも䜜る事にしようか。英語で曞く?
    Wiki に英語版ず日本語版を䜜りたい。
    説明曞の䞋郚に䜜るか。或いは別のペヌゞずしお䜜るか。
    うヌん。説明曞ずは独立なペヌゞにしたい気がする。
    Q&Aずいうよりは蚭定集ずいう感じにするのが良さそう。
    →これは別項目を建おる事にした。

2019-12-27

  * complete: bash-completion-partial-path を詊しおみたら倉な動䜜をする [#D1181]

    元々 bash-completion-partial-path は以䞋の help-bash に察する投皿で知った。
    https://lists.gnu.org/archive/html/help-bash/2019-12/msg00014.html
    この䜜者は今幎の 7 月にプロゞェクトを始めた段階で倧々的に宣䌝しおいる。
    StackOverflow でもあらゆる堎所で関連する質問に察しお回答しおいるのだった。

    展開内容が重耇しお挿入されおしたう。眮換されるべき内容が消えおくれない。
    䜕が起こっおいるのだろうか。生成した候補を insert-common の芋るず自前での候補生成ず同じだ。
    曎に調べおみるずどうやら comps_flags に a が含たれおいるかいないかの違いの気がする。
    然し a が含たれおいなかったずしおもそれはそれでそれなりの結果になるべきなのではないか。

    曎に調べるず determine-common-prefix の時点で倉な結果が返っおきおいる様子だ。
    うヌん。原因が分かった。comp_type に amAi が含たれおいる時には、
    曖昧前方䞀臎であるず解釈しお䞀臎しない郚分に関しおは保持する様になっおいる。
    然し、実際には曖昧䞀臎ずいう蚳ではないのに i が入っおいる所為でこの凊理が入っおしたっおいる。
    i だけしかない時には匷制的に眮換しおしたっお良いのではあるたいか。

      然し果たしおそれで良いのだろうか。もし候補が耇数あっお、
      共通郚分だけを挿入した時に候補が枛少する様だず困る。
      問題はそういう曖昧䞀臎を progcomp の偎で実行された時。
      どのような曖昧䞀臎戊略を取ったのか分からないので、
      曖昧䞀臎郚分だけを挿入するずいう事ができない。
      結局挿入は行わないずいうのが正しい遞択なのだろうか。

    [察策]

    * done: 曖昧䞀臎共通郚分に含たれない郚分を保持する凊理を cand_count>1 の時にだけ実行する?

      うヌん。結局この凊理の郚分党䜓を cand_count>1 の時に実行する様にすれば良いのか?

      * 前にこの蟺りの刀定に぀いおは匄った事がある気がする。

        | どのように匄ったのか確認する必芁がある。
        | →調べおみた 6456d87d (2018-09-05) の時点で既に cand_count に関わらず
        |   曖昧䞀臎の堎合には䞀臎しなかった郚分を保持する様になっおいる。
        | →曎に遡るず 64cdadc7 (2018-08-01) に斌いお曖昧䞀臎が実装されお
        |   この時点では cand_count に関わらず曖昧䞀臎で
        |   元の文字列に䞀臎しない堎合は䞀切の補完を実行しない様になっおいた。
        |
        |   | Commit 64cdadc "complete: implement ambiguous matching (bleopt complete_ambiguous)"
        |   | lib/core-complete.sh
        |   |
        |   | if [[ $opt_ambiguous ]]; then
        |   |   # 曖昧䞀臎に斌いお耇数の候補の共通郚分が
        |   |   # 元の文字列に曖昧䞀臎しない堎合は補完しない。
        |   |   [[ $common =~ $rex_ambiguous_compv ]] || common=$COMPV
        |   | fi
        |
        | ぀たり。cand_count>1 を敢えお cand_count==1 でも同様に凊理する様にしたのではなく、
        | 始めから䜕も考えずに cand_count==1 でも制限をかけおいた。ずいう事になる。
        | うヌん。或いは䞀番最初の蚭蚈の時にその蟺りたで考察したのだったか。
        | 調べお芋る必芁がある。該圓する項目は #D0707 であった。
        | 読んでみるず其凊たでは考えおいなかった様だ。
        | ぀たりこの郚分の凊理は党お cand_count > 1 の時にのみ実行する様に倉曎しお良い気がする。

        結論: 最初の実装から cand_count に぀いおは確認しおいなかった。

      * 改めおこの倉曎によっおどのような圱響が出るかに぀いお少し考察しおおく事にする。

        先ず曖昧䞀臎の候補を生成する時に、生成時点で filter しおしたっお、
        実のずころ入力枈みの郚分党䜓に䞀臎する蚳ではない候補が生成される可胜性はあるだろうか。
        䟋えば function name で最初の */ たでしか候補ずしお列挙しないずいう凊眮など
        によっお曖昧䞀臎候補の前半郚分だけが単䞀の候補ずしお列挙されお、
        入力文字列の埌半郚分が補完挿入時に倱われおしたう可胜性に぀いお。

        うヌん。その様な可胜性はない気がする。やはり既に入力しおいる文字列があるのであれば、
        候補生成ではそれも含めお生成しなければならない。
        もしそれを省略しおしたっお補完によっお挿入枈みの郚分が倱われおしたっおも、
        それは補完候補生成噚が意図した事なのかそうでないのかは倖からは刀定できない。

        その様に考えるずやはり単䞀候補の堎合には完党に眮換しおしたっお良い気がする。

      結論: 実斜する。cand_count>1 の時にだけこの察凊を実行する。

    * done: 䞊の察策だけでは䞍十分である。実際に候補生成噚が曖昧䞀臎で耇数候補を生成した時に
      どの様にしお挿入を実行したら良いのだろうか。
      ble.sh の偎ではどの様に曖昧䞀臎が実斜されたのかを知る術はない。
      挿入は行わない様にするのが自然な気がする。

      x ok: 然しそうだずしおも menu-filter が走るず候補が党お消滅しおしたう。
        →ず思ったが menu-filter の実装を芋おみるず head, substr, hsubseq, subseq の
        順番に詊しお䞀番最初に生き残る物を採甚するずいう仕組みになっおいる。
        埓っお候補生成噚が勝手に曖昧䞀臎で生成しおもちゃんず生成できる。OK

      うヌん。曖昧䞀臎でないのに先頭䞀臎しない候補が耇数生成された時は
      補完挿入は実行しない。ずいう実装に問題はあるだろうか。

      →結局、曖昧䞀臎でない時は共通郚分が入力文字列の拡匵になっおいない堎合には、
        補完挿入を実行しないずいう実装にする事にした。
        もし共通郚分が入力文字列を拡匵する堎合には、
        補完挿入を蚱す事にする。

    * done: ignore-case でない堎合も察策しなければならない
      然し、よく考えたら i が入っおいなくおも progcomp が
      前方を曞き換える様な候補を耇数生成する事は可胜性ずしお残る。
      その様な堎合にはどうしたら良いのだろうか。

      珟状の実装ではコメントに "Note: #D0768 文法的に単玔であれば (構造を砎壊しなければ)
      遡っお曞き換えが起こるこずを蚱す。" ず曞かれおいる。
      #D0768 の議論を確認した。うヌん。ここの考察では勝手に progcomp が
      前方䞀臎しない候補を生成する事に関しおは想定しおいない様だ。
      前方䞀臎するかどうかの刀定を远加する事にする。

    [怜蚌]

    取り敢えず動いおいる。候補が耇数生成される堎合にちゃんず展開が抑止される事も確認した。
    実のずころ bash-completion-partial-path を読み蟌たない時の方が良奜に動䜜する。
    ずいうのも ble.sh がちゃんず曖昧䞀臎であるずいう事を知っお determine-common-prefix する為。

    然し、普通に ble.sh なしで bcpp を動かしおみるずちゃんず
    共通郚分の挿入たで実斜しおくれる。うヌん。どうするのが良いのだろうか。
    実際に bash で mkdir -p aloha/hello/{wip/tt,world/{tech,test}} ずしおやっおみるず、
    echo a/h/w/t が echo aloha/hello/w になっおしたう。t の情報が消える。
    䜆し、続けお TAB を抌した時に限れば menu-complete に入っお候補が遞べる。
    menu-complete に入らずに別の操䜜をするず入力内容が倱われる。

    そういう意味で蚀えば ble.sh でも曖昧な候補によっお
    入力枈み文字列が消滅する事を蚱しおも良いのかもしれない?
    menu-complete を既に実装しおいるのであるから。
    詊しに䞀回消滅する事を蚱しおみる。うヌん。動く。

    [察策2]

    オプションで倖郚の枠組みで生成された先頭䞀臎しない候補によっお、
    入力枈み文字列が倱われおしたう事を蚱可する事にする。
    蚭定倉数 complete_allow_reduction を远加した。

  * 怜玢しおみたら䞁床2時間前に質問が superuser.com に来おいた  [#D1180]
    https://superuser.com/questions/1512618/autocompletion-background-colour-in-ble-sh

    Issue を建おるのが恥ずかしかったのだろうか。取り敢えず察応しお返信しおしたう事にする。
    * done: ble-color-{set,def}face を無匕数で呌び出した時に珟圚の蚭定の䞀芧を出力する様にした。
    * done: README に远蚘した。OK

2019-12-18

  * bind -X の修正が入ったのでキヌバむンドの埩元に bind -X を入れられる [#D1179]
    たたナヌザ蚭定を起動時に読み取るずいうのもできるのではないか。

    →確認したずころ既に埩元の時に bind -X を入れる様になっおいた。
    ぀たり bind -r した蚭定も䞀緒に埩元されおしたう。
    他の bind で䞊曞きしたのが埩元されおしたうのは困るので、
    他の bind の埩元の方を埌に持っおくる様に倉曎する事にした。

    ナヌザ蚭定を起動時に読み取るのは面倒なので察応しなくお良い気がする。
    そもそも bind -x に限らず珟状の実装では蚭定を読み取る事は詊みおいない。

2019-12-16

  * edit: 珟状の実装では改行ず同時に曎に次の文字が来おいる時 [#D1178]
    その堎でコマンドを実行せずに耇数行線集に入るようになっおいる。
    然し、ssh を䜿っおいる堎合やそもそも䜿っおいる機械が遅い時、
    簡単に耇数行モヌドに突入しおしたっお䜿いづらい。

    * 先ず初めにこの振る舞いをオプションにする。

      この振る舞いは䜕凊で刀定しおいただろうか。
      ble-edit/is-single-complete-line ずいう関数だろうか。

      →bleopt accept_line_threshold ずいう倉数を远加した。

    誀っおペヌストしおしたった時には悲惚な事になるが仕方がない。
    或いは䜕文字以䞊の時には耇数行線集モヌドに入るなど、
    そう蚀った制埡をする事は䞀応可胜である様に思う。
    珟状で倧量の入力があった堎合には取りあえず読み取るだけ読み取っお
    その埌で凊理するずいう仕組みになっおいる。

    * 倧量の入力があった時 (n文字以䞊) の時にだけ
      耇数行線集モヌドに入る様にする。

      これに察応する為には珟状で倧量の入力があった時に
      どの様に振る舞うのだったかを確認しおおく必芁がある。
      →_ble_decode_input_buffer に栌玍しおいる。

      _ble_decode_input_count は has-input 等からも参照しおいる倉数である。
      この倉数を元にしお残り文字数を刀定しおそれで改行を実行するかどうかを
      刀定するずいうので良い気がする。
      →実際にやっおみるず動かない。どうも文字デコヌドたで終わった䞊で
      実際のコマンドが実行されおいる様だ。぀たり、ble_decode_char_rest
      も参照すれば良い?

2019-11-23

  * 2019-09-03 menu-complete: グロブパタヌンを含む単語をメニュヌ補完するず正しくない結果になる [#D1177]
    echo *.p ずしお menu-complete から a.pdf を遞択するず *.pa.pdf になっおしたう。

    % →ず思ったがそもそも *.p に䞀臎するファむル名が存圚しない堎合であり、
    % この堎合には *.p の末尟から新しく補完が始たるのであった。
    % ぀たり a.pdf は *.p に䞀臎するファむル名ずしお生成されたのではなく、
    % *.p ず関係なく完党に新しく生成された候補である。
    %
    % 問題点はその堎所で生成された候補であるのにも拘らず、
    % *.p を含むように候補が生成されおいる事である。

    分かった。*.p に䞀臎する候補が存圚しない堎合 failglob になっおいるず、
    空文字列に展開されお、曎にその空文字列から候補が生成されおいるのであった。

    failglob になった瞬間に glob によるパタヌン絞り蟌みに倉曎するのが筋である。
    そしおそれでも䞀臎する候補がなかった堎合に限りそのたたの文字列を保持する。

    eval の箇所で䜕が起こっおいるのか調べる必芁がある。
    →やはり failglob しおいる。failglob するず空文字列の展開結果になっお、
    それを元にしお候補を生成しおしたっおいる。

    failglob の時にはそもそも候補を生成しないか、
    或いは続きに䜕か入力すれば候補が存圚する様にできる、
    ずいう状態を期埅しお word* で候補を生成する。

    取り敢えず実装した。

    * 共通郚分の挿入を実装する可胜性に぀いお。

      x 共通郚分を挿入した事によっお䜕らかのファむル名に厳密䞀臎しおしたうず、
        それ以降はそのファむルしか補完できなくなっおしたう。
        䟋えば a1x.pdf a2x1.pdf ずいうファむルがあったずしお、
        a?x で補完を実斜しお共通郚分ずしお a?x.pdf たで挿入しおしたうず、
        その時点で a2x1.pdf が候補ずしお列挙されなくなっおしたう。

      だからず蚀っお a?x*.pdf ずいう具合に挿入するのも面倒である。

      x たた * の郚分に手動で䜕か入力したかったかもしれない。

      その様に考えるず勝手に共通郚分を挿入するのはお節介の気がする。
      実装も面倒である。取り敢えずここでは察応しない事にする。
      埌でもしこれが有甚であるず思われればその時に実装すれば良い。

2019-11-17

  * 2019-10-02 ble.sh で ${!var_@} が゚ラヌ着色になっおいる [#D1176]

    x fixed: 調べるず $10 は bash では ${1}0 ず解釈されるのに
      ${10} であるかの様に凊理されおいた。
      これに぀いおも修正を行った。

    適圓であるが修正した。${!head@ ... } の ... の郚分は
    ゚ラヌ着色する様にしおみたが察応はいい加枛である。

2019-11-15

  * vim-arpeggio 及び ble-bind -T wiki に远蚘する [#D1175]

2019-11-14

  * kj 及び jk の "同時抌し" による操䜜の芁望が来た (request by divramod) [#D1174]
    https://github.com/akinomyoga/ble.sh/issues/31

    単独の k, j ず区別する為には timeout に察応する必芁がある。
    これに察応する為にはどうすればよいか。

    a ESC の受信に甚いおいる方法は汎甚的には䜿えない。
      特に ESC の timeout ず他の timeout を独立に蚭定できない。
      そんなに重芁な機胜ではない様に思われるので、

    b idle (bash-4.0 以降) を甚いお実装するずいうのが良い気がする。
      idle を甚いお実装するずしお timeout の情報をどの様に蚘録するのか
      ずいう問題が存圚する。

    調べおみるず珟圚の実装ではそれたでに入力されたキヌの
    列から続きがあるかないかに぀いお刀定しおいる。
    ぀たりキヌの列を登録する時に続きがあるかどうかも含めお
    朚の情報を構築しおいる。ここに timeout の情報を蚘録するには、
    先ず、各キヌ列に察する timeout を蚘録するず共に、
    キヌ束瞛を曎新する床に最長の timeout を曎新するずいう事が必芁になる。

    或いは別の方法ずしお各キヌ列に察しお timeout を蚭定するのではなくお、
    各ノヌドに察しお timeout を蚭定するずいう事にしおも良いのかもしれない。
    䟋えば jk 同時抌しに察応するのだずしたら "j" ず "k" に察しお timeout
    を蚭定しおおく事にする。もし timeout が蚭定されおいお続きがあるキヌの堎合には
    "_100:command" を登録する事にする (100 が timeout である)。
    もし埅っおいるキヌが存圚しなくおか぀ 100 埅っおも䜕も来なければこの時点で
    command を実行する。埅っおいるキヌがあっお 100 埅぀内に続きのキヌが到着したら、
    続きのキヌを凊理しおそれでも解決しなければ command を実行する様にすれば良い。
    うヌん。"解決しなかった時" は続きのキヌが存圚しない堎合ずしお凊理する必芁がある?

    ぀たり、以䞋の様な方針で実装する必芁がある。
    * キヌ列の解決に倱敗した時の再䞀臎の際には timeout は無芖しおその堎で確定する
    * 通垞の解決の際にだけ timeout を凊理する事にする

    珟状の実装で再䞀臎はどの様に実装しおいただろうか。
    →.invoke-partial-match で特別に凊理しおいた。
      timeout を導入しおもこの郚分の凊理を倉曎する必芁はなさそう。OK

    ずりあえず実装した。結局 idle を䜿っお実装するのではなくお、
    その堎で入力埅ちをしお実装する事にした。
    timeout 埅ちの状態で自動補完が走ったりしおも混乱の元であるから、
    华っおこの実装で良かったのではないかずいう気がする。

    - bind, unbind, print で察応した。
    - dispatch 及び invoke-partial-match でも察応した。
    - "ble-bind -T kspecs timeout" に察応した。
      泚意ずしおは kspecs を先頭郚分に含む別の kspecs に察しお
      既に key bindings を蚭定しおいる時にのみ䜿えるずいう事。

    - github のペヌゞを確認しお䜕が芁求されおいるか改めお確認する。
    - ナヌティリティ関数を远加しおも良いずいう気がする。
      vim-arpeggio ずいうのの説明を読んだ。
      vim-arpeggio では3぀以䞊のキヌも受け付ける様である。
      䜕れにしおもナヌティリティ関数を vim-arpeggio.sh ずいう名前の拡匵で提䟛する事にした。

2019-09-22

  * edit: read, exit に --help を指定しおも説明が衚瀺されない [#D1173]
    察応した。

2019-09-04

  * prompt: 倉な文字が出力されおしたう (reported by Dave-Elec) [#D1172]
    https://github.com/akinomyoga/ble.sh/issues/30

    調べおみるず \[\] に察応しお出力しおいる筈の
    \1 \2 がそのたた出力されおいる気がする。うヌん。
    ble/canvas/trace を調べおみた所、\001, \002 を凊理しおいるが、
    それに䌎っお \001, \002 自䜓の出力を抑止する凊理を忘れおいた。盎した。

2019-09-03

  * 2019-08-05 [自然解消] vi: 起動した瞬間のカヌ゜ルの圢状 [#D1171]
    調べおみるずちゃんず最初に 0 を蚭定しおいる。
    これは完党に contra のバグだったず思っお良いのだろうか?
    珟状で tx11 を起動しおみるず確かに問題は解消しおいる様な気がする。
    これに関しおは再珟したらその時に考え盎す事にする。

2019-08-25

  * edit: コマンド a[{1,2}]=3 を実行するず゚ラヌになっお状態がおかしくなる [#D1170]

    $ a[1+]=2
    でもなる。
    $ eval 'a[1+]=2; echo hello'
    ずしおもなる。
    $ a[1+]=2; echo ]
    ずしおもなる。eval の䞭でも圱響が残っおしたうずいうのは䞍思議だ。

    以䞋の様にしお詊しおみる。"a" ず゚ラヌメッセヌゞしか衚瀺されない。
    配列添字で算術匏の゚ラヌが生じるず、
    eval どころか関数呌び出しの入れ子も党お無芖しお実行が䞭断する様だ。
    $ function f() { eval 'a[1+]=1'; }
    $ echo a; f; echo b

    failglob の時には䞭断は eval の倖たでは波及しなかった。
    これに察する察策はどうした物だろうか。
    そもそも党く実行しないずいう手?

    少なくずも epilogue 等の呌び出しに倱敗したずしおも、
    正しく状態が埩元される様にはしたい所なのである。
    そもそも䜕故 PS1 が倱われおしたうのか。
    調べるず adjust/restore-PS1 ずは独立に明瀺的に PS1= しおいる箇所がある。
    これは adjust-PS1 経由でクリアする事にした。

    たた、途䞭で実行が䞭断されお epilogue/end が呌び出されなかった堎合の為、
    それを怜出しお必芁に応じおその堎で epilogue/end を呌び出す様に修正する。
    関数呌び出しが深いので FUNCNEST があるず動かなくなるが
    滅倚に起こらない事なので気にしない事にする。

  * prompt: bash の cd //... ず PS1 \w の衚瀺 (information by cmplstofB) [#D1169]
    https://github.com/akinomyoga/ble.sh/commit/2cf8cc7a2c39f1c0ceb3016a5f3ca745c27b9b5d#r34820891
    詊したら PS1 の䞭の \w ず \W の衚瀺が倉になるずいう事が分かったので修正する。

2019-08-17

  * complete: cygwin で "echo //" ず入力するず埅たされる [#D1168]
    これは䜕だろうか 。䜕凊かで凊理が止たっおいるずいう事。
    bleopt complete_auto_complete= ずしおも遅いのは倉わらない。

    色々調べるず問題が起こっおいるのは䞀箇所では無い様に芋える。
    time [[ -e //$RANDOM || -h //$RANDOM ]] ずするず物凄く時間がかかる。
    bash --norc の䞊で実行しおも同様に時間がかかる事から ble.sh の所為ではない。
    Windows の䜕か特殊なディレクトリでも芋に行っおいるずいう事なのだろうか。

    ずいうか問題が起こっおいる箇所は䞀箇所ではない。
    少なくずももう䞀぀止たっおいる箇所がある。
    以䞋に列挙しおいく事にする。ず思ったが䞀぀ず぀
    朰しお行った方が効率が良いのではないか。

    - ble/syntax:bash/simple-word/locate-filename

    探しおみるず echo //* ずいうのを実行しおも埅たされるずいう事が分かった。
    䞀般に Cygwin では // で始たるパスは駄目な様だ。
    曎に、// は / ず同䞀芖されるのかず思いきや、そうでもない。
    党く觊る事ができないパスになっおいる様な気がする。
    䜕しろ echo //* ずしおも䜕も衚瀺されないし、
    たたは ls -la // ずするず Permission denied ずいう事になる。
    ls -dl // ずするずディレクトリずいう事になる様なので '//' の時だけ有効?

2019-08-13

  * [棄华] char_width_mode=emacs での斜め矢印の文字幅 [#D1167]
    この文字である ↗

    ble.sh の䞊では幅2ず蚈算されおいる。しかし、
    emacs 䞊での取り扱いは幅1であり、そしお contra でも1である。
    自前の screen の cjkwidth emacs でも 1 であり、
    それから自前の Poderosa の文字幅蚈算でも 1 である。
    これは ble.sh の方を合わせるべきの気がする。

    どうも contra のコヌドを調べおみるず、
    これは絵文字ず刀定されおいる様である。
    䞀方で A ではない文字ずも刀定されおいる。

    これは emoji_width の蚭定の問題なので bash 自䜓の問題ではない。
    取り敢えず emoji_width を蚭定せずに䜿う事にした。
    絵文字を䜿う為にはやはり emacs/screen/端末 などが
    党お察応しおいないず幅の蚈算が駄目になるのである。

  * exec: failglob したコマンドがサブシェルにあるず固たっお動かなくなる [#D1166]
    䟋えば echo ? | echo で固たっおしたう。
    よく考えたらどう察凊したら良いか分からない 。
    →分かった これは subshell で ble/base/unload が起こっおいるのが原因である。
    ble/base/unload で BASHPID をチェックする様にしたらあっさりず盎った。
    他の hook に関しおもチェックした方が良いのではないか。

2019-08-06

  * syntax: 䜕ずサブシェル () の盎埌に then 等を眮いおも OK らしい [#D1165]
    yash のサンプルを芋おいお気づいた。bash でもそうだった。
    詊すず then, fi, 等が眮ける。(()) の盎埌は駄目の様だ。
    [[ ]] の盎埌も駄目の様子である。} の盎埌は倧䞈倫。
    その様に考えるず } の盎埌ず同じ文脈ずいう事になるか。
    どうも完党に CTX_CMDXE の様である。CTX_CMDXE にする。

2019-08-03

  * vi_test: マクロ再生に倱敗しおいる [#D1164]
    手動で実行しおみるずちゃんず動䜜する様に芋える。
    マクロ再生䞭にマクロ再生は再垰的に実行しない、
    ずいうのが匕っ掛かっおいるのだろうか。ずいう気がする。

    ず思ったらそうではなかった。
    ちゃんず再生郚分たでは到達しおいるが蚘録を読み出す所で倱敗しおいる。
    うヌん。a (97) は空である 。マクロ蚘録䞭の再垰の抑制だろうか 。

    うヌん。ちゃんずマクロ蚘録の蚭定は開始しおいるが、
    䜕故か䞀文字もマクロからの文字が ble-decode-char の
    該圓郚分を通過しない 䜕故だろうか。
    ず思ったら分かった 。vi_test は ble-decode-char は介さずに、
    盎接に ble-decode-key を呌び出しおいるのでキヌボヌドマクロは䜿えないのだ 。

    代わりに ble-decode-char を呌び出す様にしおみたが、
    そうするず今床は凊理が遅延されおしたっおその堎で実行されない。
    ず思っお ble-decode-char の䞭を芗いたら ble_decode_char_sync ずいう倉数がある。
    これを䜿ったら期埅通りに動く様になった。

  * vi_nmap: C-x が効かなくなっおいるず思ったら、 [#D1163]
    C-x C-e を登録しおしたった為に動かなくなっおいたのだった。
    うヌん。テストは通る様になったがそれでもやはり C-x がすぐには効かない。
    C-x は二個の組でしか受信できおいない様子である。
    vi_test で実行するずちゃんず䞀個ず぀受信できおいるので、
    decode.sh の䞭で詰たっおいるずいう蚳ではない様に思う。

    䜕ず bash-4.3 では動くけれども bash-4.4 以降では動かなくなっおいる。
    うヌん。実際に出力しおみるず C-x に察する䜜戊が異なる様だ。
    ずいうか emacs ず vi で bind の戊略を倉曎しおも良いのかも知れない 。
    面倒なので binder の䞭に emacs/vi の刀定条件を入れる事にした。

    (ずいうかそもそも䜕故条件刀定を䜿わずに bash version 毎に
    スクリプトを生成しおいたのだったか。恐らく初期化の速床を気にしおの事だろう。
    実は物凄く高速なので気にしなくおも良いずいう気もするが、
    䜕れにしおも bash-5.0 では条件分岐も必芁ないのでこれで良いずいう気がする)

  * init-bind: "C-\ C-\" が効かなくなっおいる @ bash-5.0 [#D1162]
    そもそも受信できおいるのだろうか 。
    うヌん。受信できおいない 。
    どうも bash-5.0 から受信できなくなっおいる様である。
    うヌん。前に修正した物ずの関連は? #D1078 これである。
    これの気がする。単に衚瀺が倉なだけではなく実際に振る舞いが倉なのである 。
    取り敢えず bind "\x1c" ずすれば動かない事は無いようである。

2019-07-30

  * util: "bash: INT 云々" ずいう゚ラヌメッセヌゞが出る [#D1161]
    declare | less で \<INT\> を怜玢しお芋おみるず
    _ble_builtin_trap_handlers=([1000]="INT") ずいう状況になっおいる。
    そしおこれは以䞋の郚分で匕き起こされおいるのではないかずいう気がする。
    function ble-edit/exec:exec/.eval-epilogue {
      trap - INT DEBUG
      ble/base/adjust-bash-options

    ず思ったがこれは gexec ではなくお exec なので関係ない気がする 。
    ずいう事はたた䜕凊か別の所で匕き起こされおいる 。
    䜕れにしおも恐らく叀い trap 呌び出しによっお倉な物が登録されおいるのである。
    そしおそれは状況を芋るに trap - INT DEBUG なのである。
    詊しに実行しおみる事にする。再珟した 。匕数の読み取りが倉なんだ。

2019-07-27

  * syntax: echo "${var/[a/b]/c}" これが正しく解析できおいない [#D1160]
    echo "${var#[a}" これも駄目である。
    →これは物凄く単玔なミスだった。修正した。

  * syntax: echo ${var##@(((a)))} ずした時の着色が倉だ [#D1159]
    echo @(((a))) に察しおはちゃんず動いおいる。
    取り敢えず察応する開始郚分ず同じ色に着色する様にする事にした。

  * 2015-02-16 ${ ... } 内の文法チェック [#D1158]
    extglob (䜆し '}' で匷制終了する必芁がある。
    䞀旊党お読み取っおから埌付けで着色する?)
    →これは #D1157 ず䞀緒に察応した。

  * 2017-11-22 syntax: ${var##...} における check-glob の察応 [#D1157]
    ctx-bracket-expression に関しおは、
    新しい nctx ぞの察応が必芁になる。

    実はこれに関しおは文法の解釈には寄䞎しない。

    a ぀たり、CTX_PATN に察しおも @( は } が来たら終了する。
      これだず CTX_PATN に぀いおも bashc を匄る必芁が出おくる。
      実は芪が CTX_PWORD の時に '}' を远加しお、
      check-word-end で終了する様にすれば良いだけなのではないかずいう考え方もある。

    b そもそも CTX_PATN に入らずに @+?!(|) を党お着色するずいう手もある。
      しかしそれだず pattern ではない物たで着色されおしたう。
      それならそもそも色を付けない方が良い。

    c 或いは CTX_PATN を耇補しお CTX_PWORD から呌び出した時甚の新しいものを䜜る。
      ず思ったが珟状の CTX_PATN ず比べお殆ど違いはないので a の方が良さそうに思う。

    所で CTX_PWORD ず蚀っおも様々な文脈がある。
    文脈によっおはパタヌンが無効になる堎合もある。
    % 以䞋の xxx の堎所では有効で yyy では無効である。
    %   ${a//xxx/yyy} ${a#xxx} ${a%xxx}
    %   ${a:-yyy} ${a:=yyy} ${a:+yyy}
    %   ${a,xxx} ${a^xxx}
    % →詊しおみたが yyy だずパス名展開に䜿われる様だ。぀たり有効である。
    珟状では䜕も考えず党お CTX_PWORD にしおいる。
    そもそも文法的に蚱されないものも党お蚱可しおいる。
    パタヌンの着色に察応する前にこの様々なパラメヌタ展開の着色に察応するべきである。

    * 珟状では CTX_PATN 内郚でブレヌス展開が垞に有効になっおいる。
      ${var#pattern} を解析しおいるずき
      CTX_PATN からブレヌス展開が呌び出されない様にする。
      これは CTX_PATN が "}" で終了するこずを蚱すかどうかず同じ条件刀定を䜿えば良い。

    2019-07-27 cmplstofB さんから報告があった。
    https://github.com/akinomyoga/ble.sh/issues/29
    成る皋、構文解析を適圓にやっおいるずこういう事になるのである。
    ちゃんず察応する必芁がある。

    * ${a//.../...} の圢匏の時は / で globpat は䞭断する様である。
      ぀たり、${a//[a/a]/hello} は、${a//'[a'/'a]/hello'} ず解釈される。


    ? CTX_BRAX 及び CTX_PATN に぀いおは入れ子等で
      倖郚の文脈をどう継承するかが耇雑だった気がする。
      どの様になっおいたのだったかを調べる。

      →#D0622 の 7 に詳しく曞かれおいる。
      特にブレヌス展開たで絡んできた時の振る舞いなのであった。
      匕甚するず以䞋の様になっおいる。

      > 以䞋のずき、ブレヌス展開は無効ずなり通垞文字列ずしお読み取られる。
      > - CTX_CONDI/CTX_VRHS/CTX_RDRS からブレヌス展開を詊みるずき
      > - CTX_VRHS/CTX_RDRS によっお䞍掻性化した CTX_PATN/CTX_BRAX からブレヌス展開を詊みるずき
      > - CTX_CONDI の盎䞋にある CTX_BRAX(有効) からブレヌス展開を詊みるずき
      > 以䞋のずき、ブレヌス展開は䞍掻性ずなりブレヌス展開ずしお有効になったずき゚ラヌを蚭眮する。
      > - CTX_RDRF/CTX_RDRD からブレヌス展開を詊みるずき
      > - 䞍掻性の CTX_BRACE1/CTX_BRACE2 から入れ子のブレヌス展開を詊みるずき
      > その他のずき、ブレヌス展開は有効になる。䜆し、bash ず違い以䞋の堎合を含む
      > - CTX_BRAX によっお䞍掻性化した CTX_PATN からブレヌス展開を詊みるずき
      > CTX_BRACE1/CTX_BRACE2 から CTX_PATN/CTX_BRAX に入る時は特別な凊理は䜕も必芁ない。

      この話でいうず CTX_PWORD の時は特に "CTX_VRHS/CTX_RDRS によっお䞍掻性化した
      CTX_PATN/CTX_BRAX" 等ず同様にブレヌス展開を無効にすれば良い。
      CTX_BRAX 及び CTX_PATN 自䜓の耇雑さではなかったずいう事か。

      然し、この入れ子を遡っおどの文脈にいるのかを刀定するのが、
      どの様に実装されおいるのかは確認しおおく必芁がある気がする。
      うヌん。ntype に glob_attr=* ずいう圢匏の文字列を栌玍しおいる様だ。
      そしお * の郚分に芪の文脈倀を入れおいる。実は歀凊に CTX_PWORD を入れおおけば良いのでは?

    ? うヌん。珟状の CTX_BRAX の動䜜が分からない。
      解析の結果を芋るず "a[b(" ず入力するず、
      "(" が珟れた時点で CTX_BRAX を抜けおいる気がする。
      然し、そもそも ble/syntax:bash/check-glob に入っお来ない。
      →もしかするず ble/syntax:bash/ctx-bracket-expression.end で抜けおいる?
      →うヌん。そうだった。倚分ここで抜けおいる。

    取り敢えず実装する。CTX_PWORD で check-glob を実行する。

    * done: ${var%%@(a|b[hello} の時 CTX_BRAX も CTX_PATN も同時に抜けるべき。
      珟状の実装では実は CTX_PATN の匷制終了条件は存圚しおいない様だ 。

    色々実装した。動いおいる気がする。

  * syntax: 'a=[' ず入力するず゚ラヌメッセヌゞが出る [#D1156]

    ずいうか詊しおいたら凄いバグを芋぀けた。
    a=[ ず入力しただけで゚ラヌメッセヌゞが出力される。
    これは failglob か? ず思ったが failglob を倖しおいおもメッセヌゞは出る。
    先にこれを片付ける事にする。䜕凊から発生しおいるのだろうか。

    うヌん。構文解析か或いは単語着色か うヌん。単語着色が怪しい気がする。
    →詊しに update-word-table を /dev/null にしお芋た所メッセヌゞが出なくなった。
    どうも ble/syntax:bash/simple-word/evaluate-path-spec の䞭で発生しおいる。
    ble/syntax:bash/simple-word/evaluate-path-spec [ / noglob  で再珟する。
    ble/syntax:bash/simple-word/eval-noglob [ でたた再珟した 。うヌん。

2019-07-24

  * edit: 䜕ず DEBUG トラップが物凄く倧量に呌び出されおいる気がする [#D1155]
    うヌん。そもそも DEBUG を登録するのは SIGINT を停止する為である。
    それなのに DEBUG を垞に trap しおいるず凊理が遅くなるのではないか。

    実際に䜕回呌び出されたのか、ずいうのを調べおみるず
    やはり物凄い勢いで呌び出されおいる。
    すぐに数癟回の呌び出しに到達しおしたう。
    やはり動的に trap/untrap を実行する様にした方が良い気がしおきた。

    うヌん。どの様にするのが良いか。
    珟状ではどの様に動䜜するか 。
    ずいうかそもそも ble.sh の内郚で動いおいる時には DEBUG trap は䞍芁である。
    ずいう事を考えればコマンドを実行する盎前に DEBUG trap を有効にしお、
    コマンドを実行した埌に DEBUG trap を削陀するずいう様にしおも良い気がする。
    曎に蚀うずコマンドを実行する前ですら DEBUG trap を必ず入れる必芁があるかは埮劙。
    そもそも DEBUG trap を入れるのは SIGINT を捕たえた時にそれを停止する為である。
    それならばその時点で DEBUG trap を仕掛ける様にすれば良いのではないだろうか。

    * done: 先ず蚭蚈ずしおは blehook DEBUG は取り敢えず廃止するずいう事。
    * done: 次に必芁のある時にだけ builtin trap DEBUG するずいう事。

    x fixed: うヌん。C-c が動かなくなっおいる。
      前は確かに動いおいたのだずいう事は確認した。䜕がいけないのだろうか。
      うヌん。そもそも SIGINT を捕たえられおいない気がする。
      然し、builtin trap を芋るずちゃんず登録されおいるし、
      手で blehook/invoke INT を呌び出しおもちゃんず動くず確認できる。
      → builtin trap -- 'blehook/invoke INT' INT を改めお実行する様にしたら動く様になった。

    * done: 次に ble/builtin/trap DEBUG は prologue/epilogue の間でしか起こらない様にするずいう事。

    x fixed: やはり挏れがある。ble-edit/exec:gexec/.* に察しおは呌び出さない事にした。
    x fixed: 未だ倉だ。ず思ったら盎接 builtin trap -- ... DEBUG されおいる?
      これは ble/builtin/trap/reserve を忘れおいた。
    x fixed: コマンドの終了ステヌタスが0以倖の時にも䜕故か䜙分に呌び出されおいる。
      しかも同じコマンドに察しお2回呌び出されおいる。䜕故?

      % echo A; false; echo C ずいう具合にするず
      % false の盎前で TRAPDEBUG が2回呌び出される。

      echo A; bash -c 'echo X;false'; echo C で調べた所、
      盎前で2回呌ばれるのではなくお、実行盎前ず実行盎埌の2回呌ばれる様子である。
      うヌん。もしかしお ERR トラップを実行する盎前に
      DEBUG も呌び出されおいるずいう事か?

      どの様に解決するかずいうず 。
      䟋えば ERR トラップを解陀しおそれからたた蚭定するずいう具合にする?
      ずいうよりそもそも䜕の為に ERR を捕たえおいたのだったか 。
      珟状のコヌドを芋おも䜕か特別な凊理をしおいる様には芋えない。
      元々の゜ヌスコヌドを芋るず ERR は実際には䜿われおいないのだった。

      うヌん。ERR関連は削陀する事にした。
      ナヌザが自分で ERR を蚭定した時には諊める事にする。
      ずいうか bash の既定の振る舞いずしおそれは正しいのだろう。

    * done: ble/builtin/trap DEBUG を prologue/epilogue の間で呌び出した時には、
      その堎で exec:gexec/trap を実行する様にする必芁がある。

      これには ble/builtin/trap 偎で set/reset
      関連で関数を呌び出す仕組みを远加すれば良い。

      x fixed: 実際に実装しおみた所、ble/builtin/trap の䞭で実行しおいる
        return 0 に察しおも反応しおしたっおいる 。
        たあ、これは面倒なので気にしない事にしようか 。

        a 或いは、珟状の振る舞いの方が寧ろ自然ずも考えられるかもしれない。
          䜕れにしおも ble の関数をナヌザから呌び出せば trap は発動するのである。
          ず思ったらそんな事はなかった trap を蚭定した関数呌び出しより倖にしか効果はないのである。
        b 或いはグロヌバルで発生した DEBUG だけを取り扱う様にすれば良いだろうか 
          ず思ったがグロヌバルかどうかを怜出する方法は実は存圚しない。
        c 或いは ble/builtin/trap を明瀺的に跳ねる? ず思ったが、
          これも BASH_COMMAND に ble/builtin/trap が入っおいる蚳ではないので
          怜出する事ができない。
        d trap 偎で return 0 を䜿わない様にする?
          ず思ったがそれだけだず䞍十分である。耇数の trap を同時に仕掛ける堎合などに
          続く trap を蚭定する段階で沢山の DEBUG を呌び出しおしたう。
        e その様に考えるず ble/builtin/trap の䞭にいるかどうかを
          衚す倉数を䜜っおも良いのかもしれない。
          結局 _ble_builtin_trap_inside ずいう倉数を䜜っおそれで刀定する事にした。

    * done: DEBUG の trap は終了ステヌタスが意味を持぀
      .TRAPDEBUG の意味を反転させれば良い?
      →玆䜙曲折あったが意味は反転させた。
      ちゃんず 2 以倖の時には単に終了ステヌタス倱敗を返す様になっおいる。

2019-07-23

  * main: 実は FUNCNEST 察策はそんなに難しくないのではないか [#D1154]

    詊しおみる。
    - FUNCNEST=0 の時には制限はない。
    - FUNCNEST=1 の時には䞀回は関数を呌び出すこずができる。
    - eval f1 や eval 'eval f1' や eval "eval 'eval f1'" の様な入れ子は幟らでもできる。
    - 曎に初めに呌び出した関数の䞭で local FUNCNEST= 等ずしおおけば
      その䞭では自由に関数を呌び出す事ができる。
    - 関数の䞭で FUNCNEST を小さな倀にしたらその堎で死んでしたうのか?
      →別に䜕も問題は起こらない。続きも実行されるし、
        関数を抜ける時に゚ラヌになるずいう事もない。
        ぀たり FUNCNEST は関数に入る時にだけチェックされるのである。


    set -ex の類ず同様に ble/base/adjust-bash-options ず
    ble/base/restore-bash-options で退避・埩元する事にした。
    問題は ble/base/adjust-bash-options を呌び出す迄に死なないかずいう事ず、
    それから ble/base/restore-bash-options を呌び出した埌に死なないかずいう事。

    ble/base/adjust-bash-options を呌び出しおいる箇所は以䞋の通り。
    - ble.pp ロヌドの初め → 最初の関数呌び出しがこれなので OK
    - ble/attach → これも ble/attach さえ呌び出す事ができおいればOK?
      ず思ったが埮劙かも知れない 。FUNCNEST=1 だず ble/attach は呌び出せるけれども、
      その退避を行う為の adjust-bash-options は呌び出せないずいう事になる。うヌん。
      local FUNCNEST で呌び出しおから unlocal を䜿っおグロヌバルを修正する?
      ず思ったけれども、それだず unlocal が必芁かどうかの刀定ができない。
      やはり倖で FUNCNEST 退避を行うべきだろうか。

      仕方がないので倉数に実行するべきコマンドを入れお、それを eval する事にした。
    - edit.sh の save-last-exit 及び epilogue で呌び出されおいる。
      これに関しおは save-last-exit, epilogue で FUNCNEST を調敎すれば良い。

    ble/base/restore-bash-options を呌び出しおいる箇所は以䞋の通り。
    - ble.pp ロヌドの末尟。これはOK。䞀番最埌に付け加えれば良い。
    - prologue の䞭。.setexit は盎接蚘述する様に倉曎しなければならなかった。
    - ble-edit/bind/.check-detach の䞭。
      check-detach で return 0 すればもう関数は呌び出さない?
      check-detach は exec:gexec/.end からしか呌ばれおいなくお、
      この .end の䞭では check-detach が 0 を返したらすぐ終了する様になっおいる。
      たた gexec/.end はトップレベルで呌び出される事になっおいるので、
      改めお関数が呌び出されるずいう事もない。OK

    倚分。これで倧䞈倫。これで動かなかったらそもそも set -e で死んでいる筈。
    取り敢えず死ぬずいう事はないけれども実は FUNCNEST が消去されおしたっおいる。

    うヌん。どうやらコマンド実行䞭に trap 経由で実行される物は FUNCNEST が退避できおいない。
    - blehook/invoke では local FUNCNEST= しおしたう事にする。

  * main: set -e の蚭定が消滅しおいる気がする [#D1153]
    % ず思ったが 。うヌん。もしかするず意図的に察応を諊めた?
    % そんな気もする。しかし #D0930 では特に議論されおいない様にも思う。
    % それに ble/base/restore-bash-options では明瀺的に埩元を詊みおいる。
    うヌん set -e にするず䜕も起こっおいないのではなくお、
    その堎ですぐに抜けおしたっおいおそれに気づいおいなかったずいう事らしい。
    然し、゚ラヌを発生させおいないのに終了しおしたうずいうのは怖い。
    䜕があったのだろうか 。あヌ。分かった気がする 。盎した。

    たた set -x にするず trap/invoke DEBUG が物凄く沢山のメッセヌゞを出しおしたう。
    これに関しおも察策を斜した。

  * blehook: trap を眮き換える? [#D1152]
    その為には trap の仕様を確認しなければならない。

    * done: blehook で匕数を枡すのは関数名たたはコマンド名を指定した時だけにする事にした。

    * 取り敢えず実装した。少し動かしおみたがちゃんず動いおいる気がする。眮き換えおも良い気がする。

    * ERR が無駄に沢山呌ばれる。setexit で呌ばれおいる気がする 。
      ERR に察しおも介入するべきではあるたいか。

  * bind: コマンドを実行した埌はプロンプトを再蚈算するべきなのではないか [#D1151]
    特に C-z を fg に割り圓おおいるが、これによっお出入りしおプログラムが終了した埌には
    やはりプロンプトを再蚈算したいずいう気がするのである。
    特に、䜕も実行しないコマンドであっおも次の行に衚瀺䞊移動するのだから。

    珟圚の実装では ble-edit/prompt/update で
    local version=$COLUMNS:$_ble_edit_LINENO を芋おプロンプトの再蚈算が必芁かどうか刀定しおいる。
    LINENO だけではなくお ble/widget/execute-command でも䜕かカりントするべきなのでは。
    ble/widget/.insert-newline で _ble_edit_lineno++ する事にした。
    ble/widget/.newline は _ble_edit_lineno++ _ble_edit_LINENO++ の䞡方を実行する。
    ble/widget/.insert-newline は片方だけ実行するずいう事にした。
    _ble_edit_LINENO が倉化する箇所は他にはないので _ble_edit_LINENO
    の代わりに _ble_edit_lineno を prompt の version 刀定に甚いお問題ないだろう。

  * highlight: 入力した URL の最初の // だけが着色されるのは倉な感じがする [#D1150]
    http:// の圢匏をしおいる時には : 区切りにするのをやめるべきなのではあるたいか。
    →URLの圢匏の単語を着色する所たで実装した。

2019-07-22

  * bash 2 でロヌドしおみた所 ble.sh がロヌドされないのは良いが、 [#D1149]
    䜕のメッセヌゞも衚瀺されない。ず思ったら set -x 察策ずしお
    暙準出力・゚ラヌ出力を封じおいるのだった。
    ble.sh からの゚ラヌメッセヌゞだけは衚瀺する様に修正する。

    他に builtin コマンド (非暙準) を䜿っおいる所を䜿わない様に修正した。

2019-07-21

  * 以䞋の蚭定に関しおはもう ble.sh 偎で勝手に匄っおも良いのではないか? [#D1148]
    どうせ bashrc の䞀番始めに曞いおもらう事になっおいる。

    ((_ble_bash>=40100)) && builtin bind 'set skip-completed-text on'
    ((_ble_bash>=40300)) && builtin bind 'set colored-stats on'
    ((_ble_bash>=40400)) && builtin bind 'set colored-completion-prefix on'

  * Cygwin console のバグに぀いお [#D1147]

    - Cygwin は ED(2) "ESC [ 2 J" が駄目
    - Cygwin は RI の振る舞いがおかしい
    - Cygwin は最終行での DL "ESC [ M" が駄目
    - Cygwin は CUF() の行き先が行末 $ の時に䜕凊にも移動しない。

    これは最新の cygwin を確認したら党お盎っおいた。
    䜆し、TERM=xterm-256color になっおいるので区別はできる。
    たた最新版でも ED(2) はカヌ゜ル䜍眮を倉える、等の振る舞いの違いはある。
    䜕れにしおもこれは別の堎所で扱う事にする。

  * blehook: blehook に hook 名を指定しおも無芖される [#D1146]
    これは単玔なミスだった。修正した

  * blehook: 初期化の順序によっお load hook が実行されない事がある [#D1145]

    % cygwin で M-b 等が党郚 ESC b ず解釈されおいる
    Cygwin は関係なかった。

    [状況敎理]

    | 0.4.0-devel1+30cc31c の既存のセッションでは再珟しおいない
    | 0.4.0-devel1+362ab05 の既存のセッションでは再珟しおいる。
    | 最新の version でも再珟しおいる。
    | 確かに checkout しお比范しおみるずそれぞれその通りになった。
    | 二分法で絞り蟌む。2ea7cfd は未だ倧䞈倫である。
    | caa46c2 はもう駄目になっおいる。af758e5 も駄目。
    | af758e5~ だず倧䞈倫である。ずいう事は犯人は af758e5 である。
    | .inputrc の読み取りタむミングの倉曎で駄目になった。
    |
    | 特に bind で ESC から始たる䜕かを登録するずもう駄目なのだろう。
    | ず思ったがそれを削陀しおも問題は再珟するたたである。
    | --noinputrc を指定したら再珟しなくなった。
    |
    | うヌん。ble-bind -m vi_imap -P の結果を芋比べた所、
    | そもそも inputrc で ESC で始たる物が登録されおいた堎合、
    | hook が呌び出されおいない? ずいう事の様だ。うヌん。
    | ぀たり inputrc の䞭で vi_imap がロヌドされお、
    | その埌で blerc などの蚭定が適甚されおいる?
    |
    | ずいうのも倉だ。そもそも mshex による蚭定も消えおなくなっおいる。
    | ずいう事を思えばたた別の理由によっお load hook
    | が呌び出されなくなっおいるずいう事か。
    |
    | 実際に詊しおみるずやはり load hook が起動された瞬間には未だ
    | 登録されおいない様である。
    | うヌん。そもそも mshex の load hook も定矩されおいない。
    | どのタむミングで load hook が呌び出されおいるのだろう 。

    しなければならない事は (1) 珟状で䜕が起きおいるかの解明ず、
    (2) load_hook に関しおは既にロヌド枈みであればすぐに実行する、
    ずいう仕組みを敎えるずいう事。

    調べおみるずいきなり keymap_load が実行されおいる様子だ。
    どうも blerc の䞭で keymap_load, keymap_vI_load が実行されおいる。
    確かに blerc の䞭で bind を呌び出しおいるのでそうなるのは分かる。
    以前同じ事が起こっおいなかったのは bind 呌び出し時に keymap 初期化をする
    ずいうのを最近远加したからである。

    [察凊]

    どの様に察凊するのかずいう事。

    * 少なくずも load hook に関しおは既に load 枈みであれば
      その堎で実行する事にする。

      * ok: どの様な関数名にするのが良いだろうか。これは emacs を参考にする。
        そういう関数名があった筈ず思ったが思い出せない。
        →探したら mwg-doxygen.el で䜿われおいた eval-after-load である。

        ble/util/eval-after-load ずいう関数名にでもするか。
        或いは blehook/eval-after-load の方が良いだろうか。
        取り敢えず埌者で定矩する事にしようかず考える。

      * done: そしお blehook/eval-after-load を実行する為には
        それが既に実行されたかどうかずいう情報を蚘録しおおく必芁がある。

        a それ専甚の倉数を定矩しおおくか。
          倉数名をどうするのかずいう事ず倉数の汚染が気になっおしたう。
        b 或いは蟞曞にするか。
          蟞曞にするず bash-4.0 未満に察する察応を別に実装しなければならないので面倒である。
        c 或いは倉数の代わりに関数を定矩するか。
          うヌん。関数を定矩する方法だず reload の時に関数を削陀するのが面倒である。
          然し倉数で蚘録したずしおもそれを消去する必芁性を考えたら面倒である事は倉わりない気はする。

        取り敢えず倉数に蚘録する事にする。OK

      * done: 倉数名を倉曎する事にした。倉曎した。
        取り敢えず blehook_h_NAME に handlers を栌玍し、
        blehook_c_NAME にこれたでの呌び出し回数を栌玍する事にした。

      * done: ずいうか今思ったのだが blehook に関しお、
        blehook_* ずいう倉数名にしおおく必芁はあるのだろうか。。

        bleopt の堎合には source する前に䜕か倀を予め蚭定しおおきたい可胜性もあった。
        然し、blehook の堎合には結局 def.sh で =() ずしお初期化しおしたうのだずいう事を考えるず、
        公開倉数にしおおく意味がない。或いは、既存の hook を保持する事にするか?
        然し、blehook は䞊曞きではなくお环積なので既存の hook を残しおおくず、
        だずすれば ble-reload の時にどんどんず hook が环積しお行く事になり駄目。

        埓っお、これに関しおは blehook は _ble_hook_ 的な倉数名に改名するのが賢明だろう。
        そうは蚀い぀぀もそんなに圱響は広範には亘らないので倉曎は少なくお枈みそうである。
        今慌おお修正しなくおも埌でゆっくり名前を倉えれば良いずいう事の気がする。

        結局倉数の䜿い方を倉えたので䞀緒に名前も倉曎する事にした。

      * 同時に _ble_version ずいう倉数も甚意する事にした。
        単䞀の倉数で倧小比范をできる様にしたスカラヌ倀。

    これで枠組みを倉曎しおしたったので既存の枠組みを䜿っおいる
    人に察する譊告の様な物を衚瀺するべきなのではないだろうか。
    然し、そのチェックは䜕凊で実行するのか。
    idle で実行すれば良い気がする。
    idle が実行されるのは keymap 関係はロヌドし終わった時の筈だから。
    ず思ったが単に blerc を読み蟌んだ埌で実行すれば良い気がする。
    bashrc の䞭で蚭定しおいる人に関しおは関知しない事にする。

2019-07-20

  * cygwin: 未だ cygwin での振る舞いが倉である [#D1144]
    行末補正が効いおいない。ずいうか塗り぀ぶされおしたう。
    _ble_term_xenl=1 にしおみるず䜙分な改行が入っおしたう。

    取り敢えず調査を継続する事にする。
    そもそも行末補正の為に䜕を出力しおいるのだったかを確認する。

    先ず eol mark を出力しお restore cursor する。
    実は eol mark は関係無さそう。
    その埌で行頭から CUF で COLUMNS-3 文字進む。
    曎に二文字挿入しおから CR で行頭に戻る。ずいう事をしおいる。
    うヌん。実際にその様に制埡シヌケンスを出力させるずちゃんず動いおいる。
    分かった事は printf A だず行末補正が効くが printf AAA だず効かないずいう事。
    もっず調べるず䞁床 3 文字の時にだけ倉な事が起こる 。

    →printf で再珟できた。
    $ printf 'AA\e[154C12\rX\n'
    $ printf 'AAA\e[154C12\rX\n'  # 駄目
    $ printf 'AAAA\e[154C12\rX\n'

    $ printf 'AAA\e[154CX\r\nhello\n'
    うヌん。分かった。䞁床 $((COLUMNS+1)) 列目に移動しようずするず
    "動かない" ずいう動䜜になっおいる 。
    この堎合どの様に察凊したら良いのだろうか 。

    二぀の察凊が圚る。先ず Cygwin の偎での䜕故その様になっおいるのかの解明ず、解決。
    それから ble.sh の偎での察策である。Cygwin の偎は埌で考える事にしお、
    ble.sh の偎でどの様にしお察策するのかずいう事。
    a うヌん。䞀぀の方法は珟圚䜍眮を問い合わせおそれに応じお出力するかどうかを決定するずいう物。
      正盎この方法は採甚したくない。ナヌザによる入力ず前埌しおしたうからである。

    䞁床ぎったり移動する堎合でもちゃんず前に移動する方法はあるのだろうか。

    b 䟋えば䞀文字ず぀前に進む? うヌん。酷いやり方だが他に方法がないのであれば仕方がない。
      これが珟実的な解ずいう事になっおしたう。䟋えば 157 列あるのだずすれば、
      157 x 3 (\e[C) = 471 bytes 出力する事になる。

      - 移動に䜿える別のシヌケンスは存圚するだろうか。

    c 或いは b の方針で䞀文字ず぀ではなくお2文字4文字等ず組み合わせお䜕ずかならないか 。
      然し珟圚䜍眮に察しお䜕の仮定も眮けないのだずするず、
      2文字以䞊を実行する時は垞に倱敗の危険性がある 。
      ず思ったが珟圚䜍眮が問題の䜍眮より巊にあれば倧䞈倫だし、
      問題の䜍眮より右にあれば其凊で倱敗しおも埌の CUF で十分に末端に到達できる。
      ずにかく目的は末端に到達する事なのである。末端に到達できさえすれば良い。

      兎に角目暙は"少なくずも N 文字前進する"ずいう事である。
      取り敢えず N = N/2 + (N-N/2) に分けお、
      取り敢えずN/2進めれば残りは "(N-N/2)文字前進する" ずいう同様の問題に垰着できる。
      䞀気に N/2 文字進む事ができれば䜙り沢山の文字列を出力しなくおも枈む。

      今、残り前進可胜数が R ずする。たたN>1であるず仮定する。RずNの倧小関係は分からない。

      a a=N/2進むずするず、
        䞁床 a==R+1 の時に問題になっおしたう。
        この時 R = N/2-1 であるから、R < N/2 <= N-N/2 なので
        埌半の "N-N/2前進する" ずいうステップに斌いお、
        十分に行末たで達する事が可胜である。

      b 代わりに N-N/2 + N/2 に分ける堎合はどうだろうか。
        ぀たり取り敢えず a=N-N/2 だけ進む。
        N-N/2==R+1 の時に問題が発生しおこの時 R = N-N/2-1 である。
        Nが奇数の時 R = N-N/2-1 = N/2 である。
        Nが偶数の時 R = N/2-1 である。埓っお、 R <= N/2 である。
        なのでこの様にしおも十分に行末たで達する事ができる。
        こちらの方が効率が良さそうである。

      ぀たり、N文字前進したい時、取り敢えず ceil(N/2) だけ進んで
      floor(N/2)前進したいずいう問題に垰着できる。
      半々になるので log の長さの文字列で倧䞈倫になる。

    ? ここで気になるのが䜕故 margin を "  " ず二文字にしおいるのかずいう事。
      これは䜕らかの理由でその様にしたのだったか。blame しおみる。

      $ g blame src/edit.sh
      5084b02a ble-edit.sh (Koichi Murase 2018-08-31 13:40:32 +0900 3846)   ble/canvas/put.draw "  $_ble_term_cr$_ble_term_el"
      $ g blame 5084b02a~ -- ble-edit.sh
      650b3f14 (Koichi Murase 2015-03-04 01:17:38 +0900 2984)   ble-edit/draw/put "  $_ble_term_cr$_ble_term_el"
      $ g blame 650b3f14~ -- ble-edit.sh
      ^c68412b (Koichi Murase 2015-02-09 03:13:19 +0900 2100)   echo -n "$_ble_term_sc${eof}$_ble_term_rc((xenl?cols-2:cols-3))C  ^M"
      これが initial commit である。぀たり䞀番初めから空癜二文字でやっおいた。git では远跡できない。

      #D0004 を読んだらちゃんず説明が曞かれおいた。これは xenl の時に
      "(1)行末に移動する(2)次の行に移動する"ずいう具合に2文字必芁だからなのであった。

      ぀たり xenl でない時には気にしなくおも良いずいう事である。
      特に Cygwin 専甚のコヌドを曞く䞊では考えなくお良いずいう事である。

  * cygwin terminal で久しぶりに動かしおみたら様子がおかしい [#D1143]
    䞀番䞋の行で -- INSERT -- が残った儘になっおしたうし、
    vbell が衚瀺される床に描画䜍眮がどんどんずれおいく。
    うヌん。党然駄目だ。実は 0.1 の時からずっず動いおいなかったらしい。

    詊しおみお分かった事は、cygwin terminal では、
    1. RI 及び IND は必ず其凊に行を挿入しおしたうずいう事
      本来は画面の䞀番䞊にいる時にのみ行を挿入するべきなのである。
    2. DL で珟圚行以降の行数以䞊を匕数に指定するず䜕も起こらないずいう事。
    3. 曎に \e[$((LINES+1))H するず画面の
      䞀番䞋に行っお IND したのず同じ効果がある 。

    さお察策或いは代替手段はあるだろうか。
    効率の悪い方法だったずしおも TERM=cygwin の時にだけそれをすれば良い。

    [Cygwin の振る舞いに぀いお調査]

    | ずいうか cygwin に patch を送りたい気分ではある。
    | cygwin の゜ヌスコヌドを確認しおみる。
    | 以前 cygwin の release note で DECSCUSR の事が曞いおあった事を思い出しお
    | newlib-cygwin/winsup/cygwin の䞭で grc DECSCUSR したら盎ぐに芋぀かった。
    |
    | $ grc DECSC
    | ./fhandler_console.cc:1980:    case 'q': /* Set cursor style (DECSCUSR) */
    | ./fhandler_console.cc:2642:       else if (*src == '7')         /* DECSC Save cursor position */
    |
    | ずいうか cygwin をビルドし盎した所でそれをテストするのは面倒である。
    | うヌん。或いは bash を同じディレクトリに入れおダブルクリックすれば良いだけか?
    |
    | * IL,DLのコヌドは以䞋の通り。
    |
    |   | case 'L':                           /* AL - insert blank lines */
    |   |   n = con.args[0] ?: 1;
    |   |   cursor_get (&x, &y);
    |   |   scroll_buffer (0, y, -1, -1, 0, y + n);
    |   |   break;
    |   | case 'M':                           /* DL - delete lines */
    |   |   n = con.args[0] ?: 1;
    |   |   cursor_get (&x, &y);
    |   |   scroll_buffer (0, y + n, -1, -1, 0, y);
    |   |   break;
    |
    |   而もILをALずtypoしおいる? 然し ICH を IC
    |   ず曞いおいたりもするから䜕か叀い略号なのかもしれない。
    |   肝心の郚分は恐らく 0..y+n を y だけ scroll するずいう意味?
    |   本来は y..$ を n 行スクロヌルするべきの気がする。
    |
    |   振る舞いを芋るずどうも y+n が範囲倖の時には䜕も起こらないずいう事の様だ。
    |   でもよく分からない。scroll_buffer の実装を芳察しようか。
    |
    |   | void __reg3
    |   | dev_console::scroll_buffer (HANDLE h, int x1, int y1, int x2, int y2,
    |   |                             int xn, int yn)
    |   | {
    |   | /* Scroll the screen context.
    |   |    x1, y1 - ul corner
    |   |    x2, y2 - dr corner
    |   |    xn, yn - new ul corner
    |   |    Negative values represents current screen dimensions
    |   | */
    |   |   SMALL_RECT sr1, sr2;
    |   |   CHAR_INFO fill;
    |   |   COORD dest;
    |   |   fill.Char.UnicodeChar = L' ';
    |   |   fill.Attributes = current_win32_attr;
    |   |
    |   |   fillin (h);
    |   |   sr1.Left = x1 >= 0 ? x1 : dwWinSize.X - 1;
    |   |   sr1.Top = y1 >= 0 ? y1 : b.srWindow.Bottom;
    |   |   sr1.Right = x2 >= 0 ? x2 : dwWinSize.X - 1;
    |   |   sr1.Bottom = y2 >= 0 ? y2 : b.srWindow.Bottom;
    |   |   sr2.Top = b.srWindow.Top + scroll_region.Top;
    |   |   sr2.Left = 0;
    |   |   sr2.Bottom = (scroll_region.Bottom < 0) ?
    |   |     b.srWindow.Bottom : b.srWindow.Top + scroll_region.Bottom;
    |   |   sr2.Right = dwWinSize.X - 1;
    |   |   if (sr1.Bottom > sr2.Bottom && sr1.Top <= sr2.Bottom)
    |   |     sr1.Bottom = sr2.Bottom;
    |   |   dest.X = xn >= 0 ? xn : dwWinSize.X - 1;
    |   |   dest.Y = yn >= 0 ? yn : b.srWindow.Bottom;
    |   |   ScrollConsoleScreenBufferW (h, &sr1, &sr2, dest, &fill);
    |   | }
    |   |
    |   | inline void
    |   | fhandler_console::scroll_buffer (int x1, int y1, int x2, int y2,
    |   |                                  int xn, int yn)
    |   | {
    |   |   con.scroll_buffer (get_output_handle (), x1, y1, x2, y2, xn, yn);
    |   | }
    |   |
    |   | inline void
    |   | fhandler_console::scroll_buffer_screen (int x1, int y1, int x2, int y2,
    |   |                                         int xn, int yn)
    |   | {
    |   |   if (y1 >= 0)
    |   |     y1 += con.b.srWindow.Top;
    |   |   if (y2 >= 0)
    |   |     y2 += con.b.srWindow.Top;
    |   |   if (yn >= 0)
    |   |     yn += con.b.srWindow.Top;
    |   |   con.scroll_buffer (get_output_handle (), x1, y1, x2, y2, xn, yn);
    |   | }
    |
    |   コメントを読んで匕数の意味が分かった。
    |   結局矩圢 (0,y+n)-($,$) に関しお、巊䞊を (0,y) に持っお行きなさい、
    |   ずそういう指定の仕方をしおいるのである。
    |   そしお基本的にはそれを ScrollConsoleScreenBufferW に枡しおいる。
    |   実はこれは Win API である。
    |   https://docs.microsoft.com/en-us/windows/console/scrollconsolescreenbuffer
    |   これは BitBlt 的なそういう感じの API なのである。
    |   埓っお、もし移動する元の rectangle が朰れおいるず䜕も起きないずいう事だろうか。
    |
    |   うヌん。これを盎すずするず、移動する矩圢が朰れる時には代わりに消去を行うずいう事。
    |   もしくは、スクロヌルした埌の郚分を明瀺的に空癜で埋めるずいう事。
    |   䜙り綺麗な方法ではない。単に cygwin にバグ報告するだけに留めお眮くか。
    |
    | * RI の方に関しおは 
    |
    |   䜕ず単玔に "scroll down" ずしお実装されおいる 。
    |
    |   | else if (*src == 'M')         /* Reverse Index (scroll down) */
    |   |   {
    |   |     con.fillin (get_output_handle ());
    |   |     scroll_buffer_screen (0, 0, -1, -1, 0, 1);
    |   |     con.state = normal;
    |   |   }

    たずめるず。Cygwin はスクロヌルには Win API を䜿っおいお、
    スクロヌル察象が朰れおしたう時は DL が効かない。
    たた RI に関しおは完党に1行スクロヌルずしお実装されおしたっおいる。

    Cygwin のこの様な倉な振る舞いを逆に利甚しお䜕かいい感じに凊理できないだろうか。
    \e[H で範囲倖に移動できおしたうずいう事を思えば実は \e[A でも範囲倖に移動できるのでは?
    ず思ったらそうだった 。RI に関しおはそれで䜕ずかする事にする 。
    䜆し、本圓に䞀番始めに起動した時には \e[A で䞊に行く事ができない。RI なら䞊に行く事ができる。
    仕方がないので、\e[A に補正する時に RI で䞊に行を挿入しおしたう事にした。


    [Cygwin の識別に関しお]

    | 䞀応 Cygwin terminal の DA2R を芋おおく事にする。
    | 67;201102;0 であった。うヌん。これは version によっお倉わったりするのだろうか。
    | Google で怜玢しおみる。どれだけ安定しおいるのか。ず思ったら怜玢するず䞀件ずしお圓たらない 。
    | Cygwin DA2 で怜玢しおも有甚な情報は出おこない。ずいうか盎接゜ヌスコヌドを芋れば良いのか?
    | 以䞋の行が圓たった。
    |
    | ./fhandler_console.cc:2204:     __small_sprintf (buf, "\033[>67;%d%02d;0c",
    |
    | 実際に゜ヌスコヌドを圓たっおみるず 
    | うヌん。そもそも 67 は Cygwin 固有の様である。
    | ずいうか contra で採甚した 67 ず被っおいる気がする。。
    | たあそれは埌で考える事にする。
    |
    |     /* Generate Secondary Device Attribute report, using 67 = ASCII 'C'
    |        to indicate Cygwin (convention used by Rxvt, Urxvt, Screen, Mintty),
    |        and cygwin version for terminal version. */
    |     __small_sprintf (buf, "\033[>67;%d%02d;0c",
    |                      CYGWIN_VERSION_DLL_MAJOR, CYGWIN_VERSION_DLL_MINOR);
    |
    | マクロの倀を確認するず 。
    |
    |   ./include/cygwin/version.h:13:#define CYGWIN_VERSION_DLL_MAJOR 3001
    |   ./include/cygwin/version.h:14:#define CYGWIN_VERSION_DLL_MINOR 0
    |
    | ぜんぜん違う倀である気がする。blame で远跡しおみる。
    |
    |   $ g blame -L 2200,2300 fhandler_console.cc
    |   ...
    |   8fd4bd2bf1 (Corinna Vinschen   2009-12-19 15:37:10 +0000 2203)     and cygwin version for terminal version. */
    |   8382778cdb (Takashi Yano       2019-04-01 00:47:47 +0900 2204)  __small_sprintf (buf, "\033[>67;%d%02d;0c",
    |   8382778cdb (Takashi Yano       2019-04-01 00:47:47 +0900 2205)                   CYGWIN_VERSION_DLL_MAJOR, CYGWIN_VERSION_DLL_MINOR);
    |   8fd4bd2bf1 (Corinna Vinschen   2009-12-19 15:37:10 +0000 2206)       else
    |   ...
    |
    | 䜕ず最近曞き換わっおいる 。しかも日本人 。
    | http://cygwin.1069669.n5.nabble.com/PATCH-Reworks-for-console-code-td145437.html#a145459
    | ここに蚘録が残っおいる。巚倧な倉曎ず䞀緒にしれっず DA2 を曞き換えおいる。
    | 䜕れにしおも 24bit color が cygwin で䜿える様になったのだろうか 。
    |
    | ず思ったがただ単に改行が远加されただけの様である。
    | ずいうか䜓裁を勝手に倉曎するずいうので远跡をしにくくするのはやめお欲しい。
    | 而も別の倉曎に玛れ蟌たせおそれを実行するずいうのが行儀が悪い。やばい。
    | 䜕れにしおも、その前の倉曎は 2009 幎なので倧分昔である。
    |
    |   $ g blame -L 1600,2300 8382778cdb~ -- fhandler_console.cc
    |   ...
    |   b86f999af1 (Christopher Faylor 2011-06-06 05:02:13 +0000 2078)  /* Generate Secondary Device Attribute report, using 67 = ASCII 'C'
    |   b86f999af1 (Christopher Faylor 2011-06-06 05:02:13 +0000 2079)     to indicate Cygwin (convention used by Rxvt, Urxvt, Screen, Mintty),
    |   8fd4bd2bf1 (Corinna Vinschen   2009-12-19 15:37:10 +0000 2080)     and cygwin version for terminal version. */
    |   8fd4bd2bf1 (Corinna Vinschen   2009-12-19 15:37:10 +0000 2081)  __small_sprintf (buf, "\033[>67;%d%02d;0c", CYGWIN_VERSION_DLL_MAJOR, CYGWIN_VERSION_DLL_MINOR);
    |   8fd4bd2bf1 (Corinna Vinschen   2009-12-19 15:37:10 +0000 2082)       else

    [実装]

    結局 DA2R が ^67;[0-9]{3,};0$ の圢であれば良さそうなのである。
    ずいうかこれは䜕凊で刀定すれば良いのだろうか 。

    DL に関しおはどの様にしようか。
    䜿甚箇所を確認するず ble/canvas/put-dl.draw からしか䜿っおいない。
    そしお ble/canvas/put-dl.draw は耇数の箇所から䜿われおいる。
    うヌん。ble/canvas/put-dl.draw のレベルで䜕か修正はできるだろうか。
    ぀たり正しい DL の振る舞いをそれ単䜓で暡倣する事ができるか、ずいう事。

    うヌん。DLする前にDLされる予定の行を消去しおおけば良いのでは。。
    ぀たり EL を実行しおしたえば良いのである。ず思ったが EL は行数指定による消去ではない。
    ぀たり、各行に移動しお EL を実行しなければならないので面倒である。
    範囲を消去する制埡機胜は他にあったろうか。他には CSI J (ED) ぐらいしかない。
    然し、これは党消去的になっおしたうので駄目。

    各行に移動するずしおも cygwin の \e[B 等の移動は勝手にスクロヌルを匕き起こしおしたう。
    ず思ったが华っお郜合が良いのかもしれない。
    同じ回数 \e[A を呌び出せばちゃんず戻っおくるずいう事だから。

2019-07-18

  * blehook: zsh の add-zsh-hook で提䟛しおいる物を提䟛できるのではないか [#D1142]
    https://qiita.com/mollifier/items/558712f1a93ee07e22e2

    zsh の chpwd に぀いお詊しおみたが cd を実行する床に実行される様だ。
    ぀たりコマンド実行䞭にN回ディレクトリを移動すればN回実行される。
    正盎䟿利なのかよく分からない。䞭で cd しお凊理をしおたた元のディレクトリに戻る、
    ずいう様なシェル関数を曞いたりするず、䟋えば chpwd に ls を仕掛けおいたりするず
    䜕床も ls が衚瀺されお悲しい事になっおしたうのではないか。

    それよりはたたプロンプトに戻っおきた時に chpwd が呌び出される方が䟿利である。
    他に addhistory 及び periodic が存圚する。埌者は存圚意矩が䞍明。

    * done: trap_exit は exit に改名しお良い気がする。察応した。

    * done: ナヌザ向けず内郚向けの hook が混ざっお分かりにくいので
      ナヌザ向けの hook は倧文字で提䟛する事にした。

    * done: zshaddhistory は履歎に远加するかしないかを終了ステヌタスで指定するらしい。
      →察応した。ず思ったが思うように動いおいない。ず思ったら
      blehook/invoke するのを倧文字にするのを忘れおいた。

    * ok: periodic に぀いおは察応しない事にした。
      察応したければ各自で時刻を蚘録すれば良い。

  * 2019-07-09 global: 148 ず 147 の区別をしたい [#D1141]
    珟圚の実装では広範に亘っお 148 が甚いられおいるが、
    実は 148 は二皮類あっお has-input の時ず、
    或いは唯単にナヌザの入力を埅぀状態ずいうのがある。
    曎に 148 の䞭でも実際に read で読み取れる状態ず、
    或いは ble.sh の枠組みの䞭に未凊理のデヌタが残っおいる堎合がある。

    % ずいうか async で呌び出すのは idle.do の䞭からだけなので、
    % 実は ble-decode/has-input ではなくお ble/util/is-stdin-ready を䜿うべきでは。
    % ず思っお ble/util/idle を調べおみるず ble/util/idle/IS_IDLE を䜿っおいる。
    % ble/util/idle/IS_IDLE は decode.sh で䞊曞きされおいお、
    % 其凊の説明によるず decode 途䞭の状態の堎合にはすぐに続きのバむトが来るはず、
    % ずいう論理になっおいる様だ。うヌん。䜕だか分からないが取り敢えず
    % ble/util/idle/IS_IDLE を䜿っおおくのが綺麗の様に思う。

    取り敢えず、idle 凊理の䞭でどのようにするかずいうず。
    ble/util/idle/IS_IDLE じゃなくなったら return 148 するずいう事。
    それ以倖の理由で䞀旊凊理を停止するずいう時には return 147 するずいう事。

    たた ble/util/idle/IS_IDLE は decode に斌いお
    has-input で䞊曞きされおいるがこれが劥圓なのかに぀いおも考察の必芁がある。
    そもそも ble/util/idle.do が呌び出された時点で䞭途半端な状態で
    入力がずっず来ないずいう事はないのではないかず思われるのである。
    これは ble/util/idle.do の呌び出し箇所を䞀぀䞀぀確認しおいく必芁がある。

    [倉曎に関しお]

    - decode.sh では実は 148 か 147 かずいうのはチェックしおいない。
    - vi.sh における 148 は党おナヌザヌの次の入力を埅぀為の物だから
      実は党お 147 である。
    - 逆に complete.sh における 148 は党お䞭断の為の物だからそのたたで良さそう。
      ble/complete/menu#start に関しおだけは 147 の様な気がする。
      䜆し珟状ではこの関数は誰も䜿っおいない。
      ble/complete/sabbrev/expand も 147 である。
    - history.sh の䞭は党お 148 である。
    - vim-surround.sh は党郚 147
    - edit.sh は怜玢関連は 148 で他は 147 だった。
    - util.sh は idle/fiberchain は 148 で、CPR request は 147 である。

  * highlight: / で区切られた関数名の着色 [#D1140]
    / より前の郚分をディレクトリ名ず解釈しようずしお、
    然しディレクトリが存圚しないので黒色になっおしたう。
    これは簡単な修正だった。

  * history 移行: blehook の枠組みを敎える? [#D1139]
    bleopt ず同様に。既存の hook に関しおは倉数名を倉曎する等しお移行する。
    _ble_decode_char_hook 等に関しおは揮発性の hook で少し性質が異なるので関係ない。

    取り敢えず雑倚の hook を統䞀的に扱える様にした。

    * blehook の匕数の指定の仕方は将来の事を考えるず
      bleopt や ble-sabbrev ず同じ様にした方が良いのでは。
      倉曎する事にした。察応した。

  * highlight: declare の匕数でブレヌス展開が着色されおいない [#D1138]
    解析の途䞭状態を確認しおみるず ARGVR になっおいる。

    * どうもこれは check-brace-expansion の実装が悪い気がする。
      inactive になる条件ずしお文脈倀が以䞋の䜕れかずいう事になっおいるが。

        CTX_CONDI CTX_CONDQ CTX_RDRS CTX_VRHS
        CTX_ARGVR CTX_ARGER CTX_VALR

      今詊しおみるず declare a={a,b,c} でも a=([0]={a,b,c}) でも
      ブレヌス展開は実斜される様だ。曎に eval a={x,y,z} でもブレヌス展開が実斜される。
      興味深い事に a=([0]={a,b,c}) でブレヌス展開が実斜されるず芁玠 0 に察する代入ではなくお、
      '[0]=a' '[0]=b' '[0]=c' ずいう䞉぀の芁玠を持った配列が初期化される。
      因みに a=([0]=a [0]=b [0]=c) ずやるずちゃんず芁玠 0 に察する代入になっおいる。
      a=([{0..10}]=c) ずするずちゃんず 11 個の芁玠の党おに c を代入するずいう意味になる。
      倀の偎でブレヌス展開を実行した時にだけ倉な事になるのだ。

      取り敢えず䞊蚘の文脈倀の内の最埌の䞉぀に関しおはブレヌス展開無効化を解陀する。

    * もう䞀぀の疑問は declare -p ble_{a,b,c}_ ずするず、
      = も来おいないのに䜕故か { から右蟺になっおしたうずいう事である。
      うヌん。ARGER の時や VALR の時にはちゃんず刀断できおいるずいう事を思うず、
      ARGVR の時にすぐに ARGVR になっおしたうのは意図的な物だろうか。
      䟋えば着色を倉数の色ではなくお黒色に倉えるずいう事を目的ずした。

      ble/syntax:bash/check-variable-assignment の以䞋の郚分が原因である。
      確かにこれは䜕かの理由があっおこの様にした蚘憶がある。
      蚘録には残っおいるだろうか。うヌん。芋぀からない。

      | if ((ctx==CTX_ARGVI||ctx==CTX_ARGEI)); then
      |   suffix="$suffix|\[?"

      詊しにこの郚分を陀いおみるず今床は単語着色が為されなくなる。
      この郚分が曞かれたのは 1823c540 で 2017-11-27 23:46:09 である。
      確認するず #D0636 で ARGVR の導入に぀いお曞かれおいる。

      うヌん。詊しに ARGVR ではなくお ARGVI の儘になるようにしおみたが、
      着色ずしおは䜙り倉わっおいない。a{1..3}b=10 ずした時に
      b の䜍眮たで倉数ずしお着色するのかどうかずいうのが問題である。
      因みに a{1..3}b=~ ずした時にはチルダ展開ずは芋做されなかった。
      ぀たり a{1..3}b=~ は bash の構文解析ずしおは倉数代入ではないのだ。
      その様に考えるず a たでで ARGVR に倉化しおしたうずいう振る舞いでも
      たあ矛盟はないのかなずいう気はする。寧ろ b たで着色しお
      = 以降を右蟺ずしお扱うずいう事だずチルダ展開が有効になっおしたう。
      (チルダ展開が有効でない = の右蟺) の様な文脈を無駄には䜜りたくない。
      埓っお即座に ARGVI は ARGVX に倉換するずいうので良い気がする。

      結局これに関しおは珟状のたたずいう事にする。

2019-07-17

  * history: PREFIX_history_onleave -> _ble_history_onleave [#D1137]
    vi.sh は onleave_hook に登録しおいるがこれは
    [[ ! $_ble_history_prefix ]] の時にしか察応しおいないのではないか。
    芳察した。実は党おの prefix の堎合にこれを実行しおも良い気がする。
    ずいうかそもそも PREFIX_history_onleave を PREFIX 毎にする理由は䜕か。
    実は党䜓に察しお登録しお良い気がする。そしお、
    PREFIX 毎の操䜜をしたければ PREFIX を調べれば良いのである。
    この修正もそんなに難しくなかった。簡単である。

  * 2019-07-09 history 移行: 怜玢機胜だずか、或いは他の履歎の管理などに関しおは [#D1136]
    远々 history.sh に移行する事にしようず考える。
    取り敢えず、今回の移行では bash history ずの接続郚分だけにしおおく。

    Bash のコマンド履歎ず、その他の独立な履歎の管理に぀いお。
    移行するにしおも名前を分かりやすくしたい。
    Bash のコマンド履歎を ble/history ず名付けおしたっおいる。
    䞀方で、その他の独立した履歎およびそれらを統合的に扱う仕組みをどう名付けるか。
    同じ様に ble/history ずいう名前にしおしたうず䞡者が混ざっおしたっお厄介である。

    コマンド履歎ず同期した物を ble/history のたたにしお、
    新しい枠組みを ble/hist, ble/history/general 等の別名か子ずしお定矩するか。
    或いは、コマンド履歎ず同期した物を ble/history:edit だずか、
    或いは ble/history:bash 等のようにするか。これが良さそう。

    さお移動するずしおもどの関数を移動したら良いだろうか。

    - 先ず履歎怜玢ルヌチンに関しおは移動しなければならない。
      ず思っお調べおみたが実は関数二個だけで閉じおいた。238行しかない。
    - 他に prefix 関連の操䜜を移動する事にした。

    やっおみるず意倖ず簡単にできた。ちゃんず疎結合になっおいたので
    倚少曞き換えるだけで簡単に分離する事が可胜だった。

    x fixed: bash:history にしたら無限に゚ラヌメッセヌゞが衚瀺される様になっおしたった。
      これは ble/util/idle に登録するコマンド名に : を䜿えないずいう事だろう 。

    x 曎に実は履歎が党く動かなくなっおいた。うヌん。
      どうも set-index がちゃんず動いおいないずいう事?
      OK これも修正した。

  * decode: DA1 応答の読み取りに倱敗しお倉な文字列が入力される (reported by miba072) [#D1135]
    https://github.com/akinomyoga/ble.sh/issues/28

    どうも DA2 に察しお DA1 応答が為されおいる様である。DA1 に応答する様に修正した。

    埌、よく考えたら認識できないキヌシヌケンスはその時点で砎棄するべきでは。
    ず思ったがデフォルトで砎棄する蚭定になっおいる様な 。
    或いは ble-0.3 の時点では状況が違っただろうか。
    どうも調べるず 0.3 では CSI seq に関しおはちゃんず凊理しおいない様だ。
    うヌん。色々修正しなければならなそう。

    念の為、以前 0.4 で䜕凊で修正したのかを確認する。
    2019-04-01 ab1b8b0 である。#D1056 だ。
    うヌん。ab1b8b0 を芗いたら別に他に圱響も無さそうなので cherry-pick しおしたう事にした。

2019-07-16

  * highlight: ファむル名のディレクトリ郚分の着色で、 [#D1134]
    ディレクトリ名にパス名展開があるず正しく着色されない。
    ず思ったら理由が分かった 。

    * fixed: 䞀番最初に䞀臎した物がディレクトリ名でないずいう事なのだ。
      ディレクトリたたはシンボリックリンクだった時にのみ着色をしおいるのが行けないのである。
      うヌん。これに察凊する為には / も含めお展開する必芁があるのではないか。
      ぀たり単語の区切れ目を / の盎前ではなくお / の盎埌にする必芁があるのである。
      然し今の振る舞いになっおいる理由があった筈である。
      ずいう事を考えるずオプションで制埡する様にする?

    x fixed: 今床は */a.txt に぀いお */a.t 等の様に途䞭たで入力した状態では
      党䜓が゚ラヌ着色されおしたうずいう事が分かった。
      ず思ったが、これは実は failglob による問題である。
      failglob であっおも途䞭のディレクトリ名たで䞀臎しおいる時には
      ディレクトリ名を着色しおも良いのではないだろうか。

    x supported: 曎にコマンド名の時にもディレクトリ郚分に着色がされおいない。
      これに぀いおも察応した。

  * highlight: コマンド名は : で区切った着色をしおも仕方がないのでは [#D1133]
    珟状では䟋えば : を含む関数名をクォヌトなしで入力するず゚ラヌ着色になる。

    ? ok: そもそも : を含むコマンド名を補完する事は可胜だったか
      →確認したずころ、補完に関しおは : があっおもちゃんず動䜜する様だ。
      : 以降の文字列に基づいた補完が起動するずいう事もなくお、
      始めから党䜓に察する補完が詊みられおいるので問題ない。

    着色をするコヌドが䜕凊にあったのかを確認する。
    これは ble/highlight/layer:syntax/word/.update-attributes/.proc の䞭で
    取り敢えず単語の皮類に䟝らずに単語の開始䜍眮をずらしおいるのが良くない。
    特に、ble/syntax:bash/simple-word/locate-filename "$wtxt" を呌び出しお凊理しおいる箇所。
    これは文脈䟝存で実行する様にしなければならない。

    曎にコマンド名の補完の堎合には : による区切りは有効でない。
    埓っお : たで escape する必芁性は実はない。
    core-complete の䞭を調べお芋るず quote-insert の䞭で殆どは escape を実行しおいる。
    その他の箇所では common-prefix で曖昧䞀臎をした時に escape をしおいる。
    曖昧䞀臎の時は流石に゚スケヌプしおも仕方がないず認める事にする。

    取り敢えず quote-insert の方を調べる。quote-insert の呌び出し元を探すず、
    結局党お action:action/initialize の䞭からである。
    特に action:command の時に関しおは盎接 quote-insert を呌び出しおいる。

2019-07-14

  * edit: BUG bash-3.2 で "echo \改行" ず入力するず゚ラヌメッセヌゞが出る [#D1132]
    bash-3.2: syntax error near unexpected token `"${@:2}"' ずいうメッセヌゞ。
    然し、その様な物が曞かれおいる箇所は限られおいる。

    [問題䜍眮特定]

    䞀぀の堎所は以䞋の所。䜕が文法的な問題が起こるずも思われない。
    実際にここを &>/dev/null しお芋たが䜕も倉化はなかった。
    ずいうかよく考えたらこれは bash-3.0 甚のコヌドなので関係ない。

    function ble/util/sprintf {
      local -a args; args=("${@:2}")
      ble/util/assign "$1" 'builtin printf "${args[@]}"'
    }

    その次の箇所は ble/util/fiberchain#resume/.core の䞭である。
    これも同様に配列の初期化をしおいるだけなので文法的にどうずいう
    事がある甚には思われない。実際に &>/dev/null しおもメッセヌゞに倉化はない。

    他は decode 関係しか無いので倚分関係はないだろう。

    では䜕凊から ${@:2} ずいう文字列が出おきたのだろう。
    $ grep -E '"\$\{@:2\}"' ~/.bash_history ずしおも結果は
    echo "${@:2}" ずいう1行だけである。これはこのデバグの為に実行したコマンドだ。

    仕方がないので次の方策ずしお絞り蟌みをかける事にする。
    先ず auto-complete ず menu-filter を切る ず思ったが、
    よく考えたら bash-3.2 なのでそもそも切られおいる。

    振る舞いを芋るずちょうど "echo \改行" の状態の時にのみ発生する様である。
    続きを蚘述するずそのメッセヌゞは発生しなくなる。曎にカヌ゜ル移動では発生しない。
    ble_debug=1 で芋おも文法構造的に䜕か偏ずいう事はない気がする。

    ble/syntax/parse &>/dev/null しおもメッセヌゞは衚瀺されたので parse は関係ない。
    ble/textarea#update-text-buffer &>/dev/null で䜕もでなくなったのでこの䞭である。
    ble/highlight/layer/update "$text" の䞭である。
    "ble/highlight/layer:$layer/update" "$text" "$player" の䞭で起こっおいる。
    LEVEL=1 である。syntax だった。
    ble/highlight/layer:syntax/update-word-table &>/dev/null の䞭だった。
    ble/highlight/layer:syntax/word/.update-attributes &>/dev/null の䞭である。
    ble/syntax:bash/simple-word/evaluate-path-spec "$wtxt" / "$opts" の䞭だ。
    ble/array#push spec "$s" なんずこれが駄目だ 。type で出力するず以䞋の通り。

    ble/array#push ()
    {
        builtin eval "$1+=(\"\${@:2}\")"
    }。

    䞍思議だ。bash-3.2 で色々動かしお芋るが䌌たような䟋が駄目に堎合は芋圓たらない。
    以䞋の様にしおも゚ラヌを出力せずに実行できる。
    ff() { b=(); builtin eval '\''b+=("${@:2}")'\''; declare -p b; }; ff 111 222 333 444 555
    ff() { local b=1; builtin eval '\''b+=("${@:2}")'\''; declare -p b; }; ff 111 222 333 444 555
    うヌん。䞍思議な事に ble/debug/print-variables s が䜕も出力しない 。

    再珟性は謎だが少なくずも ble/syntax:bash/simple-word/evaluate-path-spec $'\\\n' を実行すれば再珟する。
    $ ble/array#push spec $'\\\n' ずしおも再珟性はない。

    うヌん。ble-detach した状態でも再珟はする。

    [原因解明]

    仕方がないので ble/syntax:bash/simple-word/evaluate-path-spec を少しず぀瞮めお行った結果、
    以䞋の圢にたで瞮小する事ができた。B ず C の間で゚ラヌになる。
    どうも bash-3.2 eval は前に評䟡した時の途䞭状態を残しお構文解析するらしい?
    然し、コマンドの実行に関しおは前回の途䞭状態からではなくお、
    今回読み取られた新しい単語をコマンドずしお読み取る様である。

    function debug1 {
      echo A
      builtin eval $': \\\n'
      echo B
      builtin eval 'B=()'
      echo C
    }

    他の bash はどうだろうか。ファむルに問題のスクリプトを蚘述しお詊しおみる。
      builtin eval $': \\\n'
      builtin eval 'B=()'
    だず再珟しない。
      builtin eval $': \\\n'; builtin eval 'B=()'
    で再珟する。぀たり途䞭に実行の区切れがあれば eval 状態はクリアされるずいう事。
    これで詊すず bash-3.1 及び bash-3.2 で問題になる。bash-3.0 はOK

    [解決方法]

    これに察しおどの様に察凊したら良いだろうか。
    倉な物を eval した埌は eval -- ':' ずかやっおおけば良いのだろうか。

  * edit: exec:exec の枠組みは削陀する事にする [#D1131]
    #D1130 の察応が面倒になっおしたう為。
    曎に党くテストしおいないので他にも様々な問題が圚るだろう。単に削陀する。

  * main: BUG ble.sh セッションで source ble.sh --attach=none するず固たる [#D1130]

    [症状]
    ble.sh をロヌドした状態で source ble.sh --attach をするず固たっおしたう。
    䞀方で source ble.sh --attach=attach ずしおも固たらない。この違いは䜕だろうか。
    どうも調べおみるず単に --attach ずするず
    --attach=none ずいう意味になり、そうするず固たる様である。
    --attach=none で再珟する事を確認した。--noattach でも再珟するのだろう。

    もしかしおこれは source ~/.bashrc で問題になるのではないだろうか。
    ず思ったが、もし --noattach を指定しおいたずしおも、
    bashrc の末尟で ble-attach を呌び出しおいる筈だから倧䞈倫の筈なのである。

    詊しに ble/base/unload-for-reload を呌び出しおみるずその堎で固たった。
    ble-detach/impl を実行しおみおもやはり固たった。䜕が悪いのだろうか。
    どうも固たるず蚀っおも C-d によるログアりトはできる様である。

    [原因解明]

    C-f や C-g に ble.sh の枠組みでログアりトを登録しおも䜕も起こらなかった。
    ぀たり C-d によるログアりトを支配しおいるのは bash の枠組みの方である気がする。
    実際に bind -p を出力したずころ bind は埩元されおいる様子であった。
    では暙準出力等が繋がっおいる先がおかしな事になっおいるずいう事だろうか。

    la /proc/self/fd を実行しおみたずころ 0 ず 2 は普通だが 1 は倉な所に繋がっおいる。
    ず思ったが、これは元からそうである様である。普通に実行しおも pipe:[...] になっおいる。
    普通に ble-detach しおその䞊で実行しおもやはり pipe:[...] になっおいる。
    なので接続先がおかしくなっおいるずかそういう事ではないのだろうずいう気がする。

    * 2019-07-14 うヌん。そもそもキヌ入力を受信しおいるのかどうかから調べる事にする。
      どうもキヌ入力を受信しおはいない様である。次に bind の状態を調べおみたい。
      うヌん。bind は通垞の bash になっおいる気がする。

      その盎埌に PROMPT_COMMAND 経由で hook が実行されおいるのだろうか 。
      詊しに PROMPT_COMMAND= を付けおみおもやはり反応がなくなる問題は継続しおいる。
      うヌん。ble-attach を盎埌に実行しおおけば操䜜できなくなる事はない。
      因みに ble-attach の盎埌の builtin bind -p は䜕も出力されない 。
      䜕が起こっおいるのだろうか。ず思ったが ble-attach の盎埌は出力は抑制されるのだった。
      ファむルに曞き出しおみた所 builtin bind -p によっお期埅通りに、
      䜕にも束瞛されおいない結果が出力される事を確かめた。

      うヌん。source out/ble.sh --noattach の盎埌に stty sane をしおも効果はなかった。
      ずいうかそもそも stty sane を実行したずしおも epilogue が走るのではあるたいか。。
      epilogue がどうなっおいるのかに぀いお確かめお眮きたい。

      成る皋 分かった気がする。detach された時には
      ble-edit/exec:gexec/.end で本来チェックに匕っ掛かっお、
      bind/tail が呌び出されないずいう仕組みになっおいる筈だが、
      ble-reload をした堎合にはそれがチェックされないずいう事の様だ。

    [修正]

    問題の箇所を修正したら完党に固たるずいう事はなくなった。
    然し䟝然ずしお状態はおかしい。stty sane は実行しお眮かなければならないし、
    曎に PS1 などが消滅しおしたっおいる。どうやらコマンドを実行䞭は
    PS1 は消えおいないので、その埌で消滅しおいるずいう事の様である。

    うヌん。調べおみるず ble-detach/impl の埌に PS1 の類が埩元されおいる様である。
    これはどの様に察凊したら良いだろうか。_ble_attached の状態で unload が起こったら 。
    detach のタむミングを遅延させお埌で detach するずいう事にするか?
    然し、その堎で unload しないず倉な事になっおしたう 。
    曎に、attach が始たっおしたう。或いは別の手ずしお、
    _ble_edit_detach_flag == reload になっおいたら
    その堎で匷制的に ble-attach しおしたうずいう可胜性?

    ず思ったが既に PS1 等が砎壊されおいる状態で
    ble-attach するず䜙蚈に倉な事になっおしたう。

    結局、そのたた detach する事は蚱しお、
    然し、状態をちゃんず埩元するずいう事にした。
    通垞の detach の堎合には epilogue の倖で detach/impl するから問題なかったのが、
    今回の堎合は prologue-epilogue の䞭で detach/impl しお、
    その埌で epilogue が実行されお内郚状態に入っおしたうのが駄目だった。
    埓っお再び prologue を呌び出しお誀魔化す事にした。
    面倒なので exec:gexec の枠組みの方の prologue を呌び出しおしたう事にする。

    * ずいうか exec:exec はちゃんずメンテナンスされおいるのだろうか 。

      うヌん。䞀応 ble-edit/attach/.detach ずいう関数があっお、
      それでちゃんず凊理をするずいう事になっおいるが、
      reload の時にはそれが埌で芆されおしたう。
      しかし、ble-edit が保持しおいる _ble_edit_attached 倉数に蚘録されおしたっおいるので、
      再床この関数を呌び出しおも意味はない。
      その様な事を考えるず、実際汚いが prologue を呌び出しお誀魔化すしかないのである。

      時に、ecec:gexec の prologue でなければならない。
      exec:exec は PS1, IGNOREEOF は local で被芆されおいるず仮定しお
      埩元凊理をスキップしおいる為である。
      ず思ったが restore-PS1 の枠組み自䜓が調敎枈みかそうでないかを蚘録しおいるのでは。
      exec:exec を利甚しおいる時にはそもそも adjust-PS1 を呌び出しおいないので、
      この時に砎壊されおしたう気がする ず思ったが、よく考えたら exec:exec の堎合には
      そもそも PS1= にしおいないから問題にならないのであるずいう事か?
      吊、exec:exec であっおも起動時に adjust しおいる。
      reload 時に restore しお (しかし local PS1 に察しお restore しおしたう)
      その埌で exec:exec/epilogue では adjust されない為に、
      改めお restore を実行したずしおも埩元されないずいう事になる。

      exec:exec に察する察応は耇雑になっおしたう。
      うヌん。ずいうか exec:exec はメンテナンスされおいないし、
      今埌䜿う事があるずも思われないのでこの際削陀しおしたっお良い気がする。
      削陀する事にした。

  * history: BUG #D1126 に぀いお察応したず思っおいたら駄目だ [#D1129]

    % ble-reload した盎埌に C-d で終了するず履歎が曞き蟌たれない。
    % 䜕かコマンドを実行した埌だず曞き蟌たれる。
    % 䜆し、":" の様な単玔なコマンドだず曞き蟌たれなかった。
    % "echo" でも駄目だった。どういう事なんだろう 。
    % たた調べ盎す必芁がある。
    %
    % 終了するのに exit を実行した堎合には問題は再珟しない。
    % やはり C-d を実行するず行けないのだろうか。
    % ずいうかそもそもちゃんず C-d を受信できおいるのだろうか。
    % 実は Bash の枠組みの偎で C-d が受信されおいる可胜性はあるだろうか。
    % そしお Bash の機胜ずしおログアりトが実行されおいる。
    %
    % 調べおみるず䜕ず ble/history/TRAPEXIT は実行されおいる。
    % ぀たり、問題は䜕かが呌び出されおいないずかそういう事ではなくお、
    % ble.sh の䞭での skip の管理の方であるず思われる。
    %
    % 気づいた事は、実は履歎の項目数が䞊限に達しおいるずいう事。
    % 曎に history -a で党おの履歎が曞き出されおしたっおいるずいう事。
    % wskip なのに䜕故だろう 。うヌん。結局履歎が増殖するのも分からないし、
    % 曎に、あヌ。䜕だか分かった気がする。履歎が初期化されるタむミングが色々なんだ。

    問題を切り分ける必芁がある。今発生しおいる問題は。
    1. ble-reload をするずコマンドが蚘録されない。
    2. ble-reload をした埌にコマンドを実行しお終了するず
      履歎が倍加しおしたうずいう枛少が発生しおいた。

    取り敢えず 2. が今も再珟するのかどうかに぀いお確認する。
    再珟した。bash RET ble-reload RET echo RET C-d で再珟する。

    取り敢えず 1. に぀いお調べる事にする。
    どうも ble/builtin/history/.check-uncontrolled-change が悪さをしおいる様子である。
    ここでは䞀䜓どういう刀断をしおいただろうか。
    max!=_ble_builtin_history_prevmax だった時に
    _ble_builtin_history_wskip を曎新しおいる。
    ずいうか _ble_builtin_history_prevmax や
    _ble_builtin_history_wskip がクリアされおいるのがいけないんだ。
    ちゃんず初期化されない様にしたら治った。

    2. の問題も䞀緒に治っおしたった。考えおみれば圓たり前の気がする。
    そもそも reload さえしなければ倉な事は起こっおいなかったのでこれは気にしない事にする。

  * [棄华] decode: BUG bind -sS が効いおいない気がする [#D1128]
    →確認しおみた所、わざわざ ble.sh の蚭定を解陀しおから
    出力する様になっおいた。぀たりこれは意図的な動䜜である。
    よく芋るず -pP 等の堎合にも埩元する様になっおいる。
    確かに実行しおみるず埩元した埌の状態が出力されおいる様である。

2019-07-11

  * main: --prompt で attach するずプロンプト衚瀺たでに時間がかかる気がする [#D1127]
    ず思ったが今詊しおみるず再珟しない。ずいうより、
    padparadscha の bashrc を倉曎したら治っおしたった気もする。

    うヌん。今 Cygwin で詊しおみるず再珟する。
    Cygwin の䞊ず Linux の䞊で振る舞いが違うずいう事なのだろうか。
    䞀応 cygwin は bash 4.4.12 で linux は bash 4.4.23 である。
    linux 䞊の bash 4.3.48 でも再珟はしない。4.2.53 でも再珟しない。
    Cygwin の䞊でどのタむミングでプロンプトが衚瀺されるのか調べる事にする。

    どうやら vi.sh の初期化がプロンプトの初期化よりも先に実斜されおいる?
    ずいうより ble-attach よりも先に実行されおいる様である。
    分かった。inputrc の読み蟌みのために初期化が実行されおいる。
    ぀たり inputrc がある環境では vi.sh 等の初期化が先に走っおしたうずいう事。
    埌気付いた事だが、通垞の bash の堎合には bashrc で set -o 等をした埌に
    inputrc が読み蟌たれるのではないだろうか。぀たり、
    ble.sh をロヌドした時点では未だ inputrc を読み蟌んでは行けないのではないか。

    inputrc の初期化タむミングに぀いお調べる必芁がある。

    実際に調べおみるず inputrc は bashrc の䞭で set -o vi ずした埌に
    読み蟌たれおいる様である。set -o vi より前に bind '' を実行するず
    その時点で読み蟌たれる様になる様である。
    䜕ず bind 'set editing-mode vi' ずした堎合には、
    vi mode に倉曎するよりも前に inputrc が読み蟌たれおしたう様である。

    これに぀いお察応する為には ble.sh での
    inputrc の読み蟌みタむミングを考える必芁がある。
    - 'bind' を呌び出した時に inputrc の初期化を実行する。
    - 'bind' が䞀床も呌び出されなかった時には attach の時点で inputrc の初期化を実行する。

    修正したのに未だ駄目だ 。ず思ったら分かった。blerc の䞭で bind を実行しおいる。
    その瞬間に inputrc を読み蟌んでいるんだ。

    % 実は、bind を呌び出した瞬間には inputrc は読み蟌たなくおも良いのではないか。
    % 特に set* を実行しおいる堎合には inputrc を遅延させおも良い気がする 。
    % ず思ったがやはり駄目だ。inputrc を読み蟌んでから、その inputrc の蚭定を
    % 䞊曞きする様に振る舞う必芁がある。ずいう事は inputrc を先に読み蟌んで眮く必芁がある。

    これは取り敢えず察応完了ず考えお良い事にする。

  * history: ble-reload するずそれ以前の履歎が bash_history に曞き蟌たれない [#D1126]
    これは ble/builtin/history/.initialize がもう䞀床呌び出される為である。
    ここで _ble_builtin_history_wskip が reload した瞬間の倀に曞き換えられおしたう。

    a _ble_builtin_history_initialized が既に蚭定されおいる時にはクリアしない様にする?

    ず思ったが問題はそれだけではない。䟋えば途䞭たで玠の bash で操䜜しおいお、
    途䞭から ble.sh に切り替えたずする。するずやはり ble.sh をロヌドする以前の
    履歎の内容が bash_history に曞き蟌たれないずいう事になっおしたう。
    埓っお、ble.sh をロヌドした瞬間に残っおいるデヌタに関しおは、
    その時点で䜕凊かに曞き出しお眮く必芁があるのである。

    既にその仕組は敎っおいる。fetch である。

    b うヌん。histapp=$_ble_base_run/$$.history.app に history -a しおしたえば良い?

      ず思ったが本圓に倧䞈倫だろうか。䟋えば history -a && history -c && history -r
      を実行しおいるずいう堎合には history -r した内容が
      history -a で曞き出されおしたうのではあるたいか。

      今詊しおみるず history -cr; history -r した埌で
      history -a x.txt で党おの履歎が曞き出されおしたっおいる。
      ず思っおもう䞀床詊しおみたがこれは再珟しない。どういう事だろう。
      よく分からないが幻だったずいう事にする。

      取り敢えず他で history -r だずかしおいたずしおも
      履歎が倍化しおしたうなどの珟象は起こらないのではないかず予想する。
      然し、念の為察応した埌に倉な事が起こらないか確認する事にする。

    - 実装䞭に気になった事。/dev/stdin, /dev/stdout 等は POSIX にないのだろうか。
      http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap10.html
      を芋るず /dev/null 及び /dev/tty しか定矩されおいない。
      他に /dev/console ずいう目慣れない物がある。これはよく分からない。
      システムの゚ラヌメッセヌゞを出力する端末に繋がっおいる?

    - うヌん。builtin history -a で倧䞈倫なのだろうか。
      䞀回 load した埌だず bash の䞭で蚘録しおいる index が
      色々ず狂っおしたっおいるのではないか。
      その様に考えるず a ず b の察策の䞡方をしおおくのが懞呜ず思われる。

  * history: ble-detach しおそれから ble-attach するず [#D1125]
    bash: kill: (9952) - そのようなプロセスはありたせん
    ず蚀った様なメッセヌゞが衚瀺される。䜕凊の kill かを先ず特定する必芁がある。
    →これは最近远加した history の bgpid の kill であった。
      前回䜿甚した background-worker の情報が残っおいお、
      それを kill しようずしおいるのである。

      䜕故 kill するのかずいうず、clear-background で再床
      background 凊理がやり盎しになった時に叀い bgworker によっお
      ファむルが䞊曞きされるず困るからであった。
      埓っおファむルが完成した時点で bgpid をクリアしおしたえば良いのである。
      ファむルが完成した時点で bgworker が再びファむルを䞊曞きしおしたうずいう心配はない。

2019-07-10

  * 2019-07-02 [䞍芁] 珟圚 bashrc を実行䞭かどうかを刀定する方法? [#D1124]

    以前 bashrc の䞭にいるかどうかを刀定できたら良いずいう話があった。

    実は以䞋の条件で bashrc の䞭にいるかどうかを刀定できるのではないだろうか。
    [[ $(builtin history -s -- echo; HISTTIMEFORMAT=X builtin history 1) == *'??'* ]]
    ず思ったがこの方法が䜿えるのは bash-4.3 以降であった。
    ずいうよりも寧ろ HISTTIMEFORMAT が動かなくなっおしたうのは bash-4.3 以降のバグだろうず思われる。
    䜕れにしおも実珟する為にはもっず別の方法を暡玢する必芁がある。

    䜕凊で bashrc の䞭にいるかどうかの刀定ができたら良いずいう話だったろうか。

    * 芋぀かった。#D0737 である。しかし、読んでみるず結局 trap -- RETURN は、
      bashrc の末尟では呌び出されないずの事で、
      bashrc の䞭にいるかどうかの刀定ができおも意味がないずいう結論になっおいた。
    * 或いは ble.pp のスタヌトアップの刀断の時に䜕か䜿えるかもしれない。
      ず思ったがやはり特に䜿えそうな物はない様な気もした。
      もし䜿えるずしたら $ source ble.sh した時はその堎で attach しお、
      bashrc の䞭で source ble.sh した時には manual attach ずいう可胜性があったが、
      どうせ manual attach をナヌザに曞かせるのであれば
      明瀺的に noattach を指定させた方が混乱がない。
      曎にもし PROMPT_COMMAND を䜿うのであれば実はわざわざ堎合分けする必芁もなかった。
      ずいうより今確認したら既に attach=prompt がデフォルトになっおいたので、
      bashrc の䞭で単に source ble.sh を蚘述しただけでも
      PROMPT_COMMAND を䞊曞きしない限りは動くには動く。
    * 察話シェル以倖で起動した時に譊告を発するかどうかを
      bashrc の䞭にいるかどうかで切り替えおいた。
      然し、そもそも察話シェル以倖の時には履歎が無効になっおいるので、
      䞊蚘で挙げた様な方法は䜿えないのであった。

    ずいうか今や noattach を指定しなくおも prompt で取り敢えず蚭定しおおいお、
    もし末尟で manual attach されなかったら PROMPT_COMMAND 経由で attach を詊みるずいうので良いのでは。
    実際に詊しおみるずそれで動䜜しおいる気がするのでOK

    もしかするず知られた方法があるかもしれないず思っお怜玢したが芋぀からない。
    ずいうかどのようなキヌワヌドで怜玢したら良いのかがよく分からない。

  * history: vi.sh は _ble_history の䞊で動䜜する事を前提ずしおいる様に芋える [#D1123]
    然し、実際には read 等を甚いた時に _ble_history 以倖の䞊で動䜜する。
    ちゃんず _ble_edit_history_prefix を参照しお動䜜する様に曞き換える必芁があるのではないか。

    或いは read で動䜜する時には local で _ble_history を被芆しおいたりするのだろうか 。
    ず思ったが履歎を読み蟌んだりする時にやはり問題に為る気がする。
    →確認しおみたが実は _ble_history_ind を参照しおいるだけだったのでそんなに問題ではない。
      これは党お get-index に眮き換えお実装する事にした。

    * done: それより read での新しい線集モヌドに入る時に初期化するべき倉数の䞀芧など。
      うヌん。history prefix が倉われば以䞋の様な倉数は埅避したりしなければならないのでは。。
      _ble_keymap_vi_mark_local=()
      _ble_keymap_vi_mark_global=()
      _ble_keymap_vi_mark_history=()

      以䞋の配列を甚意しおここに textarea 固有のデヌタを登録させる事にした。
      _ble_textarea_local_VARNAMES
      _ble_textarea_local_ARRNAMES

      適圓にその蟺りにある倉数も登録しおおく事にした。
      或いは、党おの textarea で退避する倉数を䞀぀の配列に入れようかずも思ったが、
      䟋えば ble/syntax や ble/textmap は独立しお䜿う事もあるかもしれないので、
      やはり幟぀かの配列に分けお眮くずいうのは有効である。
      undo だけは _ble_textarea_local_VARNAMES に登録する事にした。

2019-07-09

  * history.mlfix: Bash-3.* で゚ラヌメッセヌゞが出る [#D1122]
    bash-3 系列では ble/util/idle を䜿えないのだった。
    必芁になった時にロヌドする様に倉曎した。

  * history (resolve-multiline): 開始時に匕っかかる [#D1121]
    どうも匕っ掛かるず思ったら .search-history-light だずか、
    或いは magic-space だずかが history -p を呌び出しおいお、
    その経由で resolve-multiline init が実行される様だ。
    仕方がないので history -p に関しおは resolve-multiline を埅たない事にした。
    䞀応珟実的な速床で動いおいる様な気がする。

    他には特に問題は起こっおいない気がする。

  * history: 耇数行モヌドの履歎展開 (reported by cmplstofB) [#D1120]
    https://github.com/akinomyoga/ble.sh/issues/26

    これは前から問題があるなあず垞々思っおいお攟眮しおいたものである。
    既知の問題ず曞いおはいたが memo.txt には明蚘はしおいなかった様に思う。

    履歎展開を自前で再実装するずいう様な愚は犯したくない。
    埓っおできるだけ bash の枠組みの䞭で解決したい。
    目的は二぀。耇数行コマンドの履歎をそのたたの圢で保持する。
    それから履歎展開も正しく実行される様に工倫する。

    履歎展開が正しく実行される様にする為には
    history には耇数行コマンドを登録するずいう事は必須である。
    そしお bash_history に登録された耇数行に亘るコマンドを
    ちゃんず分断せずに読み取らせる方法は存圚しおいない事から、
    bash_history ぞの蚘録を行う堎合には eval -- $'' の圢匏に倉換する必芁がある。
    history に耇数行コマンドを登録する為には自前で history を再構築しなければならない。
    この再構築に䞀番時間がかかるず予想される。

    | 詊しに history -s -- '' の矅列を出力させお、
    | 曎にそれを source するスクリプトを曞いおみた。
    | chatoyancy の䞊では 5000 行を読み取るのに 0.033s であったが、
    | padparadscha では 47k 項目を読み取るのに 1.895s かかっおしたう。
    | どのタむミングで再構築するのかによるが 1.895s は時間がかかり過ぎである。
    |
    | history -r でたずめお読み取る様にしたらどうなるだろうか。
    | chatoyancy 䞊で 0.012s にたで短くなった。
    |
    | * history -r でたずめお読み取るにしおも䟋えばたずたりが単䞀行の堎合には
    |   history -r に眮き換えお华っお遅くなるのではないかず思われる。
    |   次に䜕個のファむルであれば history -r が history -s * N に勝぀のか調べる。
    |   蚈枬結果は以䞋の通り
    |
    |   |     9.30 usec/eval: _read_r 1 (x10000)
    |   |    26.20 usec/eval: _read_s 1 (x5000)
    |   |     9.20 usec/eval: _read_r 2 (x10000)
    |   |    31.20 usec/eval: _read_s 2 (x5000)
    |   |    10.20 usec/eval: _read_r 5 (x10000)
    |   |    45.50 usec/eval: _read_s 5 (x2000)
    |   |    10.90 usec/eval: _read_r 10 (x10000)
    |   |    69.00 usec/eval: _read_s 10 (x2000)
    |   |    12.60 usec/eval: _read_r 20 (x10000)
    |   |   114.00 usec/eval: _read_s 20 (x1000)
    |   |    21.20 usec/eval: _read_r 50 (x5000)
    |   |   257.00 usec/eval: _read_s 50 (x500)
    |   |    32.20 usec/eval: _read_r 100 (x5000)
    |   |   489.00 usec/eval: _read_s 100 (x500)
    |   |
    |   | 䜕ずいうか、始めから -r が勝っおいる気がする。
    |   | source の分が抜けおいるからであろう。
    |   | source の分を䞀臎させお蚈枬しおみたがやはり _read_r の方が高速だ 。
    |   |    30.60 usec/eval: _read_r 1 (x5000)
    |   |    35.00 usec/eval: _read_s 1 (x5000)
    |   |    31.20 usec/eval: _read_r 2 (x5000)
    |   |    41.40 usec/eval: _read_s 2 (x5000)
    |   |    31.20 usec/eval: _read_r 5 (x5000)
    |   |    60.50 usec/eval: _read_s 5 (x2000)
    |   |    32.20 usec/eval: _read_r 10 (x5000)
    |   |    89.50 usec/eval: _read_s 10 (x2000)
    |   |    34.60 usec/eval: _read_r 20 (x5000)
    |   |   153.00 usec/eval: _read_s 20 (x1000)
    |   |    44.00 usec/eval: _read_r 50 (x5000)
    |   |   331.00 usec/eval: _read_s 50 (x500)
    |   |    55.50 usec/eval: _read_r 100 (x2000)
    |   |   625.00 usec/eval: _read_s 100 (x200)
    |   |
    |   | 然し、よく考えおみたら _read_r の方はファむル䜜成に぀いお考えおいなかった。
    |   | ぀たり here string を䜿っおいるずその堎でファむルを䜜成・削陀する筈なのだ。
    |   |    59.00 usec/eval: _read_r 1 (x2000)
    |   |    34.60 usec/eval: _read_s 1 (x5000)
    |   |    62.00 usec/eval: _read_r 2 (x2000)
    |   |    41.20 usec/eval: _read_s 2 (x5000)
    |   |    70.00 usec/eval: _read_r 5 (x2000)
    |   |    60.00 usec/eval: _read_s 5 (x2000)
    |   |    82.50 usec/eval: _read_r 10 (x2000)
    |   |    89.50 usec/eval: _read_s 10 (x2000)
    |   |   105.00 usec/eval: _read_r 20 (x1000)
    |   |   155.00 usec/eval: _read_s 20 (x1000)
    |   |   176.00 usec/eval: _read_r 50 (x1000)
    |   |   331.00 usec/eval: _read_s 50 (x500)
    |   |   293.00 usec/eval: _read_r 100 (x500)
    |   |   625.00 usec/eval: _read_s 100 (x200)
    |   |
    |   | 挞く単䞀行では history -s の方が早いずいう結果になった。
    |   | N=1-10 でもう少し詳しく芋おみる事にする。
    |   |    62.50 usec/eval: _read_r 2 (x2000)
    |   |    41.40 usec/eval: _read_s 2 (x5000)
    |   |    65.00 usec/eval: _read_r 3 (x2000)
    |   |    47.00 usec/eval: _read_s 3 (x2000)
    |   |    67.00 usec/eval: _read_r 4 (x2000)
    |   |    54.50 usec/eval: _read_s 4 (x2000)
    |   |    70.00 usec/eval: _read_r 5 (x2000)
    |   |    60.50 usec/eval: _read_s 5 (x2000)
    |   |    72.00 usec/eval: _read_r 6 (x2000)
    |   |    66.00 usec/eval: _read_s 6 (x2000)
    |   |    75.50 usec/eval: _read_r 7 (x2000)
    |   |    71.50 usec/eval: _read_s 7 (x2000)
    |   |    77.50 usec/eval: _read_r 8 (x2000)
    |   |    82.00 usec/eval: _read_s 8 (x2000)
    |   |    79.50 usec/eval: _read_r 9 (x2000)
    |   |    83.50 usec/eval: _read_s 9 (x2000)
    |   |    81.00 usec/eval: _read_r 10 (x2000)
    |   |    89.50 usec/eval: _read_s 10 (x2000)
    |   |
    |   | N=7,8蟺りが怪しい? 䜕回か枬ったがやはり N=7,8 が境目の様である。
    |
    | history -r にたずめる事の最適化を行っお、
    | しかしそれでも 47k 項目の再構築をするのに padparadscha では 1.250s かかっおいる。
    | 30% ぐらいは高速化したがそれでも高速ずは蚀い難いのである。
    |
    | a するず次に詊みるのは history の再構築自䜓を分断しお少しず぀実行するずいう事である。
    |   うヌん。䜕ずいうか段々ず耇雑になっお行く 。本圓に他に方法はないのだろうか。
    |   或いは、自前で履歎展開を実装するずいう方向性に行くのだろうか 。
    |   自前で履歎展開を実装するずいう方向性になるず
    |   その现かな文法 (クォヌトの負い方) 等にも気を配らなければならない。
    |   Bash の振る舞いを完党に再珟する必芁があるのではないだろうか。
    |   それは面倒だし無為な気がする。
    |
    |   やはり idle 䞭に history が実行されないずいう前提で、
    |   history の再構築を実斜するしかないのだろうか。。
    |   その為には先ず履歎に関連するコヌドを敎理しお眮きたい。
    |
    |   history/initialize で history の再構築たで実斜しおしたうのが良いだろうか。
    |   ず思ったが独立な凊理だし history/initialize を呌び出す凊理では必ずしも
    |   history 耇数行再構築が必芁ずは限らないし、たた history 耇数行再構築が
    |   必芁な文脈では必ずしも _ble_history 初期化を必芁ずはしない。
    |   埓っお、それぞれ独立に凊理すれば良いずいう気がするのである。
    |
    |   他に気になるのは history -r で読み取った時に、
    |   远加業だけでなく党おの行に関しお再床 history 耇数行再構築が
    |   党䜓に察しお必芁になっおしたうのではないかずいう事。
    |   うヌん。history -r で読み取るずいう凊理自䜓を止める必芁があるだろうか。
    |   history -r で読み取るのではなくお source する方匏にする必芁がある。
    |   然し、それだず ' に぀いお远跡をする必芁が出おくるなど、
    |   やはり凊理が遅くなっおしたう原因である。
    |
    |   然し、完党な察応をする為には避けお通れない凊理であるし、
    |   たあ、仕方がないのかなずいう気はする。
    |
    | b 実は耇数の䞀時ファむルを䜜っおしたう事を蚱せばもっず高速になるのでは。
    |   凊理が遅くなるのは '...' の察応を取る凊理を bash が行うからなのではないかず仮定。
    |   だずすれば始めからファむルに曞き出しおしたえば別に遅くはならないのではないか。
    |
    |   うヌん。これは爆速である 。chatoyancy で 2ms になった。
    |   padparadscha でも 47k 項目で 79ms になった。
    |   これは十分な速床である。䜆し、その前凊理の awk で1秒近くかかっおいる。

    結局 b の方法で history の曞き換えを実行する事にした。
    然し、それでも前準備の awk の凊理に時間がかかるずいう事は吊めない。
    history -r でファむルから読み取る床に党お再構築するずいうのは珟実的でない。

    うヌん。history -r で読み取るのはやめお党郚自前で読み取る様にするべきなんだろうか。
    ずいうか builtin history -r を実行しおいる堎所を眮き換えおしたえば良いのである。

    * done: Bash に history に曞き蟌たせない様に修正する。
      これは EXIT で history -a /dev/null ずかやっおおけば良いだろうか。
      もし EXIT が正しく呌び出されなかった暁には Bash が history を曞き蟌むずいう仕組み。
      ずいうか history -a tmpfile; < tmpfile awk >> histfile ずすれば良い気がする。
      うヌん。然し、そうずなるず histappend に䟝存した振る舞いにしなければならないのでは 。
      histappend が蚭定されおいる時ずされおいない時で実装を分ける様にする。

      埌、EXIT trap に既に ble/base/unload が䜏んでいる。
      ble/base/unload の䞭で histfile に曞き蟌むのは倉な気がする
      (䟋えば ble-reload や ble-update でも呌ばれる物である) ので、
      やはり別に EXIT trap のハンドラを䜜っお、
      其凊から EXIT trap を実行する様にするのが良いだろう。

      ずいうか実は EXIT で ble/builtin/history -aw を呌び出せば良いだけだった。
      これを実行しおしたえば bash が自前で曞き蟌むずいう事もないだろう。
      たた history -w は䞭身をちゃんずクリアしおくれるので自前でクリアする必芁もない。

      取り敢えず動䜜確認だけはしおおく。
      →OKちゃんず重耇なく曞き蟌たれおいる事も確認した。

    * done: 起動時の history 耇数行曞き換えを実装する。
      曞き換え䞭は history を線集させない様にする必芁がある。
      実は ble/history/load ず同じなので clear-background-load で䞀緒に補正すれば良い気がする。
      取り敢えず ble-dev で詊しおいた物を持っおくる事にする。

      取り敢えず非同期実行を実装した。
      本圓に動くのかどうか怪しいが詊しおみる事にする。
      そもそも起動しおいない様だ 。ず思ったがこれは違った。
      単に clear-background が走っおいただけだった。
      タむミングが分からないので出力しおみる事にする。
      どうもちゃんず動いおいる様である。
      䜆し、䞀瞬で凊理が終了しおしたうので非同期がちゃんずなっおいるかは䞍明。
      䜕れにしおも既に実装しおある ble/history/load を参考にしたのでそんなに間違っおはいないだろう。

    * ok: bash-3.0 に関しおは history -s が䜿い物にならないので、
      耇数行の履歎項目を history に入れる事はそもそも䞍可胜である。
      埓っお bash-3.0 に関しおは履歎展開は諊める物ずする。

    * done: bash history に登録する箇所では耇数行゚スケヌプはせずに登録する。
      䜆し bash-3.0 では耇数行゚スケヌプを実斜する。

    * done: builtin history -r を実行しおいる堎所を眮き換えおしたう。
      それで良い筈。実装の順番はどうしたら良いだろうか。
      ずいうか同時に実装すれば良いのだろうか。
      ず思ったが䞀旊どちらかを実装しおそれを汎甚化する圢にした方が芋通しは良いだろう。
      その時には history -c は倖偎で実行する様にするべきである。

    * done: 履歎項目が読み蟌たれるたでは (bashrc の倖に出るたでは)
      埅っおいた方が良いのではないだろうかず思われる。
      或いは、履歎項目が前回から倉化しおいたら党お初期化し盎す。

    取り敢えず実装した気がする。実際に動かしおみる。

    x fixed: 自前で曞き蟌んでいる筈なのにちゃんず改行が \n になっおいない 。
      少なくずも eval -- $'' で囲たれおいるので自前の曞き蟌みは実行されおいる。
      ず思ったら ble/builtin/history/.write の゚スケヌプが間違っおいた。
      text ずいう倉数の䞭身を曞き換えるべきなのに珟圚行を曞き換えおいただけだった。

    x fixed: 盎したず思ったら今床は末尟に無駄な ' が挿入されおいる 。
      どうやら gawk で /\'/ ずいうのを䜿うず文字列の末端に䞀臎しおしたう様だ。
      ぀たり /'/ ずしなければならなかった。
      或いは gsub(/['\\]/, "\\\\&", text) ずするべきだった。埌者の方法に修正した。

  * history: 履歎に関連するコヌドの敎理 [#D1119]

    特に新しいファむル src/history.sh に移動する事で敎理を行いたい。
    先ず、どの郚分を edit.sh から独立させる事ができるかに぀いお考察する必芁がある。

    ble/builtin/history の郚分に関しおは倧䜓は倧䞈倫だが
    _ble_edit_history に関連する郚分は䞀緒に移動しなければならないず思われる。

    * done: ble-edit/info を呌び出しおいる堎所もある。
      これに関しおも適圓な hook を甚意すれば問題ないだろうずいう気がする。
      ずいうか bleopt ず同様に hook 専甚の枠組みを敎えおも良いのかもしれない。
      䟋えば blehook_ で始たる倉数名を予玄しおしたうなど。。
      たあそれに関しおはたた別項目ずしお埌々で察応する事にすれば良い。

    * done: ble-edit/history/initialize に関しおは
      _ble_edit_history_prefix をチェックする版ずチェックしない版に分ける。

    * ok: うヌん。実は _ble_edit_history_ind はやはり
      history の方で管理した方が良いのではないか。
      ずいうのも履歎の皮類毎に *_history_ind ずいう倉数が存圚しおいる。
      寧ろ _ble_edit_history_ind が倉曎された時に
      その事を通知する様にした方が良いのではないのかずいう事。

    * fixed: うヌん。ble/builtin/history/option:d の䞭で ble-edit/history/goto を呌び出しおいる 。
      % →これに関しおは _ble_builtin_history_delete_hook の䞭で実行すれば良いのではないか。
      %   基本的に _ble_edit_history_ind に関連する凊理ず
      %   _ble_edit_history_prefix に関連する凊理は hook の䞭で凊理すれば良いのではないか。

      _ble_history_ind はやはり ble/history 偎に属しおいるずしお凊理する事にした。
      この時、どの様に ble-edit/history/goto を凊理するべきだろうか。
      →結局 _ble_history_ind の補正は呌び出し元で行っお、
        それずは別に履歎項目の移動に関しおは delete hook で凊理する事にした。

    x fixed: 曞き換えおいたら初期の _ble_history_ind が 0 になっおしたっおいる気がする。
      䜕故だろう。_ble_history_load_done=1 になった瞬間での倀を出力しおみたらちゃんず有限の倀になっおいる。
      get-index で芋匵っおみるず3回問い合わせがあっお初回が 0 になっおいる 。
      →これは ble/history/update-count が正しく動䜜しおいなかったのが原因であった。盎した。

    x fixed: 埌、async の途䞭で history/initialize の芁求があっお sync load が芁求された時に、
      loading... のメッセヌゞが衚瀺されない状態になっおいる。これは衚瀺する様に修正した。

    x fixed: どうも background load が動いおいない様な気がする。
      最初にアクセスしようずした瞬間に読み蟌たれおいる様な気がする。
      async で呌び出すずどうも 148 で終了しおしたっおいる気がする。
      うヌん。どうしおだろう。。調べおみるず恐らく idle.wait-condition が働いおいない?
      どうも結局 148 を戻しおいたのがいけない様だ。148 を返すずいうのは
      ble/util/idle の枠組みに斌いおは入力があったずいう事を瀺しおいる。
      埓っお、盎埌に再び ble/util/idle が呌ばれるずいう事を予期しおいる。
      然し、実際には呌ばれない、ずいう事によっお問題になっおいる。
      では入力がないけれども制埡を戻すずいう事の為の専甚の戻り倀はあるだろうか。

      取り敢えず 147 を返す事にした。148/147 のもっず詳しい考察に぀いおは別の項目で行う事にする。

2019-07-05

  * sabbrev: メニュヌ絞り蟌み䞭に静的略語展開するず [#D1118]
    メニュヌ絞り蟌み状態が残存しおしたう。そしお䜕だか倉な状態になる。
    ず思ったが再珟しない。再珟した。

    "fi " で䞀旊補完候補を出しおおいお其凊で \L ずしお SP をするず再珟する。

    - 䞍思議な事に \date 等では再珟しない。展開埌の内容が "less" だず再珟しない。
      展開埌の内容が "| less" だず発生する。"| less -r" でも発生する。
    - "echo " の堎合にも再珟した。

    どうも menu-filter の線集範囲を抜出する時に "| less" 等が挿入されるず
    simple-word ではなくなっお、その事により menu-filter の曎新が止たっおしたう様だ。
    本来であれば is-never-word の刀定で単語ではないずいう事になっお、
    それによっお menu 絞り蟌みがキャンセルされる筈だが、
    䜕故か is-never-word が反応しおいない。

    is-never-word の正芏衚珟を修正した。
    最初から非単語文字が存圚しおいる堎合に察応しおいなかった。

  * sabbrev: 耇合コマンド盎埌で展開されない (reported by cmplstofB) [#D1117]
    https://github.com/akinomyoga/ble.sh/issues/25

    䟋えば ble-sabbrev '\L=| less' ずしお、
    fi \L \L ずするず1぀目の\Lは展開されない。2぀目の\Lは展開される。
    [[ ]] \L \L の堎合にも同様になる。

    調べおみるず sabbrev は補完候補の生成を甚いお単語範囲を決定しおいる。
    ゚ラヌ単語の堎合にはそもそも補完が存圚しないので駄目なのである。
    % 実際に動かしおみるずずちゃんず䞡方の堎合で argument が補完源ずしお動䜜しおいる。
    この argument の補完源はその堎で新しく匕数を始めるずいう補完源であった。
    ぀たり、\L 党䜓を囲むような prefix の補完ずいう蚳ではないのである。

    代わりに単語ずしお䞍正な物であっおも良いので
    䜕らかの補完 source を生成する様にしたいのである。
    具䜓的に芋おみるず CMDXE 及び ARGX0 に぀いお補完源を生成すれば良い?

    取り敢えず実装しおみた。動いた。ず思ったが少し敎理したら動かなくなった。

    x fixed: "fi \comm" たで入力しお補完を開始するず末尟から補完が開始しおしたう。
    o "fi \commit" 及び "[[ ]] \commit" は動く様になった。
    x fixed: "[[ ]] " の盎埌で補完候補が生成されない。
      調べおみるず "[[ ]] " ずいう単語が prefix になっおしたっおいる。
      ず思ったら単に completion-context/.add に第二匕数を枡し忘れおいた。
      それを修正したら動く様になった。

2019-07-02

  * highlight: 䜕故か空文字列に展開される匕数が゚ラヌ着色されおいる [#D1116]
    これはファむル名着色が有効になっおしたっおいるからず思われる。

    ファむル名が問題なのかず思っお調べおみたらそもそもファむル名着色のコヌドに入っおいない?
    然し ble_debug=1 で確認するず確かに単語着色で実装されおいる。
    詳しく調べおみるず ble/syntax:bash/simple-word/evaluate-path-spec
    の時点で倱敗しおいるずいう事が分かった。

  * history: ble-detach 時の ble/builtin/history の振る舞いに぀いお [#D1115]
    history -na 等の操䜜がずれおしたうず困るので detach しおいる状態でも、
    ble.sh の実装を甚いる事にする。䜆し、_ble_edit_history 等に察する操䜜は
    detach しおいる時には実行しない様にする必芁がある。

  * 2019-06-28 history: history -d で珟圚線集の項目が削陀された時 [#D1114]
    珟圚の実装ではどの様に動くだろうか。
    線集䞭の文字列は珟圚線集の項目がそのたた残る。
    この状態で移動を行うず、別の項目の edit ずしお
    珟圚線集䞭の内容が蚘録されおしたっお、
    元々其凊にあった項目の内容が芋えなくなっおしたう。
    削陀埌の index に明瀺的に移動するべきなのではないか。

    然し、そうするず珟圚線集䞭の文字列が倱われおしたう。
    或いは index を最新の履歎項目(未登録)の䜍眮に移動するのが良いか。
    ず思ったがそうするず最新の履歎項目で線集䞭の内容があった堎合に、
    やはりそれが倱われおしたう。

    そもそも珟圚の項目を削陀するずいう事なのだから、
    珟圚線集䞭の文字列が倱われるのは仕方のない事なのではないだろうか。
    なので珟圚線集の文字列は捚おお削陀埌の䜍眮の項目をロヌドする事にする。

2019-07-01

  * history: HISTFILE を削陀するず awk が譊告メッセヌゞを出す [#D1113]
    読み取るべきファむルが存圚しおいない堎合には単に無芖するべきである。

  * history: 履歎に倉化がない時 history -r で履歎デヌタが同期されない [#D1112]
    これは ble-edit/history/load の問題だった。

  * history: 履歎ファむルが存圚しない時、譊告が出る [#D1111]
    これは wc の譊告を殺すこずにした。
    ファむルが存圚しない時 wc の結果は空になるが算術匏では空は 0 になるので気にしない事にする

  * history: PROMPT_COMMAND で history -cr するず履歎が倍化する (reported by cmplstofB) [#D1110]

    これは ble-attach した時に内郚で初回の PROMPT_COMMAND を評䟡する時に
    history -a && history -c && history -r を実行するずなるずいう事の様である。

    色々実行しおも倍加するタむミングが分からないのでもっず詳しく調べおみる。

    | ble/textarea#render ble/textarea#redraw ble-attach source                                                                                                                                                         ~
    | -rw-------. 1 murase murase 2994 2019-07-01 16:59:01 /home/murase/A.bash
    | ble/textarea#render ble-edit/bind/.tail ble-attach source
    | -rw-------. 1 murase murase 2994 2019-07-01 16:59:01 /home/murase/A.bash
    | ble/textarea#render ble-edit/bind/.tail ble-decode/EPILOGUE ble-decode/.hook
    | -rw-------. 1 murase murase 5988 2019-07-01 16:59:15 /home/murase/A.bash
    | ble/textarea#render ble-edit/bind/.tail ble-decode/EPILOGUE ble-decode/.hook
    | -rw-------. 1 murase murase 5988 2019-07-01 16:59:15 /home/murase/A.bash

    どうも最初の epilogue の呌び出しの瞬間になる様である。
    うヌん。history -a で倍加しおいるのだろうか。
    history -a は wskip を基準にしおいる。調べおみる。
    ず思ったら wskip に関しおは history 1 の出力ず同期しおいる様子である。

    | ble/textarea#render ble/textarea#redraw ble-attach source
    | # Note: history 1 で䜕も出力されない
    | wskip=0
    | -rw-------. 1 murase murase 12010 2019-07-01 17:13:32 /home/murase/A.bash
    | -rw-------. 1 murase murase 12010 2019-07-01 17:13:32 /home/murase/A.bash
    | ble/textarea#render ble-edit/bind/.tail ble-attach source
    |  1088  bash
    | wskip=1088
    | -rw-------. 1 murase murase 12010 2019-07-01 17:13:32 /home/murase/A.bash
    | -rw-------. 1 murase murase 12010 2019-07-01 17:13:32 /home/murase/A.bash
    | ble/textarea#render ble-edit/bind/.tail ble-decode/EPILOGUE ble-decode/.hook
    |  2176  bash
    | wskip=1088
    | -rw-------. 1 murase murase 12010 2019-07-01 17:13:32 /home/murase/A.bash
    | -rw-------. 1 murase murase 24020 2019-07-01 17:13:35 /home/murase/A.bash

    したがっおこれは関係ない。先に history のリストの方が倍加しおいる。
    ずいう事は読み取りの方が問題になっおいるのだろうか。

    | ble/textarea#render ble/textarea#redraw ble-attach source
    | history 1:declare -A _ble_builtin_history_rskip_dict=()
    | wskip=0
    | -rw-------. 1 murase murase 48051 2019-07-01 17:19:00 /home/murase/A.bash
    | -rw-------. 1 murase murase 48051 2019-07-01 17:19:00 /home/murase/A.bash
    | ble/textarea#render ble-edit/bind/.tail ble-attach source
    | history 1: 4355  bash
    | declare -A _ble_builtin_history_rskip_dict=([/home/murase/A.bash]="4355" )
    | wskip=4355
    | -rw-------. 1 murase murase 48051 2019-07-01 17:19:00 /home/murase/A.bash
    | -rw-------. 1 murase murase 48051 2019-07-01 17:19:00 /home/murase/A.bash
    | ble/textarea#render ble-edit/bind/.tail ble-decode/EPILOGUE ble-decode/.hook
    | history 1: 8710  bash
    | declare -A _ble_builtin_history_rskip_dict=([/home/murase/A.bash]="4355" )
    | wskip=4355
    | -rw-------. 1 murase murase 48051 2019-07-01 17:19:00 /home/murase/A.bash
    | -rw-------. 1 murase murase 96102 2019-07-01 17:19:01 /home/murase/A.bash

    ず思っお rskip の方を出力しおみるがこちらも問題ない。
    ずいうかやはり history のリストが倍加しおいる 。
    分かった気がする 。bashrc の䞭で history -r を呌び出すず、X行読み蟌たれお、
    曎に最初の bind 呌び出したでに曎にデフォルトの動䜜ずしお X 行が読み蟌たれる事になる。

    倧分特定できた。そもそもの原因は history -r を bashrc の䞭で呌び出すず、
    実際に察話モヌドに入った時に項目が二倍になっおしたっおいるずいう事。
    うヌん。最初に bind を受信した時に項目の数を rskip/wskip に蚘録するべきなのだろうか。
    しかし、そうしたずしおも履歎ファむルの倍化が防げるだけであっお、
    history や _ble_edit_history が二倍になっおしたうずいう問題を防ぐこずはできない。

    a だずすれば bashrc の䞭での history に察する操䜜は党おキャッシュしおおいお、
      その堎では発動しない様にしおおくずいう事が必芁になるのだろうか。うヌん。

    b うヌん。或いは bashrc の䞭で呌び出した ble-attach の堎合には最埌に history -c を実行しおしたう?
      それず同時に ble/builtin/history/initialize に関しおもデヌタを消去しおしたう。
      うヌん。察症療法的である 。実際にナヌザが意図的に特別な履歎項目を予め読み蟌んで眮きたいずいう時に問題になる。

    c 或いは ble/builtin/history/initialize は具䜓的に履歎が読み蟌たれおいる時にのみ実行しお、
      そうでない時には初期化せずに攟眮しおおく事にする? ず思ったが、それは解決にならない。
      結局 history -r よりも埌に曎に䜕らかの別の history -r を実行するずずれおしたう。

      初回の bind の時に wskip を再蚭定するずいう事にするのが良いのかもしれない。
      うヌん。綺麗な解決方法が芋぀からない。ble/builtin/history/.initialize が
      呌び出された埌に Bash による history -r が暗黙で走る、ずいう事が問題になっおいる。

    d それならば history が呌び出される床に履歎項目の数を監芖しおおいお、
      勝手に増えたらそれは䜕らかの別の枠組みによっお履歎項目が増えた物ずしお、
      その分だけ wskip を増加させるずいう事にしおはどうだろうか。
      今 wskip が倉化するのは read/write/delete の時だけである。

      その様に実装するのであれば埒倖の builtin history
      による履歎項目の倉化は党お远跡する必芁がある。

2019-06-27

  * 2019-06-19 history: clipboard が党く効かなくなっおいる [#D1109]
    これは HISTSIZE を小さな倀にするず発生する様子である。
    最近の倉曎が悪い蚳ではない様に思う。
    emacs mode の時には問題は発生しおいない? ず思ったら
    vi mode でも再珟しない。うヌん。発生条件がわからない。

    これは .get-count の蚈算がずれるからだろうか。
    取り敢えず .get-count に関しおは修正する事にしお、
    それから .get-count を修正する事にする。

    これは再珟しないし、たた HISTSIZE の取り扱いに぀いお #D1108 で修正を行ったので、
    それにより解決した可胜性もある。再床発珟した時に察凊する事にする。

  * 2018-08-29 history: HISTSIZE に達した時の動䜜? [#D1108]

    今気づいたが HISTSIZE に達した時、䜕が起こるだろうか。
    䜕かがずれるのではないだろうか 。
    ず思ったが history コマンドを䜿うのは初期化時ず履歎展開だけである。
    実は倧した圱響はないのではないかずいう気がしおきた 。

    たた、実は bash-4.3 以降では HIST{FILE,}SIZE に負の倀を蚭定できる様だ。
    曎に、それ以前から単に空文字列にしおおけば無制限なのだそうだ。

    →2019-06-19 実際に動䜜を確認しおみた所、

      % HISTSIZE に達しおも履歎ぞの登録が止たったり、
      % 叀いものから順に削陀されおいくなどの動䜜はしない様だ。
      % だずすればそもそもHISTSIZEずは䜕だったのか 。
      % うヌん。䞍思議だ。或いは初期化時の HISTSIZE に意味があるのだろうか。

      ず思ったら 。実は HISTSIZE に達するず番号を保持したたた
      先頭郚分が削れおいくずいう事の様だ 。

    * fixed: だずすれば今たでの history 1 による count の蚈枬なども誀っおいた事になる。
      うヌん。修正するずすれば history に登録されおいる最初の項目の番号が必芁になる。
      最初の項目の番号を取埗する最も速い方法は䜕だろうか。
      history | head -1 だず 3 fork 必芁になる。
      history を倉数に入れるず蚈算時間がかかる。
      ず思ったが 13k 項目で 0.017s だった @chatoyancy
      それ皋には時間はかからない。
      しかし history | head -1 の方が 0.007s ず速い。

      history 1 は4箇所で䜿甚しおいる。
      うヌん。history | head をする䜍であれば
      history | wc -l で取埗した方が速い。

    * fixed: HISTSIZE に関連しお history -p '!1' も危ないのではないか

    先頭が削れた時に _ble_edit_history 等はどうしたら良いのか 。
    実は _ble_edit_history ず builtin history は内容が異なっおも良い?
    うヌん。埮劙である。䟋えば ble/builtin/history/option:d の実装は
    history の番号ず _ble_edit_history の番号が䞀臎しおいる事を想定しおいる。
    他にも考察が必芁な箇所が幟らか芋られる。

    そもそも _ble_edit_history の内容をどの様にするかの可胜性が幟぀かある。

    a history の番号ず同じむンデックスに蚘録する。

      x 然し、これだず ble.sh をロヌドした時から history の offset が有限である堎合に、
        offset たでを空文字列で初期化しなければならない。

    b history の内容ず同期する。぀たり HISTSIZE に達しお先頭が削れた堎合、
      _ble_edit_history も䞀緒に shift を実行する様にする。
      この実装の為には、珟圚の _ble_edit_history の先頭の項目の
      history における察応する番号を䞀緒に蚘録しおおく必芁がある。

      x HISTSIZE に達するず毎回 shift が起こっお効率が悪い。
        hook も毎回呌ばれる事になる。

      そもそも倧量にメモリを䜿甚しおいるし、
      履歎によっお倚少メモリを远加で食らっおも問題ない気がする。
      なので HISTSIZE に構わず珟圚たでの履歎を党お蚘録しおも良いのでは。

    c history ずは独立に _ble_edit_history の開始番号を蚘録する。

      x 然し、これだず history -r で HISTSIZE よりも倚い行数を読み取った時に、
        その䞊で読み取った行数の䞀郚だけが _ble_edit_history に远蚘される。
        この時、_ble_edit_history に蚘録される項目の番号は連続でなくなる。
        ぀たりずれが生じおしたう。

    d 或いは、末端からの行数で察応関係を取る事にする。
      ぀たり、history に斌ける末端から N 番目の項目は
      _ble_edit_history に斌ける末端から N 番目の芁玠ず解釈する。
      この様にしおおけば少なくずも history に珟圚ある項目に関しおは、
      _ble_edit_history に斌ける項目ず正しく察応が取れる筈である。

    取り敢えず d の方策で問題なく実装できるかに぀いお確認する。

    - option:d に関しおは history の offset/count を取埗しお、
      削陀範囲を限定する。そしおその埌で察応する
      _ble_edit_history を削陀する事にすれば良い。

    うヌん。取り敢えず ble/builtin/history に関しおは察応した気がする。
    他に察応するべき箇所はあるだろうか。。。
    ble-edit/history/load は特に察応を取っおいる蚳ではないので関係ない。

  * 2016-07-07 history: HISTCONTROL=erasedups の時 ble-edit/history/add が遅いかもしれない [#D1107]

    重耇する項目がないかぎりはそんなに遅くないのではないかず思われる。
    䜕れにしおも bash 配列においお䜕が遅くお䜕が速いのかに぀いお蚈枬する必芁がある。
    filter 郚分の操䜜ずそれから truncate の郚分に぀いお。
    →benchmark-array.sh で filter を実装しお詊しおみたが、
      実装の仕方でそんなに速床が倉化するずいうこずはなかった。
      もっず巚倧な配列の堎合などでしか効かないずいう事だろうか。
    →しかし䜕れにしおも実枬しおみたずころによるず
      重耇する項目がある時はかなり重くなるずいう事が予想される。

    ずいうか unset しお再床 arr=("${arr[@]}") したら速い気がする。
    →その方針で再実装した。遅い堎合には 0.800 皋床かかるのが
    0.120 皋床に抑えられる事を確認した。もしかするず、
    項目数がもっずずっず倧きい堎合にはそれでも問題になるかもしれないが、
    埓来の実装で遅くなるよりは栌段に増しになっおいる筈である。

  * 2019-02-07 history: history -nr [filename] に関しおは履歎を idle で再初期化する? [#D1106]

    特に远加項目の数が倧量にある堎合には background で初期化しおも良いのかもしれない。
    これは bash 4.0 以降に斌いお ble-edit/reset-history を呌び出せば良い。

    では远加項目の数が䜕個以䞊の時に background で初期化を実行するべきか。
    % 取り敢えず delta>=_ble_edit_history_count/2 で刀定する事にした。
    やはり delta>=10000 で刀定する事にした。

  * 2019-06-18 history: ble/builtin/history -r に時間がかかる [#D1105]

    調べおみるず eval に時間がかかっおいる。
    やはり mapfile 等を甚いおロヌドし盎した方が早いずいう事か。
    5000項目ロヌドするのに20秒かかっおいる。
    1秒で250項目である。0.1秒で25項目である。
    うヌん。

    結局、既存の ble-edit/history/load を拡匵しお、
    远加の項目を初期化できる様に倉曎した。
    動いおいる。

  * 2019-06-19 history: ble/keymap:vi/mark/history-delete.hook の動䜜テスト [#D1104]
    䞀応動いおいる様な気がする。

    x ずれが芋られた 。詊しに以䞋を実行しおみるず
      declare -a fire=([5]="B" [6]="C") ずなるべき所が
      declare -a fire=([0]="B" [1]="C") ずなっおしたう。

      $ fire[7]=1
      $ fire[9]=A
      $ fire[10]=B
      $ fire[11]=C
      $ declare -p fire
      $ ble/builtin/history/array#delete-hindex fire 5-10
      $ declare -p fire

      調べおみた所 local shift=0 を宣蚀するのを忘れお shift を䜿っおいた。
      前回の shift の倀が䜿われおいたずいう事だった。盎した。
      取り敢えず䞀番最初にずれを芋぀けた䟋でも詊しお盎っおいる事を確かめた。

    たあ、これに関しおは動いおいるず芋做しお良いずいう事にする。

2019-06-19

  * 2019-02-07 history コマンドで出力される内容ず、 [#D1103]
    ble.sh で管理しおいる内容がずれおしたうずいう問題はある。
    ただ、それは珟実的な問題になるだろうか。
    履歎展開を確認する堎合には䜕れにしおも history を䜿っお番号を取埗する。
    埓っお、内郚の番号を参照する事になるはずである。

    䞀方で history -d や history -r 等の操䜜を実行した時に、
    どの様に ble.sh の方を曎新するのかずいう問題はある。
    通垞の bash では確かにコマンドラむン線集時に蟿れる履歎も䞀緒に倉曎されおいる。

    history の倉曎に際しお䜕を修正するべきか。

    * done: vi.sh においお履歎項目ごずに蚘録しおいる内容

      | history に倉化が珟れた時の hook ずいう物があった筈である。
      | それは䜕で䜕凊から参照されおいたか。
      | _ble_edit_history_onleave ずいう配列がある。
      | これは onleave.fire で参照されおいる。
      | 去る盎前に䜕らかの状態を蚘録するのに䜿われおいる。
      | 新しい行き先の情報は参照しおいない様である。
      | これを䜿っおいるのは ble/keymap:vi/mark/history-onleave.hook だけである。
      | そしお ble/keymap:vi/mark/update-mark-history を呌び出しおいる。
      | 特に _ble_keymap_vi_mark_history ず _ble_keymap_vi_mark_global の䞭身を曎新する必芁がある様に思う。
      | その他の箇所で hindex を䜿甚しおいる箇所はあるだろうか。
      | history/get-index で怜玢するず他には ble/widget/vi-command/search.impl で䜿っおいるが、
      | これは移動したかどうかなどを刀定する為に䜿っおいるだけで履歎に関する情報を蚘録するのには䜿っおいない。

      - _ble_keymap_vi_mark_history
      - _ble_keymap_vi_mark_global

      _ble_keymap_vi_mark_global に関しおは探玢する必芁があるので、
      やはり hook は削陀範囲で指定する様にしたい。
      →ble/keymap:vi/mark/history-delete.hook に実装した。
        動䜜テストは䞀床も行っおいない。適圓な実装なのでテストは是非に行うべきである。

    * done: edit.sh

      以䞋の配列に察しお䜜甚すれば良さそう。
      - _ble_edit_history=()
      - _ble_edit_history_edit=()
      - _ble_edit_history_dirt=()
      - _ble_edit_undo_history=()
      最初の3぀に関しおは履歎をロヌドしおいる時にのみ曎新する。
      最埌の物に関しおは履歎をロヌドしおいるかどうかに拘らず曎新する。

      _ble_edit_history 及び _ble_edit_history_edit に関しおは察応しおいるが
      _ble_edit_history_dirt に関しおは察応しおいない。

    * ok: core-complete.sh

      他に history/get-index を参照しおいるのは core-complete.sh だけである。
      dabbrev で履歎を遡るために䜿甚しおいる。
      履歎を遡っおいる最䞭に history によっお履歎が曞き換わる事はない筈なので、
      これに぀いおは気にしなくおも良いだろう。

    | history の操䜜ずしおどの様な物があるだろうか。
    |
    | * history -c は䞭身をクリアする
    | * history -d は項目を削陀する
    | * history -n [filename] は远加行を読み蟌む
    | * history -r [filename] は履歎ファむルを読み蟌み盎す
    | * history -aw [filename] は履歎デヌタには倉化なし
    | * history -p args... は䞀郚の bash のバヌゞョンで補正が必芁
    | * history -s args... は項目を远加する
    |
    | 結構察応は面倒そうである。

    * done: 2017-12-03 の項目も察応する必芁がある
    * 2016-07-07/3 に぀いおも確認が必芁

    [実装]

    * clear.hook も远加した。
    * 取り敢えず実装した様な気がする。

  * 2017-12-03 keymap/vi (mark): BUG erasedup 等のずきに履歎番号がずれるのではないか? [#D1102]

    これは ble-edit/history/add/.command-history 蟺りで callback
    を呌び出す様にするなどの方法にしなければならない。

    ble/keymap:vi/mark/update-mark-history の仕様を芳察すれば、
    erasedups 等に際しおどの様に曎新すれば良いかが分かる筈 。
    _ble_keymap_vi_mark_history の index をずらす。
    それから _ble_keymap_vi_mark_hindex を曞き換える。
    -1 にでもすればよいか。

2019-06-18

  * 2015-08-11 history コマンドで操䜜を実行したずきにそれが ble の履歎情報に反映されない [#D1101]
    history コマンド自䜓を䞊曞きするなどするずたたややこしいこずになるので、
    ble-history 等のコマンドを甚意しおそちらを䜿っおもらうようにした方がよい。

    或いは、もっず interactive に history 操䜜を実行できるようにしたい所である。
    →これは新しい項目で立おる事にする。

    builtin history を眮き換える。取り敢えず実装した様な気がする。
    動䜜確認はしおいない。→うヌん。history -r を実行するず時間がずおもかかる。

  * 2019-06-11 history: ble/builtin/history/option:n の Bash 3.0 察策 [#D1100]
    そもそも history -r を甚いるず history -n の䜍眮が倉わっおしたっお倉な事になる。
    history -r を䜿わずに履歎項目を䜕ずかする方法はあるだろうか。。ない気がする。
    では history -n を䜿っおも倉な事が起こらない様にする方法?
    うヌん。history -n を完党に自前で実装するずいうぐらいしか思い浮かばない。

    或いは history -r $histfile 等ずしお history -n の開始䜍眮を再蚭定できないか。
    サブシェルに閉じ蟌めお history -r "$tmp" ずするず本䜓には反映されない。
    history -r ずするず倧量の行が远加されおしたうのでそれらを削陀しなければならない。
    history -d は䞀぀ず぀削陀しなければならないので倧倉である。
    history -cr ずするず再床党䜓に察する初期化を実行しなければならないので遅い。

    a 或いは bleopt_history_share が蚭定されおいる時には history -n で読み取っお、
      蚭定されおいない時には history -r で読み取るずいう様にするか。
      しかし、そうするず bleopt_history_share が蚭定されおいない状態から
      蚭定されおいる状態に倉化した時に history -n で倧量の行が远加されるずいう事になる。
      或いは bleopt_history_share の蚭定が倉曎される時に怜出しお
      bash 3.0 の時には再初期化を実行する事にするか。

    ずいうよりそもそも䜕故 Bash 3.0 では history -s が䜿えないのだったか。
    蚘録を探しおみるず #D0233 に議論が残っおいる。
    history -s をしおも䞀番䞊の項目が入れ替わるだけなのだずいう。うヌん。

    改めお幟぀か詊しおみる事にする。
    䞀぀の bind -x の䞭で耇数回 history -s をしおもやはり駄目だった。
    䞀番最埌に実行した内容が登録されるだけだった。
    ずいうかそもそも普通にコマンドを実行しおいおも history -s は
    䞀番䞊にある履歎項目を眮き換えるずいう動䜜しかしない様である 。

    b やはり history -n の実装を眮き換えるしかないのだろうか。
      history -n の実装を眮き換える為に䜕が必芁だろうか。
      先ず、次の読み取り䜍眮を蚘録しお眮かなければならない。
      䞀番最初は初期化時の history count で良い。
      history -n を実行する床に行数を調べる。
      history -a を実行する床にむンクリメントする。

      芁するに history -anrw を完党に ble.sh の物で
      眮き換えおしたうずいう算段である。

    * ずいうより Bash 3.0 でなかったずしおも、
      history -n の結果が history -r の圱響を受けお倉化するのは望たしくない。
      やはり Bash 3.0 かどうかに関係なく党お自分で凊理しおしたうずいう手の方が良いだろうか。
      ぀たり前回の history -n の際の行数を芚えおおく。
      しかしどうやっお蚘録するのだろうか。wc で数えるのだろうか。
      曎に読み取る時には tail awk を甚いお読み取る事になる。
      たあ、そういう実装でも良いのかもしれない。どうせ awk を起動するのだから
      䜙分に幟぀かのプロセスを走らせおもそんなに倧倉ではないだろう。

      もしくは awk で党お凊理しおしたうずいうのも手である。
      数を数えるずいう所から远加の行を配列に登録する所たで。

      ? 䞀番最初のカりントはどうするのだろうか。
        もし bashrc でロヌドしおいるのであれば
        その時の bash_history の行数で問題ない。
        然しもし ble-attach によっお埌でアタッチしたのであれば、
        最埌に読み取った䜍眮ずいうのは非自明である。

        ずいうより history を䞊曞きするのは
        ble-attach ではなくお ble.sh をロヌドした瞬間である。
        ロヌドした瞬間に history -n で読み取っおしたうずいうのが手の様な気がする。

        サブシェルで history -n で読み取られた内容をファむルに曞き出しお眮く等。
        次に読み取る時には先に曞き出しお眮いた内容を読み出しお、
        その埌で新しく远加された行を読み取る様にする。

      連想配列の算術匏に斌ける展開に぀いお確認→OK
        $ tip='1]+a[1'
        $ declare -A arr=()
        $ arr[$tip]=12345
        $ arr[1]=10 a[1]=10
        $ echo $((arr[$tip]))
        20
        $ echo $((arr[\$tip]))
        12345

    [実装]

    * done: _ble_builtin_history_wskip
      ble.sh をロヌドした時に初期化するべき。
      その瞬間の histfile の行数にするか、
      或いはその瞬間の history 1 で埗られる履歎項目の数か。
      これはその瞬間の histfile の行数ず history 1 で埗られる履歎項目の数 (0 より倧きい時) で、
      より小さい方を採甚するのが良い様に思われる。

    * done: _ble_builtin_history_rskip[histfile]
      これも ble.sh をロヌドした時に初期化するべきである。
      これは $_ble_builtin_history_wskip ず同じ行数で良い気がする。

      うヌん。ナヌザが HISTFILE を蚭定し盎す可胜性もあるので、
      ble.sh をロヌドした時ずいうよりは最初に ble-attach を実行した時だろうか。
      或いは、最初に ble/builtin/history にアクセスした時に初期化を実行するずいうのが良いだろうか。
      うヌん。ble/builtin/history で最初に history 1 が有限の倀を返した時にするか。
      これにするべき気がする。

    * done: _ble_builtin_history_wskip
      履歎を削陀したり erasedups で履歎項目が消滅したりした時に修正する必芁がある。
      erasedups で項目が倉曎される堎合に぀いおは察応した。
      履歎を削陀する堎合に関しおは。。これは history -d だけだろうか。
      history/option:d を実装した。history/option:c に斌いおも
      _ble_builtin_history_wskip=0 を実行するべきではないか。

      珟圚の実装では _ble_builtin_history_wskip は項目が枛った分だけ枛らすずいう実装になっおいるが、
      本圓にそれで良いのだろうか。
      wskip の䜍眮が削陀末端以降である堎合にはそれで良いが、
      wskip の䜍眮が削陀開始䜍眮以前にある堎合には倉化しない。
      たた wskip の䜍眮が削陀範囲の内郚にある堎合には削陀開始䜍眮に移動する。
      →history/option:d ず erasedups の凊理でちゃんず wskip を凊理する様に修正した。

    x fixed: 䟝然ずしお Bash 3.0 で .bash_history に远加された内容が重耇しお読み取られおしたう問題は残っおいる。
      うヌん。詊しおみるず Bash 4.4 でも同様に発生しおいる。option:n で wskip をずらすのに倱敗しおいるのか?
      そもそもちゃんずずらしおいなかった。ずいうより読み蟌んだ時に wskip を䜕凊に蚭定するのかが非自明である。
      取り敢えず未曞き蟌みの内容を histapp ずいうファむルに蚘録しおおいお、
      埌の本圓の write の際に曞き蟌むこずにした。
      →どうもちゃんず動いおいる気がする。

2019-06-10

  * 2019-05-27 edit: .bash_history ず垞に同期する蚭定を ble.sh で提䟛しおも良いのではないか [#D1099]

    新しく远加された行を毎回読み蟌む様にする。

    a 具䜓的には巷にある蚭定ず同様にしお history -r すれば良いのではないか。
      ずも思ったが少し埮劙かもしれない。巷にある蚭定だず history -c しおから history -r しおいる様な 。
      それだず ble.sh を実行しおいる堎合には毎回履歎を初期化しなければならなくなっお面倒である。
      もっずコストの䜎い方法を考えおも良いのではないかずいう気がする。

    b 或いは、コマンドを実行する前に新しい項目が远加されおいないかチェックする、ずいう具合で良いのでは。
      新しい項目が远加されおいたら远加分を履歎に反映させる様にする。

    コマンドを実行する前ずいうよりは newline を入れる床にずいう様にする方が良いかもしれない。
    或いはナヌザ入力がある床に? もしくは履歎を参照しようずする床に?
    履歎を参照しようずする床にずいうのが最も劥圓な曎新のタむミングである。

    ble.sh 独自の履歎ファむルを䜜っおしたうずいうのが䞀぀の手の気がする。
    コマンドを実行する床にそのファむルに远蚘する。
    新しい履歎がある事をどのように他の bash に䌝達するか。

    a 䞀぀の手は党おの Bash むンスタンスに察しお *.history_add.txt 的なファむルを甚意しお、
      或る Bash がコマンドを実行する時に *.history_add.txt に履歎を曞き蟌むずいう物。
    b 或いは履歎ファむルの長さを芚えおおいお増えた分を远加するずいう物。
      これを実行する為には mapfile -s などで読み飛ばす必芁がある。
      mapfile のない叀い Bash の堎合には tail 等を䜿っお切り出す必芁がある。
      もしくは党お読みだした埌で切り取るか 。
      䜕れにしおも履歎が長倧になっおくるず結局時間がかかっおしたう気がする。
    c ずいうか history -a, history -n で良いのでは?
      これだずうたく動かない等あるのだろうか。

      history -a を実行するずちゃんず蚘録されおいる気がする。
      ちゃんず行数も増えおいる。次に history -n を調べる。
      うヌん。hist_uniq.sh を実行した埌で bash_history が瞮たっおいる堎合には読み蟌んでくれない。
      ぀たり Bash は前回の history の行番号を芚えおいるずいう事なのだろう。
      再床他の bash で history -a しおから history -n するず読み蟌たれたので、
      前回の bash_history の長さずいうのは実際に読み蟌みが発生しなくおも曎新される。
      たた bash_history が短くなっおいたずしおも珟圚の履歎が短くなるずいう事はない。

      history -na の順番ず動䜜に぀いおも確認する必芁がある。
      どちらを先に実行したずしおも Bash の実装が単玔だず倉な事になる気がする。

      | * 䟋えば先に -n で新しい項目を読み蟌んでそれから -a で曞き蟌むず、
      |   どの範囲のコマンドが bash_history に曞き蟌たれるのだろうか。
      |   -n を実行するず新しく远加された行が history の末尟に読み蟌たれる。
      |   うヌん。色々詊した所、以䞋の様な事が分かった。
      |
      |   (1) Bash は最埌に曞き蟌みをしおから䜕個のコマンドを実行したかを蚘録しおいる。
      |   (2) history -n で読み取るのは最埌に読み取った時の行数以降の行である。
      |     この時に (1) で蚘録しおいる情報の曎新は行わない。
      |
      |   これによっお䜕が起こるかずいうず、
      |   A個コマンドを実行した埌に、history -n で N 個新しい履歎が読み取っお、
      |   次に history -a する時ず、history -n で読み取ったN個の項目ず、
      |   (A-N)個の自分で実行したコマンドが蚘録される事になる。
      |   ぀たり、N個の自分で実行したコマンドが履歎に蚘録されずに終わる。
      |
      | * 或いは先に history -a しお眮いおそれから history -n で読み蟌むず䜕が起こるか。
      |   →これは特に䜕も起こらなかった。぀たり history -n では䜕も読み取られない。
      |   →然し history -a する前に他の Bash プロセスから履歎項目が远加されおいる時には
      |   たた倉な事が起こった。぀たり、history -n で自分の远加したコマンドが重耇しお読み取られおいる。
      |   ぀たり history -a で曞き出す時に history -n の開始点がA個ずらされるずいう事の様に思われる。
      |
      | * Bash の動䜜は以䞋の様になっおいる?
      |
      |   | var number_of_new_commands;
      |   | var history_next_index;
      |   | history -a
      |   |   history[-number_of_new_commands..$] を HISTFILE に曞き出す。
      |   |   history_next_index += number_of_new_commands
      |   |   number_of_new_commands = 0;
      |   | history -n
      |   |   HISTFILE[history_next_index..$] を history に読み出す。
      |   |   history_next_index += count;
      |
      |   曞き換えるず以䞋に等䟡である。
      |   | var history_write_index;
      |   | var history_read_index;
      |   | history -a
      |   |   history[history_write_index..$] を HISTFILE に曞き出す。
      |   |   history_read_index += count
      |   |   history_write_index = += count
      |   | history -n
      |   |   HISTFILE[history_read_index..$] を history に読み出す。
      |   |   history_read_index += count
      |   |   history_write_index = += count
      |
      |   垞に同じだけずれるのだずすれば。。
      |   実は最初の history ず HISTFILE の差だけ蚘録しおおけば良い事になる?
      |   ず思ったが、少なくずもどちらかの倉数は蚘録しお眮かなければならなくお、
      |   それに加えお差を蚘録するずいう事になるので結局2぀の倉数を䜿う。䜙り意味ない。
      |
      | * 因みに history -an ずしたらどうなるのかず思っお詊しおみたら、
      |   history -anrw は䜕れか䞀぀しか同時に䜿甚できないずいう゚ラヌメッセヌゞになる。

      動䜜に関しおは #M0013 にたずめた。
      この動䜜を螏たえお history -a, history -n を䞊手に䜿っお同期を実行する事は可胜だろうか。

      a 䟋えば必ず history -s の盎前に history -n を実行する様にしたらどうだろう。
        そしおその盎埌に history -a を実行する。
        未曞き蟌みのコマンドが存圚しない状態で history -n を実行した堎合には特に䜕も問題は起こらない。
        その䞊で history -s を実行しお history -a を実行するず history -s した内容が曞き蟌たれる。
        それで良い様な気がする。

        たた新しい履歎項目を远加する蚳ではないが、
        新しい履歎項目が曞かれおいないかチェックする為には単に history -n ずすれば良い。

    * 次に HISTCONTROL に倉な倀が蚭定されおいた時に history -n がどの様に動䜜するのかずいう事である。
      HISTOCONTROL=erasedups が蚭定されおいる時にコマンド command を実行するず、
      その時点で履歎の䞭に含たれおいる command が党お削陀される。
      その他の重耇するコマンドに関しおはそのたたである。
      history -n で読み取った堎合は過去の䞀臎するコマンドは削陀されない、ずいう事が分かった。
      単に远蚘されるだけである。ずいう事であれば割合察応は簡単なのだろうずいう気がする。

    * 他にチェックしなければならない項目ずしお
      history -r 他ファむル を実行した埌の history -n がどうなるかである。
      →うヌん。履歎項目が倍化しおしたっおいる 。
      ぀たり history -r を甚いお履歎項目を増やす䜜戊は実は駄目。
      その埌の history -n で駄目な事になっおしたう。

      history -r は Bash 3.0 で history -s が䜿えないのを補うのに䜿っおいる。
      その他の方法で history -s に盞圓する機胜を実装するか、
      或いは history -n 以倖の方法で新しい行を読み取る様にする必芁がある。

      うヌん。Bash 3.0 では別の方法で history -n を実珟する様にするか 。
      しかし、別の方法で実珟するにしおも history に関連する党おのコマンドを䞊曞きしないず
      history -n で読み取り始める䜍眮を特定する事ができない。
      うヌん。結局毎回読み取る事になるのではないか 。
      →Bash 3.0 の時には history -n; histrory -a 戊略ではなくお、
      echo command >> "$histfile"; history -cr "$histfile" 戊略で行く事にする。
      ず思ったがそうするず erasedups 等の蚭定で倉曎された履歎が党お消滅するので、
      結局改めお党おの履歎を読み出す事になっおしたうのではないか。
      そしおそれは Bash 3.0 ではずおも重いので避けたい操䜜である。

    取り敢えずは c (history -na) を甚いお実装する事にする。
    その他のタむミングでの同期に関しおは別の項目で改めお実装する事にする。
    ず思ったが早速実装が汚くなっおしたう気がする 。

    曎に HISTINDEX_NEXT ずいう物もあっおこれも凊理しなければならないのでは 。
    ず思ったが、これに関しおは history -n で項目が増えるだけである事を考えれば気にしなくおも良い。

    取り敢えずの所は Bash-3.0 の事は無芖した実装で区切りを぀ける事にした。
    䞀応動いおはいる様である。しかし、やはり同期のタむミングが
    新しい行に移った時ずいうのが分かりにくい。

2019-06-09

  * 2019-06-07 progcomp: どうも bash は \= は COMP_WORDBREAKS の察象ではない様である [#D1098]
    確かにその様に動䜜するのが自然に思われる。

    * 曎に、これが意味する所は挿入時に COMP_WORDBREAKS
      に含たれる文字も゚スケヌプする必芁があるずいう事でもある。

    珟圚の実装はどうなっおいるか。完党にクォヌト等を陀去した䞊で凊理しおいる。
    凊理を行っおいるのは以䞋の郚分である。
    ble/complete/source:argument/.compvar-generate-subwords
    ble/complete/source:argument/.compvar-perform-wordbreaks

    クォヌトをせずに裞で存圚しおいる COMP_WORBREAKS だけに぀いお
    分割をするようにするにはどうしたら良いか。
    ずいうより既に存圚しおいる関数でその様な物はあるだろうか。

    うヌん。評䟡たで䞀気にしおしたう実装ならば evaluate-path-spec に存圚しおいる。
    実のずころ評䟡たで実行しおしたっおも問題ないのではないかずいう気もする。
    ず思ったが各郚分に぀いお評䟡を実行したいずいう事ず noglob ずいう事には泚意する。
    notilde に関しおはどの様に䌝達すれば良いだろうか。

    実際に実装を初めおみるずどうしたら良いのか分からなくなる。

    * 先ず初めにパス名展開は起こすのか起こさないのかずいう事である。
      元の実装の堎合にはパス名展開を起こした埌に分割を行っおいた。
      しかし元の単語の状態で分割を行うずすればパス名展開を起こす蚳には行かない。

      →これに関しおは元の単語が単語分割の察象になっおいればパス名展開を起こし、
        元の単語が単語片に分割されおいればパス名展開は起こさないずいう方針にする。

        或いは䞀番最埌の単語片に関しおだけパス名展開を実行する事にするか?

    * 次の問題は補完開始点の察応をどの様に取るのかずいう事である。

      叀い実装に䟝るず補完開始点たでの文字列を展開した結果から、
      新しい䜍眮の補完開始点を算出するずいう事をしおいる。
      しかし、パス名展開が絡んでくるずこの方法で正確に察応を取る事ができるのかは怪しい。
      ぀たり、埓来の方法でも既に問題はあったずいう事になる。

      新しい実装ではどの様に実装するのが良いだろうか。
      取り敢えず䞀から考えおみる事にするず 。

      そもそもパス名展開が起こるずしおもカヌ゜ルよりも埌の䜍眮に䟝存しおはならない。
      ずいう事を考えればパス名展開を考えるにしおもカヌ゜ルよりも埌の䜍眮は展開に関䞎しおはならない。

      1. カヌ゜ルが単語内郚に存圚しおいる堎合には、
        先ず初めにカヌ゜ルよりも巊の郚分ず右の郚分に分ける。
        これを left ず right ずする事にする。
      2. left ず right のそれぞれに぀いお COMP_WORDBREAKS を適甚する。
        left が単語分割された時はそれぞれの単語片に察しお eval-noglob を適甚する。
        left が単䞀の単語片の時には eval を適甚する。
        right に関しおはそれぞれ eval-noglob を適甚する。
        left ず right を結合する。left の最埌の単語片ず right の最初の単語片は結合する。
      3. カヌ゜ル䜍眮に関しおは left/right を結合する時に、
        どの単語片のどの䜍眮に察応するかが蚈算できる。
      4. 曎に登録する際に quote があるずその分のカヌ゜ル䜍眮補正が入る事に泚意する。

      䜕だか汚い実装だが仕方がない事だろうか。
      党䜓を䜜り盎すずいう事も考えたが、
      凊理ずしお汚いかどうかではなく䞀぀䞀぀の関数の機胜ずしお、
      分かりやすいかどうかが優先されるべきである。

  * menu_complete: C-g でキャンセルするず䜕故か展開が実行されおしたう [#D1097]
    因みに確定をした時にはちゃんず前の展開が保持される。

    曎に゚スケヌプ等も消えおしたう。
    調べおみるず ble/complete/menu-complete.class/onselect で
    local insert=$_ble_complete_menu_common_part ずしおいるのが原因である。
    ここは menu_common_part ではなくお元々の文字列を指定するべきなのでは。

    _ble_complete_menu0_comp を芋たら良いだろうか?
    ず思ったがこれは候補を䞀番始めに衚瀺した時の倀が入っおいお、
    その埌の補完や入力に䟝る絞り蟌みの状態を刀定しおいない。
    _ble_complete_menu_comp を芳察しおみるずそれらしい倀が入っおいる気がする。

    menu_common_part に代入しおいる郚分を遡っおみるず䜕れも COMPV を代入しおいる。
    埓っお COMPV の代わりに COMPS を䜿う様にすれば良い筈である。
    そしおそれは ${_ble_complete_menu_comp[2]} に入っおいる気がする。

    ず思ったが本来 menu_complete を開始する時に元々の文字列を蚘録しおいるべきなのではないか。
    ず思っお調べおみるず _ble_complete_menu_original にちゃんず蚘録しおある。
    これを䜿うべきなのである。ず思ったが menu-complete.class は必ずしも
    menu_complete の䞭からだけ呌び出されるずは限らない様だ 。

  * 2015-06-28 color: --prefix=filename の filename 郚分 (ref #D0839, #D0840, #D1095) [#D1096]
    単語に察しお郚分的な着色をする堎合、珟圚の単語毎の着色ではない方法を考えるべき。
    → #D1095 で完党に察応した。

  * 2019-04-21 syntax: ファむル名の着色でディレクトリ郚分の着色を別にする事が可胜なのではないか [#D1095]
    特に simple-word に斌いお / で区切られる堎合に぀いお
    各 pathspec に察しおの展開を既に実装しおいた気がする。
    これを利甚すればディレクトリ郚分を切り離しお着色する事が可胜なのではないか。

    たた単語の途䞭で着色を倉曎する枠組みも既に甚意しおあった筈。

    * 確か = たたは : の埌だけファむル名着色する時に䜿っおいた。
      ず思ったら = たたは : の埌にある単語の着色は有効になっおいない 。
      これは 2015-06-28 から todo にずっず残っおいる項目である。

    取り敢えず着色を行っおいる箇所を調べる事にする。
    実装は ble/highlight/layer:syntax/word/.update-attributes/.proc で行われおいる。
    単語着色の䞭でもファむル名の着色は特に ble/syntax/highlight/filetype を呌び出した埌に行われおいる。

    * fixed: ble/syntax:bash/simple-word/evaluate-path-spec の実装を確認する。
      glob がある時に failglob で党然駄目になる様な気がする 。
      取り敢えず修正しおみる事にする。
      詊しおみたずころやはり駄目だった。修正が必芁である。
      修正した。動いおいる気がする。OK

    * done: 䞀応単語の䞭に = や : が存圚する時にはそれ以降をファむル名ず解釈する様にした。

    x resolved: しかしこれだずチルダ展開が起こらない文脈でもチルダ展開を前提ずした着色になっおしたいややこしい。
      →途䞭からの着色の堎合 ATTR_TILDE が蚭定されおいなければチルダ展開を抑制する事にした。

    x fixed: 䜕故かチルダ展開を抑制しおいるのにチルダが着色される。
      ずいうか echo '~' ずしおもチルダ展開が内郚で実行されおいる気がする 。
      調べおみるず filetype の䞭で明瀺的に ~ を凊理しおいる様だ。
      これは恐らく昔展開を実行する前のコヌドなので今は消しお良いだろうず思われる。
      念の為呌び出し元を䞀぀ず぀確認しおいく事にする。

      - core-complete.sh からの呌び出しでは CAND を枡しおいる。
        CAND にはファむル名が入っおいるず考えおいる。
        チルダに眮換しお短瞮した名前は INSERT の方に入っおいる筈である。
      - 他に core-syntax.sh ble/syntax/highlight/getg-from-filename
        からの呌び出しがある。これはやはり core-complete.sh から CAND
        を枡しお凊理する物である。
      - 他は珟圚の実装郚分だけである。

    x fixed: a= の圢匏の補完でディレクトリ名の埌に / が挿入されないのは䞍䟿だ
      →うヌん。原因が分かった。cand/yield file で a= の郚分も䞀緒に枡すので、
      tail 蚭定のためのファむル名・ディレクトリ名刀定が働かないのである。
      いや、yield ずいうより最埌の complete の時の凊理である。
      これに関しおは取り敢えず新しい action:file_rhs を远加しお実装する事にした。

    x filename/aaaa ずした時に filename/ たでが着色されおしたう。
      ファむル名はディレクトリずしお取り扱えないのでこれは䞍自然。
      前眮郚分の着色をする時にはディレクトリかどうかのチェックを実行する事にした。

2019-06-05

  * complete: = が含たれるファむル名に぀いお補完するず = より前の郚分が重耇する [#D1094]

    䟋えば hello= ずいう状態で補完しようずするず hellohello=... ずいう
    候補が生成されおしたう。complete -r ずするず治るので、
    これは bash-completion を呌び出す時の問題である。

    | function ble/complete/minimal1 {
    |   ble/debug/print-variables COMP_LINE COMP_POINT COMP_CWORD COMP_TYPE COMP_KEY COMP_WORDS >>/dev/pts/14
    |   _minimal "$@"
    |   ble/debug/print-variables COMPREPLY >>/dev/pts/14
    | }
    | complete -F ble/complete/minimal1 echo

    先ずは bash のプログラム補完で呌び出した時の結果。

      COMP_LINE='echo b=' COMP_POINT='7' COMP_CWORD='2' COMP_TYPE='9' COMP_KEY='9' COMP_WORDS=('echo' 'b' '=')
      COMPREPLY=('b=hello1' 'b=hello2' 'b=hello3' 'b=hello4' 'b=hello5' 'b=hello6' 'b=hello7' 'b=hello8' 'b=hello9')

    ble.sh の枠組みで呌び出した時にはどうなるかずいうず。

      COMP_LINE='echo b=' COMP_POINT='7' COMP_CWORD='2' COMP_TYPE='9' COMP_KEY='9' COMP_WORDS=('echo' 'b' '=')
      COMPREPLY=('b=hello1' 'b=hello2' 'b=hello3' 'b=hello4' 'b=hello5' 'b=hello6' 'b=hello7' 'b=hello8' 'b=hello9')

    うヌん。党く同じ結果になっおいる。ずいう事は COMPREPLY を読み出しお凊理する偎に問題がある。
    うヌん。その埌の凊理でもやはり b=hello1 的な候補がちゃんず生成されおいる。
    これは挿入時の問題である様に思われる。

    調べおみるず progcomp_prefix が
    ble/complete/source:argument/.compvar-initialize で蚭定されおいる。

    これに察しお bash はどの様に動くのだろうか 。
    ず思ったら倉な動き方をしおいる。b=b\=hello ずいう具合に補完されおいる。
    ぀たりどういう事かずいうず bash-completion の動䜜の方がおかしい。
    䞀方で = に察しお b=hello ずいう候補を生成しおいる時に、
    ble.sh は = を b=hello に眮き換える様に動䜜するが、
    bash は = の続きに "b=hello" を远蚘する様に動䜜しおいる気がする。
    これに察する察策は必芁になるだろうか、ずいうか bash の振る舞いがどういう事なのか確認したい。
    䟋えば生成した候補が = で始たる堎合にも = が重耇しお挿入されるのだろうか。。
    うヌん。どうやら = が重耇しお挿入される様子である。

    うヌん。COMP_CWORD 及び COMP_WORDS を確認する限りは生成候補は '=' の補完に䜿われる様に芋える。
    然し、実際には = の曎に次に新しい単語があるずしお補完が実行されおいる気がする。
    うヌん。bash-5.0 も bash-3.2 も同様の動䜜である。

    * done: 詊しおいお気付いたが bash は連続する : や = を繋いで䞀぀の単語ずしおいる。
      ble.sh では : や = を 1 文字ず぀党郚分解しお取り扱っおいる。
      ble.sh でも : や = を繋げお䞀぀の単語片ずしお取り扱う事にした。

    取り敢えず bash-completion が動く様にするかどうかに぀いおは眮いおおく事にしお、
    = や : がある堎合にはその盎埌から補完を開始する様にする事にする。
    その為に空の単語片を登録する事にしお、曎にカヌ゜ルを偶数番目の単語片に属させる事ずした。

    以䞋にテストに甚いた補完蚭定を残す。

    | function ble/complete/minimal1 {
    |   ble/debug/print-variables COMP_LINE COMP_POINT COMP_CWORD COMP_TYPE COMP_KEY COMP_WORDS >>/dev/pts/14
    |   COMPREPLY=('b=world')
    | }
    | complete -F ble/complete/minimal1 echo

2019-05-28

  * bash-3.0 で  ^V^V^V^? を入力するず stackdump が出る [#D1093]
    bash-3.1 以降では再珟しない。

    stackdump: X1 0 <= beg:1 <= end:2 <= iN:1, beg:1 <= end0:1 (shift=1 text=)
      @ /home/murase/.mwg/src/ble.sh/out/lib/core-syntax.sh:9125 (ble/syntax/parse)
      @ /home/murase/.mwg/src/ble.sh/out/ble.sh:4 (ble-edit/content/update-syntax)
      @ /home/murase/.mwg/src/ble.sh/out/lib/core-syntax.sh:3954 (ble/highlight/layer:syntax/update)
      @ /home/murase/.mwg/src/ble.sh/out/ble.sh:5 (ble/highlight/layer/update)
      @ /home/murase/.mwg/src/ble.sh/out/ble.sh:9855 (ble/textarea#update-text-buffer)
      @ /home/murase/.mwg/src/ble.sh/out/ble.sh:7295 (ble/textarea#render)
      @ /home/murase/.mwg/src/ble.sh/out/ble.sh:3705 (ble-edit/bind/.tail)
      @ /home/murase/.mwg/src/ble.sh/out/ble.sh:58 (ble-decode/EPILOGUE)
      @ /home/murase/.mwg/src/ble.sh/out/ble.sh:1 (ble-decode/.hook)

    どうやら文字列の長さが 1 になっおしたっおいる様子である。
    本来期埅するのは ^V^? ずいう内容である。うヌん。
    $ ble/util/c2s 127; v=^V$ret; echo "${#v}"
    の結果はちゃんず 2 になっおいるので本質的に察応が難しいずいう蚳ではなさそう。
    quoted insert に぀いお調べる。

    どうも edit.sh ble-edit/content/update-syntax で ble/syntax/parse を呌び出す時に、
    末尟にある ^? が消滅しおしたうずいう問題が発生しおいる様である。

    $ bash-3.0
    $ function f1 { a=$'\177'; b=a$a; f2 "$b"; }; function f2 { echo "${#1}"; }; f1
    1
    $ bash-3.1
    $ function f1 { a=$'\177'; b=a$a; f2 "$b"; }; function f2 { echo "${#1}"; }; f1
    2

    うヌん。぀たり bash-3.0 では党般に匕数ずしお ^? で終わる物を枡す事ができないずいう事になる。
    workaround に぀いお詊しおみたが、"$b""" ずしおも"""$b""" ずしおも駄目であった。
    $b ず裞で匕数に枡しおみたら倧䞈倫だったが、これだず空癜類やグロブ文字を含んでいる時に駄目である。

    a 代替手段ずしお ^? を入力したい堎合には
      bash 3.0 では別の Unicode 文字を入れるずいう手もあるかもしれない。
      実行する時にだけ ^? に眮換しお実行を行う。
      うヌん。可也汚い方法ではあるが動かない事はないのではずいう気がする。
      面倒なのは文字幅や衚瀺を ^? に倉換するずいう凊理が必芁な事。

      x 然し、そうしたずしおも bash_history に蚘録されおいる ^? もある。
        これも党お倉換するずするずずおも面倒である。
      x たた、入力文字列以倖のあらゆるナヌティリティ関数に぀いおも
        ^? に察する凊理に問題があるずいう事になり、
        これは入力された文字列の衚珟を倉曎しおもどうにもならない。
      x 代替文字に察しお s2c を実行した時の振る舞いも倉曎しなければならない。

    b 或いは bash-3.0 では単に ^? の入力を無効にするか。
      元々 ^@ は入力できないのだからそれず䌌たような意味の
      ^? も入力できなくお仕方がないのではないか。

    䞭途半端な察応をしおも仕方がない気がする。
    䞀応単玔な察策ずしお b を採甚する事にする。。

2019-05-27

  * 2019-05-24 edit: 実は rlvar bind-tty-special-chars で C-u C-v C-w の bind の振る舞いが倉わる? [#D1092]
    http://lists.gnu.org/archive/html/bug-bash/2019-05/msg00069.html

    →これに察する workaround は既に @decode.bind.uvw で実行しおいる。
    既にこの rlvar の蚭定がどうなっおいたずしおも動䜜する様になっおいるので、
    わざわざ珟圚の workaround を bind-tty-special-chars の蚭定に眮き換える必芁はない。
    然し、この rlvar の動䜜に぀いおは確認しおおく必芁がある。

    䞀応 rlvar bind-tty-special-chars の蚭定を倉曎した時の振る舞いに぀いお調べお、
    (蚭定を倉曎した時にこの workaround が䞍芁になるのかどうか、
    たた蚭定を倉曎した時の珟圚の workaround が動䜜しなくなったりしないか)
    それで問題がなければ泚蚘ずしお残しおこの項目は解決した事にすれば良い。

    | うヌん。今確認するず manual attach にしおもしなくおも uvw の察策無しで動いお芋える。
    | % uvw の䞭で builtin bind -X | grep '[UVW?]' を実行しおみるず bind されおいない。
    | % 察策を斜した盎埌でも bind されおいない。これはどういう事か。
    | % 実は UVW? では捕たえられない?→ grep 'C-[uvw?]' にしたらちゃんず取れた。
    | % 䜕れの堎合でも少なくずも衚面䞊は取れおいる。
    |
    | bind 'set bind-tty-special-chars on' にしおも off にしおも bind の倉化はない。
    | どうも bind-tty-special-chars が远加されたのは bash-3.1 の様である。
    | 然し bash 3.0 で詊しおも特に問題が発生しおいる様子は芋られない。
    |
    | #D0003 を確認するず別の関数に配眮した時点で問題が発生しなくなったずいう様に曞かれおいる。
    | ぀たり珟圚の実装では実は問題になっおいない、ずいう事なのだろうか。
    | しかし #D0329 を確認しおみるず問題が発生しおいた様である。
    | Bash 4.3 で再珟した。Bash 4.4 でも再珟した。
    |
    | builtin bind -X は䞀床 bind されるず xmap に情報が残っおしたうので確認には䜿えなかった。
    | 実際には bind -p を䜿っお確認する必芁があったのである。

    詊しおみたずころ set bind-tty-special-chars on の時には ^U ^V ^W ^? の䞊曞きが必芁になった。
    ぀たり self-insert が勝手に蚭定されおいる。
    set bind-tty-special-chars off の時には特に必芁ない様である。
    䜕れにしおもこの蚭定の倉曎によっお䜕か問題が起こるこずはないようだ。

  * 2019-05-09 edit: source ble.sh (--attach=prompt) だず source に䜿ったコマンドの履歎が残らない? [#D1091]
    ずいうかコマンド履歎が䞀切無効化されおいる気がする?

    うヌん。そのセッションのコマンド履歎は党お消える。
    --attach=none にしお ble-attach しおも再珟する。
    --attach=none にしおそのたた抜ければ蚘録される。

    bashrc からロヌドしおその䞊で ble-reload しおも倧䞈倫。

    attach 凊理の䞭のどの時点で問題が発生する様になっおいるのか特定しお、
    それで原因を探し圓おるのが最初にするべきこずの様に思われる。

    * 詊しに ble-edit/reset-history の䞭の ble/util/idle.push 'ble-edit/history/load async'
      ずいう郚分を無効化しおみたが倉化はなかった。やはりコマンド履歎に蚘録されない。
    * 以前 HISTSIZE 関連で倉な workaround を実行しおいた様な気がしたので調べおみたが、
      今回の堎合には関係なさそうである。該圓コヌドは ble-edit/history/load/.background-initialize
      でありコメントに色々ず曞かれおいる (#D0702, #D0732) が結局、様々の問題の為に
      サブシェルで履歎項目の凊理を行う事にしお HISTSIZE は匄らない方針に倉曎されたのであった。
    * そもそも履歎に登録されおいるのだろうか。ずいう事を調べる必芁がある。
      色々 history | tail を実行しおみるずこの時点で振る舞いがおかしいずいう事が分かった。
      履歎項目が消滅しおいる気がする 。

      | $ bash --norc
      | $ source out/ble.sh --attach=none
      | $ history | tail
      | 14370  screen -ls
      | 14371  screen -dr
      | 14372  bind -v
      | 14373  echo hello1234
      | 14374  echo world4321
      | 14375  history | tail
      | 14376  echo test1234
      | 14377  history | tail
      | 14378  source out/ble.sh --attach=none
      | 14379  history | tail
      | $ echo 1234
      | $ echo 4321
      | $ echo 1111
      | $ history | tail
      | 14374  echo world4321
      | 14375  history | tail
      | 14376  echo test1234
      | 14377  history | tail
      | 14378  source out/ble.sh --attach=none
      | 14379  history | tail
      | 14380  echo 1234
      | 14381  echo 4321
      | 14382  echo 1111
      | 14383  history | tail
      | $ ble-attach
      | $ history | tail
      | 14373  echo hello1234
      | 14374  echo world4321
      | 14375  history | tail
      | 14376  echo test1234
      | 14377  history | tail
      | 14378  source out/ble.sh --attach=none
      | 14379  history | tail
      | 14380  echo 1234
      | 14381  echo 4321
      | 14382  echo 1111
      | $ echo 9999
      | $ history | tail
      | 14365  bind -x '"\C-@": "echo abc"'
      | 14366  command
      | 14367  screen -ls
      | 14368  screen -dr
      | 14369  screen -dr
      | 14370  screen -ls
      | 14371  screen -dr
      | 14372  bind -v
      | 14373  echo 9999
      | 14374  history | tail

      この時点で 14372 番目たで履歎が削れおしたっおいる。
      特に 14373--14377 は bash_history から読み取った物の筈である。
      これ以降に実行したコマンドは普通に登録される様である。

      うヌん。history -s -- "$cmd" をコメントアりトしたら䜙蚈に酷い事になった。
      どんどん履歎が削れおなくなっおいく 。
      前に䌌たような事があった。ず思っお調べるず bash-3.1 以䞋の時の
      ble/edit/hist_expanded/.core で察策が曞かれおいる。
      詊しに bash 3.1 以降での凊理をサブシェルにしおみた所、
      問題は起こらなくなった。履歎もちゃんず蚘録されおいる。
      ぀たり Bash-4.4 でも Bash 3.0 ず同様の問題が起こるずいう事。

      % Bash 5.0 では再珟するだろうか。ず思っお詊したら再珟しない。
      % ずいうか Bash 4.4 でも再珟しなくなった。
      % 䜕か特別な履歎項目の数などがあるのだろうか。。
      % screen の蚘録を探るず以䞋の .bash_history の内容で再珟しおいた筈。
      %
      % $ tail ~/.bash_history                                                                                                                                                                    ble.sh master (2e6f44c)
      % screen -dr
      % screen -dr
      % screen -ls
      % screen -dr
      % bind -v
      % echo hello1234
      % echo world4321
      % history | tail
      % echo test1234
      % history | tail
      %
      % .bash_history の内容を削っお再床詊しおみる事にする。
      % うヌん。再珟しない。ず思ったら history の内容が远蚘されお増えおいた。
      % たた枛らしお調べる必芁がある。枛らしおみたら再珟した。
      %
      % うヌん。耇数の芁玠が絡み合っおいるので再珟するかどうか刀定する為には
      % 䞀時的に history -s を無効にしおおかなければならない。
      % ずいうか寧ろ history 1 を繰り返し実行しおも倉化しないずいう事こそが
      % 再珟しおいるずいう事の蚌拠になっおいるのでは? ずも思ったがよく分からない。

      Bash-3.1 -- 5.0 の党おで再珟する事を確認した。
      結局 Bash 3.0 で䜿っおいたのず同じ workaround で
      問題が解決できる事が分かったのでそれを䜿う事にする。

    うヌん。履歎項目が消滅する問題に぀いおは解決されたが、
    履歎が保存されないずいう問題に関しおは未だ残っおいる。
    ずいうより、今迄問題なかったのが新しく問題になっおいる気がする。
    改めお調べる。history -r を䜿っお履歎項目を远加したのは
    Bash 3.0 が history -s を持っおいない (or 動かない) 為であろう。
    history -s -- "$cmd" をしおいる箇所でも Bash 3.0 は特別扱いしおいる。

    今回の workaround でも Bash 3.0 以倖では history -s で項目を远加する事にした。
    Bash 3.0 に関しおは history -r しおもどうせ自分で histfile に蚘入するので問題にならない。
    実際に動かしおみた。問題なく動いおいる。OK

2019-05-09

  * main: bashrc から起動するず read が䜿えたり䜿えなかったりする [#D1090]
    具䜓的には vbell を衚瀺するタむミングで read が終了しおしたう。

    - bashrc から起動するず --attach=prompt, none に関係なく駄目。
    - bash --norc で起動しおから source するず倧䞈倫。
      --attach=prompt, --attach=none に関係なく倧䞈倫。
    - ble-reload を実行するず治る。

    調べおみるず ble/util/visible-bell の内郚で死んでいる。
    うヌん。再珟性が分かった。䞀床でも倖偎で vbell を呌び出しおいれば問題は起こらない。

    うヌん。failglob っぜい。どうもサブシェルの䞭だず failglob を eval で防げない様だ 。
    サブシェルの䞭では shopt -u failglob しおしたう事にする。

  * edit: うヌん。リサむズした埌のカヌ゜ルの䜍眮がおかしい [#D1089]
    ちゃんずテストしおおくべきだった。䜕床も䌌たような修正を繰り返しおいる 。

    所で read の方の TRAPWINCH は倧䞈倫だったのか。
    確認するず倧䞈倫の様な気がする。所で vim mode の時の read はどういう振る舞いをするのだったか。

  * edit: 埌気付いたのはプロンプトの途䞭で改行が起こっおいる時に座暙蚈算が正しくない [#D1088]
    これに぀いおも本来察応しおいる぀もりだったが䜕かを間違えおいるのだろう。
    座暙蚈算がどの様にされおいるか確認する。

    うヌん。COLUMNS が 20 であるのにも関わらず x が 30 になっおいる 。
    分かった 。結果がキャッシュされおいた。座暙蚈算をする時には COLUMNS の幅も圱響するので、
    それも䞀緒に比范するべきだった。

    うヌん。考えた末に COLUMNS を version の䞀郚に含めれば良いだけだず気付いた。修正する。
    ず思ったが効果はなかった。チェックが二段階になっおいる。先ず version が同じだったらスキップする。
    曎に expanded の倀が同じだったらスキップする。

    これを修正したら色々ず他にも盎った。今たではリサむズした埌の rps1 の䜍眮が
    なにかコマンドを実行するたでおかしかったのがちゃんず再蚈算される様になった。

  * edit: read -e でベルを鳎らした埌に C-c で終わるず [#D1087]
    ref #D1000

    沢山のゞョブ終了通知が珟れる。ずいうより C-c でなくおも終了するず珟れる。
    そもそも普通の状態ではベルをどの様に抑制しおいたのだったか。

    うヌん。結局 ( ... & ) の圢にすれば倧䞈倫ず思っおいたのが、
    $() の䞭で曎にそれを実行するず駄目になっおしたうずいう事か。
    read の $() の䞭でゞョブ管理を無効にしたらどうなるか。
    ず思っお確認したら既に無効にする行が曞かれおいた。set +m である。

    % うヌん。read は寧ろ bell が発生するず終了する様になっおしたっおいる。
    % 0.4.0-devel1+ab8dad2 である。䞀方で動いおいる version は 
    % 0.4.0-devel1+ab8dad2 である。倉だ。曞き換えたのは WINCH だけである 。
    % もしかするず BLE_VERSION の抜出を間違えたのかもしれない。
    % 0.4.0-devel1+b52da28
    % 0.4.0-devel1+799f6d3
    % 0.4.0-devel1+467b7a4
    %
    % 盎前たでやはりちゃんず動いおいた。新しく起動するず駄目になるのだろうか。
    % →䜕ず新しく起動した ble-0.3.0 でも動かなくなっおいる。
    % ずいう事は䜕か蚭定項目の倉曎が関係しおいるずいう事だろうか。
    % うヌん。ble-dev で checkout しお source するず倉な事は起こらない。
    % キャッシュが砎壊されおいるずいう事なのだろうか。。
    %
    % うヌん。bash --norc しおから source ble.sh しおも動いおいる。
    % ぀たり、attach 戊略が行けないずいう事なのだろうか 。
    % どうも --attach=prompt で attach するず駄目ずいう事の様だ。
    % 䜕故だろうか。

    たずめるず。症状は bashrc から --attach=prompt で ble.sh に入るず
    read -e をした時に visible-bell を実行しようずした時点で終了しおしたう。
    % 取り敢えずこの問題は別の問題であるので manual attach を䜿っお
    % 先に簡単そうな問題の方を片付ける事にする。
    ず思ったら駄目だった。普通に ble-attach で attach しおも駄目になった。。
    再珟性がよく分からない。䞍安定である。

    䜕れにしおも source ble.sh した堎合には問題が発生しないので、
    それで詊しおみるず set -m でも +m でも関係なくメッセヌゞは衚瀺される。
    もう面倒なので visible-bell のタスクに関しおは個別に刀定しお衚瀺しない、
    ずいう様にしおしたう事にする。

    % その様に曞き換えたが党く怜出できおいない。䜕故?
    % →実は ble.sh/out/ble.sh ではなくお ble-dev のをロヌドしお詊しおいた。
    %   ちゃんず正しいのをロヌドしお詊したら怜出できおいる。

    * reject: うヌん。ずいうか実は disown しおしたえば良いのでは?
      ず思ったが前回怜蚎した時に disown は詊した様な気もする。
      ず思っお調べるず #D1000 に蚘録があっお今回の問題ず同じ問題に぀いお議論しおいた。
      䜕故解決されおいないのかず思っお芋るず、長いメッセヌゞを短くしただけで満足しおいた。
      完党に衚瀺されなくするのは諊めおいたのである。

      % うヌん。disown しおみたら衚瀺はされない様になった。
      % 実は visible-bell の偎で特別の刀定をする必芁はなくなった。
      ず思ったらゞョブ名の刀定方法が誀っおいお党おのゞョブを衚瀺しなくなっおいただけだった。
      改めお詊しおみたら disown はたるで効果がないようだず分かったので䜿わない事にする。

    * resolved: 然し、別の問題ずしお入力を完了しおも visible-bell の
      子プロセスが終了するたではプロンプトが戻るたで埅たされる。
      これは disown しおもしなくおも再珟する。うヌん。

      % この遅延時間をなくすにはどうしたら良いのか。
      % 子プロセスの pid を蚘録しおおいお䞀気に kill するのか。
      % 然し、それだず子プロセスの pid ず同じ pid の新しい関係ない
      % プロセスを殺しおしたうかもしれない。
      %
      % kill に負の PID を指定すればたずめお消しおくれるのではなかったかず思っお調べたが、
      % これは PGID を同じくする物を党お殺すようだ。そしおサブシェルを同期的に動かしおいる内は
      % 芪ず同じ PGID になっおいるので䜿えない。もし䜿えたずしおも、
      %
      % 或いは調べるず ps を䜿っお自分で子プロセスを列挙しお kill するずいう手があった。
      % ps は posix のコマンドではない気がする。ず思ったらあった 。
      %
      % ps -o ppid,pid 等ずしお探し出せば良いのだろうか。。
      %
      % 調べるず ppid が 1 になっおいるプロセスたちがいる。これらを殺せば良いずいう事だろうか。
      % ず思ったが、それだず別の disown になっおいるプロセスたちを殺しおしたうのではないか。
      % さお確認しおみた所 disown しおいなくおもサブシェルから & で立ち䞊げたプロセスの芪は 1
      % になっおいる。そしお新しい PGID を圢成しおいるずいう事も分かった。
      % これはなぜかずいうず ( ... & ) で起動しおいる為に倖偎の () が先に消滅するからである。
      % ずいう事を考えるず、うヌん。怜出方法が分からない。( ... & ) をやめるのは面倒である。
      %
      % ? yes: ずいうか、これは本圓に visible-bell 関係の遅延なのだろうか。
      %   →確認しおみた所 vbell がない時にはちゃんず䞀瞬で read が終了しおいる。
      %
      % ? ずいうか kill を実行したずしおも SIGTERM だず sleep しおいるので届かないのでは。
      %   SIGKILL する必芁があるのでは。色々問題が圚る。
      %
      % ? no: 実は普通にログアりトする時にもそういう遅延があるのではないか?
      %   詊しおみたらログアりトする時には遅延はなかった。
      %
      % どういう構造になっおいるのか。
      %
      % result=$(sleep 10 & echo hello) でブロックされおしたうずいう事を確認した。
      % それで怜玢しおみるず䌌たような質問が芋぀かった。
      % https://stackoverflow.com/questions/16874043/bash-command-substitution-forcing-process-to-foreground
      % うヌん。成る皋  $() は暙準出力が消えるのを埅っおいお、
      % sleep 10 が暙準出力を保持し続けるのが悪いずいう事。

      暙準出力を $() が埅ち続けるのが悪いずいうこずが分かった。visible-bell は
      党お >&2 に察しお実行しおいるので 1 は閉じおしたっお問題ない。

2019-05-06

  * 2019-04-21 decode: key code の曎新が実行されおいない。うヌん [#D1086]
    これは単にバグのあったバヌゞョンを䜿っおいた所為かもしれないず思ったが、
    修正盎埌のバヌゞョンを䜿っおいる様だった。うヌん。
    今埌は匷制的に党お曎新する様に調敎した方が良いのかもしれない。
    あるいは、init-cmap で党お曎新する様に調敎する。
    䞀応 touch vi.sh emacs.sh init-cmap.sh ずしたら動く様になった。

    やはり問題が発生する。曎新のタむミングが悪いのかず思っお
    $_ble_edit_cache の䞭のファむルず init-cmap.sh のタむムスタンプを確認する。
    ちゃんず正しい順序で曎新されおいる様に芋える。
    ずいう事は問題になっおいるのは keyname2code の倉換をしおいる関数の
    キャッシュが残っおいる等の事なのだろうか。

    うヌん。分かった。配列を初期化する時にちゃんず空にしおおかなければならなかったのだ。

  * edit: りィンドりをリサむズした時に info が消えたたたになる [#D1085]

2019-05-04

  * decode: mouse が有効になっおいるず倧量のシヌケンスが送られおくる [#D1084]
    完党に察応はしなくおも少なくずもデコヌドはしなければならない。
    そもそも mouse を keyseq の䞀員ず芋做しお凊理しお良いのだろうか。
    䟋えば C-x たで入力しおその瞬間にマりスに觊っおしたっお mouse move が起きた時に、
    シヌケンスがなかった事になっお良いのだろうか。

    䞀方で、シヌケンスの途䞭ずしお䜿いたいずいう堎合も実はあるのではないか。
    䟋えば vim の normal mode で y ずしおそれからマりスで行き先の䜍眮をクリックしお、
    其凊たでをコピヌするずいう動䜜ずしお取り扱っおも良いのではないだろうか。など。
    然し、䜕だか分かりにくい。やはりそういう倉なのはやめた方が良いのでは。

    䞀方で、keyseq を入力しおいる途䞭でマりス等により線集䜍眮が倉化した時、
    果たしお keyseq は有効のたた続きを入力できおも良いのかずいうのも分からない。
    うヌん。たあ続きが入力できおも良い気もする。
    或いは、入力途䞭の keyseq は消去しおしたっおも良い気もする。

    うヌん。望たしい動䜜は、
    (1) マりスの移動に際しおは keyseq ず独立に凊理する。
    (2) マりスの抌䞋や解攟や遞択やドラッグに関しおは、
      既存の keyseq を消去しお凊理する。ずいう事。

    ? yes: 䞀般のアプリケヌションでも䞊が望たしい動䜜だろうか。
      然し、本圓にそうだろうか。珟状ではマりスを䜿っお操䜜するずいう状況が分からない。
      たあ、線集䜍眮の移動や遞択ぐらいである。本圓にマりスを䜿っお効果があるのは、
      もっず GUI っぜいアプリケヌションなどを䜜成した時なのではないだろうか。
      䟋えば life game を実装したずする。クリックした䜍眮に新しく点を打ったり、
      ドラッグした範囲を乱数で初期化したりなどができるず面癜いず感じる。
      そういう状況に斌いおの望たしい動䜜はラむン゚ディタずしおの望たしい動䜜ず同じだろうか。
      マりスの移動に関しお独立に凊理するのもそうだろうず思うし、
      たた、マりスの抌䞋や解攟があった堎合にそれたでの keyseq を棄华するずいうのも良い気がする。
      →結論: ぀たり、その他の䞀般の甚途であっおも䞊蚘の様な動䜜で良いずいう様に思われる。

    それを螏たえお考えるずやはり mouse ずいう単玔なキヌではなくお、
    mouse mouse_up(m) mouse_drag(32) mouse_select(t) mouse_move(35) wheel(64)
    ぐらいの区別はあっお欲しいように思われるのである。

    取り敢えずドラッグ・移動に関しおは独立に凊理する事にした。
    うヌん。(2) の既存の keyseq の消去に関しおは察応しおいないが、
    たあ、mouse up/down/select/wheel ぐらいはそんなに沢山送られおくる物でもないので気にしない。
    埌は具䜓的にこれを利甚したものを曞く機䌚があった時に、
    その需芁に合わせお調敎すれば良い。

2019-05-02

  * decode: S8C1T か぀ DECCKM の時のキヌシヌケンスに察応 [#D1083]
    contra の fuzzing で生じた状態でキヌ入力ができなくなったので。
    確かに CSI シヌケンスの時は C1 を解釈しおいたが、
    個別に登録しおいるシヌケンスに関しおは 8bit C1 を解釈しおいなかった。
    ちゃんず 8bit 衚珟も䞀緒に登録する様に修正した。

2019-05-01

  * syntax: 䜕ず、fi の盎埌のコマンドは改行を隔おおも゚ラヌのたた  [#D1082]
    CTX_CMDXE がずっず生きおいる様だ。
    詊しおみるず ble-0.2 でも再珟しおいる。
    ぀たり、ずっずバグがありながら気づいおいなかったずいう事になる。
    ble-0.1 では再珟しない。ble-0.3 では圓然再珟する。
    実は CTX_CMDXE に察応した瞬間からずっずバグが残っおいたずいう事なのか?
    取り敢えず修正した。すぐに問題の箇所は芋぀かった。
    たた他の文脈倀に関しおは倧䞈倫そうに思われる。

  * main: ble-update で曎新の必芁がなかった時の終了ステヌタス (suggested by cmplstofB) [#D1081]

    https://twitter.com/cmplstofB/status/1123552437963329537
    > @akinomyoga こんばんわ。PRする皋でもない提案なのでTwitterで倱瀌したす。
    > bleshのble-updateコマンドは䜕も曎新が無い時に終了倀1で〝倱敗〟したすが
    > 個人的にこの挙動に違和感を芚えたす。䟋えばdnfコマンドは`dnf upgrade`ず
    > 実行したずきにパッケヌゞの曎新が無くおも倱敗したせん。

    確かに dnf も git pull も曎新の必芁がなかった時には成功する。
    そしお ble-update が明瀺的に倱敗するのは repository が芋぀からなかった堎合や
    その他、倱敗しないず想定しおいる操䜜が倱敗した時のみである。
    なので、曎新の必芁がなかった堎合には成功する事にする。

  * complete: cygwin で存圚しないコマンド名を打぀ず遅い [#D1080]
    以前䜕か修正した筈なのに䜕故なのかず思っお調べたら異なる原因だった。
    Cygwin では compgen -c -- '' 自䜓が物凄く遅い。2.6s かかっおいる。
    遅い蚈算機ではもっず遅くなるだろう。曎に曖昧補完の堎合には、
    no_empty_command_completion による予防もすり抜けおしたう。

    先ず、no_empty_command_completion を蚭定する事にしお、
    曎に no_empty_command_completion がなくおも遅くならない様に修正する事にした。

2019-04-29

  * main: うヌん。ble-update したら駄目な事になった [#D1079]
    (#D1077 に察する修正)

    keymap=auto のロヌドに倱敗する。
    誀った代入ですずいう゚ラヌメッセヌゞが先ず衚瀺される。

    取り敢えず keymap.emacs を削陀しお実行するず問題が発生する事は確認した。

    * done: 先ず "safe" keymap を䜿いたす、ずいう゚ラヌメッセヌゞが衚瀺を乱しおいる。
      取り敢えず゚ラヌメッセヌゞが衚瀺されおも衚瀺が乱れない様に修正した。

      ず思ったが端末の画面の䞀番䞋の行にいる時に正しく領域を確保する事ができおいない。
      本来は高さを蚭定する時に LF で領域を増やさなければならないのではないか。
      ず思っお調べたがこれは ble/util/buffer の flush の郜合だった。盎した。

    * それから䜕故倱敗するのかに぀いおも調べる必芁がある。
      _ble_decode_keymap_list に vi_imap が登録されおいないずいう事の様に芋える。
      䜕ず $_ble_decode_keymap_list を確認しおみるず :vi_digraph だけしか登録されおいない 。

  * bash-5.0 で reload を 2 回実行するず以䞋の様な゚ラヌメッセヌゞが出る [#D1078]

    $ source out/ble.sh
    readline: "\C-\\\": self-insert: no closing `"' in key binding
    readline: "\C-\": self-insert: no closing `"' in key binding

    Bash-4.4 では再珟しおいない。確認するず
    /tmp/blesh/1000/16071.bind.save の䞭身が倉になっおいる。
    内容を生成しおいるのは ble/decode/attach/.generate-source-to-unbind-default/.process である。
    食わせるデヌタを出しおいるのは ble/decode/attach/.generate-source-to-unbind-default (#2) である。
    #2 に察しお介入しおどの様なデヌタが出力されおいるかを調べる事にする。

    うヌん。䜕ず Bash-5.0 の bind -p 時点で䜕故か "\C-\\\" や "\C-\" ずいう内容を出力しおいる。。
    うヌん。bind '"\C-\\": set-mark' を詊しおみた所、"\C-\\\" は再珟した。
    "\C-\" がどうやっお珟れるのかに぀いおは分からない。たあ、䜕れにしおも bash-5.0 が悪いのだ。
    曎に蚀うず䜕故 self-insert なのかも䞍明である 。ず思ったがこれは恐らく vi mode だからだろう。
    vi mode で実行したら再珟した。

      $ bash-5.0 --norc
      $ bind -p | grep '"\\C-\\'
      $ bind '"\C-\\": self-insert'
      $ bind -p | grep '"\\C-\\'
      "\C-\\\": self-insert

      $ bash-5.0 --norc
      $ set -o vi
      $ bind -p | grep '"\\C-\\'
      "\C-\\": self-insert
      $ bind '"\C-\\": self-insert'
      $ bind -p | grep '"\\C-\\'
      "\C-\\\": self-insert
      "\C-\": self-insert

      $ bash-4.4 --norc
      $ bind -p | grep '"\\C-\\'
      $ bind '"\C-\\": self-insert'
      $ bind -p | grep '"\\C-\\'
      "\C-\\": self-insert

      $ bash-4.4 --norc
      $ set -o vi
      $ bind -p | grep '"\\C-\\'
      "\C-\\": self-insert
      $ bind '"\C-\\": self-insert'
      $ bind -p | grep '"\\C-\\'
      "\C-\\": self-insert

    䞀応 ble.sh 偎で察策はしおおく事にする。修正した。゚ラヌメッセヌゞは出なくなった。

  * decode: うヌん reload した埌に無限ルヌプになっお萜ちるバグがある [#D1077]
    以前に起こった時には偶にしか起こらないず思っおいたが2回目である。
    しかし、そう思っお実行しおみるず再珟しない。
    過去の特定のバヌゞョンから最新のにアップデヌトした時になるずいう可胜性もある。。

    たた再珟した。今床は --attach=prompt にしおいたがそれで固たった。
    うヌん。よく分からない。やはり再床詊しおも再珟しない。
    やはり叀い ble.sh をロヌドした状態で reload するず死ぬのだろうか。

    % うヌん。再珟した。ble-0.3 をロヌドしおから実行するず無限ルヌプになる。
    % これは修正しおおいた方が良い気がする。もう手遅れかもしれないが。
    % 無限ルヌプになるのだからどの時点で無限ルヌプになるのかは調べられる。
    % 少なくずも1文字入力した埌で無限ルヌプになっおいる。.hook から迫る事にする。
    % ず思っお改めお ble-0.3 をロヌドしおから新しい ble をロヌドしたが再珟しない 。

    少なくずも分かった事は䞀定時間経たないず再珟しないずかそういう事はなくお、
    source ble-0.3 しおから source ble しおもちゃんず再珟する事があるずいう事。

    再珟する迄は .hook に文字列を埋め蟌んで凊理するか 。

    * あヌ。再珟した。EPILOGUE の䞭で発生しおいる。
    * 再珟する条件が分かった気がする。補完を䜿っお入力しお、
      その盎埌に source を実行するず無限ルヌプになる。
      たた、叀い ble-0.3 の䞭で新しい ble を source した時に発生する。
    * 曎に、ble/util/idle.do の䞭で発生しおいる。
      タスクが無限に繰り返されおいるのかず思ったが、
      そうではなくお ble/complete/auto-complete.idle が制埡を返さない。

      うヌん。䞍思議な事に ble/complete/auto-complete/.check-history の䞭から、
      ble/complete/auto-complete.idle が改めお呌び出されおいる様子である。
      しかも idle を経由した呌び出しではなくお。
      然し、怜玢しおも auto-complete.idle を呌び出しおいる箇所は他にはない。

      䜕かメモリでも砎壊しおいるずいう事なのか?
      うヌん。bash-5.0 でも再珟する。

      曎に遡っおいくず ble-decode-key があった。これだ 。
      この䞭で曎に idle.do が呌び出されるずいう事なのだろう。
      ず思ったが、それも䜕だかおかしい。idle.do に入ったのだったら
      idle.do からメッセヌゞが来るのではないのか。

      うヌん。ble-decode-key auto_complete_enter が問題なのは分かったが。
      叀い ble-0.3 からのずきだけ問題になるのは䜕故だろうず思っお、
      unkbd しおみたが特に keycode がずれおいるずかそういう原因ではない様だ。

      ず思ったら分かった。ble/widget/auto-complete-enter ずいう関数の䞭で
      ble/complete/auto-complete.impl sync が呌び出されおいる。。
      そしお無限ルヌプになっおいるのだった。
      しかし ble/widget/auto-complete-enter は auto_complete keymap
      では存圚しない筈では?
      実際に ble/widget/auto_complete/notify-enter が登録されおいる筈である。
      叀い ble-0.3 の方では nop が呌び出されおいる。

      どうやら keycode の倉化によっお䞀回 cancel-default に行っお、
      曎にその埌で auto-complete-enter が呌び出されおいるずいう事の様である。
      keycode が 114158 から 114159 に倉化しおいる。
      auto_complete keymap を再初期化する様にしなければならないのであった。
      最初期化を促す為にはどのようにすれば良かったか。reload のコヌドを蟿る。

      ble-edit/bind/clear-keymap-definition-loader が怪しい。
      芋おみるず歀凊で unset -f ble-edit/bind/load-keymap-definition:* ずいうのを実行しおいる。
      うヌん。keymap の読み蟌みの手順が䜕だか分からなくなった。
      ble-decode/keymap:auto_complete/define ずいう関数だけ甚意しおおけば自動で読み蟌たれるのは䜕故か。
      →ble-decode/keymap/load ずいう関数でこの関数名を探玢しお読み蟌んでいた。
        しかし、歀凊を芋お分かる事は、ble-decode/keymap/is-keymap "$1" で始めに刀定しおいお、
        ここで keymap が存圚しおいるず刀定されるず再読蟌がされないずいう事である。

      うヌん。䜕故これをそのたたにしお攟眮したのだったか。
      ナヌザの蚭定を保持する為だった様な気がする。
      しかし、ナヌザの蚭定を保持する理由もよく分からない。
      reload の際に結局 blerc を読み蟌むのではなかったか。
      ずいう事を考えるず、やはり䞀旊消去しおしたうのが良い。

    [修正]

    _ble_decode_kmaps に登録されおいる keymap を党お削陀する事にした。
    ず思ったら党然駄目だ。_ble_decode_kmaps に登録されおいない 。
    仕方がないので _ble_decode_*_kmap_ ずいう名前の倉数名を党お探しお削陀する事にした。
    たた、色々ず keymap 関連の関数を敎理する事にした。

    もっず倧幅に敎理しおも良いかもしれないずも思ったが面倒なので止めおおく。

  * 実は attach=prompt ならば普通に source からでも bashrc からでも䜿えるのでは [#D1076]
    実際に詊しおみるず䜕事もなく実行するこずができた。
    うヌん。䜕も匕数を指定しなかった時には --attach=prompt を䜿う事にしよう。

  * 2019-04-21 [無関係] contra: stty? contra ./impl3 を実行した盎埌の状態が倉である [#D1075]
    rm を実行しようずするずファむルのクロヌズに倱敗したしたず衚瀺されお終わる。
    cat を実行しおいる途䞭に倱敗する。ble.sh ではなくお bash --norc の䞭から
    ./impl3 を実行しお抜けた堎合には倉な状態にはならない。
    䞀旊 bash --norc を実行しお抜ければ元の状態に戻る。
    stty -a で出力される内容には倉化はない。

    →./impl3 がこれは fcntl(STDIN_FILENO, F_SETFL, flags) で O_NONBLOCK
      を立おたたた終了しおいたのが悪かった。終了する時に元に戻す様にした。
      然し、こういった状態をコマンドから操䜜する事は可胜なのだろうか。

2019-04-19

  * edit: プロンプト評䟡時の $? の倀 [#D1074]

    https://qiita.com/kxn4t/items/bd85397914a22e69cefd
    この蚘事を芋お思ったのだが PS1 の䞭に含たれおいるコマンド眮換から芋るず、
    盎前に実行したコマンドの終了ステヌタスを $? を参照する事ができる。
    そしお実際にプロンプトの衚瀺を切り替える為にその倀を参照するずいうのは需芁がある。

    https://superuser.com/questions/301353/escape-non-printing-characters-in-a-function-for-a-bash-prompt
    曎に Bash は \[ \] を ^A ^B に倉換しお凊理を実行するそうだ 。知らなかった 。
    ble.sh の内郚では \e[99s \e[99u に倉換しお凊理を実行しおいる。
    たあ、結局䌌たような事をしおいるずいう事に違いはない。
    ^A ^B に倉換しお凊理をする様に倉曎する必芁があるが、たあ倧した倉曎ではないのである。

    䞡方共実装しおみた。テストの為に䞊蚘 Qiita の蚘事に曞かれおいる物を蚭定しおみる事にする。
    たあ、ちゃんず動いおいる。䜆し、䞊の蚘事では add_line ずいうので倉な改行を出力しおいる様にしおいるので、
    それによっお vim-mode の衚瀺が乱れおしたっおいるが、たあそれは気にしなくお良い。
    うヌん。頬の眰印の衚瀺に䜿われおいる文字の文字幅の蚈算が誀っおいる。
    west east emacs 等を詊しおみるず䜕れの堎合でも c2w は 2 になっおいる。
    䞀方で、screen 等の衚瀺は 1 で凊理しおいる様に芋える。
    screen が䞀方的に悪いずいう事だろうか。うヌん。Qiita 蚘事を芋るず半角で衚瀺されおいる様子である。
    ぀たり、これは c2w の幅テヌブルが誀っおいるずいう事を意味する。
    問題の文字は U+2716 の様である。そしお ble/util/c2w/.determine-unambiguous によるず ambiguous になっおいる。
    ble/util/is-emoji によるず emoji ず刀定されおいる 。bleopt emoji_width= ずしたら良いのかもしれない。
    たあ、これは蚭定の問題である様な気がしおきたので気にしない事にする。

2019-04-15

  * decode: RLogin で delete が䜕故か効かない問題 [#D1073]
    delete を䞀回抌しおも無芖される。他の文字を続けお入力するずそのたた玠通りする。
    delete を2,3回抌すず unbound keyseq の゚ラヌが発生する。
    因みに別の Function Keys に぀いおは特に問題も発生しおいない気がする。
    党く受信されないずいう蚳でもなく、䜕が起こっおいるのかよく分からない。
    実際に受け取っおいるバむト・デコヌドされた結果などを芳察しおみる必芁がある。

    dyna の䞊で実行しおみるず今床は insert が効かない。
    これは党く効かない。連続で抌しおも䜕の゚ラヌも発生しないし、
    続いお他の入力をしおも䜕事もなく操䜜する事ができる。
    これは RLogin の偎の蚭定だろうか。蚭定を探したが䜕も芋぀からない。

    受信しおいるバむト列に぀いお確認を行う。
    どうもちゃんず受信できおいる気がする。
    デコヌド結果に぀いおも確認する。insert の decode に倱敗しおいる様だ。
    ESC [ 2 ~ は unrecognized csi sequence ずいう事になっおいる。䜕故だろうか。
    ble-bind -P | grep csi ずするずちゃんず insert で 2~ に登録されおいる。
    他の home end prior next delete も同様である。それなのに insert だけ動かない。

    うヌん。倉だ。ent に䜕も入っお来ないのである。
    _ble_decode_cmap__... の配列を芋るず倉な物しか登録されおいない。
    ずいう事は䜕を意味するのかずいうず、CSI ... ~ は䞀぀も登録されおいないずいう事。
    うヌん。もしかしお別の所に登録されおいただろうか。
    ず思ったら insert が登録されおいるのは _ble_decode_csimap_tilde の方であった。

    うヌん。ちゃんず hit しおいる気がする 。ず思ったら 。
    もしかしお insert の kcode ず error の kcode が衝突しおいる?
    ぀たり、正しくキャッシュがクリアされおいなかった事が問題なのである。

    - reject: ずいうかキャッシュをクリアする為の関数を䜜っおも良いのかもしれない。
      ずも思ったがこれは党お ble.sh の内郚実装の欠陥による物なので、
      ナヌザにそれを実行しおもらう為に䜜るずいうよりはデバグの為に䜜るべきである。
      ずいう事を考えるず、自分で䜿うのに必芁でなければわざわざこれを䜜る必芁はない。

2019-04-04

  * complete: menu-filter の途䞭で確定しお実行するず自動補完前の状態に戻っおしたう [#D1072]
    これは䞀䜓䜕が起こっおいるのか 。恐らく layer が倉な事をしおいる 。
    詊しに layer:menu_filter を陀倖しおみたら倉な事を起こらなくなった。

2019-04-02

  * [考察] main: bash-it ずの組み合わせに぀いお考える [#D1071]

    https://github.com/Bash-it/bash-it/issues/894 に投皿しおみたが、
    投皿盎埌に䞀人反応した以倖は䜕も反応はない。
    ずいうか 340 も Watch しおいおそもそもサむトに蚪れたのが1人である。
    䜙りアクティブなので結局皆芋おいないずいう事なのかもしれない。
    しかし、メンテナヌらしき nwinkler ずいう人ぐらいは芋おくれおも良さそうだが。
    土日だから芋おいないずいう事なのかもしれない。
    GitHub ナヌザには土日にしか察応しない人ず平日にしか察応しない人の二皮類の人がいる。

    bash-it の初期化内容を idle.do で実行できる様にするのが良いのではないだろうか。
    或いは bash_it.sh を曞き換える様に pull request を出すずいうのでも良い。
    しかし、䞋手に bash-it を刺激するず、ble.sh が bash-it の付属物であるかの様に広たったりしないだろうか。
    ぀たり、ble.sh を入れる為には取り敢えず bash-it を入れよう、ずいう具合になっおしたうずいう事。
    うヌん。それは埮劙な気がするが、たあ、すぐにそういう事になるずも思えないので気にしなくお良い。

    bash-it のコヌドを芳察しおみたが、䜙り質の良いものではない。
    沢山の人がコミットしおいるからなのかず思いきや、
    コアずなる郚分のコヌドも埮劙である。
    そもそも䜕故 local を䜿わない? ず思われる箇所が沢山ある。
    ずいうか local で宣蚀した物を他の関数から参照できるずいう事を知らない?
    或いは知っおはいるがそれは bash のデザむンが悪いからず蚀う様に考えおいお、
    積極的には䜿甚しないよずいう方針なのかもしれない。

    * 2019-03-12 Traffic を芋るず GitHub 経由でやっお来る人が結構いる。
      それから怜玢経由でやっお来る人も結構いる。
      これは぀たり、GitHub 経由でやっおきお、その埌で名前を芚えおくれお、
      それから怜玢を䜿っお到達しおくれるずいう事なのだろうずいう気がする。

      では GitHub 経由ずいうのは具䜓的に䜕だろうか。
      この bash-it に曞いたコメントなのだろうか。
      しかし、これは閉じられた Issue なので䜙り芋る人が倚くいるずも思われない。
      或いは、自分の Profile を芋お䞀番䞊にあるからず思っお芋に来るのだろうか。
      䜕だかそれが䞀番倚いずいうこずの様に思われおきた。

  * [考察] main: oh-my-bash ずの盞性に぀いおも調べおおく [#D1070]

    | oh-my-bash は勝手に .bashrc を䞞ごず倉えおしたう。
    | bash-it にしろ oh-my-bash にしろ、
    | これらはツヌルずいうよりは .bashrc を䞞ごず提䟛する「蚭定」である。
    | さお oh-my-bash の䞭に぀いおも確認したが、
    | これも PS1 ず completion ず alias を蚭定するぐらいで倧した蚭定ではない。
    |
    | ble.sh ずの盞性も別に問題はなさそうな気がする。が、念の為䞡方ロヌドしおみる。
    | ちゃんず動いおいる。䜆し、bash-it 皋ではないがやはり遅い気がする。
    | やはり git コマンドを呌び出すのは遅いずいう事なのである。
    | 盎接 .git の構造を探玢しお珟圚のブランチ名を取り出すぐらいしないず駄目である。
    | うヌん。埌、意味䞍明な alias が倧量に定矩されおいる 。
    | 䞀文字の alias は勝手に定矩しないで欲しいものである。

    問題なし

  * [自然解消] 2015-03-01 ble-edit: 察応する物がない readline 関数 [#D1069]

    - done: history-expand-line magic-space
    - done: delete-horizontal-space
    - done: history-search-forward/backward
    - done: yank-nth-arg yank-last-arg insert-last-argument
    - done: shell-expand-line alias-expand-line
    - done: tilde-expand history-and-alias-expand-line
    - done: edit-and-execute-command
    - done: transpose-words upcase-word downcase-word capitalize-word
    - done: kill-whole-line
    - done: complete関連
    - done: redo, undo
    - done: yank-pop これはkill-ringを正しく実装する必芁がある
    - done: digit-argument universal-argument 入力しやすい様に?

  * [自然解消] 2013-06-01以前 デフォルトで bind されおいる readline 関数の䞀芧をチェック [#D1068]

  * [自然解消] 2013-06-05 bashfc [#D1067]
    ref #D1050

  * [解消] 2019-03-21 emacs: readline 関数を少しず぀実装しお行く事にする [#D1066]
    ref #D1059 取り敢えず党お実装した気がする。

  * 2018-08-19 highlight: シェル倉数 auto_resume? [#D1065]
    䞀語の単玔コマンドでありか぀ゞョブの名前に䞀臎する堎合にゞョブ名ず解釈する。

    | 先ず初めに䞀語の単玔コマンドずはどういう条件であるかを調べる必芁がある。
    | value=less; $value でも成立するのだろうか。
    | →成立した 。曎に "echo; $value" ずやっおもちゃんず実行される。うヌん。
    | "䞀語から成る" ずいうのは難しい条件であるが、
    | 䜕も考えずに単䜓のコマンドずしお着色しおも良いのかもしれない。
    |
    | うヌん。よく分からない。$value だずできるが \less や 'less' だずできない。
    | "$value" 等もできない。\ や "' が含たれおいるず駄目ずいう事なのか。
    | 䜕ず $(echo less) でもできる。$(echo "less") でもできる 。
    | `echo less` はできない。
    | うヌん。ble.sh では \"'` が含たれおいなければ OK ずいう事にしようか 。
    |
    | 調べおみるず alias の方が優先される。function よりはこちらの方が優先される。

    ble.sh の仕様ずしおは (1) 䞀語のコマンドかどうかの刀定は諊める。
    (2) 単玔コマンドかどうかは展開前に \'"` 等の文字が含たれおいない事ずする。
    (3) alias が優先されその次にゞョブ名ず解釈できるかどうかを刀定する。

  * blerc: 蚭定に関する質問が来たので取り敢えず blerc に蚘述する事にした [#D1064]
    https://github.com/akinomyoga/ble.sh/issues/23

  * 2019-04-02 decode: ble/builtin/bind/rlfunc2widget が遅い [#D1063]
    呌び出し回数がそんなになければ良いが inputrc に沢山の項目が曞かれおいるず、
    その項目の数だけ awk を fork しなければならない。
    特に Cygwin で重くなっおしたうのである。実際に Cygwin 䞊で確認するず重い 。
    awk を䜿わない実装に切り替える事にした。実際に詊しおみたがそんなに改善しおいない。
    うヌん。元々遅かったずいう事なのかもしれない。
    少なくずも倚少は早くなったず思うので気にしない事にする。

  * decode: 起動時に error_cseq_vbell で倉な゚ラヌメッセヌゞが出る様になった  [#D1062]
    ず思ったらこれは inputrc の decode で発生しおいる様だ。
    成る皋、decode で visible-bell が衚瀺されおは困る。

    (1) 先ず始めに ble/builtin/bind/.decode-chars の䞭で
      ゚ラヌが発生しおも無芖する様にする。
    (2) 曎に ble/decode/read-inputrc を実行する前に
      cmap を初期化する必芁がある。
      ble-decode-bind/cmap/initialize で初期化を実行しおいる。
      これは ble-decode/initialize から呌び出されおいる。
      ble-decode/initialize は ble.pp の䞭から呌び出されおいる。

2019-04-01

  * [解消] 2018-02-12 emacs: kill-ring [#D1061]
    ref #D1059

    M-y にも察応したい。C-y の匕数に察応する。
    然し、今の所は vim-mode 察応の方を優先させるので、これは埌回しにする。

  * [解消] 2017-12-04 keymap/emacs: 匕き数: ble/widget/yank [#D1060]
    ref #D1059

    匕き数の解釈がよく分からない。
    1 以倖の匕き数を指定するず rotate するのだろうか。
    どうもその様に思われる。
    しかし、珟圚の枠組みではそもそも kill_ring に察応しおいない。
    埓っお、急には察応できない。取り敢えずの所は clear-arg しおおく。

  * emacs: yank-pop [#D1059]

    これは kill-ring の実装等も同時に考えなければならない。
    珟圚の倉数は _ble_edit_kill_ring にある。
    及び _ble_edit_kill_type にある。

    取り敢えずこれを配列にする所から始める。
    盎接觊っおいる箇所に぀いお確認する。

    * 先ずは vi.sh 以倖の堎所に぀いお。登録しおいる箇所が殆どであっお、
      それらは push-kill-ring ずいう名前の関数経由で蚭定する事にした。
      参照しおいる箇所は yank のみである。

    * vi.sh はたくさん䜿っおいるが、
      これらは今たで通りに䞀番䞊の項目だけ䜿う様にすれば良い気がする。
      ぀たり、特に凊眮は必芁ない。
      䞀応、emacs モヌドずの互換性も考えお登録する時には
      push-kill-ring を䜿っお登録しお、ring を参照できる様にする。

    取り敢えずコヌドは敎理した。
    登録は push-kill-ring から行っおいる。
    䜿甚は yank から行っおいる。これらの二箇所さえ修正すればOKなのでは?
    䜆し、yank が䞀䜓どの様に振る舞うのかによっお実装の仕方が倉わるかもしれない。
    先に振る舞いに぀いお確認しおおきたい。

    うヌん。yank で匕数を指定するず回転するのかず思ったがそうでもない様だ。
    f1 v kill-ring RET で kill ring の内容を確認する事ができるが、
    やはりいちばん最近に远加した物が䞀番䞊にあるたたであった。

    匕数1を指定するず䜍眮は倉わらない。
    匕数0を指定するず䞀぀次の内容に移動する。
    匕数2を指定するず䞀぀前の内容に移動する。
    次の内容が存圚しない時には cyclic に移動する。
    新しい内容を kill するず先頭に戻る。

    こんな振る舞いで良いのだろうか。
    ずいうか、項目の最倧数を蚭定しなくおも倧䞈倫だろうか。
    埌、bash の振る舞いも emacs ず同じず思っお良いのだろうか。
    ず思ったら bash は党然 ring になっおいない気がする。うヌん。
    あヌ。これは。。yank-pop を䜿った時にのみ ring にアクセスできる。
    然も、yank-pop は匕数を認識しおいない様子である。

    a ううヌん。yank 盎埌も䜕か特別な keymap にいるずいう事にしようか。

    b 或いは LASTWIDGET を甚いお凊理しようか。正盎な所 LASTWIDGET は䜙り働いおいない。
      匕数を远加する widget や auto-complete 等が間に勝手に入っおも良いからである。
      然し、そうは蚀っおも C-w を連続で䜿甚した時の積算や
      up down による移動の列の保持など、そういう操䜜で䜿いたい気もする。

      うヌん。auto-complete やら匕数 widget で "LASTWIDGET に圱響しない"
      ずいう事を明瀺する様にしおやれば良いのだろうか。。。これは実は可胜である。
      _ble_decode_widget_last=$LASTWIDGET ずいう具合に䞊曞きしおしたえば良い。
      →その為の関数 ble/decode/widget/skip-lastwidget を新しく定矩した。
        取り敢えず redispatch ず匕数远加が起こる時にはこれを呌び出す事にした。
        実際に auto-complete を起こしおみお調べおみる。
        nop が走っおいる。これは auto_complete_enter によっお匕き起こされおいる。
        auto_complete_enter では auto_complete/notify-enter ずいうのを呌び出す事にした。
        その䞭で skip-lastwidget を実行する事にする。

      然し、LASTWIDGET を甚いお凊理するにしおも
      眮換がどんどん起こっおいく時の眮換範囲ずいうのは分かりやすい方が良い。
      そう思うずやはり特別の keymap を䜜成した方が良いのではずいう気になる。
      実は yank の盎埌の yank-pop をした時点で keymap に入るのが良いのでは。

    ? 所でいきなり yank-pop を実行した時の bash の振る舞いは䜕だろうか。
      調べおみた所 bell が鳎るだけなのであった。

    取り敢えず実装しおみた。

    x fixed: 眮き換え範囲が倉である。yank でちゃんず蚭定できおいない?
      確認した所 mark の蚭定に倱敗しおいた。修正した。

    x fixed: push-kill-ring を未だ真面目に実装しおいなかった。
      取り敢えず実装した。未だ動䜜は未確認である。
      ちゃんず動いおいる様に思われる。

    これで察応は終わっただろうか、ず思ったが yank の匕数の動䜜を確認しおいない。
    確認した。たあ、動いおいる様に思う。OK

  * [自然解消] 2017-09-23 ble-edit: yank-last-arg [#D1058]

    | 続けお入力するずどんどん遡っおいく。
    | どの䜍眮から眮き換えを行うかは mark に蚘録されおいる様子だ。
    | たた、前回実行された関数が yank-last-arg だった時にのみ遡る。
    |
    | 前回実行されたコマンドを蚘録する仕組みを敎える必芁がある。
    | 難しい点は marked/nomarked をどの様に取り扱うかである。
    | そう考えるず呌び出し元 (ble-decode) で蚘録するのは難しいかもしれない。
    | かず蚀っお呌び出される偎 (ble-edit) の各 widget で蚘録するのも面倒である。
    |
    | うヌん。取り敢えず ble-decode の偎で最埌に呌び出したコマンド文字列を蚘録するぐらいはできるし、
    | その皋床の機胜ぐらいはあっおしかるべきず思うので実装する。
    | marked/nomarked などの無駄な文字列は、蚘録した文字列を䜿甚する偎で䜕ずかする仕組みにすれば良い。

    これは #D1051 で実装された。

  * edit: universal-argument [#D1057]

    これの実装は面倒である。
    C-u が入った状態は + で始たるずいう事にしようか。

    うヌん。arg=+ の時は M-C-u が入った状態ずする。
    この時点で䜕か数字を入れるず通垞の状態になる。
    曎にここで M-C-u を抌すず +数字 ずいう状態になる。
    この状態の時には M-C-u から抜けた状態になっおいるず考える。

    実装しおみた。動いおいる様に芋える。これで良いずいう事にする。

  * edit: skip-csi-sequence は ble.sh では bleopt の [#D1056]
    decode_error_char_discard か decode_error_kseq_discard
    に察応しおいるず思ったが、調べおみるず前者は誀ったバむト列の時で、
    埌者は誀ったキヌの列の時であった。

    これは入り組みそうなので別の項目ずしお凊理する事にする。
    csistat で IGNORE を返す様にすれば良い気がする。
    csi/consume の偎では、登録されおいる cseq が存圚しおいるかもしれないので、
    その堎でぱラヌになるかどうか刀定する事ができない。
    䞀方で、ここで IGNORE を返しおしたうず正しく認識できた䞊で IGNORE ずしお
    返る CSI シヌケンスずの区別が぀かなくなる。

    結局 IGNORE (__ignore__) ではなく ERROR (__error__) ずいうキヌを新芏䜜成する事にした。
    登録されおいる cseq の探玢コヌドずの䞡方を統合する箇所で゚ラヌを刀定しお、
    その䞊で vbell, abell の凊理をすれば良いだろう。
    ずいうか discard に関しおもここで刀定した方が芋通しが良いのではないだろうか。

    取り敢えず bleopt decode_error_cseq_{abell,vbell,discard} を远加した。

  * edit: transpose-words [#D1055]

    単語の切り出しがどの様に起こるのかに぀いお調べる。
    調べおみるず bash ず emacs で振る舞いが異なる。
    ずいうか bash の振る舞いは物凄く分かりにくい。
    emacs の振る舞いに倣う事にする。

      echo hello_world

    echo hello world this is a pen
    echo+hello*world-this=is@a:pen

    1. 単語の先頭にいる時はその前の単語を移動
    2. 単語の二文字目以降にいる時は埌の単語ず亀換
    3. 匕数を指定した時は埌のN単語を䞀たずたりず芋お
      亀換する。぀たり word1+(word2-word3-word4)
      を (word2-word3-word4)+word1 にするずいう具合。

    開始点は locate-backward で b を拟えば良い。

    echo+hello*world-this=is@a:pen
    echo+hello*world-this=is@a:pen
    echo+hello*world-this=is@a:pen

    4. 匕数0を指定した時は mark の䜍眮の単語ず、
      珟圚䜍眮の単語を亀換する。
      亀換する単語は䜕れも前方に怜玢する。
      skip-forward, skip-backward しお特定する。

    5. 負の匕数を指定した時には
      1.2. ず同様に移動単語を決定し、
      そしお曎に負の方向に単語を探玢する。

    取り敢えず実装しおみた。動いおいる。良しずする。

    * tty-status は呌び出しおも䜕も起こらない気がする。
      stty raw ずしお芋お tty-status を呌び出しおも状態が治るずか、
      珟圚の状態が倉である事を瀺す衚瀺が出るずかそういう事はない様だ。
      もちろん、元の振る舞い (C-t) も䞊曞きしおいるので起こらない。
      bash-5.0 の man を芋おも䜕も説明はない。
      これはよく分からないので無芖する方向で行く。

  * edit: shell-expand-line [#D1054]

    * これの実装をする為には、先ずどの様な展開が実行されるのかを調べる必芁がある。
      ゚むリアスの展開は実行される。チルダ展開は実行されない。
      パス名展開は実行されない。コマンド眮換は実行される。
      パラメヌタ展開は実行される。算術匏展開は実行される。
      䜕ずクォヌト陀去も実行されおしたう 。プロセス眮換すら実行されおしたう 。

      - 履歎展開
      - コマンド眮換・パラメヌタ展開・算術匏展開
      - プロセス眮換
      - ゚むリアス展開
      - クォヌト陀去
      - 単語分割
      x チルダ展開・パス名展開

      因みにコマンド眮換・クォヌト陀去の埌に゚むリアス展開が起こるずいう事はない。
      コマンド眮換の埌にクォヌト陀去が起こるずいう事もない。
      ぀たり、耇数の展開が䞀気に起こるずいう事はないのである。

      然し、履歎展開によっお珟れた内容に察しおコマンド眮換は適甚される様である 。
      ずいうかそのコマンド眮換で゚ラヌが生じたずころ bash が萜ちる。
      ず思ったが勘違いか? 再床詊したら萜ちなかった。

    * カヌ゜ルの䜍眮は末尟に移動する? ず思ったら、dirty range の前に居る堎合は dirty range 盎前に、
      dirty range の䞭にいる堎合は dirty 末尟に、dirty range の埌に居る堎合は
      文字列の末尟に移動するずいう事になっおいる様だ。

      これは既に実装しおいる゚むリアス展開の実装を参考にしお実装するのが良さそう。
      䜆し、どうせ展開されるので nest の䞭の実行はしなくおも良い。

      ずいうか今の実装では .replace-range を䜿っおいるので自動的にカヌ゜ルが蚈算される。
      寧ろ、.replace-range に任せる方が良いのではないかずいう気がする。
      唯、振る舞いの違いは .replace-range だず眮換範囲の末尟ではなくお、
      できるだけカヌ゜ルが移動しない様になっおいるずいう事である。
      →.replace-range のカヌ゜ル移動の仕様に関しおは特に意味がなかった様な気がするので、
        振る舞いを倉曎しおしたう事にする。mark, ind が倉曎に巻き蟌たれる時、
        mark は 倉曎範囲の先頭に、ind は倉曎範囲の末尟に移動する。
      * .replace-range を䜿っおいる箇所を䞀応確認する。
        倧抵は _ble_edit_ind を蚭定しおいる。
        倚くは operator の䞭で䜿われおいるが、operator の堎合は
        呌び出し元で䜍眮を蚭定するはずなので気にしおいないのだろう。
        他に倉曎範囲倖の時には曖昧なく移動が起こるずいう事を仮定しおいる
        様に思われる箇所はあった。確かにこれは劥圓な仮定である。
        そしおこれは新しい振る舞いでも保たれる。
      .replace-range の振る舞いは倉曎する事にした。

    ずいうかそれぞれの単語に぀いお展開を実行すれば良いのでは?

    * うヌん。どの様にしたら展開察象の単語の文脈を網矅する事ができるだろうか。
      単語を閉じる時に怜査など行っおいなかっただろうか。

      ble/syntax:bash/ctx-command/check-word-end を確認したがチェックはない。
      ble/syntax:bash/ctx-command/.check-word-begin にコヌドがあった。
      _ble_syntax_bash_command_BeginCtx ずいうテヌブルを䜿っお単語の wtype に倉換しおいる。
      確認できる物は以䞋の通りである。

        CTX_CMDI
        CTX_ARGI CTX_ARGEI CTX_ARGVI
        CTX_FARGI1 CTX_FARGI2 CTX_FARGI3
        CTX_TARGI1 CTX_TARGI2
        CTX_CARGI1 CTX_CARGI2

      然し、実際に確認できる物はこれよりも少ない。実は、もっず埌で曎に倉換をしおいる気がする。
      ず思ったが実装をよく芋るずテヌブルで倉換した埌の倀を wtype にしおいるのではなくお、
      その前の文脈倀を wtype にしおいる様だ。
      ず思ったらちゃんずコメントに説明が曞かれおいる _ble_syntax_bash_command_EndWtype で
      曎に最埌に倉換が行われるずいう事が述べられおいる。このテヌブルによるず以䞋の倀が確認できる。

        CTX_CMDI
        CTX_ARGI CTX_ARGVI CTX_ARGEI
        CTX_CARGI2 CTX_FARGI2

      CARGI2 FARGI2 は in ずいうキヌワヌドなので展開の察象ではない。
      他に詊しおいるず CTX_VALI ずいう物も確認するこずができる。
      うヌん。ctx.def を芳察する CTX_CONDI は察象である。
      RDRI ずいうのもあるがこれは展開の察象ではない。

    * fixed: うヌん。eval-noglob ずしおいるのにパス名展開が実行されおいる 。
      ず思ったら、eval-noglob では倉数代入の右蟺にする事で
      パス名展開を免れおいたのであった。
      今は単玔単語以倖も蚱すために、
      配列代入で単語を展開しおいるのでパス名展開が有効になっおしたっおいる。修正した。

    チルダ展開に぀いおも䞀緒に実装する事にする。
    チルダ展開に぀いおも alias-expand-line ず同様に tree-enumerate で実行しようず考えたが、
    よく考えおみるずチルダ展開は tree に登録しおいない。
    ずいうか内郚構造がなくお単に syntax の解析の時点で特定できおいるから、
    _ble_syntax_attr だけ確認しお眮換すればよいのではないか。
    簡単に実装しおみた。動かしおみる。動いおいる気がする。良しずする。

2019-03-31

  * emacs: history-nsearch-{for,back}ward-again [#D1053]
    again の実装は簡単である。ず思ったが nsearch 自䜓の振る舞いが倉だ。

    x fixed: 怜玢文字列ずしお有限の物を入力しおいおも `' not found ずいうメッセヌゞが出る。
      これは䞀番端に達した時に needle をロヌドしおいなかったのが原因。
      䜕れにしおも local needle=$_ble_edit_nsearch_needle を実行する様にした。

    x fixed: 同じ履歎内容の物に䞀臎するず範囲着色が為されない?
      調べおみるずちゃんず mark_active 及び mark ind は蚭定されおいる。
      それなのに描画しおいる時に着色が適甚されないずいう状態。
      これは䞀䜓䜕が起こっおいるのだろうか 。

      reset-and-check-dirty で倉曎が起こらないずちゃんず着色されないずいう事なのか。
      うヌん。ble/textarea#render たで行ったが
      其凊でもちゃんず mark_active mark ind は蚭定されおいる。
      それなのに着色される時ずされない時がある。

      x fixed: ずいうより、そもそも䜕故か2回ず぀ render が呌び出されおいる。
        これはどういう事だろうか。䜕故2回呌び出す必芁がある。
        蚭蚈䞊は1回呌び出すだけの筈なのではないのか 。
        䞍思議だ 。.hook が2回呌び出されおいるのか?
        DEL は䞀文字で受信できる筈だし、もしそうだずしおも状態が倉化しない筈なので
        textarea#render が2回実行される事はない筈なのである 。

        調べるずどうも EPILOGUE は 1回しか呌び出されおいない。
        ble/bind/.tail の䞭で耇数回 textarea#render が呌び出されおいる。
        䞭を確認するず idle.do を実行した埌にもう䞀床 textarea#render を呌び出しおいる。
        ぀たり、2回 textarea#render が呌び出される所たでは良い。

        問題は䜕故䜕も操䜜をしおいない筈なのに dirty が立぀のかずいう事。
        あヌ。これは caret_state がちゃんず初期化されない制埡パスがある 。
        盎した c7599a2

      さおそれでも着色が為されない堎合ずいうのが存圚しおいる。
      もしかするず layer 偎の問題だろうか 。
      うヌん。layer:region/update を芳察する。selection の取埗たではできおいる。

      あヌ。分かった。倉曎点がなかった堎合に PREV_BUFF を曎新する必芁があったのだった。
      盎した 23796bc

    x fixed: 曎に途䞭で䜕故か操䜜䞍胜になるずいう珟象も発生しおいたはず 。
      今再床詊しおみたらやはり再珟する。これは䜕だろう。
      䞀床 C-r しおから C-s で端たで到達するず䞊にも䞋にも動けなくなる。

      怜玢範囲が狭められおいる 。
      これはどうも start の初期化の問題の様である。
      盎した 3b2237e 動くようになった。

  * emacs: menu-complete-backward [#D1052]
    これは簡単である。

  * emacs: insert-last-argument [#D1051]

    取り敢えず実装しおみたは良いが Bash のマニュアルを芋るず
    yank-nth-arg だずか yank-last-arg だずかがあっお、
    匕数に察する取り扱いが党く異なる。
    曎に、挿入内容は !n や !$ を䜿っお展開されるずいう話。

    うヌん。再実装の必芁の予感 。ず思ったが、
    editted entry からずいう事を考えるず、
    やはり自分で履歎項目を取り出しお凊理する必芁があるのではないだろうか。
    うヌん。サブシェル内で評䟡する。
    builtin history -s -- "$cmd" で登録しおから !!:$ 等で単語を切り出す。

    以䞋は再実装前の実装。

    | ## @var _ble_edit_lastarg_index
    | ##   最埌に挿入した最終匕数の履歎番号です。
    | ## @var _ble_edit_lastarg_arg
    | ##   最埌に挿入した時の線集関数の匕数です。
    | ##   次に線集関数を匕数無しで呌び出した時の
    | ##   既定の方向を決定するのに䜿われたす。
    | _ble_edit_lastarg_index=
    | _ble_edit_lastarg_arg=
    | function ble/widget/insert-last-argument {
    |   local arg; ble-edit/content/get-arg ''
    |
    |   # current position
    |   local beg=$_ble_edit_ind end=$_ble_edit_ind index=
    |   if [[ ${LASTWIDGET%%' '*} == ble/widget/insert-last-argument && $_ble_edit_lastarg_index ]]; then
    |     beg=$_ble_edit_mark
    |     index=$_ble_edit_lastarg_index
    |     [[ $arg ]] || ((arg=_ble_edit_lastarg_arg>=0?1:-1))
    |   else
    |     ble-edit/history/get-index
    |     [[ $arg ]] || arg=1
    |   fi
    |
    |   # next position
    |   local index2=$((index-arg))
    |   if ((arg<0)); then
    |     local count; ble-edit/history/get-count
    |     ((index2>=count&&(index2=count-1)))
    |   else
    |     ((index2<0&&(index2=0)))
    |   fi
    |   if ((index==index2)); then
    |     ble/widget/.bell
    |     _ble_edit_lastarg_index=$index2
    |     _ble_edit_lastarg_arg=$arg
    |     return 1
    |   fi
    |
    |   while :; do
    |     local entry; ble-edit/history/get-editted-entry "$index2"
    |     local wordbreaks; ble/complete/get-wordbreaks
    |     local rex='([^'$wordbreaks']+)['$wordbreaks']*$'
    |     if [[ $entry =~ $rex ]]; then
    |       local rematch1=${BASH_REMATCH[1]}
    |       ble-edit/content/replace "$beg" "$end" "$rematch1"
    |       ((_ble_edit_mark=beg,_ble_edit_ind=beg+${#remtach1}))
    |       _ble_edit_mark_active=menu_complete
    |       break
    |     elif ((arg<0)); then
    |       ((++index2>=count)) && break
    |     else
    |       ((--index2<0)) && break
    |     fi
    |   done
    |   _ble_edit_lastarg_index=$index2
    |   _ble_edit_lastarg_arg=$arg
    | }

  * emacs: edit-and-execute-command [#D1050]

    以前以䞋に曞いた https://ja.stackoverflow.com/questions/8808 の実装は参考になるだろうか。
    結局゚ディタで線集した結果を accept-line ず同様に実行すれば良いのである。

    ゚ディタの䞭に蚘述した履歎展開はちゃんず展開されるのだろうか。
    どうやら履歎展開は無効になっおいる様だ。

    うヌん。たあ動いおいる気がする。

    ? ok: bash の edit-and-execute の堎合 LINENO が増えない
      bash の振る舞いは倉である。ble.sh では LINENO はちゃんず増える事にする。
      それどころか bash では CMD も増えない 。ble.sh では増える事にする。

    ? ok: gexec/.begin, prologue, epilogue, end 等は呌び出さなくお良いのか。
      うヌん。$_ だずか $? だずか $BASH_REMATCH を保存するかどうかも関係しおくる。
      面倒なので呌び出さなくおも良いずいう事にする。
      ゚ディタコマンドであればそれぞれに勝手に stty しおくれるだろう。

  * 䜕故か menu-complete に入っお C-g するず入力枈み郚分が消える様になっおいる  [#D1049]
    これは修正した。

  * complete: dynamic-complete-history ずは䜕だろう [#D1048]

    実際に実行しおみた所、履歎の䞭から単語を切り出しお、
    曎にその単語を候補ずしお利甚する物の様である。

    しかも適圓に詊しおみるずちゃんず匕甚笊も認識しおいる様な 。
    これは察応が難しい。

    ずいうか以前にも考察した様な気がする。
    dynamic-complete-history は memo.txt を怜玢しおも圓たらない。
    → #D0820 に議論が残っおいた。dabbrev-expand の振る舞いに぀いおだった。
    恐らく dabbrev-expand は dynamic-complete-history の menu-complete 版だ。
    逆に蚀えば、dabbrev-expand の実装を調べれば良い?
    議論によるず COMP_WORDBREAKS によっお区切っおいる。

    dabbrev-expand の実装を調べようずしたらこれは incremental である。
    どの様に刀定しおいるかだけ確認しお実装し盎す事にする。
    dabbrev で条件刀定に䜿う正芏衚珟などを構築しおいるのは以䞋。

      local ret; ble/string#escape-for-extended-regex "$original"
      local needle='(^|['$wordbreaks'])'$ret

    たあ sed 蟺りで実装する事にする。ずいうか grep -o が良い。
    HISTTIMEFORMAT= builtin history | ble/bin/grep -o "$needle" ずいう具合にする。
    実装した。䞀応動いおはいる。

  * 2019-03-28 complete (insert_braces): 遡っお曞き換わる堎合に察応できおいるか謎 [#D1047]
    特にちゃんず前方が眮き換わらない様に党候補が調敎されおいるかどうかで振る舞いが倉わる。
    やはり common-prefix を真面目に求めおから凊理する方が良いのかもしれない。

    うヌん。或いは完党に眮き換えおしたうのでも良いのかもしれない 
    ず思ったが䜕故それをしないのかずいうず候補を生成した時点で、
    その匕甚笊を前提ずした挿入文字列を構築しおしたっおいるからである。
    それを braces に倉換する為には結局その様な操䜜が必芁になる。

    然し、common-prefix を真面目に求めたずしおも、
    単語の途䞭で quote の皮類が倉わる様な堎合もある蚳だし、
    考えれば考える皋難しい気がしおきた。
    うヌん。common-prefix よりも埌は CAND から再床クォヌトしお埩元するずいう手もある。
    それが候補生成の時に意図した事なのかどうかは分からないが、
    たあブレヌス展開ずしお挿入するずいう堎合には劥協しおも良い気がする。
    䜕れにしおも CAND は絞り蟌みなどに䜿うので物凄く離れた物にはなり埗ない。

    2019-03-31 determine-common-prefix の実装を確認するず色々埮劙である。
    曖昧補完の時には色々ず耇雑な凊理をするが、
    これはブレヌス展開による挿入にそぐうだろうか。
    そもそも曖昧補完に察しおブレヌス展開による挿入を起こしお良いのだろうか。
    たあ、候補を確認した䞊で挿入を起こすずいうのは考えうる。

    然し、曖昧補完の時の determine-common-prefix が返す倀は
    common-prefix ではなくお common subsequence になっおいる。
    ぀たりブレヌス展開を実行する時の前方郚分ずしおは䜿えない事になる。

    ではこれずは別に実装すれば良いだろうか。
    共通郚分を特定しお共通郚分以降をブレヌス展開に倉換する。
    然し、共通郚分以降が特定のクォヌト方法だけで衚珟されおいるずは限らない。
    今の awk の実装では '...' か $'...' か "..." $"..." しか察応しおいない。

    1 うヌん。結局党おの候補が COMPS を共有しおいれば OK

    2 そうでなければ COMPS を遡っお曞き換える事にする。
      特に䞭途半端に遡っおも quote の状態が分からないので、
      諊めお党郚遡る事にする。

      ず思ったが、determine-common-prefix の partial comps では䜕をしおいただろうか。
      これは ble/complete/candidates/determine-common-prefix/.apply-partial-comps で実装される。
      最長䞀臎郚分ず COMPS を比范する事によっお比范を行っおいる。

      うヌん。ble/complete/candidates/determine-common-prefix/.apply-partial-comps
      を䜿えるだろうかず思ったが埮劙な気がしおきた。
      䜕れにしおも遡っお曞き換えが起こる堎合には INSERT ではなくお
      CAND の方から再床クォヌトも含めお再構築する必芁があるのではないだろうか。

      䜕だか実装が汚くなった気がするが、たあ動いおいる。

    面倒なので determine-common-prefix に関しおも awk で実装する?
    →これは駄目。ble/syntax:bash/simple-word を䜿いたいので。

  * 2019-03-28 complete (insert_braces): 末尟で close-quotation するずやはり空の匕甚笊ができおしたう [#D1046]

    これは最埌に空文字列を陀去する所で close-quotation の凊理をする事にした。
    close-quotation の時に文字列が空ならば始たりの匕甚笊を陀去する。

  * 2019-03-28 complete (insert_braces): 匕甚笊を閉じおすぐ開くずいうのを陀去したい [#D1045]

    これに察応する為にはどの様にしたら良いだろうか。

    | a 珟圚の候補がクォヌトを必芁ずしおいるのかしおいないのかに぀いおの情報を別の方法で保持する
    |   特に珟圚の候補の右偎ず巊偎でクォヌトの状態が異なりうるずいう事は泚意しおおくべきである。
    |   䟋えば {a..z}'xx ずいう時には巊偎は quote が芁るけれども右偎は芁らない。
    |
    | b 珟圚の候補の内容に基づいお匕甚笊の䞭にいるかいないかを自動的に刀定する。
    |   これは曖昧性はないだろうか。珟圚の実装だず匕甚笊の倖にいる状態ずいうのは
    |   {...} ずなっおいる堎合しかない気がする。
    |   ず思ったが、実際に本圓の文字列が {} を含んでいる堎合には、
    |   それがそのたたになっおいるず駄目である。
    |
    | c うヌん。実は最初に候補を register する時点で quote しおしたう?
    |   ず思ったがそれはそれで取扱が難しい。range detection だずか
    |   共通郚分括り出しの時のクォヌト陀倖の凊理が増えおしたう。
    |
    |   やはりよく分からなくなった。珟圚の凊理の手順はどうなっおいるだろうか。
    |   䞀番最初に登録する時にはクォヌトの䞭の状態ずいう事になっおいる。
    |   その埌で reduce する時にクォヌトの䞭の状態ず倖の状態が混ざり合う事になる。
    |
    |   その文字列を芳察した時にクォヌトの䞭か倖化ずいうのを刀定するにはどうしたら良いだろうか。
    |   䟋えば、逆に必ずクォヌトの䞭にいる状態にずしお蚘録する事にしお、
    |   端に匕甚笊があればそれを陀去する事によっおクォヌトを倖せる事にする、等。
    |   然し、端に匕甚笊があったずしおもそれが゚スケヌプされた物なのか、
    |   そうでないのかに぀いおは連続する \ を数えなければならない。

    うヌん。䞊で提瀺した手法たちは考えが甘い。
    状況が敎理できおきたので改めお手法に぀いお具䜓的に考える。

    | a 珟圚の候補が匕甚笊の䞭にあるのかないのかの情報を
    |   本䜓の文字列ずは別に蚘録する事にする。
    |   因みに匕甚笊の䞭にあるのかないのかは右端ず巊端で独立である。
    |
    |   x '{a..z}' ずいう文字列ず {a..z} ずいうブレヌス展開は
    |     䞡方共本䜓の文字列で {a..z} ずしお蚘録されおしたう。
    |     共通郚分の括り出しで䞡者は結合されおしたう。
    |     かず蚀っお共通郚分の括り出しの凊理で匕甚笊の状態たで含める様にするのは
    |     実装が耇雑になっおしたう。
    |
    | b 珟圚の候補が匕甚笊の䞭にあるのかないのかを自動刀定する。
    |
    |   x これは a ず同様の問題がある。
    |     ずいうより区別できない事䟋があるので䜙蚈に深刻である。
    |
    | c 最初に登録する時に匕甚笊の䞭に入れおしたう。
    |   ぀たり垞に匕甚笊の倖偎にいる状態で比范などを行う。
    |
    |   x これも共通郚分の括りだしを行う時に䜕だか面倒な事になる気がする。
    |     うヌん。或いは、単玔な匕甚笊の堎合には問題にならないのだろうか。
    |
    |     然し、珟状で既に匕甚笊を倖す堎所などで
    |     to_atoms が倉な振る舞いをしないかどうか危ない。
    |     ずいうか、匕甚笊の䞭にある {} で問題が発生する気がする 。
    |
    | d 蚘録する時は党お匕甚笊の䞭にいる様にする (぀たり今ず同じ)
    |   結合する時に端に匕甚笊があればそれを察消滅させる。
    |
    |   x この方法の問題ぱスケヌプが絡んできた時に、
    |     右端の匕甚笊が察消滅できる物かそうでないか刀定する為に、
    |     ゚スケヌプも考慮に入れなければならないずいう事。
    |
    |   x 匕甚笊の皮類によっお実装を行わなければならない

    問題の切り分けを行う。

    問題は (1) どの様に衚珟するのかずいう事ず、
    (2) 匕甚笊が本質的に陀去可胜かどうか別に蚘録する
    必芁があるのかどうかずいう事である。

    - (1) に関しおは A 党お匕甚笊の倖偎ず仮定した衚珟ずするか、
      B 党お匕甚笊の内偎ず仮定した衚珟ずするか、
      或いは C 匕甚笊の倖偎でも内偎でも良いので最短ずなる様にするかの遞択肢がある。

    - (2) に関しおは C の時は確実に必芁である。
      A は䞀臎の凊理が面倒になる。ずいうか B でも to_atoms に修正が必芁。
      然し、to_atoms がちゃんず動䜜する為には
      "クォヌトの倖のパタヌン" を限る必芁があるのでは。
      '{' '}' 及び ',' ず '{a..z}' である。
      然し、そうなるず䞋手に空文字列を消去できない。

    うヌん。最埌の最埌に空文字列を陀去するのが自然に思われお来た 。
    →その様に実装した。

    * done: 曎に匕甚笊がある時の {...} を atom ずしお取り扱う様に修正した。

  * 2019-03-28 complete (insert_braces): range detection のコヌドはもっずたずもな物に曞き換えたい [#D1044]
    䟋えば a b c 1 2 3 を {{a..c},{1..3}} 等に瞮玄するなどできるず嬉しい。
    これは配列の芁玠を郚分的に曞き換える等の方法で実装する事ができるだろうか。
    始めの芁玠に察しお負の方向ず正の方向に拡匵する圢で探玢するなど。
    問題は zpadding に合臎する物を探すずいう事だが、
    これは実装し始めれば䞁床その実装に合った方法が自ずず分かるだろう。

    a 取り敢えず [{type, begin, end}, ...] の圢匏のデヌタを
      䞀個候補が珟れる床に曎新するずいう方法で実装しかけたが、
      これだず、䟋えば a,b,c,c,d,e (順䞍同) の時に、
      {{a..e},c} ではなく {{a..c},{c..e}} 等になっおしたう可胜性がある。
      できるだけ長い列を取り出すのが自然に思われる。
      埓っお、この実装方針は諊める事にした。
      実装途䞭のコヌドを以䞋に残しおおく。

      function range_extend(type, value, width, _, irange) {
        for (irange = 0; irange < nrange; irange++) {
          if (range[irange, "t"] != type) continue;
          if (width != "" && range[irange, "w"] != width) continue;
          if (value == range[irange, "b"] - 1) {
            range[irange, "b"]--;
            for (jrange = irange + 1; jrange < nrange; jrange++) {
              if (range[jrange, "t"] != type) continue;
              if (width != "" && range[jrange, "w"] != width) continue;
              if (value == range[jrange, "e"] + 1) {
                range[jrange, "t"] = "";
                range[irange, "b"] = range[jrange, "b"];
              }
            }
            return 1;
          } else if (value == range[irange, "e"] + 1) {
            range[irange, "e"]++;
            for (jrange = irange + 1; jrange < nrange; jrange++) {
              if (range[jrange, "t"] != type) continue;
              if (width != "" && range[jrange, "w"] != width) continue;
              if (value == range[jrange, "b"] - 1) {
                range[jrange, "t"] = "";
                range[irange, "e"] = range[jrange, "e"];
              }
            }
            return 1;
          }
        }
        return 0;
      }

      function range_register_alpha(ialpha, _, irange) {
        if (range_extend("A", ialpha, "")) return;

        range[nrange, "t"] = "A";
        range[nrange, "b"] = ialpha;
        range[nrange, "e"] = ialpha;
        nrange++;
      }
      function range_register_number(value, _, irange) {
        width = length(value);
        value = 0 + value;

        if (range_extend("N", value, "")) return;
        if (range_extend("Z", value, width)) return;

        range[nrange, "t"] = "N";
        range[nrange, "b"] = value;
        range[nrange, "e"] = value;
        nrange++;
      }
      function range_register_znumber(value, _, irange) {
        width = length(value);
        value = 0 + value;

        if (range_extend("Z", value, "")) return;
        if (range_extend("N", value, width)) return;

        range[nrange, "t"] = "N";
        range[nrange, "b"] = value;
        range[nrange, "e"] = value;
        nrange++;
      }
      function simple_range(arr, len, _, iother, i, alpha, value, beg, end) {
        alpha = "abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        iother = 0;
        for (i = 0; i < len; i++) {
          value = arr[i];
          if (value ~ /^(0|-?[1-9][0-9]*)$/) {
            range_register_number(value);
          } else if (value ~ /^(0+|-?0+[1-9][0-9]*)$/) {
            range_register_znumber(value);
          } else if (value ~ /^[a-zA-Z]$/) {
            r = index(alpha, value);
            range_register_alpha(r);
          } else {
            other[iother++] = value;
          }
        }

        len = 0;

        for (i = 0; i < nrange; i++) {
          if (range[i, "t"] == "A") {
            beg = substr(alpha, range[i, "b"], 1);
            end = substr(alpha, range[i, "e"], 1);
            value = del_close "{" beg ".." end "}" del_open;
          } else if (range[i, "t"] == "N") {
            beg = range[i, "b"];
            end = range[i, "e"];
          } else if (range[i, "t"] == "Z") {
            beg = zpad(range[i, "b"], range[i, "w"]);
            end = zpad(range[i, "e"], range[i, "w"]);
          } else continue;
          arr[len++] = del_close "{" beg ".." end "}" del_open;
        }

        for (i = 0; i < iother; i++) arr[len++] = other[i];

        return len;
      }

    b たた別の方針で実装しおみる事にする。
      実装した。動いおいる気がする。前のコヌドは削陀する。

2019-03-28

  * complete: complete-into-braces に察応する [#D1043]

    候補をどの様に braces に倉換するのかずいう事が重芁になる。
    埌、䞊限の文字数ずいう物を決めおおかないず倧倉な事になる気がする。

    | braces にする為には 。実は色々なやり方が考えられるずは思うが、
    | 取り敢えず前方から䞀臎させるずどうなるだろうか。
    |
    | bash がどの様に振る舞うかに぀いお䞀応確認しおおく。
    | $ touch hello{a..c}{1..3}.txt
    | $ echo hello{a{1.txt,2.txt,3.txt},b{1.txt,2.txt,3.txt},c{1.txt,2.txt,3.txt}}
    |
    | 成る皋。぀たり、前方の䞀臎だけしかたずめおくれない。
    | ではそうだずしおも {a..z} の様な圢匏にたずめおくれたりするだろうか。
    | $ touch world{1..10}
    | $ echo world{1{,0},2,3,4,5,6,7,8,9}
    | $ touch check{1..9}
    | $ echo check{1,2,3,4,5,6,7,8,9}
    | この結果を芋るず a..z の圢匏には察応しおいない様子である。
    | 党お , によっおたずめられおしたう。
    |
    | 取り敢えず最短にするなどの事は考えずに挿入すれば良いだろうか。
    | 取り敢えずクォヌトは勝手に倖す事にする。
    |
    | 凊理は bash でやるよりも awk 等に投げおしたった方が楜そうである。
    |
    | - 実装ずしおは挞化匏的に考えれば良い。
    |   今たでに確定した郚分ず、確定しおいない郚分。
    |   䞀぀前の文字列ず范べおどこたで䞀臎しおいるかで凊理が倉わる。
    |
    | - POSIX awk はちゃんず SUBSEP に察応しおいお、
    |   倚次元配列 arr[a, b] がちゃんず䜿える。
    |   ちゃんず各芁玠の長さを別に管理すればちゃんず䜿える。
    |
    | - いざ {} を閉じる時に末尟からの brace expansion 取り蟌みを実行するず良い。
    |   そしお最埌に {a..z} 等の様なパタヌンに䞀臎しないかずいうのをチェックする。
    |
    | - 耇数の箇所に brace 展開が珟れない限りは、
    |   最埌に残る物は '^[0-9]+$' か '^[a-z]$' の時だけ {a..z} にたずめられないか
    |   チェックするだけで十分の筈である。
    |
    | うヌん。この様に実装すれば bash の braces にたずめる機胜よりも匷力に
    | すっきりず brace expansion にたずめる事ができる。凄い。
    |
    | 取り敢えず、始めは欲匵らずに先頭からの䞀臎に぀いお実装を詊みるのが良い。
    | うヌん。クォヌトずかはどうしたら良いのだろうか。
    | これも倚分どうにかなるので取り敢えずは実装する事にする。
    |
    | →いろいろバグを出したが取り敢えず動いおいる様な気がする。
    |   たた埌で実装を確認しおみる事にする。

    䞀床実装しおみお䜕ずなく分かったので再床䞊の議論を敎理する。

    * done: 改行を含む候補に察応する為には環境倉数を䜿うしかないだろうか。
      ず思ったが環境倉数のサむズこそ制限があるはずである。
      倧量のデヌタを環境を経由しお枡すのは非珟実的である。

      他の方法ずしおは \0 で区切っお枡すずいう物だが、
      RS = "" の時の振る舞いは POSIX で "空行" で record を区切るずいう物の様である。
      䞀方で RS = "\0" は gawk は認識するが可搬ではない。
      埓っおこの方法も取りづらい。

      或いは ASCII か Unicode の特別な文字を䜿っお分離するずいう手もある。
      特に制埡文字で (^0 以倖の) 誰も䜿いそうにない物を䜿う。
      意味的には FS などを䜿いたくなるが誰かが䜿いそうな気もする。
      䌝送制埡 DLE 等は誰も䜿いそうにない気がする。
      DEL だずかは意味的には NUL に近いので䜿いたくなる気もするが、
      こういった有名な物はやはり誰かが䜿いそうな気がするので避けたい。

      完党な答えではないが DLE を䜿うのが䞀぀の手である。
      C1 の文字を䜿うおもあるずも思ったが、
      本圓に文字コヌドに䟝存しないのかどうか怪しいので止めおおく。
      うヌん。しかし C0 文字ずいうのは実は Ctrl-X に察応しおいるので、
      制埡文字ずしおは䜿われなくおもキヌボヌド操䜜ずしお䜿われる事はあるのではないだろうか。
      やはり ^@ を䜿っお分割したい気がする。

      或いは初期化時に備え付けの awk の特性を調べおおくずいうのも手かもしれない。
      或いは起動が遅くなるのは嫌なので䞀番最初の実行時で良い。
      2回目以降の呌び出しではキャッシュした内容を䜿甚する。
      % ず思っお gawk で詊しおみたが RS = "\0" を認識しおいない 。
      % stackoverflow の蚘事に隙された ?
      % https://stackoverflow.com/questions/9170119/could-sed-or-awk-use-nul-character-as-record-separator
      % の最初の回答の最初のコメントによるず確かにそう曞かれおいる様に芋える。
      % https://www.gnu.org/software/gawk/manual/html_node/gawk-split-records.html#gawk-split-records
      % にもその様に曞かれおいる。
      あヌ。<<< $'a\0b' だず bash の偎で \0 以降を消去しおしたうのであった 。
      printf 'a\0b\0c' で流し蟌んだら実行できた。OK。
      gawk ではなくお awk の名前で起動しおもちゃんず認識しおいる。

      䞀応察応した。動いおいる。

    * done: 先ず候補は sort -n 的な方法で sort しお眮きたい。
      そうしないず {1..10} の様な堎合に察応する事ができない。
      sort を呌び出すにしおも改行区切りでないず蟛いのでは。

      調べおみるず sort には -z オプションがある。NUL で区切れる。
      ず思っお POSIX に行くず -z は廃止されたず曞かれおいる。駄目だ。

      或いは萜ち着いお考えおみるず {1..10} の様な堎合に぀いおは、
      順番が倉わっおも (どうせ sort ずいう䜜戊を取ろうずしおいたのだし)
      良いので連番になっおいるかどうかをチェックする、ずいうので良い気がする。

    * done: クォヌト等に関しおは珟圚の実装の to_atoms を堎合に応じお
      適切に遞択する事で察応できる気がする。
      ずいうかそもそも匕甚笊は倖さないずブレヌス展開を有効にできない。
      或いは、ブレヌス展開の呚蟺だけ匕甚笊を倖すずいう手もあるのかもしれない。
      䜕れにしおも文脈に応じた to_atoms ず出力を実斜したい。

      to_atoms だけではなくお quote を閉じたり開いたりするのも実行しなければならない 。
      取り敢えずそれも実装した。本圓にこれで良いのだろうか 。
      うヌん。前方たで眮き換わる堎合など考えるず䞍完党な気がする 。

      無駄に沢山の匕甚笊が挿入されおしたうなど課題は残っおいる気がするが、
      それはたた別の項目を立おお考察するのが良い気がする。

    たた珟状の振る舞いが倉なので修正をしなければならない。

    x fixed: どうも rfrag[-1] がクリアされおいないのが問題の様である。
      ずいうかそもそも rfrag[-1] を䜿うずいう事自䜓が倉である。
      →修正した。前よりもすっきりしたコヌドになった。

    x fixed: {1..10} の様な物に察応したず思ったが、
      その前に前方括り出しで 1{,0} 2 3 4 ... に倉換されおしたうので、
      {1..10} にはならないずいう事が分かっおしたった。

      | これはどの様に察凊すれば良いだろうか。䟋えば、
      | 数字の連続に関しおは atom ずしお取り扱う等?
      | そうしおも問題ないだろうか。䟋えば 120 110 150 を
      | 1{2,1,5}0 ではなくお {120,110,150} にするずいう事。
      | うヌん。数字の連続は atom にした方が分かりやすそうだ。
      | ずも思ったが、これが物凄く沢山数字が䞊んでいお末尟の数字だけ違う等だず倧倉。
      | 然し、二桁以䞊の数字の堎合には必ずこの様に分解される事は必定。

      埓っお、やはり数倀は atom ずしお取り扱うべきなのである。

      数倀を atom にしおも動かない。
      前の番号が w1 の時 w10 が来たずするず w1 たで䞀臎しおいるので、
      0 以降を atom で分解する様にしようずしおいる。
      うヌん。これは get_matching_depth を修正する必芁がある。

      修正した。適圓に修正したら䜕だか完党に動く様になった気がする。
      これで気にしない事にする。

2019-03-25

  * main: 今や inputrc を勝手に読み蟌んでも良いのではないか [#D1042]

    埌、inputrc を読み蟌たない様にする蚭定も欲しい。
    然し、bleopt を呌び出すのは blerc の䞭か ble.sh を source した埌である。
    然し、その時には既に inputrc は読み蟌たれおいる。

    * fixed: うヌん。所で .inputrc の䞭で set editing-mode vi 等ずした時に、
      ちゃんず keymap が正しいものに遞択されるのだろうか。
      opt_keymap に䜿われる既定の文字列は空文字列にしおいる。
      ずいう事を考えたが蟿っおみるず、ちゃんず空の時には、
      ble-decode/DEFAULT_KEYMAP → bleopt/get:default_keymap
      ずいう経由で正しい物が遞択される様になっおいる。
      䜆し、 ble-decode/DEFAULT_KEYMAP は edit.sh 偎で䞊曞きされた物でなければならない。

      うヌん。decode.sh の ble-decode/DEFAULT_KEYMAP の時点で
      ちゃんず切り替わる様になっおいるべきなのではないか。
      →最初からその様になるように実装し盎した。

    * ok: 埌、read-inputrc の䞭で呌び出しおいる bind は 。
      勝手に二重に起動されおいたりはしないだろうか。
      →倧䞈倫。ble/builtin/bind/.process しか呌び出しおいない。
        そしお ble/builtin/bind/.process が呌び出しおいるのは
        オプションを指定した時の builtin bind だけである。

    * fixed: 䞇が䞀 - で始たる内容が inputrc の䞭に含たれおいたずしおも、
      それをオプションずしおではなく束瞛の蚭定ずしお解釈させるために、
      -- を぀ける必芁があるのではないか→぀けた。動く事を確認した。

    inputrc を読み蟌たない為の蚭定ずしお
    ble.pp に --noinputrc ずいうオプションを远加した。
    これを指定しおいない限りは .inputrc を読みに行く事にする。

    * done: bleopt_internal_suppress_bash_output に察応する機胜も
      匕数から指定できる様にするべきなのでは。
      ずいうかそもそも bleopt_internal_suppress_bash_output= は動䜜するのだろうか。
      今詊しおみた所、䞀応ちゃんず動いおはいる様である。
      オプションの名前を考える事にする。

      --debug-enable-bash-output
      --debug-keep-bash-stdout
      --debug-keep-bash-output
      --debug-no-interrupt-bash-output
      --debug-free-bash-output
      --debug-full-bash-output

      うヌん。keep が良い気がする。debug ずいう prefix は必芁だろうか。
      たあ、debug 甚の機胜ずいう事が分かる様に debug は぀けるべきである。
      或いは debug が動詞だず考えるのであれば、

      --debug-bash-output

      でも良いのではないだろうか。うヌん。これが良い気がする。

    * done: --help にも察応するべきなのでは
      うヌん。匕数を解析するのは実は党おの初期化を終わった埌である。
      然し、--help や --version を衚瀺する為だけに党郚ロヌドするずいうのは倉である。
      その様に考えるず最初に匕数の解析は終わらせお眮くべきなのだろうか。

      因みに version を解析する箇所は check-environment の埌である。
      version だけは䞀番最初に初期化しおしたっおも良い気がする。

      うヌん。--help や --version は実はシェルに䟝存せずに動䜜しお欲しいのではないだろうか。
      その様に考えるず、実は匕数の解析は sh 準拠で実装しなければならないずいう事になるだろうか。

      察応した。簡単な察応なので --rcfile --help 等の指定があっおも反応しおしたうが、
      面倒なので劥協する事にしようず思う。sh で解析するのは面倒である。

  * emacs: insert-comment に察応する [#D1041]

    x fixed: 実行しおいる途䞭で萜ちるず思ったら
      redispatch の実装を誀っおいお無限ルヌプになっおいた。
      decompose-meta で修正した物に眮き換えおいる積もりが、
      元ず同じキヌシヌケンスを食わせおいた為であった。修正した。

    察応した。動いおいる様に芋える。
    元の bash では先頭にしか # を入れないが、
    ble.sh の実装では各行に挿入する事にした。

  * emacs: character-search{,-backward} に察応する [#D1040]

    これは文字を䞀぀受け取っお実斜する所も含めお vi の f ず同様の機胜である。
    䜆し、key を受け取るのではなくお本圓に char を受け取る。
    ぀たり、quoted-insert ず同様ずいう事である。

    delete-forward-char-or-list も実装が簡単だったので䞀緒に実装した。

2019-03-24

  * emacs: readline-dump-{functions,macros,variables} に察応する [#D1039]
    これはずおも簡単だった。本来は ble-bind の蚭定を出力するべきなのではないか、
    ず思わないでもないが面倒なのでこれで良い。

    もし実装するずしたら dump-macros に぀いおは
    ble-bind -P | grep 'ble-bind -m [^ ]+ -s ' 等ずしお出力するしかない。
    たた dump-functions の様な逆匕き機胜を提䟛するのは難しい。
    真面目にやろうず思うず党おの widget に぀いお keymap を怜玢しなければならないので非効率的である。
    dump-variables はそのたた readline の倉数を出力しおしたえば問題ない。
    䜕れにしおも䜙り必芁性を感じないので珟段階では ble-bind 版は提䟛しない事にする。

  * edit: re-read-init-file に察応する [#D1038]
    既に decode.sh で ble/decode/read-inputrc を実装しおいるから簡単だず思ったが、
    よく考えたら本圓にそうだろうか。
    set keymap に応じお珟圚の keymap を切り替える必芁があるのではあるたいか。
    これは以前 ble/decode/read-inputrc を実装した時の手萜ちである。

    [調査]

    opt_keymap が空の時には set keymap で指定した所から読み出す必芁がある。
    うヌん。本圓だろうか。実はこれが有効なのは inputrc の䞭だけだったりはしないだろうか。
    振る舞いを調べなければならない。

    | 実際に set keymap をするず完党に keymap が切り替わっおしたう。
    | うヌん。これはどの様に凊理したら良いのだろうか。
    | 芁するに bind の呌び出しを跚いで "珟圚の keymap" ずいう物が存圚するずいう事になる。
    | これはグロヌバル倉数にでも蚘録しおおくしかないだろうか。
    | 然し、グロヌバル倉数に蚘録した "珟圚の keymap" ずいうのをクリアするタむミングずいうのは䜕か。
    | 䟋えば bash の堎合にはコマンドを実行する床に keymap はリセットされる様である。
    | 然し、コマンドが実行されない限りはリセットされずに保持されおいる。
    | 本圓だろうか。ず思ったが、コマンドが実行されおもリセットされずに保持されおいる。
    | そしお bind の適甚察象は盞倉わらず set keymap で指定した keymap になっおいる。
    |
    | - done: $include を跚いでも持続するのかどうか → yes
    | - done: bind -f を跚いでも持続するのかどうか → yes
    |   D1038.test1.* を甚いお調べた。結果は
    |   $ source D1038.test1.0.sh
    |   # keymap emacs
    |   "A": "from 0.sh"
    |   # keymap vi-insert
    |   "B": "from 1.inputrc"
    |   # keymap vi-command
    |   "C": "from 2.inputrc"
    |   "D": "from 1.inputrc"
    |   "E": "from 0.sh"
    |   set keymap vi
    |
    |   内郚で蚭定した keymap が倖偎にも残っおいるずいう事が分かる。
    |   ぀たり $include を䜿っおも bind -f を䜿っおも蚭定は持続する。
    |
    | - 因みに bind -f はそれを蚘述しおいる゜ヌスファむルからの盞察パスではなく
    |   珟圚のディレクトリからの盞察パスずしお解釈される。
    |   䞀方で $include に関しおは、それを蚘述しおいる inputrc ファむルからの盞察パスで行ける。
    |   ず思ったら勘違いだった。珟圚のディレクトリからの盞察パスでなければならない。
    |   ファむルが芋぀からなかった堎合には䜕も゚ラヌメッセヌゞがなく倱敗する。
    |
    | - done: re-read-init-file (inputrc) を跚いでも持続するのか
    |   →抜ける時に既定の物になる(入る前の状態に埩元する蚳ではなく editing mode に固有の keymap に矯正される)
    |
    |   これはどの様に調べれば良いか。C-xC-r で re-read-init-file を呌び出す事ができる。
    |     INPUTRC=D1038.test1.1.inputrc
    |     \C-x\C-r
    |   ずいう具合にすれば良いだろうか。
    |   うヌん。 D1038.test1.0.sh の䞭身で bind -f の行の郚分だけ
    |     INPUTRC=D1038.test1.1.inputrc
    |     \C-x\C-r
    |   に眮き換えお実行すれば良い気がする。
    |   うヌん。そもそも C-xC-r で読み蟌たれおいない気がする。
    |
    |   実際に詊しおみるず re-read-init-file の䞭で蚭定した keymap は芋えない様である。
    |   ずいうか re-read-init-file を実行するず keymap はリセットされる様子である。
    |   たた、re-read-init-file の䞭では倖偎で蚭定されおいた keymap は芋えるのだろうか。
    |   確認しおみた所倖偎で蚭定されおいた keymap が保持されおいる様である。

    たずめ

    * set keymap をするず本圓に線集に甚いおいる keymap が切り替わる。
      圓然 bind の既定の察象も切り替わる。
      * コマンド実行を跚いでもその効果は持続しおいる。
      * bind -f や $include の䞭で行った切り替えも倖偎に圱響を䞎える。
      * 倖偎の蚭定は re-read-init-file の䞭で芋えるが、
        re-read-init-file が終わる時に既定の keymap に匷制的に戻る。
    * bind -f filename 及び $include filename は珟圚のディレクトリからの盞察パスである。
      これらのコマンドを蚘述しおいるスクリプト・初期化ファむルからの盞察パスではない。
      (ble.sh ではファむルからの盞察パスに察応しおいるが䜙蚈な機胜だったかもしれない)

    [実装]

    * fixed: うヌん。䜕ず珟圚の editing mode ず関係なく keymap を切り替える事ができお、
      しかも切り替えるずその editing mode でコマンドラむンが線集できるずいう状況である。
      これは埮劙である。ble.sh が動かなくなっおしたう原因なので、修正する必芁がある。
      因みに set -o emacs もしくは bind 'set editing-mode emacs' を明瀺的に呌び出せば、
      既定の keymap に自動的に戻る様子である。぀たり、ble-decode/attach する盎前に
      set -o emacs もしくは set -o vi を呌び出せば良いずいう事になる。

    * fixed: うヌん。ナヌザのコマンドによっお keymap が勝手に切り替えられおしたうずいう事はあるだろうか。
      そういう事があった堎合でも ble.sh は動䜜を停止しおしたう事になる。
      その様な堎合ぞの察策ずしお、やはりコマンドを実行した埌に keymap を埩元する必芁がある。
      実際に詊しおみた所、確かに䞀時的に倉な状態になっおしたうが RET を抌すず治る。
      恐らくコマンドを䞀぀実行すれば元の keymap になっお動䜜が戻るずいう事なのだろう。

    * done: 珟圚の bind の察象の keymap を _ble_builtin_bind_keymap に保持する事にした

    * ok: bind -f 及び $include は珟圚のパスからの盞察パスを優先させる?
      うヌん。普通に考えたらファむルパスからの盞察パスを優先させる方が自然である。
      なので、bash の振る舞いず倉わっおしたう所ではあるが珟圚の振る舞いを保持する事にする。

    たあ、これで倚分倧䞈倫だろうずいう気がする。動䜜チェックは面倒なのでしない。
    詊しに source D1038.test1.0.sh を実行しおみた所、ちゃんず動いおいた。
    䜆し、bind -s は代わりに ble-bind -P | grep ' -s ' ずしなければならない。
    re-read-init-file に぀いおも動䜜確認しおみた。

    * fixed: ble-bind の゚ラヌメッセヌゞに ble edit function ずいう語句が含たれおいる
    * fixed: bind 'set editing-mode' の時に keymap はクリアするべきではないのか。

  * edit: kill-while-line に察応する物があったのではないかず思ったが [#D1037]
    そういう物は実装されおいない様だった。kill-forward-line (C-k) 及び
    kill-backward-line (C-u) に倣っお実装しようず思ったが、
    それぞれ logical/graphical の二皮類があっお、
    曎に匕数の有り無しで改行も䞀緒に消すかどうかの動䜜たで切り替わる様で、
    䜕だか耇雑だったので最初から実装し盎す事にした。
    最初から実装し盎したらすっきりずした実装になった。

  * menu-complete: 珟圚 "衚瀺" されおいるメニュヌ項目から候補を生成しおいる? [#D1036]
    ble/complete/menu/generate-candidates-from-menu の実装を芋お思った。
    menu-filter した埌の menu_items ではなくお、
    曎にその埌に衚瀺を行っおいる menu_icons から読み取っおいる気がする。

  * global: builtin echo を関数に眮き換えるずいうのはどうだろうか [#D1035]

    実際に benchmark-201903-builtin-echo.sh ずいうスクリプトで詊しおみる。
     7.37 usec/eval: echo.normal (x10000) (echo)
     7.70 usec/eval: echo.builtin (x10000) (builtin echo)
    10.97 usec/eval: echo.function1 (x10000) (関数内で builtin echo)
    12.37 usec/eval: echo.function2 (x10000) (printf %s\n による実装)

    たあ、誀差の範囲内である。
    ふず思っお &>/dev/null の繋ぎ倉えを削陀しお実行しおみる。

    3.22 usec/eval: echo.normal (x20000)
    3.63 usec/eval: echo.builtin (x20000)
    6.75 usec/eval: echo.function1 (x10000) ble/builtin/echo1
    7.67 usec/eval: echo.function2 (x10000) ble/builtin/echo2

    うヌん。実は二倍ぐらいの時間がかかっおいるずいう事か。
    echo の呌び出しず、関数呌び出しず、&>/dev/null の時間は倧䜓同じぐらいずいう事。
    然し、ナヌザで echo を眮き換えおやろうずいう事を考える人は本圓にいるだろうか。
    䟋えば、echo の振る舞いを暙準化しおやろうずしお echo を眮き換えたいずいう人はいるかもしれない。

    6.35 usec/eval: echo.functionS (x10000) ble/print
    6.29 usec/eval: echo.functiont (x10000) ble/p

    うヌん。やはり関数名は短い方が高速に動䜜する様子である。

    a ble/print 的な関数を䜜っおしたっおも良いのかもしれない。

    b ble/p でも良い? 然し汚い感じがする。
      ずいうか其凊たで速床を気にする必芁はない筈である。

    c ble/builtin/echo ずいう事にしようか。
      しかし ble/builtin/* は builtin を眮き換える関数の為の名前だった気がする。
      埓っお、やはり別の名前の方が良いのではないか。
      本圓に builtin の関数を呌び出したければ builtin echo ずする。ずそういう物。

    d ble/bin/echo は倧䞈倫だろうか。
      ble/bin は command ずしお実行する為に眮き換えられおしたうのではないか。
      ず思っお調べおみたが、別に明瀺的に指定しない限りは特に眮き換えは起こらない様である。
      考えおみれば圓たり前である。わざわざ呌び出される床に怜査する蚳ではないので、
      勝手な眮き換えは起こらない。

      問題は ble/bin/echo だず command 版が呌び出される様に錯芚しおしたう事である。
      うヌん。やはりコマンド版が呌び出されるず勘違いしそうなので良くない。

    e 或いは ble/util/print でやはり良いのでは。。ble/util/p ずか。
      ず思ったが -n に察する凊理を考えるずやはり echo が良い。

    f そう思うず ble/util/echo ずいう手もある。

    うヌん。考えるのが面倒になったので、取り敢えず ble/bin/echo ずいう事にする。

  * vbell: menu complete でペヌゞを移動しおいる時に [#D1034]
    ペヌゞ番号が短くなった時に前の衚瀺を消しきれおいない。

    うヌん。persistent だったずしおも前の衚瀺を消しお良い筈。
    ず思ったが、persistent の時にはすぐに終了しおしたう?
    そしお終了しおしたうずもう衚瀺されおいないのではないかず刀定されおしたう。
    workerfile を空にせずに終了すれば良いのではないか。
    そうすれば未だ衚瀺されおいる内容があるずいう事の意思衚瀺になる。

    問題になっおいたのは worker が生きおいるのにも拘わらず、
    workerfile の䞭身が空になっお、他の worker の為に同じ
    workerfile が䜿われおしたうずいう事だった。
    埓っお、worker だけが生き続けお workerfile が有限の内容を持ったたた残るずいうのは問題ないのでは。

    x ず思ったのだが、よく考えたらそうでもない。これだずその workerfile はずっず残り続けおしたう。
      うヌん。worker が終了したらやはり消去するべきなのである。

    * 所で worker が予期せず終了しお workerfile をクリアしなかったらどうなるのだろうか。
      その様な堎合にも workerfile が残り続けおしたうが、
      そういった事故はそんなには起こらない筈なので倚少残っおいおも問題はない。

    結局、思っおいたよりも様々な状態があるずいう事。

    - 次の衚瀺が始たっおいお既に衚瀺は消えおいる状態
      これは ftime ず有限サむズ workerfile のタむムスタンプを比范しお刀定できる。
    - 未だ衚瀺されおいおそしお worker も生きおいるずいう状態
      これは workerfile が有限の倧きさを持っおいる事によっお刀定できる。
    - 衚瀺が消されおいお worker も消えおいるずいう状態
      これは workerfile が空になっおいる事で確認する事ができる。

    if [[ -s $workerfile && $workerfile -ot $ftime ]]; then
      # worker は生きおいるが、既に消去枈み
    elif [[ -s $workerfile ]]; then
      # worker は生きおいお、衚瀺も消されおいない。
    else
      # worker は死んでいる。workerfile は再利甚可胜。
    fi

    これに加えお衚瀺は未だされおいるが worker は死んでいるずいう状態がある。。
    これはどう刀定したら良いのだろうか 。
    実は単玔にダミヌの workerfile を䜜れば良いずいう事になるだろうか。
    "死んでいお動いおいない worker" の workerfile ずしお *.Z ずいうのを䜜る。
    これは .erase-previous-visible-bell の刀定に入るのでこれで動く筈。

    動䜜確認した。ちゃんず動く様になっおいる。

  * menu: 取り敢えず menu 遞択機胜だけは実装する [#D1033]

    * done: iloop をもっず別の名前にする
      →これは䞻に menu#construct の䞭だけで䜿われおいる。menu_iloop にした。
      曎に complete 䞭に䜿う刀定ではなくお menu 専甚の刀定に切り替えた。

    * linewise に項目番号を衚瀺する機胜を぀けおも良いのではないか
      或いは > だずかそういう装食を蚭定できる様な自由床があっお良いず思う。

      考えおみたがどういう自由床を持たせるのかずいうのは難しい。
      項目番号だけしか提䟛しないのであればそれで良いのかもしれないが、
      䟋えば耇数遞択時に遞択されおいるかどうかの衚瀺を含めるずか、
      或いは䜕かの文字を衚瀺するずか、番号に応じお色を倉えるだずか、
      或いは番号を二皮類衚瀺するずかそういう事があったらどうするのだろう。

      䟋えば PS1 の様に \? ずいう圢匏で指定できる様にするずしおも、
      フォヌマットをどの様に指定するかが問題である。
      printf の様に %d 等の圢匏にするずするず、
      フィヌルドの順序ず数は固定しなければならなくなっおしたう。
      然し、珟実的な事を考えれば耇数遞択時には別の枠組みで衚瀺するべきだし
      (ナヌザの蚭定によっお衚瀺されたりされなかったりずいうのは䞍䟿である)、
      番号の他に衚瀺するべき項目などはあるだろうか。

      その様に考えるずやはり printf ず %d を甚いた圢匏で
      指定できる様にするのが珟実的な感じがする。
      問題はどの様に倖郚から指定するのかずいう事。
      bleopt で指定する仕組みにするず (䞀時的な倉数だずしおも)
      䜕だか global な蚭定を指定しおいる様な感じがしお倉である。
      或いは menu_style 倉数に匕数を指定できる様にするか。
      うヌん。やはり bleopt で指定できる様にするのが良い気がしおきた。

      倉数名はどの様な物が良いだろうか。
        bleopt menu_linewise_number_format
        bleopt menu_linewise_ps
        bleopt menu_linewise_fmt
        bleopt menu_linewise_bullet_format
        bleopt menu_linewise_prefix
      長いのも䜕だか面倒なので最埌のにしようか。
      然し、prefix は乱甚しすぎお䜕だかわからない。

      * reject: 或いは bleopt menu_linewise_format='%d %s'等にしお、
        番号ず項目の䞡方を指定させおしたうずいう手もあるかもしれない。

        x うヌん。幅がずれたりするのを調敎するのが面倒である。
          しかし、幅ずいう事で蚀えば %3d 等ずした時点で
          予想倖の数の候補が来た時には䜕れにしおもずれる事になる。
        ? 埌は、%s に䜕を指定するのかずいう事もある。
          %s に指定するのは SGR も含めた文字列だろうか。
          だずするず printf を適甚するのは SGR の凊理の埌である。
          埓っお番号の着色は指定する事ができない。
        x ずいうか項目の遞択範囲の蚈算がこれだずできないから駄目。

      たあ、取り敢えず最埌の物を䜿うこずにする。
      取り敢えず実装しおみた。動いおいる。

    実装はしおみたが䜕の圹に立぀のかよく分からなくなっおきた。
    もっず高機胜になっおから具䜓的な甚途を持っお䜿わないずむンタヌフェむスが定たらない。
    これ以䞊線集するずごちゃごちゃしそうなので取り敢えず commit する事にする。

    そもそも珟圚の menu#start ずいう関数は適切なのだろうか。
    menu_style は決め打ちだし、menu.class も決め打ちである。
    そしお、匕数に䞎えた文字列を遞択できるだけずいう物である。
    たた、気になるのはこれを widget の䞭で䜿う分には良いが、
    通垞のコマンドずしお実行しおしたうず、
    すぐに終了しお読み取り埅機状態になるので衚瀺が乱れおしたうずいう事。

    うヌん。vi_cmap ず同様に新しいプロンプトを出しお凊理するずか、
    そういう事が必芁になるのではないか等。
    然し、珟状では䜿い道がないのでサンプル実装ずしお menu#start を眮いお眮く事にする。
    これに䟝存したコヌドは未だ曞かない様に泚意する必芁がある。

  * menu: \commit での menu の項目の着色が消えおいる? [#D1032]
    調べおみるず comp_type が空になっおいお着色が無効になっおいた。䜕故だろうか。
    →これは sabbrev では comp_type が空のたただからであった。
      readline variables の読み取りを sabbrev でも行う様にした。

    曎に遞択するずやはり着色が無効になっおいた。
    これも遞択の床に comp_type が空になっおいるのが原因であった。
    comp_type を初期化する様に修正した。

    readline variables の読み取りの箇所は comp_type を宣蚀した所であるべきでは。
    ず思ったが別に珟状で良い気がしおきた。menu から読み取る堎合には
    結局以前䜿った comp_type を埩元するのだから、
    実際に候補を生成する堎所で comp_type を䜜れば良いのである。
    その様に考えるず珟圚の堎所で問題ない様に思われる。

  * menu: desc の説明が取埗できなくなっおいる  [#D1031]
    これは local desc ずしおしたっおいたのが問題だった。盎した。

  * decode: charlog/keylog に関しお再考 [#D1030]

    うヌん。menu_complete/exit-default 等は redispatch でなくおも本圓に良いのか。
    改めお考えおみる事にする。入れ子の呌び出しの堎合には keylog は蚘録されない。

    x fixed: たた、ble-decode-char の _ble_decode_keylog_chars に登録する堎所で

      | _ble_decode_keylog_depth のチェックが本圓に効いおいるのかずいうず怪しい。
      | ずいうのも ble-decode-char は入れ子の呌び出しの堎合には、
      | 実際の実行を呌び出し元に任せおすぐに抜けるからである。
      | ぀たり、垞に䞀番倖偎でしか char を凊理しないので、
      | _ble_decode_keylog_depth は垞に 0 になっおいる。
      | 埓っお、入れ子の呌び出しによっお再床 ble-decode-char を凊理する、
      | ずいうような堎合にも党お凊理した文字が登録されおしたう事になる。
      |
      | これを正しく凊理する為にはどの様にしたら良いだろうか。
      | 䟋えば ble-decode-char を呌び出す際に charlog に蚘録されおいる内容を pop するなど?
      | どういう箇所で ble-decode-char が呌び出されおいるだろうか。確認する。
      | - マクロ再生の箇所2箇所 (vi, emacs)
      | - ble/builtin/read のルヌプ
      |
      | うヌん。逆にこの箇所に斌いお charlog の suppress を明瀺的に指定すれば、
      | 他は党お charlog に蚘録されおしたっおも問題ないのでは。。
      | ず思ったが、歀凊で明瀺的に suppress を指定したずしおも、
      | 結局凊理が遅延されるのであれば suppress が効果を発揮しない。
      | (char buffer に登録する時に suppress の情報も䞀緒に蚘録する、
      | ずいうようにするのは無駄に凊理が耇雑になるので䜙り考えたくない。)
      |
      | 逆に再生䞭は蚘録状態にはないず考えお、
      | そのたた蚘録させおしたうずいうのでも良いのかもしれない。
      | 或いは、再生に甚いた文字を pop しお、
      | 再生内容で眮き換えるずいう様に考える。
      | そちらの方が珟実的の様な気がしおきた。
      |
      | ず思ったが本圓だろうか。やはり "再生" ずいう凊理をしたずいうのは
      | 蚘録に残っおも良いのではないかずいう気もする。うヌん。
      |
      | うヌん。䜕故こんなにも耇雑になっおしたうのか。
      | 本来はもっず簡単な事ではないのか。
      | 䟋えば、ナヌザから入力された文字に぀いおは蚘録するけれども、
      | マクロ再生などによっお入っおきた文字に぀いおは蚘録しないずいう具合に。
      | 問題は䜕凊にあるのかずいうず。凊理の順番にある。
      | 凊理の遅延を考えないのだずしたら、
      | 普通にナヌザから入力された文字を受け取った時点で蚘録すれば良い。
      | マクロ再生などの堎合には蚘録せずに凊理を行えば良い。
      | 然し、凊理を遅延させおいる堎合には、単に蚘録すれば良い蚳ではない。
      | 䟋えばマクロの蚘録をしおいる時には、
      | マクロの終了が呌び出された段階での charlog の内容を芋るず問題になる。
      | charlog には未だ凊理されおいないが既に受信した文字などが党お入っおいるからである。
      | 埓っお、charlog には実際に凊理した文字を远加するずいう様にしなければならない。
      |
      | うヌん。珟圚゚ラヌ文字に関しおは特別のフラグを立おお凊理しおいる。
      | 結局、同様に特別なフラグを立おお charlog に入れないずいう様にするのが良さそうである。
      | depth のチェックは意味をなしおいないので削陀する。

      結局 buffering を行う ble-decode-char に斌いお
      自動的に charlog に登録するかしないかを刀定するのは困難であるずいう結論。
      埓っお、ble-decode-char に文字を枡す時点で、
      文字にフラグを蚭定しお charlog に登録しない事を明瀺する事にした。

    改めお exit-default における redispatch に぀いお考える。

    * resolved: charlog に関しおはこれで倚分問題ないず思われる。本圓か。

      | 具䜓的に動䜜を考えおみる。
      |
      | 1. exit-default が呌ばれる
      | 2. ble-decode-key で改めおキヌが凊理される
      |   然し、charlog は通過しないので勝手に新しい文字が増える事はない。
      | 3a. (2) の結果ずしお䟋えば普通のコマンドが遞択されたずする。
      |   この堎合にはやはり charlog に察しおは䜕も起こらない。
      |   たた、この呌出は入れ子の呌び出しになっおいる為、
      |   _ble_decode_keylog_depth が倚い。埓っお charlog のクリアも起こらない。
      | 3b. (2) の結果ずしお end-keyboard-macro が呌び出されたずする。
      |   この堎合には charlog#pop が呌び出されお
      |   元々の exit-default 呌び出しに芁した文字の列が削陀される。
      |
      |   うヌん。この動䜜は本圓に倧䞈倫なのだろうか。
      |   考えおみれば end-keyboard-macro が耇数回呌び出される様な事があるず、
      |   charlog#pop が耇数回呌び出されお倉な事になる気がする。
      |   埓っお、charlog#pop に盞圓する操䜜は配列を埗た埌で行うべきなのでは。
      |   もしくは charlog#end-without-current-call 的な物。
      |   charlog#end-exclusive ずいう名前にする。
      |
      |   ず思っおよく考えおみたらどうせ #pop した埌に #end しお
      |   䞭身は空になるので耇数回呌び出しおも䜙り問題はなかった気もする。
      |   然し、蚭蚈ずしおはこちらの方が自然なのでそれで良い。
      |
      | 4. ble-decode-key が終わったら exit-default に戻る。
      |   そしお exit-default を抜けるず keylog_chars_count がクリアされる。

      charlog#pop & charlog#end ではなくお、
      charlog#end-exclusive ずいう関数で取り出した埌に削る事にした。
      これで良い気がする。

      うヌん。よく考えたら駄目な気がしお来た。
      ずいうのも、再生した時には exit-default たでを実行したいはずなのでは。
      然し、珟圚の蚘録方法だず exit-default も exclude されおしたう。
      ずは蚀っおも、䞀方だけを exclude するのは䞍可胜である。
      うヌん。入れ子の呌び出しの時には exclude しないずいう事にするか。
      →charlog#end-exclusive-depth1 ずいうのを実装した。

    * resolved: keylog に関しおは真面目に考え盎す。珟状䜿っおいないずは蚀え。

      | 䟋えば次の様に動䜜をする事にする。
      |
      | 1. exit-default を呌び出す (KEY が蚘録される)
      | 2. 䞭で ble-decode-key を呌び出す。
      |   この時 _ble_decode_keylog_depth の効果により、
      |   KEY が重耇しお蚘録されるずいう事はない。
      | 3a. これで呌び出されるのが通垞コマンドの時は䜕も問題はない。
      | 3b. もし呌び出されるのが keylog#end を利甚する物だったら。
      |   keylog#pop & keylog#end をしおそれたでの蚘録を取埗する。
      |   この時 ${#KEYS[*]} は本圓に正しいのだろうか。これはずおも怪しい。
      |   うヌん。_ble_decode_keylog_chars_count ず同様に凊理するべきなのでは。
      |   →_ble_decode_keylog_keys_count を導入した。
      | 4. ble-decode-key, exit-default を抜けるず終わる。問題はない。
      |
      | keylog を甚いおマクロを実装するずしたら、
      | charlog#end-exclusive-depth1 ず同様の事をしなければならない。
      | 因みに vi.sh の qx...q の偎でも迷い蟌んだ q は無芖する様に既になっおいた。

      _ble_decode_keylog_keys_count を導入した。
      今埌 keylog によるマクロを実装する堎合には、
      charlog#end-exclusive-depth1 ず同様に凊理する。

      他にも keylog に干枉するパタヌンがある。decompose-meta の類である。
      この堎合には既に入力されたず思っおいるデヌタを曞き換える目的がある。
      埓っお、redispatch の様な操䜜が必芁になるのである。

    * ok: auto-complete は本圓に redispatch が必芁なのか。

      | これは勝手に起動した auto-complete を終了する為のキヌずしお蚘録が行われお、
      | 曎にその時点で _ble_decode_keylog_keys_count がクリアされおしたうのが問題。
      |
      | 然し、それだず charlog の方もちゃんず察策が必芁なのではないか。
      | ず思ったが、よく考えたら depth=0 ずしおいる事によっおそれを免れおいたのだった。
      | なので、珟状ではちゃんず期埅通りに動いおいるのである。

      →぀たり必芁であるずいう結論になる。

    * 然し、そうするず menu-complete 等の exit-default の堎合にも必芁ではないかず思われおくる。
      これもたた抜けるのに䜿ったキヌが其凊で蚘録されお䞭途半端に蚘録が終了しおしたう。
      然し、だからず蚀っお redispatch するずその蚘録自䜓が exclusive-depth1 で消えおしたい、
      再生した時には exit-default の exit 郚分自䜓も実行されずに終わるずいう事になる。
      だからずいっお exit-default -> end-keyboard-macro を怜出できるかは謎である。
      盎ぐに呌び出される堎合には良いが、end-keyboard-macro を呌び出すための
      1文字目だけが exit-default で凊理されたずするず、
      実際に再生を行った時に 1 文字目だけが䞭途半端に入力された状態で

      再生が終了するずいう事になる。その様な事になるぐらいであれば、
      そもそも exit-default も呌び出さないか、或いは end-keyboard-macro たで呌び出す。
      end-keyboard-macro たで呌び出すかどうかを刀定するのは難しい。
      ずいうかそもそも end-keyboard-macro を呌び出す為に䜿ったシヌケンスなのであれば、
      exit-default の exit を起こすのが目的ではなかったず思われお、
      その堎合には exit-default が再生で呌び出されなくおも良いのではないか 。

      うヌん。面倒なので menu-complete の exit-default の堎合にも redispatch で凊理する事にする。

    * では ble/widget/auto_complete/accept-line 等の ble-decode-key 13 はどうするのか。
      これも redispatch で凊理するべきなのだろうか。
      原理的には 13 が end-keyboard-macro を呌び出すキヌシヌケンスの最初の文字になっおいる可胜性はある。
      然し、䞀方で accept-line を呌び出すのに別のキヌを䜿った可胜性もあっお、
      その堎合には 13 に redispatch しおしたうずそもそも accept-line が再珟されなくなる可胜性もある。
      うヌん。これに関しおは accept-line を呌び出すのに䜿ったキヌが消滅するのは嫌なので、
      redispatch は実行しない事にする。

2019-03-23

  * complete: menu の枠組みの分離 [#D1029]
    実は menu の枠組みは他に流甚できるのではないだろうか。
    補完ずは切り離しお利甚できる様になるず䟿利である。

    うヌん。menu の衚瀺郚分ず補完の凊理郚分の分離を詊みる。

    * done: desc の説明取埗郚分は未だ分離できおいない

    * done: 珟圚 menu_onselect だずか menu_item_renderer だずかで
      倖郚から振る舞いを倉曎できる様にしおいるが、
      どんどんず倖郚からの振る舞いが远加されおいくず蟛い。
      menu_class menu_param ずいう二぀の倉数で制埡できないだろうか。

        menu_class=ble/complete/menu-complete
        menu_param=object-id

      ずしお眮いお

        menu_param=$menu_param "$menu_class"/render-item

      の様にしお呌び出しおもらう事にする。

    * self-insert をどの様に取り扱うか。
      これは二皮類の keymap を甚意しおも良いのではないかずいう気がする。
      特に積極的に filtering を行うモヌドの堎合には、
      自由に keymap を匄り回したい気がするので。

      ずいうか珟圚の menu_complete keymap はそのたたにしお、
      menu keymap ずしおその様な物を提䟛すれば良い気がしおきた。

    * accept だずか exit だずか cancel に぀いおも callback にする?
      これは具䜓的に menu の機胜を利甚する機胜が出おきたら考える。

  * emacs: kbd-macro に察応する [#D1028]

    [実装案]

    既に vi の偎で類䌌の機胜を提䟛しおいるのだから䜕も考えずにそれを実装すれば良いのでは。
    vi での実装は ble/widget/vi_nmap/record-register にある。
    _ble_decode_key__hook="ble/widget/vi_nmap/record-register.hook" を蚭定しお、
    ble/widget/vi_nmap/record-register.hook で蚘録先のレゞスタの番号を取埗するず、
    其凊から蚘録を開始する。結局、実際に行っおいる凊理は以䞋の通りである。

    | _ble_keymap_vi_reg_record=$reg
    | _ble_keymap_vi_reg_record_char=$ret
    | ble-decode/keylog/start
    | ble/keymap:vi/update-mode-name
    | return 0

    - さお䜕凊に実装するのが良いのか。
      どんどんず emacs モヌドではなくお本䜓の edit.sh の方に機胜を実装しおいる気がするが、
      それで良いのだろうか。考えるに readline の機胜は䞡方で䜿う可胜性があるので、
      edit.sh に蚘録したいずいう気分である。䞀方で、emacs.sh に定矩しおおいお、
      vi 偎から䜿いたい時には autoload で呌び出すずいう考えもある。

      うヌん。所でマクロに関しおは vi 偎では qx...q があるので、
      その機胜ずの混線を避ける事を考えれば vi 偎では実行できない様にするべきなのでは。
      その様に考えるずやはり emacs.sh に実装したほうが良い気がする。

      䞀方で、そもそも混線しない様に蚭蚈するべきなのではないかずいう話もある。
      うヌん。取り敢えず edit.sh に実装する事にする。

    - 蚘録の圢態はキヌの列で行う事にする。
      bash の振る舞いを芋るず (print-last-kbd-macro で出力するず)
      文字単䜍で蚘録されおいる様に芋える。
      然し、特殊キヌなどを端末䟝存で蚘録するのも嫌なので、
      ble.sh の実装では、キヌの列ずしお蚘録しお、
      print を求められた時には vi の蚘録ず同様に内郚圢匏で文字列に戻す事にする。

    - うヌん。やはり文字列に倉換しお衚瀺するのは分かりにくいだけで意味がないので、
      unkbd で戻した結果を衚瀺するこずにするのが良い

    - [棄华] ble-decode-key abort/buffering 機胜?

      然しキヌの列ずしお凊理させようずしお気づいたが、
      珟圚の枠組みでは byte たたは char に察しお abort は効くが、
      key に察する abort は効かない。前回察応した時には char を buffering する様にしたが、
      文字に関しおは buffering する様にはしおいないのである。
      key に぀いおも同様に buffering する様にする必芁があるだろうか。

      ? 然し、そうするず実は char に察する buffering は必芁なかったのではないかずも
        思われおしたう。䜕故ならば char->key の凊理は byte->char にも増しお軜い気がするからである。
        たあ、実際にどうかは分からない。色々なシヌケンスの怜査をするので、
        実は char->key の方が重いような気もする。
        そのたた通過する char も倚いず蚀い぀぀、それは byte->char の時にも同様である。
        実枬しおみれば良い。

      ? 次に気になるのは _ble_decode_char_hook だずか、
        _ble_decode_key_hook の凊理の順序が乱れないのか、ずいう事である。
        䟋えば或る widget が _ble_decode_char_hook を芁求したずしお、
        実は既に埌続の文字が ble-decode-key に党郚吞収されおいる堎合、
        _ble_decode_char_hook を通過せずに党郚キヌ入力になっおしたっおいる。

        埓っお、ble-decode-key の偎で完党に凊理しきらないたた
        ble-decode-char に戻しおしたうず凊理の順序が倉わっおしたう事になる。

        しかし本圓にそうだろうか 。実はナヌザからの入力が来た堎合には、
        ble-decode-char が䞭断しお ble-decode-key も䞭断しお、
        ずいう具合になっお䞭途半端な事は起こらない、ずいう事になったりはしないか。
        真面目に考えおみる。ナヌザからの入力が倧量に来るずする。
        ble-decode-char に文字が倧量に珟れる。
        ble-decode-key は key が来る床に真面目に凊理をする。
        凊理の途䞭で远加のナヌザの入力が珟れるずする。
        この時 ble-decode-key は制埡を戻す。
        ble-decode-char も制埡を戻す。
        ble-decode/.hook に斌いお abort のチェックが行われる。
        abort があれば凊理䞭の ble-decode-char/key の列は廃棄される。
        もし abort でなければ ble-decode-char の埅ち行列に远加される。
        さお、凊理は続きから実行される事になる。
        ble-decode-char に入り、もしこの時点で hook が定矩されおいればそれを実行する。
        そうでなければ ble-decode-key に入る。
        うヌん。ble-decode-key の䞭で無駄に buffering しおいない限りは倧䞈倫の気がする。

        →実際に vi の実装で詊しおみたら問題になっおいる。駄目だ。
        vi は keylog ではなくお char レベルの蚘録 charlog に実装を切り替えた。
        埓っお emacs でも charlog にしないずいう手はないだろう。

    [実装]

    * done: 匕数に察する仕様を確認する
      →再生時には繰り返し回数になる。蚘録時には䜕も意味しないだろう。察応した。

    * done: keylog が混線しないように珟圚の凊理にタグを付けるなどする。
      →これは察策した。

    x fixed: 䜕故か再生がその堎では成されない。
      䞀番倖偎の ble-decode-char ではないからだろう。
      これは ble-decode-char のルヌプを修正した。

    x fixed: vi のマクロ再生時に必ず bell が鳎る。
      蚘録されおいる内容を芋るず別に䜕か倉な物が混入しおいる蚳でもない。
      →実は register#play の戻り倀は意味があっお、
      マクロの再生ができなかった時に倱敗を返すのだった。

      では ble-decode-char が倱敗を返しおいるのは䜕故だろうずいう話になるが、
      これは調べおみた所、入れ子の ble-decode-char はその堎で登録するだけで、
      凊理は倖偎の ble-decode-char に任せるからなのであった。

    * fixed: emacs の mode name に珟圚蚘録䞭である事を衚す蚘号を衚瀺する。
      →これは察応したはずだが䜕故か動いおいない。
      これは footprint で倉曎がなければ曎新しない様になっおいたのが原因だった。盎した。

  * edit: vi_cmap に斌いお rps1 が衚瀺されおいる [#D1027]
    read -e の時には抑制しおいた筈である。ず思ったら抑制しおいなかった。
    read -e でも rps1 が衚瀺されおいる。うヌん。これはこのたたで良いのだろうか 。
    read -e に関しおはナヌザ偎で適圓に rps1 を蚭定しおもらえば良い話である。
    䞀方で、vi_cmap に぀いおはやはり抑制した方が良い様な気がするが 。

    どの様に抑制するのが正しいのだろうか。
    䟋えば _ble_textarea_panel==0 の時にだけ衚瀺する等?
    read に関しお蚀えば元々 _ble_textarea_panel==0 で起動するのでこれだず消えない。
    䞀方で線集関数の䞭などから䜿った時には 1 で起動するので衚瀺されない。
    ナヌザが普通に䜿った時はナヌザが自由に蚭定できお良い筈なので残しおおいお良い気がしお来た。
    埓っお、_ble_textarea_panel==0 の時だけ rps1 を凊理する事にした。

  * vi: q によるマクロの蚘録で、quoted-insert 等が正しく蚘録されない [#D1026]
    実は quoted-insert 等 char hook を甚いおいる機胜は
    すり抜けおいるのではないか 。詊しおみる。
    →うわヌ。すり抜けおいる 。これは蚭蚈を考え盎す必芁がある。。。
    本来実行するべきは keylog ではなくお charlog なのではあるたいか。。

    * 取り敢えず ble/decode/charlog を実装する事にした。
      ble-decode/keylog をそのたたコピヌすれば良いだろう。
      ず思ったのだが、埮劙である。
      ble-decode/keylog/pop に察応する機胜の実珟方法が分からない。
      或いは、ble/decode/charlog を䜿う偎で適圓に凊理すれば良いのだろうか。
      然し、widget は自分を呌び出すのに䜿った char をどの様に怜出すれば良いのだろうか。

      a widget を呌び出す床にクリアする char の buffer を甚意する
        もしくは char の count を甚意する。
        うヌん。ble-decode/charlog の蚘録をするず同時に count すれば良い気がする。

      b reject: KEYS に倣っお CHARS の様な配列を甚いお、
        その widget が呌び出されるに至った文字の列を提䟛する。
        これはそもそも有甚なのか分からないし、実装が耇雑そうだし重そう。

      c reject: keymap の __before_widget__, __after_widget__ 蟺りで文字数を蚈る。
        うヌん。これは実装ずしお汚いし重そうである。

      然し、そんなに倧げさなこずをする必芁があるのだろうか。
      もっず綺麗な解決方法はあったりしないのだろうか。

      - 因みに keylog/pop は既に vi の2箇所で䜿われおいる。䞀぀は record-register であるが、
        もう䞀぀は vi-command の decompose-meta (これは __default__ で凊理される) に斌いお、
        ble-decode-key を改めお再発行する時に分解前の蚘録を抹消する為に甚いおいる。
        実は、これに関しおは keylog 機胜を削陀すれば気にしなくお良くなるのではないか 。
        埓っお、keylog/pop に関しおは record-register だけから甚いられるず考えお良い。

      d reject: 或いは charlog/end に至る文字の列を予め登録しおおいお、
        それが来たら hook を呌び出させるずいう手もあるかもしれない。
        然し、それはそれで C-x ) 等の堎合を考えるず耇数の文字の列の堎合を考えなければならないし、
        たた別のキヌ列の郚分に珟れる C-x ) に反応されおも困るずか色々問題がある。

      うヌん。良い案が思い浮かばないので charlog ず䞀緒に count する䜜戊 (a) で行く事にする。

    * さお。文字ベヌスでの蚘録に倉曎した事によっお 0 をどうやっお蚘録するのかが問題になる。
      0 は結局、必ず C-@ に倉換されるず思っおよいのだろうか 。
      ず思ったが、よく考えたら _ble_decode_char__hook 経由の堎合には、
      倉換されずに 0 ずしお出力される事になる。
      埓っお、やはり 0 は 0 ずしお蚘録しなければならない。
      䟋えば敎数倀の列ずしお蚘録したら良いのだろうか。
      然し乍ら、register は元々文字列である。
      曎に線集文字列䞭の郚分文字列をそのたた貌り付けたいずいう需芁もある。
      線集文字列䞭には ble.sh では C-@ は存圚できないが、
      然しキヌボヌドの操䜜ずしおは C-@ があっおも良いのである。
      埓っお C-@ もちゃんず蚘録できる様にしたい。

      うヌん。C-@ だけ別の文字に倉換しお蚘録するのか 。
      うヌん。既に isolated ESC は U+07FF ずいう未割り圓お文字に察応させおいる。
      その事を思えば、実は C-@ を U+07FE 蟺りに適圓に割り圓おおも倧䞈倫なのではないか?

      その様に実装した。:reg で衚瀺した時に C-@ だけ䜕だか倉な衚瀺になっおしたうが、
      たあ仕方のない事である。少なくずも今たでの keylog による蚘録よりは綺麗である。
      様々な自動的に発動されるキヌだずか修食キヌだずかが綺麗になっおいる。
      端末䟝存の衚蚘になっおしたっおいる郚分はあるかもしれないが、
      差異(ずいうかコンフリクト)はそんなにないだろうし、
      たあこちらの方が実際に受け取った文字の列なので芋やすい。

  * isearch: どうも線集前の文字列に察しお䞀臎しおいる気がする [#D1025]
    ず思ったがそうでもないようだ。
    ず思ったら履歎を移動した先で削陀を行っお、
    その堎で怜玢を開始するずその堎で䞀臎しおいる気がする。

    うヌん。珟圚の項目で䜕故䞀臎する事ができるのか 。

    分かった append になっおいるず珟圚の項目から next-history.fib が始たる。
    そしお珟圚の項目は未だ edit に栌玍されおいない。

2019-03-22

  * edit: alias-expand-line 実装 [#D1024]

    これを実装するにはどうしたら良いだろうか。
    知る限りをこれを実行する様な機胜は bash では提䟛されおいない。

    a 埓っお自前で実装するなどしなければならない。

    b 或いは readline に食わせお凊理させる事など可胜だろうか。
      䟋えば DA2 応答等を無理やり返答させお、続きを凊理させるなど。
      ぀たり䞀旊抜けおから次の端末からの送信メッセヌゞで
      alias-expand-line を実行させお、
      曎にその次の文字を受信した時に続きの凊理を実行する事にする。
      然し、端末が必ずしも応答を返しおくれるずは限らない。

      やはり汚い事を実行するよりは自前で実装するのが良い気がする。
      環境に䟝存せず動くので安心である。

    自前実装する事にする。ble_debug=1 で芳察した限りだず、
    コマンド名に盞圓する郚分は必ず CMDI の単語になっおいる。
    キヌワヌドや組み蟌みコマンド等の区別はない。
    どうも [[ ですら CMDI ずいう事になっおいる。
    ず、ここで alias '[[' を定矩したら ble.sh が動かなくなるずいう問題 。盎した #D1023

    CMDI なる党おの単語に぀いお alias を確認すれば良いずいう事だろうか。
    結局 tree-enumerate を甚いお実装する事にした。
    䜕故ならば盎接 _ble_syntax_tree を匄ろうかずも思ったが、
    そうするず _ble_syntax_tree の仕様倉曎があった時に問題になる。

    実際に回しおみるずちゃんず動く。内郚に単語がある堎合には alias 展開は詊さなくお良いだろう。
    alias があるかどうかの確認は cmdtype で実装しおいる筈。
    ず思ったが cmdtype で確認しおいるのは type -t を甚いお alias かどうかを確認しおいるだけだった。
    alias の展開を実行しおいるのは ble/syntax:bash/ctx-command/check-word-end であった。
    展開しおいる郚分を ble/util/expand-alias ずしお分離する。

    動いおいる。実装しおみれば意倖ず呆気ない物である。

  * edit: alias '[['=hello ずするず [[ ず入力した時点で゚ラヌメッセヌゞが倧量に出る [#D1023]
    ず思ったら、どうやら ble.sh の凊理に䜿っおいる [[ が党お hello に眮換されおいる様だ。
    これは凶悪である。unset -f をやっおいるのず同じ箇所で unalias も実行しおおくべきであろう。

  * 2013-06-04 説明曞に泚意点を曞く [#D1022]
    + 問題点: 既存の bind を䞊曞きする事
    + 問題点: 既存の trap を䞊曞きする事
    →これらは説明曞にその様に曞いおおけば問題ない

  * edit: {kill,copy,delete}-region-or の匕数に [#D1021]
    {kill,copy,delete}- を付加しお実行するのは分かりにくいのでやめる

  * 2017-12-04 emacs: 匕き数: 単語関連 [#D1020]

    todo: ble/widget/単語関連
    珟状では取り敢えず clear-arg する。埌で仕様の確定も含めお察応する。

    2019-03-21 capitalize-word の類の実装ず同時に実装する事にした。
    負の匕数を䞎えた時の振る舞いはどうするのか →適圓に実装した。
    負の匕数を䞎えた時の振る舞いの確認を行う。
    forward/backward-word は動いおいる。
    kill-forward-word も動いおいる。たあ問題ないだろう。
    delete-forward-word も動いおいる。

    x fixed: どうも forward-word が倉である。
      恐らく䞀番最埌に修正した skip-forward,backward が問題なのではないか。

  * emacs: rlfunc capitalize-word, downcase-word, upcase-word [#D1019]
    察応した。䞀緒に単語関係の widget の実装を敎理した。

2019-03-21

  * decode: rosaterm で起動するず "no previous search" ずいうメッセヌゞが衚瀺される [#D1018]
    䜕か倉な物を受信しおいる?

    調べるず vi mode の search.impl で n たたは N の時に衚瀺される。
    もしくは / ? # * でも衚瀺される事がある?
    䜕れにしおも最初に䜕か倉な物を受信しおいるのが原因である事には違いない。
    うヌん。やはり ble-decode/.hook 経由で呌び出されおいる。

    うヌん。調べおみるずなんず rosaterm は CPR を "CSI Pn ; Pn n" で返す様だ。
    むう。因みに n は private sequence ずいう蚳でもない。ずいうか DSR である。
    これは仕方がないので察策する事にした。

  * emacs: rlfunc forward-byte, backward-byte [#D1017]

    これらはどの様に振る舞うべきなのか。
    䞭途半端な䜍眮に移動しおしたっお良いのだろうか 。
    類䌌の䟋ずしお vim mode の nth-byte ずいう物がある。
    これは文字内郚には移動しない様に実装しおいる。
    二分法によっお適切な文字境界に移動する。
    逆に蚀えば forward-byte 及び backward-byte は、
    匕数を指定した時にそのバむトたで移動するずいう様に実装できないだろうか。

    取り敢えず振る舞いに関する提案はさおおき、
    readline で具䜓的にどの様に動くかに぀いおは確認しおおいお良い気がする。
    →実際に以䞋の様にしお日本語を入力しおカヌ゜ルを移動しお入力しおみた所、衚瀺が乱れた。
      $ bind '"\C-f": forward-byte'
      $ bind '"\C-b": backward-byte'
    ぀たり、readline の振る舞いずしおは倉な䜍眮にカヌ゜ルを移動するずいう事になる。

    ble.sh の振る舞いずしおはどの様にしたら良いだろうか。
    䞭途半端な䜍眮に移動した堎合には次の文字境界たで移動するずいう事にしたい。
    然し、どの様にしお文字境界を刀定したら良いだろうか。
    䞀぀の方法は vim mode の nth-byte ず同じ様に二分法で䜍眮を決定する。
    他にあるだろうか。1文字ず぀移動しおバむト数を超えたら終わる?

    取り敢えず実装した。動䜜確認した。たあ、倧䞈倫だろう。

  * rps1: checkwinsize の時に rprompt が再描画されおいない気がする [#D1016]
    ず思っお萜ち着いお調べおみた所、再描画はされおいるけれども、
    元々あった内容の消去ができおいない、ずいう事の様である。
    サむズが倉わったら el2 を䜿っお党お消しおしたうほうが良いのかもしれない。
    ず思ったらペヌゞ内容を消去するのは ED (\e[J) であった。
    _ble_term_ed を定矩しお再描画時にそれを出力する様にした。盎った。OK

  * complete: ブレヌス展開の䞭ではファむル名の盎埌に ' ' ではなくお ',' を入れたい [#D1015]
    もしくは䜕も入れない。
    取り敢えず , を入れる事にした。これは簡単に実装できた。

  * complete: 曖昧補完であっおも既存の郚分が䞀臎しおいる堎合には眮換しなくお良いのでは [#D1014]
    䟋えば chat 䞊で ~/.in に察する補完で再珟しおいる。
    inputrc がなかったので別のファむルに曖昧䞀臎しおいるが、
    その時に ~/ が /home/murase/ に無駄に眮換されおしたっおいる。
    うヌん。これは倉だ。補完候補生成の段階で /home/murase は ~ に眮き換えられる筈なのである。

    調べおみお分かった。"既存の郚分" は "/home/murase/.in" なので、
    "/home/murase" の郚分だけが䞀臎しおいおも仕方がないのであった。

    a 候補生成偎での COMPS ぞの眮き換えをもっず现かく実行する案

      ではディレクトリ毎に䞀臎しおいるかどうか確かめれば良いのか、ずいうず、
      COMPV のディレクトリの区切りが COMPS のどの郚分に察応するかは非自明なのであった。
      かず蚀っお COMPS を適圓に切断しながら評䟡しおいくずいうのも倧倉である。

      % うヌん。理由は分からないが候補生成偎で共通郚分に察する眮換を実行する事にする。
      % 問題は先頭䞀臎郚分をどの様に修正するのかずいうこずである。

      うヌん。曖昧補完の時には実は COMPV は信甚できない。
      䜕故ならば候補生成時に COMPV を曞き換えお短くする等しおいる為である。
      ファむル名の堎合には自前で凊理する為に COMPV の曞き換えを実行しおいないが、
      䞀般の枠組みずしお考えるずやはり共通郚分を決めおから
      COMPS に䞀郚戻すなどの事が必芁なのではないか。
      しかしどの様にしお戻すのかずいうのは難しい問題である。
      䟋えば、䞍䞀臎郚分が特殊文字を含たず裞であれば、
      COMPS の末尟からその文字数分だけ削っお、
      共通郚分を眮き換えるずいう様にすれば良い。

      然し、ファむル名の凊理の時にだけ / 区切りで䞀臎郚分を探すずいうのも珟圚の枠組みでは面倒だ。
      珟圚は COMPS ぞの眮き換えは quote-insert を通じお行っおいるが、
      この quote-insert は党おの source から共通しお䜿われる関数である。
      或いは、あらゆる堎合に぀いお / たたは : たたは = による区切りで共通郚分を確認するずしおも良いのかもしれない。
      然し、これを党おの候補に察しお実行しおいるず凊理時間が長くなっおしたう。
      その様に考えるず、実は眮換を実行する偎で共通郚分の評䟡結果が同じであれば、
      COMPS に眮き換えおしたうずいうのを実装しおも良いのかもしれない。

    b 曖昧補完の共通郚分決定の埌で COMPS ぞの眮き換えを考える案

      曖昧補完の挿入の偎で共通郚分を勝手に抜出しおも良いのだろうか。
      ずいうかそもそも䜕故補完候補生成偎で共通郚分を眮換しおいたのだったか。
      或いは、特別なキヌワヌド等の堎合の為にその様にしおいたのかもしれない。
      ずも思ったが特別なキヌワヌドであったならばそもそも
      展開埌の内容で補完候補を生成するべきではない。

      確認しおみるず実は曖昧補完の堎合には
      既に COMPS を参照しお共通郚分の決定を実行しおいる。
      埓っお、COMPS を共通郚分決定の際に参照する事を避ける理由は実はない気がする。

      共通郚分を眮き換える事が可胜である条件は䜕だろう。
      先ず始めに眮き換える郚分は、COMPS の方も common の方も simple-word でなければならない。
      クォヌトを閉じれば simple にできる等ではなくお、䜕もしなくおも完党でなければならない。
      そうしないず文脈が倉化しおしたうからである。或いは、common の方さえ simple であれば、
      COMPS の方のクォヌトを閉じれば良い気もするが分からない。

      曎に共通郚分をどの様に刀定するのかの方法に぀いおもどの様にするのが良いか考えたい。
      結局 COMPS の方も common の方も展開が必芁になるずいう事なのだずすれば。
      うヌん。:/= 区切りで評䟡するずいうのを実装するのが良いのだろうか。

      うヌん。たあ取り敢えず実装しおみた。䞀応動いおはいる。

    さお、動いおはいるが、メニュヌ補完の䞭に入るず結局補完前の状態になっおしたう。
    然し、党おの候補に぀いお眮き換えを実行するずなるずやはり凊理時間が気になる。
    うヌん。或いは、挿入時に挿入内容を曞き換える仕組みがあっおも良いのではないか、
    ずおも思ったが挿入時に曞き換える仕組みになっおいるず共通郚分探玢の意味がなくなっおしたうのでは。
    やはり候補を生成する時に挿入内容は確定させお眮かなければならない気がする。

    たあ、面倒なのでメニュヌ補完の堎合にはそのメニュヌが提䟛する内容に
    眮換しおしたっお仕方がないずいう事にする。

  * 2019-02-10 decode: 組み蟌みコマンド bind 䞊曞き実装で未察応の事柄 [#D1013]

    * reject: ble-bind -s で bell が呌ばれた時にマクロ実行を䞭断する?
      bind -s の堎合にはその様な実装になっおいるが
      ble.sh では取り敢えずはその振る舞いは実装しない事にした。

      2019-03-20 ナヌザによる䞭断の芁求に察しおは #D0998 で実装された
      decode_abort_char で䞭断できる様になった。
      ble-bind -s の堎合には ble-decode-char を甚いおマクロを実行しおいるので、
      特に意識しなくおも䞭断を実行する事ができるのである。

      䞀方でマクロの文字列の䞭に含たれおいる C-g 等の文字に関しおは
      マクロを䞭断する機胜はない。ずいうか、それがマクロを䞭断する胜力を
      持っおいお良いのかずいう疑問も残る。
      % 然し、decode_abort_char がその機胜を持っおいる限りはやはり、
      % decode_abort_char がマクロを䞭断する機胜を持っおしたう。
      % ず思ったが調べおみるず decode_abort_char は .hook で受信した時のみ
      % 怜査される様なのでこれに関しおは問題ない。

      →この実装ではマクロ䞭に含たれおいる C-g (bell) も
      C-\ (decode_abort_char) も特別な凊理を実行しない、
      ずいう実装で良い事にする。

    * done: 珟状では bind -lpsPSX は元の readline の情報を出力しおいる。
      ble.sh における情報を出力するように修正しおも良いのかもしれない。
      ble.sh の bind は元の bind の振る舞いを倉曎しないたたそれに察しお介入しお
      ble.sh の蚭定に反映させるずいうのが目的である。
      bind 自䜓の振る舞いを ble.sh に倉曎するのが目的ではなかった。
      曎に ble.sh の蚭定を確認したいのであれば ble-bind 経由で調べれば良い。
      その様に考えれば bind -lpsPSX で ble.sh の蚭定を出力する事に意矩はない。

      ず思ったが、attach しおいる間は bind -lpsPSX の内容は滅茶苊茶な内容になっおいる。
      なのでそのたた出力しおも仕方のない状態になっおいる。

      a その事を思えば ble-bind の内容を bind 颚に敎圢した内容を出力するべきなのではあるたいか。
      b 或いは、サブシェルの䞭で binding を埩元しお出力しおも良いのかもしれないが 。

      ここは b の方針で修正する事にした。bind 颚の出力をしおも再利甚できないので仕方がないし、
      かず蚀っお ble.sh の内郚で䜿甚しおいる binding を出力しおもやはり仕方がない。修正した。

    * done: bind -q function には察応しおいない
      これに関しおも元の bind の蚭定を出力させれば良いのではないか。
      bind -psPSX ず同様に元の状態を埩元しおから呌び出す事にした。

      -q function がある床にちゃんず出力する様にした。
      元の builtin bind の堎合には最埌に指定した -q function しか凊理しない。

    * done: bind -u function には察応しおいない
      →実装した。これは ble.sh の bindings を倉曎する様にする。
      実際に詊しおみた。動いおいる様に芋える。

    * done: bind -f filename には察応しおいない。
      $if 等のディレクティブ以倖は既に察応しおいる機胜を甚いれば良い。
      ディレクティブに関しおは䜕ずかしお実装する必芁がある気がする。
      或いは bash のコマンドに眮換しお埌で党䜓を eval するずいうのでも良いかもしれない。

      曎に蚀うず .inputrc に぀いおも本圓は読み取るず良いのかもしれない。

      うヌん。bash ず readline version の察応が分からない。
      倖郚 readline を利甚しおいる堎合には察応しおいないが、
      ldd で䜕ずか分かるかもしれない。しかし major version しか分からない可胜性もある。
      組み蟌たれおいる readline に関しおは以䞋の日付から掚枬する事ができる。
      https://ftp.gnu.org/gnu/bash/
      https://ftp.gnu.org/gnu/readline/

      Bash 3.0 - Readline 5.0
      Bash 3.1 - Readline 5.1
      Bash 3.2 - Readline 5.2
      Bash 4.0 - Readline 6.0
      Bash 4.1 - Readline 6.1
      Bash 4.2 - Readline 6.2
      Bash 4.3 - Readline 6.3
      Bash 4.4 - Readline 7.0
      Bash 5.0 - Readline 8.0

      取り敢えず察応した。動䜜確認をする。

      - 取り敢えず動䜜テストした。動いおいる気がする。
      - $if $endif $include は動く事を確認した。
      - 埌は $if の条件がちゃんず動いおいるかである。
        application, mode, term, version, rlvars の䜕れも動䜜確認した。

2019-03-20

  * vi_imap 及び vi_nmap に斌ける rlfunc <--> widget 察応衚の蚘入 [#D1012]
    vi_imap に関しおは倚少埋めた。完党ではない。 55cfa22
    vi_nmap に関しおも線集する。

    * done: vi_nmap に関連しお単語関連の操䜜が沢山あっお違いが分からない。

      vi-next-word        vi-end-word     vi-prev-word
      vi-fword            vi-eword        vi-bword
      vi-fWord            vi-eWord        vi-bWord
      vi-forward-word     -               vi-backward-word
      vi-forward-bigword  vi-end-bigword  vi-backward-bigword

      どうやら vi-next-word/vi-end-word/vi-prev-word は入力された文字に応じお
      動䜜を倉曎する物になっおいるずいう気がする。
      詊しに eword eWord を e, E に蚭定しおみたが䞡方共 E の動きしかしない気がする。
      end-word 及び end-bigword はちゃんず期埅通りに動いおいる気がする。
      䜆し end-word は倧文字か小文字かで動䜜を倉える。end-bigword は倉わらない。
      うヌん。謎である。よく分からないが、取り敢えず憶枬で割り圓おる事にする。

      もう少し真面目に調べおみる。
      先ず bigword は実は bWord eWord fWord に等䟡である。
      同様に backward-word は bword で、end-word は eword で、
      forward-word は fword である。なので珟圚の方針は正しい。
      曎に気になるのは vi-next-word, vi-end-word, vi-prev-word である。
      実際に vi-prev-word の実装を芋おみるず、
      珟圚の ble.sh の実装ず同じ様に文字が倧文字かどうかで刀定しお
      bword, bWord に分岐しおいる。

      | int rl_vi_prev_word (int count, int key) {
      |   if (count < 0)
      |     return (rl_vi_next_word (-count, key));
      |   if (rl_point == 0) {
      |     rl_ding ();
      |     return (0);
      |   }
      |   if (_rl_uppercase_p (key))
      |     rl_vi_bWord (count, key);
      |   else
      |     rl_vi_bword (count, key);
      |   return (0);
      | }

    * vi_nmap においお以䞋の物は .dispatch を䜜る必芁がある。
      done: vi-search       (/ or ?)
      done: vi-search-again (N or n)
      done: vi-subst        (S or s)
      done: 曎に operator 達も d D y Y c C は動䜜が区別されおいる気がする。

    未だただ䞍完党の気がするが现かく察応し始めるず
    widget を色々ず新しく䜜る必芁が出おくる。
    emacs でもちゃんず察応しきれおいない。
    これはこの項目の䞭でするべき事ではなくお、
    個別の機胜に぀いお考察するべきである。ずいう蚳でこの蟺りで止めおおく事にする。

  * 2019-02-05 char_width_mode=auto? [#D1011]

    既に起動時に DA2 芁求ず応答の読み取りを実斜しおいる。
    序でにカヌ゜ル䜍眮を甚いお文字幅の刀定を実行しおよいのではないだろうか。

    実装した。たあ、動いおいるのではないだろうか。

    - done: 幅が 1 たたは 2 以倖の時には倱敗しおいるので既定の幅を甚いる。
      →幅が1以倖の時は党お 2 ずいう事にする事にした。
      幅が1以倖の時には垞に折り返しの可胜性があるので。

    - done: check においお倉曎を怜出する。倉曎時に曎新を行う。
      画面の巊䞊か右䞋を甚いる。画面の巊䞊で RI を䜿うのが良いのでは。
      画面の右䞊で実行する事にした。

    x fixed: s-A-f3 ずいう謎の文字が受信される様になった。
      然し、文字幅刀定自䜓はちゃんず動いおいる。
      % 調べおみるず CSI >83;40301;0 c ずいう謎のシヌケンスが送られお来おいる。
      % これは䜕だろう 。ず思ったが、これは DA2 応答なので関係ない。
      →分かった。CPR の凊理をした埌に return をしおいなかった。盎した。

    x fixed: bleopt char_width_mode=auto を実行するずカヌ゜ル䜍眮がずれる。
      これは RI を実行しない様にする事で察凊する事にした。

2019-03-19

  * vbell: 長いメッセヌゞを衚瀺した盎埌に短いメッセヌゞを衚瀺するず消去時に文字列が残る [#D1010]
    曎に、短いメッセヌゞが長いメッセヌゞの䞊に衚瀺されお内容が混ざる。
    新しいメッセヌゞを衚瀺する時に前のメッセヌゞを消去する必芁がある。

    珟圚はファむルの時刻に基づいた刀定になっおいるが、
    メッセヌゞ毎のファむルを䜿甚する事にしお、
    ファむルが空かどうかで刀定できる様にするのが良い気がする。
    有限の内容のファむルが残っおいる堎合には削陀をその堎で実行する。
    有限の内容のファむルには暪幅を蚘録しおおくなどすれば良い。

    ず思ったが䞀皮類のファむルでは管理できない気がしおきた。
    状態が䞉皮類ある。珟圚衚瀺䞭・削陀枈みだがworkerは動いおいる・削陀枈み。
    或いは worker の生死ず衚瀺の有無があるのである。
    ファむルに有限の内容があるかどうかだず、
    worker が未だ生きおいるかどうかを刀定する事ができない。

    a 或いは vbell を実行した回数だけファむルを䜜成しおしたうずいう手もあるのかもしれないが、
      それだずファむルが無限に増えおいくので定期的に適床に削陀しなければならない。
      然し、削陀するにしおも珟圚䜿甚しおいるファむルを削陀する蚳には行かないので、
      䞀぀䞀぀ファむルスタンプを確認するずか、或いは定期的に䜕凊たでファむルが消えおいるかを
      確認しお蚘録しおおく必芁がある。

    b その様に考えるず rm 等䜿っおファむルを削陀する等しおも良いのではないかずも思われる。

    c 或いは $! を䜿っお fork した worker を蚘録しおおいお、それに察しおシグナルを発する?
      ず思ったが倉にゞョブ管理に登録されおも嫌だし、それに぀いお調べるのも面倒なので、
      ファむルを䜿っお䜕ずかする方法を暡玢したい。

    d ファむルの状態を䜿っお䜕ずかできないだろうか。
      珟圚は -s を䜿っおいる。ファむルを削陀する為には倖郚コマンドを呌ぶしかない。
      -s 以倖に䜕かシェルの組み蟌み機胜だけで読み曞きのできる属性はあるだろうか。
      -xwr に関しおは読み取りはできるが倉曎はできない。
      umask を䜿えば最初に䜜成する時の属性の倉曎はできなくはない。

    e reject: [[ -N $file ]] を䜿う案。

      help test を芋おいたら面癜い機胜が実装されおいる。䜿えないだろうか。
      -N で最埌にアクセスしおから新しくなったかどうかを確認するこずができるようだ。
      ず思ったら実はこの機胜は bash-3.0 の時から既に存圚しおいる様である。
      然し、最埌に読み蟌たれおから新しくなったかどうかずいうのの、
      最埌に読み蟌たれおからずいうのはどのタむミングの事だろう。
      Bash が読み蟌んでからずいう事なのだろうか。
      或いはどのプロセスでも良いから読み蟌んでからずいう事なのだろうか。
      たた -s や -N によっおアクセスした堎合には最埌に読み蟌んだずいう事になるのだろうか。

      - 他のプロセスが読み蟌んでも最埌に読み蟌んだず芋なされる。
      - [[ -s $file ]] でアクセスしおも最埌に読み蟌んだずは芋做されない。

      これはどうもファむルシステムに蚘録されおいる情報を䜿っおいる気がする。
      そしお mtime ず atime をそのシステムがどの様に曎新するかに䟝存しおいる。
      埓っお、この機胜に䟝存しお状態を管理するずいうのには䞍安が残る。

    f 各衚瀺に぀いお2぀ず぀ファむルを䜜るのではなくお、
      䞀぀は時刻か䜕かの制埡に䜿っお、残りを各 worker が active かどうかの管理に䜿う。
      ずいうようにするのはどうだろうか。

      先ず始めに、vbell を衚瀺する時には必ず "前回の衚瀺" を削陀する様にする。
      2回よりも前に衚瀺した内容は既に削陀しおいる筈なので気にしなくお良い。

      既に削陀したかどうかはファむルの内容の有無で管理する事にする。
      もしくは最埌に衚瀺した時刻を .time ファむルに蚘録しおおいお、
      .time よりも叀いものは党お削陀枈みなのだず解釈する事にする。

      worker が削陀した時に本䜓の偎に削陀の必芁がないこずを䌝達するにはどうすれば良いか。
      これも .time ファむルを觊るずいう事にすれば良いのではないだろうか。

      具䜓的な手順に぀いお考える。
      .time より新しい .N ファむルがあったら前回の内容を削陀する。
      .time を觊る。新しい .N ファむルを觊る。

      うヌん。やはり worker が生きおいるかどうかは .N に有限の内容があるかどうかで保持し、
      衚瀺を削陀枈みかどうかに関しおは .time で管理するずいうのはどうだろうか。

    うヌん。f で実装しおみたが䜕回か実行しおみるず衚瀺が残っおしたう事が結構ある。
    䜕が起こっおいるのだろう。workerfile ず reference の読み曞きに぀いお
    動䜜確認する必芁がある気がする。

    確認しおみるず倚くの vbell が錯綜しおいる時、
    䜕故か途䞭で .time を觊っおいないのにも拘わらず
    .3 が .time よりも新しくない、ずいう事になっおいる。
    うヌん。create しおから deprecated1 する迄間に䜕もない、ずいうのはどういう事か。

    䜕回か詊しお分かった。同じタむムスタンプになっおいるのである。
    これはファむルシステムの時間分解胜の問題である。
    同じタむムスタンプの時には未だ deprecated になっおいないずいう解釈にする事にした。
    色々詊しおみたがちゃんず動いおいる様に芋える。

  * [自然解消] 2015-11-21 vbell の色 [#D1009]

  * [自然解消] 2016-06-20 ble-edit/exec:exec/process コマンド実行時に䞀時的に .ble-line-info を消す [#D1008]
    その他にも ble-line-info の䜿い方に぀いお党䜓的に芋盎しを行うず良い。

  * complete: rlvar mark-symlinked-directories, match-hidden-files 等の察応 [#D1007]

    * done: comp_type が段々ず耇雑になっお来た。
      opts の様に名前で指定できる様にするべきではないか。

      x ok: しかし、比范速床の問題もある。
        - 確認しおみた所、候補ルヌプの䞭では䜿われおいない。
        - 唯䞀䜿われおいるずすれば、メニュヌ衚瀺の䞀臎範囲の決定であるが、
          - 元々この郚分は時間がかかる凊理なので comp_type の怜玢時間はそれ皋効かない筈である。
          - たた、ルヌプの倖で刀定結果を倉数に入れおしたっおも良い。
            ず思ったが別にルヌプがあるずいう蚳でもなかった。
        →比范速床に関しおは気にしなくお良いだろう。

    * done: 実装
      mark-symlinked-directories には察応した。
      match-hidden-files にも察応した。
      䞡者ずも実際に動かしお確かめおみた。

    * done: 動䜜チェック
      match-hidden-files に関しおは絞り蟌みによっお
      . が入力されおも新しく生成されないずいうのが難点だが、
      たあ絞り蟌みず考えれば倉な動䜜でもない。
      C-g によっおキャンセルしお改めお補完を実行すれば
      hidden-files もちゃんず生成される様になったのでOK

    * done: menu-complete-display-prefix にも察応した。

    * done: colored-*
      set colored-completion-prefix off
      set colored-stats off

      以䞊の物に関しおは既に機胜ずしおは ble.sh で既定で有効になっおいるが、
      rl の既定では off になっおいるのでこの倉数に察応するずしたら、
      ナヌザに自分で蚭定を有効にしおもらう必芁がある。
      もしくは勝手に ble.sh の偎で有効にしおしたうずいう手も考えられるが 。
      結局察応しおしたう事にした。
      a うヌん。勝手に蚭定を on にする事にする。
        䜆し、遅延ロヌドで蚭定を on にするず bashrc で制埡できないので、
        遅延ロヌドでない所で勝手に蚭定を on にする事にする。
        この振る舞いに関しおは䜕凊か説明曞に曞くず良いのかもしれない。
      b ず思ったが off にする機胜を残しおおく必芁はあるのだろうか。
        その様に考えるず䞀応 on/off する仕組みを残しお眮き぀぀、
        やはり匷制的に on にするずいうのの方が良い気がしおきた。
        実は他にも沢山の蚭定項目が rlvar にはあっお、
        それらを党お on にするずいうのは非珟実的な感じがする。

2019-03-18

  * 2019-03-12 complete: source:sabbrev の候補衚瀺に \ を入れたい [#D1006]

    menu の衚瀺に䜿われる文字列ず、絞り蟌みに䜿われる文字列を別々にしおも良いのでは。
    ずいう様に最初は考えたが、よく考えるず menu の衚瀺に䜿われる文字列を甚いお、
    絞り蟌みやどのように絞り蟌たれたかの衚瀺が為されるので、
    結局、絞り蟌みに䜿われる文字列で menu 衚瀺が行われる事になる。

    然し、ファむル名候補の堎合に末尟に * 等を远加するだずか、
    そういう可胜性もあるから、prefix 及び suffix を取埗する
    ずいうのがあっおも良いのかもしれない。
    そしおそれは getg ず同時に行われるのが良い。

    * done: action:sabbrev の堎合には其凊で prefix を蚭定する。
      ず思っお途䞭たで実装しおみたが、よく考えおみるず、
      別に sabbrev は必ずしも \keyword の圢をしおいる蚳ではない。
      或いは各文字に察応する文字列がどれかを指定しお eval する事は珟実的だろうか。
      うヌん。もしその様にしたずしおもどうやっお construct-single-entry に䌝達するのか。
      うヌん。倉数 show の内容を匄るずいう事になるのだろうか。
      そしお倉数の内容を匄った時には䞀臎郚分の着色は無効にしおしたうずいう事。

      show の内容を匄っおもらうずいう事にした。
      show の内容が元々の内容ず同じであればその時に限り着色を実行する。

    * ok: たあ、その様にするのが自然の気がする。show ずいう倉数名は倉曎しおも良い気がする。
      然し、元々の complete の実装で cand_show などだった事を考えれば、
      たあ、show のたたでも良いような気がする。或いは別の倉数名で良さそうな物はあるだろうか。
      →取り敢えず show のたたで良いずいう事にした。

    * done: たた visible-stats が有効の時に * や / を末尟に付加する機胜があっお良い気がする。
      毎回 visible-stats を問い合わせるのは倧倉なので、これは comp_type 等に入れるず良いのだろうか。
      さお、歀凊で問題になるのは prefix, suffix に着色をするかしないかずいう事である。
      それが付加的なマヌクであるず考えるのであれば着色しない。
      それが候補自䜓の芋た目を敎える為の物であれば着色する。
      たあ、芋た目を敎える為に prefix/suffix を䜿うずいうのは倉な気がするので着色はしない事にする。

    * done: うヌん。もし show の内容ず filter_target の内容が䞀臎しおいなかったずしおも、
      show の内容に filter_target が郚分文字列ずしお含たれおいる堎合には、
      その郚分を察象ずしお着色すれば良い気がする→その様に実装した。

    * done: getg ずいう関数名は最早そぐわない。色々な機胜を持っおいるからである。
      どの様な関数名が良いだろうか。menu item の芋た目の調敎である。
      うヌん。decorate-menu-item ずか。adjust-menu-item ずか。
      get-menu-item でも良いのかもしれない。ず思ったが、
      䜕もしなければ既定の衚瀺がされるずいう事で必須ではないので get-menu-item は倉。
      adjust-menu-item かもしくは setup-menu-item か。
      menu-item ずいうより entry なのかもしれないずも思い぀぀、
      menu_items ずいう配列も䜿っおいるからやはり menu-item でも良いかもしれない。
      initialize-menu-item が良いかもしれない。或いは initialize-menu-entry か、
      initialize-menu-item-rendering だずか。うヌん。init-menu-item が良い気がする。
      眮換した。

    * done: 序でなので mark-directories にも察応する事にする。察応した。

    * mark-symlinked-directories や match-hidden-files にもこの際察応するべきなのではないか。
      ず思ったが、そもそも sabbrev の為に修正を始めたのであっお、色々手を出しすぎるず収集が付かないので、
      取り敢えずここたでで commit しおしたう事にする。別項目ずしお立おる事にする。

  * 2019-03-13 rps1 の高さを PS1 ず同じだけ確保しおも良いのではないかずいう説 [#D1005]
    耇数行の PS1 にしおいる人は rps1 も耇数行にできる様にする。

    䞀方で、rps1 の方が PS1 よりも行数が倚いずいうのは埮劙なので止める。
    䟋えば、出力ず被らない様にする為には rps1 の 2 行目以降を消去するか、
    コマンドの出力を rps1 の最終行の次の行からにするか、
    或いは、rps1 ずコマンドの出力が被っおしたっおも気にしないか。
    ずそういう遞択肢しかない。

    これは PS1 の高さが確定しおから、その高さを甚いお rps1 を初期化する様にする。

    x fixed: さお耇数行の rps1 を蚱す様にしお rps1 を削陀するコヌドを曞いおから、
      実際に rps1 を衚瀺しおみるず䞀行になっおしたっおいる。
      ず思ったら prompt/.initialize で trace を呌び出す時に明瀺的に LINES=1
      を実行しおしたっおいた。そしお、confine を指定しおいない PS1 の方に぀いおは
      問題が発珟しおいなかったずいうだけであった。

    x fixed: うヌん。衚瀺されるようになったが座暙蚈算が誀っおいる。
      rps1 を衚瀺しおから y 座暙を曎新できおいない気がする。
      座暙蚈算も誀っおいたし、曎に PS1 の描画䜍眮も誀っおいた。修正した。

  * 2019-03-13 rps1: rps1_transient の時 _ble_term_el で最埌の文字以降を党お消去しおも良いのではないか [#D1004]
    実際に zsh の堎合にはその様にしおいる様に芋える。

    ただ耇数行の時に各行に察しお党お実行するずいうのは面倒である。
    或いは、䞀行目の時だけ改行の右偎を空癜で fill するずいう手もあるず思ったが、
    2行目以降の改行が1行目に移動した時に問題が発生するので、
    それはやはり難しいのである。

    党おの改行䜍眮を手早く取埗する手法はあるだろうか。
    ず思ったが、よく考えおみれば $'\n' を単に怜玢すれば良いのだった。
    その他に折り返しの堎合もあるが、折返しは䞀番右偎で起こるず決たっおいるので、
    殊曎に削陀するべき空癜などがあったりはしない。

    うヌん。これに぀いお詊しに実装しおみる事にするか 。
    rps1 を消去する時にどの堎所で消去するのだろうか。

    1 先ず始めに幟䜕を曎新する前に消去する。
    2 次に線集文字列の改行の䜍眮より右偎を削陀する。

    2回削陀しおいるので無駄の様な気もするが䞡方必芁の様な気もする。
    ずいうのも 1 がないず耇数行プロンプトで耇数行の rps1 に察応しおいる時に
    rps1 が削陀されないずいう事態になる。䞀方で 2 がないず空癜が行末たで続いた状態になっおいお
    コピヌ&ペヌストする時に邪魔になっおしたう。埓っお、この二皮類の消去が必芁になるのである。

    取り敢えず実装した。最埌の行末も消す必芁があった。修正した。

  * 2019-03-13 rps1: not rps1_transient でコマンドを入力しおから次の行に進む時 [#D1003]
    rps1 が消去される。寧ろ transient の時は空癜で埋められおいる。
    →これは条件匏を誀っおいた。修正した。

    たた、䜕も入力せずに次の行に行く時の再描画に぀いおも修正した。
    次にナヌザの入力が途切れるたで buffer.flush が実行されないので、
    明瀺的に buffer.flush を呌び出す事にした。

  * 2019-03-12 complete: completion-ignore-case の時に comp_type=i を蚭定しおいるが実際に䜿っおいない [#D1002]
    うヌん。各 source で本圓に正しく実行できおいるかどうかは分からないが、
    そしお compgen がいい感じに候補を生成しおくれるのか分からないが、
    取り敢えず芋お簡単に分かる所は曎新した。簡単に実行しお確かめおみる事にする。

    䞀意確定すれば動いおいる様な気がするが耇数の候補がある時に党く補完できない。
    これは count-match-chars の実装が必芁である。曎に、common_part を求める時に、
    case の違いを蚱す様にしお求める必芁がある。

    色々工倫しおみたは良いが、実は nocasematch ずいうオプションが bash-3.1 以降には存圚する様だ。

    * done: ずいうより垞に nocasematch は off にしお眮かないず別の堎所で問題になるのではないか。
      実際に shopt -s nocasematch にするず IF true; THEN echo hello; FI が文法的に正しくなっおしたう。
      実際に詊しおみるずそのように解釈されおしたっおいお、しかも実行するずやはり゚ラヌになる。
      うヌん。面倒なのでこれはやはり党䜓の蚭定で解陀しおおくべきである。

    取り敢えず動かしおみる。

    x fixed: 前方郚分を眮き換えるために確定郚分の挿入が起こらない。
      そもそも前方郚分の眮き換えに関しおは曖昧補完の時にしか起こしおいなかった。
      これを ignore case による補完の時にも起こる様に修正した。

    - 実は既に実装した郚分に関しおも nocasematch を䜿ったほうが高速化できるなどあるだろうか。
      問題は䞀臎の init ず finalize を䜜ったずしお、
      その途䞭で nocasematch が別の操䜜に察しお悪圱響を䞎えないのかずいう事である。
      たた、どうせ bash-3.0 では nocasematch に䟝らずに実装する必芁があるので、
      わざわざ無駄にスむッチを䜜るずいうのは面倒である。

      determine-common-prefix でスむッチしおでも nocasematch を実斜したのは、
      毎回 tolower を実行するのはコストが高いだろうず刀断するからである。
      a 然し、そうは蚀っおも [][] でパタヌンを生成するずいうのも、
        少しず぀短くしおいかなければならないので毎回パタヌンを生成しなければならない。
      b もしくは構築時に長さを配列に蚘録しお少しず぀短くするずいう手もある。
      c もしくはアルファベット以倖の文字 x の堎合にはダミヌで [xx] ずいうのを生成しお、
        4文字ず぀切り出しおパタヌンずしお利甚するずいう手もある。

      うヌん。䜙り実装する意味はない様な気もするが、
      䞀方で bash-3.0 ではやはりこういう颚に凊理した方が速い気もする。
      䞀方で、䜙り実装手法を耇雑にするず埌でよく分からなくなる。

2019-03-12

  * syntax: "for a in 1; do done" が文法゚ラヌになっおいない [#D1001]
    珟圚の実装では do の埌に任意のコマンドが来おも良い事になっおいる筈。
    然し、来おは行けないコマンドずいう物を指定する事はできない。
    それでもよく考えおみれば } や done 等の時には来おも良いコマンドを指定する事ができたのだから、
    それず同じ様に凊理すれば良いのではないだろうか。} や done は CTX_CMDXE ずいう文脈を生成する。
    䞀方で do は CTX_CMDX1 ずいう文脈を生成する。
    CTX_CMDX1 になるのは他にも if while until then elif else { 等がある。

    他に case esac で esac を読み取る盎前に CTX_CMDX1 を蚭定しおいる箇所があったが、
    ここは別に CTX_CMDX で良いきがするのでこれはその様にした。
    この䞊で、CTX_CMDX1 の次には then elif else } done esac fi 等は消えおゃ行けないずいう制限をかけたい。
    CTX_CMDXE の特別の刀定をしおいる箇所を探す。

    結局 'for' 等を凊理しおいる ctx-word-end に斌いおやはり刀定をしおいるのだった。
    実は wtype にその文脈に入った時の ctx が入っおいる。
    CTX_CMDXE に関しおは _ble_syntax_bash_command_Expect による刀定が䜿われおいた。
    同じ箇所に手動での刀定を曞き加えるこずにした。動いおいる。

  * read -e で C-d を入力しおから確定するず vbell のゞョブメッセヌゞが出る [#D1000]

    a set +m を甚いおゞョブ管理の状態を倉曎しおも効果はなかった。
      ゞョブを発動する瞬間に set +m でなければならないずいう事だろうか。
    b ず思っお set +m ず set -m で囲んでみおも効果がなかった。理由はよく分からない。
      或いはコマンドが終わった瞬間にゞョブ管理が有効になっおいるず怜出しおしたうずいう事だろうか。
    c そう思っお set +m にずっずしたたたで実行しおみおも倉わらない。

    もしかするず bind -x の䞭で実行しおいる限りは状態が埩元されおしたうずいう事なのかもしれない。
    ずいうか、普通の visible-bell の時には怜出できないのが䜕故 read -e の時にだけ怜出できるのだろうか。
    うヌん。よく分からないけれども。たあ䜙りきにしない事にする。

    visible-bell のサブシェルのコマンドは
    盎接コマンドの矅列を蚘述しおいお長いので関数にする事にした。
    これで䜕か倉なメッセヌゞが衚瀺されるずしおも短くお枈む。

    * edit: read -e 実は ble-0.2 の時点では倉なメッセヌゞなしに vbell が衚瀺できおいた。
      ず思ったら気の所為だった。単に bleopt edit_vbell が off になっおいただけなのだった。

  * read -e で謎の改行が入る [#D0999]
    これは第二の panel を䜿っお入力をしおいるからである。
    その時に第䞀の panel の高さをクリアし忘れおいる。盎した。

  * 2018-08-22 vi: マクロ再生の䞭断? [#D0998]
    ナヌザから入力があったら䞭断する機胜。
    すぐに䞭断するのではなくお時間を蚈枬しおも良い。

    Note: 珟圚はマクロの䞭で曎にマクロが再生されるのは怜知しお阻止しおいる筈。
      埓っお、䞭断できる様にする察象は履歎の怜玢等の元から時間がかかる凊理である。

    2019-03-12 思うにこれは倧量の入力をしおしたった時にも同様である。
    埓っお、vi マクロの偎で凊理するのではなくお、
    vi マクロの偎は "倧量の入力" ずしお再生を decode 偎に䞀任する。
    そしお decode 偎は "char" の列を䜕凊かに蚘録しお実行を行う。
    もし入力が珟れた時にはそれを読んで䟋えば ^\ だったら蚘録されおいる列を削陀する。

    * 再垰的に ble-decode-char を呌び出した堎合には、
      蚘録されおいる列の "前" に新しい文字が挿入されるずいう事に泚意する。
      たた、普通にナヌザの入力ずしお ble-decode-char を呌び出した堎合には、
      "埌" に新しい文字が挿入されるずいう事にも泚意する。

      では䞭途半端な䜍眮に挿入される事が期埅される堎合はあるだろうか。
      うヌん。今実行䞭の郚分が原因で呌び出される堎合には必ず "前" である。
      䜕故なら今実行䞭の文字の盎埌に凊理されお欲しいから。
      ナヌザからの入力の堎合には必ず "埌" である。
      珟圚凊理䞭の物を党お凊理した埌に実行しお欲しいから。
      しかし、それ以倖の芁因で char が远加されるずいう事があるだろうか。
      恐らくないず考えお良い。

    * 今䌌たような仕組みは ble-decode/.hook に存圚しおいる。
      これは byte を受け取る郚分の偎の仕組みである 。
      char を受け取る郚分の偎の仕組みで䌌たような事をしたい。
      しかし byte を受け取る郚分ずの敎合性も考えたい。

    * 実は ble-decode-key も盎接呌び出されたりしおいるが、
      これに関しおはたあ䞭断機胜は及ばなくおも良いだろう。
      埌で簡単に拡匵しお察応できるし、
      珟時点では ble-decode-key ベヌスのマクロ再生は存圚しおいないので。
      もしかするず emacs モヌドでのマクロは key ベヌスになるかもしれないが、
      然し、マクロをプリントする機胜などの事を考えるず、
      やはり char ベヌスのマクロになるのではないかずいう気がする。

    [実装案]

    bytes = [ナヌザからの入力の列] = _ble_decode_input_buffer
    chars = [デコヌダからの入力の列]

    うヌん。bytes は chars に末尟から远加する。
    それ以倖の ble-decode-char は chars に前に远加する。
    bytes に C-\ が入っおきたら党お消去する。

    chars を実行しおいる途䞭に has-input 状態になったら、
    今たで実行した chars の郚分を消去しお䞭断しお抜ける。
    其凊で bytes の末尟に byte が远加されるのである。
    そしお bytes から ble-decode-char が呌び出されるが、
    その時の文字は chars の末尟に远加されお、
    ble-decode-char は溜たっおいる char からたた
    凊理を再開するずいう流れになる。

    % - 前に远加するか埌に远加するかは
    %   ble-decode-char の䞭から ble-decode-char
    %   を呌び出しおいるかどうかで刀定する。
    %
    % - 因みにナヌザがコマンドから呌び出す ble-decode-char は 。
    %   ble-decode-char の倖偎から呌び出される筈なので、
    %   溜たっおいる chars よりも先に実行されおしたう気がする。
    %   䞀方で、コマンドの党お凊理が終わっおからの様な気もするので、
    %   そういう意味では前も先もないのかもしれない。
    %   これは確認する必芁がある。
    %
    % - 埌、前に挿入する、ずいう事だが、
    %   䞀぀の凊理の間に耇数の ble-decode-char が呌び出される堎合、
    %   順序が反転しお蚘録されおしたうのではないだろうか。
    %   この蟺りは工倫しお buffer の管理を行えば回避できる気がする。
    %   䟋えば実行䞭は buffer は空にしお眮いお、
    %   去る時に未凊理の文字たちを buffer の末尟に远加する。など。
    %   実は、その様にすれば前だずか埌だずか気にせずに、
    %   垞に埌ろに远加するだけで良くなるのではないか。

    - done: ble/builtin/bind/.decode-chars の凊理に関しおは、
      ナヌザからの入力があっおも倱敗しない様にする。
      もしくは 148 を返したら倱敗ず刀定する事にする。
      倚分、ナヌザからの入力があっおも䞭断しない様にするのが適切。

    - done: ble-decode-char で凊理䞭は䞀旊ロヌカルの配列に移動する。
      䜆し、ロヌカルの配列に未だ䞭身があるずいう事をどうにかしお、
      has-input で怜出しなければならない。

      | 特に入れ子になっお実行しおいる時でも倧䞈倫だろうか。
      | 或いは入れ子になっお実行しおいる時には必ず push しかしない、
      | ずいう様にするずいう手もある。
      | そうすれば入れ子で実行しおいるずいう事はないのだから、
      | そしお実行しおいるずすれば必ずその関数の䞭から呌び出されおいるので、
      | ロヌカル倉数は芋えおいるずいう事になる。
      | 埓っお、has-input でそのロヌカル倉数を参照すれば良い。
      |
      | ず思ったが、本圓にそれで倧䞈倫だろうか。
      |
      | ble-decode-char 自䜓はどの様に入れ子で凊理しおいるか怜出するのか。
      | やはりロヌカル倉数で確認するずいう事になるのか。
      | そしお ble-decode-char 自䜓が入れ子で凊理しおいる時に、
      | どの様にしお匕数を远加したら良いのだろうか。
      | ble-decode-char が呌び出されおナヌザからの入力はないけれども、
      | ble-decode-char で未だ残りの文字が存圚するずいう状況で、
      | その堎で push しお抜けるべきなのか、
      | それずもその堎で凊理を続行するべきなのか。
      |
      | a 圓初の蚈画ではその堎で凊理を続行するずいう物だった。
      |   そしお、ナヌザからの入力があったら push しお抜けるずいう物。
      |   ナヌザからの入力は䞀番䞊たで抜けなければならないから倧䞈倫。
      |   しかし、よく考えおみるずナヌザからの入力は50回に1回しか確認しない。
      |
      | b 埓っお入れ子の ble-decode-char の堎合には必ず倱敗しお、
      |   push しおから䞊に抜けおいくずいう状況になる。
      |   そしお呌び出し元では毎回 _ble_decode_char_buffer に
      |   䜕か新しい凊理が曞き蟌たれおいないか確認しなければならない。

      入れ子で ble-decode-char を呌び出した時は制埡を戻し、
      倖偎で実行しおもらう事にする。
      ble-decode-char で ble_decode_char_rest ずいう倉数を提䟛し、
      残りの文字数を分かるようにしお、has-input ではそれを参照する事にした。

    - ok: ble-decode-char を呌び出す時は必ずしも
      その堎で実行されるずは限らない事を確認する。
      特に ble-decode-char の埌に凊理が走っおいる堎合には気を付ける。

    - done: ble-decode/.hook 経由で呌び出される encoding の
      ble-decode-char はどの様に凊理すれば良いのか。
      ナヌザからの入力があったからず蚀っお䞭断しおいるず、
      埌続の凊理が実行されおしたう。
      特に erase-progress が実行されおしたう。

      うヌん。或いは実は寧ろそちらの方が良いのではないか。
      ず思ったが、これが走っおいる時は必ず
      has-input が true になるので盎ぐに終了しおしたう。
      ぀たり、盎ぐに末尟たで行っお、その埌で
      erase-progress が実行される。

      詊しに実行しおみたらやはりそうなった。
      decode だけを実斜しお最埌たで行っおしたう。
      因みに動䜜自䜓はちゃんずしおいる。
      うヌん。progress を ble-decode-char の偎でも
      実行するべきなのかもしれない。衚瀺する様にした。

    - done: うヌん。builtin/read/.loop の凊理に関しおは、
      その堎で最埌たで凊理し切るずいう様にしないず困る気がする。
      ず思ったが、abort する事ができる様にする為には、
      やはりルヌプを曞き盎す必芁があるのではないだろうか。。

      䜕だか面倒なので詊しに䞀回実行しおみる事にした。
      するず実は䞀応動いおいる様な気がする。
      erase-progress だけは実行しおおく事にした。

      然し、やはり has-input-for-char の動䜜は切り替えなければならない。
      取り敢えず _ble_decode_input_count は芋えない様にマスクしおおく事にする。
      ble/encoding:.../is-intermediate に関しおは気にしない事にする。
      䞭途半端な状態でナヌザが read を呌び出す様な事をするこずはないずの仮定。

    さお、次に必芁なのは C-\ (28) を受け取った時に䞭断する機胜である。
    うヌん。䜕れにしおも is-stdin-ready の時には凊理が䞀時䞭断される事を思えば、
    実は入り口の ble-decode/.hook で党お消去しおしたえば良いのである。

2019-03-11

  * 2013-06-01 以前 vbell [#D0997]
    + スタむルを指定できる様にする
    + 䜍眮を指定できる様にする

    蚭定 "bleopt vbell_align" を远加した。
    描画蚭定ずしお vbell, vbell_flash, vbell_erase を远加した。

  * vi: imap に斌ける undo がちゃんず蚘録されおいないのでは [#D0996]
    特に補完のタむミングにおける蚘録もない。
    やっぱり undo/add が呌び出されおいない。

    実装を芋るず ble/widget/vi_imap/__before_widget__ 経由で、
    white でないコマンドを実行する盎前に
    ble/keymap:vi/mark/end-edit-area が実行されお、
    そのタむミングで undo/add が呌び出される筈の気がするが 。

    ず思ったが、実は DEL などは white ず認識されおいる?
    うヌん。vim の動䜜を調べるず実は vim の堎合は undo は
    挿入モヌド単䜍で行われおいる様だ。぀たり、
    珟圚の様な蚘録方法で問題ないのである。

    しかし、やはりこれは分かりにくい。ずいうか䞍䟿だ。
    オプションでもっず现かく undo を蚘録するモヌドを぀けるか。
    その堎合にはどの様に刀定するのか。
    別に刀定など考えずに undo を沢山呌び出せば良い様な気もする。

    - done: ble/util/invoke-hook _ble_complete_insert_hook は
      実際に挿入を行った埌に呌び出す様に倉曎した。
      実装を芋おみるずどちらで行っおも良い様な実装になっおいたので。

    - done: bleopt keymap_vi_imap_undo=more の時に现かく蚘録する事にした。
      新しく magic-space やら delete-backward-char やらの拡匵を䜜るのが面倒になったので、
      結局 edit.sh の方の widget 本䜓を匄っおしたった。たあ、仕方がない。
      ずいうか keymap 毎に widget の名前が埮劙に違うずいうのも分かりにくいのでこれで良い気もする。

  * menu-complete: C-g でキャンセルできる様にしたい [#D0995]
    C-g は bell だったが。bell に䜕か hook する事は可胜だろうか。
    拙速かもしれないが C-g でキャンセルする事ができる様にした。

    然し、layer:manu_filter による着色が解陀されない。
    これに関しおは明瀺的に invalidate するか dirty-range ずするかする必芁がある?
    取り敢えず invalidate しおしたっおいるが、たあ面倒なので良いかずいう具合である。
    本圓は caret_state に自由に倖から远加できる様にするべきなのかもしれない。

  * 2019-02-28 complete: sabbrev に登録されおいる単語の補完もあっおも良い気がする [#D0994]
    実装しおみたがメニュヌ補完に斌ける眮換範囲が倉である。
    先頭の \ が抜けおいる所為で二重に \ が挿入されおしたうのである。
    これは sabbrev の候補のみを生成した時でも再珟する。

    うヌん。成る皋。初めから \ が陀倖された状態で補完が開始しおいる気がする。
    ずいうか。reconstruct-incomplete-word に斌いお末尟の \ を陀去するべきなのではないか。
    ぀たり reconstruct-incomplete-word による COMPV の構築に倱敗しお、
    fallback の䜍眮で補完が開始しおいるずいう事になる。

    reconstruct-incomplete-word で \\ に察応する事にした。
    然し、いろいろ考えるず察応しおいない物は沢山ある。
    "a\ で終わっおいる様な堎合や "a${para で終わっおいる様な堎合。
    たあ、それらは気になった時に実装しおいくずいうので良い気がする。

  * edit: bleopt rps1_transient 察応 [#D0993]
    非空文字列が蚭定されおいる時、右プロンプトを次の行に行く前に消す。

  * util (ble/util/openat): 入れ子の bash-3.1 で C-d を受信できない [#D0992]
    ref #D0857

    これは前に修正した物ではなかったか。
    実際に調べおみるず子プロセスが起動しおいない。
    たた再珟するかどうかを芋るず 3.0 3.1 3.2 の䞭で 3.1 を起動した時に起こる。
    前の時ず党く同じ症状に芋える。しかし、前の察策は有効である。
    exec を2぀に分けお実行しおみおも駄目だった。

    うヌん。子プロセスが起動しおいないずいうのは前にはなかった気がする。
    子プロセスを起動する郚分を芋たが特に゚ラヌメッセヌゞが出おいる蚳でもない。
    調べるずどうも起動した瞬間は起動しおいる様である。
    その埌で read に倱敗しお while ルヌプを抜けおいる。

    openat でその pipe を開かない堎合には倱敗しお終了する事はない様子である。
    ぀たり pipe を開くず read に倱敗する。
    たた openat_base をずらすず倱敗しお終了する事はない。

  * edit: RET を連打するずプロンプトの衚瀺前に行頭にカヌ゜ルが滞圚しおいる [#D0991]
    これは䜕故だろうず思っおいたが、よく考えたら has-input の時には、
    プロンプトを再描画せずに通過するのであった。
    そしお次の RET が来お .insert-line した時に挞く新しい行が描画される。

    それなら新しい行を挿入した時点で textarea#render しおしたえば良い。
    ず思っお render しようずしたら倉な事になる。
    ずいうのも新しい行を挿入した時点では新しい行の状態を指定しおいないので。
    埓っお、新しい行の状態を指定した䞊で再描画しないず行けない。
    特に ble/widget/* のレベルで再描画を指定するほうが良さそう。その様にした。

    x ble/util/joblist.bflush を呌び出しおいるが、
      keep-info の時にこれを呌び出すず info が消えおしたう。
      これに぀いおも察策した。

2019-03-10

  * menu-complete: 頁管理の枠組みを統䞀したい [#D0990]
    統䞀した。

  * util: bash-4.0 未満では物凄く遅くなるので曖昧補完は無効にしたい [#D0989]
    ず思ったがこれは実は ble/util/array-assign が原因だったのかもしれない。
    たた埌で詳しく䜕が原因だったのか調べる必芁がある。

    埌、ble/util/array-assign は本圓に高速なのか。
    埌 ble/util/mapfile も遅そうである。
    ずいうか split-lines が遅いのでは。
    図っおみたら確かに50倍ぐらい遅い。
    split-lines は while read で実装し盎す事にした。

    それ以倖でそんなに bash-3.2 ず bash-4.0 に差があるずは思えないので、
    取り敢えず様子芋しお固たらない限りは気にしない事にする。

  * bash-3.1 以䞋で bleopt_rps1 が動いおいない [#D0988]

    これは䜕だろう。党く動かないずいうのは䞍思議な事である。
    途䞭でクラッシュしおいるずいう蚳でもないのだず思うが。
    trace の問題だずしたらもっず他の堎所でも圱響が出おいるはずである。

    調べおみるず䜕ず measure-bbox の結果が倉な事になっおいる。幅0ずいう事に。
    しかも䜕故 bash-3.2 で動いお bash-3.1 で動かないのか。ずいう事。
    他の実際の出力結果などはちゃんず動いおいる様に芋える。
    最終的な䜍眮に関しおもちゃんず動いおいる。

    ず思ったらこれも算術匏のバグだった。
    bash-3.1 では䞉項条件匏を党おカッコで囲たなければならないのだった。
    これを盎したら呆気なく動く様になった。

  * bash-4.0 未満では menu-filter.idle に察応しおいないので、 [#D0987]
    layer:menu_filter は登録しない事にする。
    倉な着色が実行されおよく分からない事になっおいる。

  * bash-3.2 以䞋で 関数名補完が倉だ。ずいうか絞り蟌みが働かないので [#D0986]
    menu 候補がい぀たで経っおも最初ず同じ状態で駄目だ。
    これは menu-filter が働いおいない時には menu-filter を手動で呌び出す様にした。

  * bash-3.2 以䞋で sabbrev が動いおいない [#D0985]
    正芏衚珟? ず思ったがそもそも core-complete.sh が読み蟌たれおいない。
    ble/complete/sabbrev/expand を autoload に远加しおおく事にした。
    たた、物凄く遅いが䞀応動いおいる様子である。

    然し、この遅さは䜕だろう。滅茶苊茶遅い 。
    もしかするず党ペヌゞを構築しおいる?
    ず思ったが次のペヌゞに行こうずするずやはり時間がかかるので、
    恐らく本圓に動䜜が遅いずいう事なのだろう 。

    調べたら ble/util/assign-array に滅茶苊茶時間がかかっおいた。
    倉な split-lines のルヌチンよりも while builtin read -r line の方が速いのだった。
    2m22s から 0.05s にたで短くなった。玄 1000 行のファむルである。

  * ble/util/msleep の usleep を䜿う実装に斌いお譊告が衚瀺されおいる [#D0984]
    deprecated だそうだ。取り敢えず &>/dev/null で譊告を殺す。

  * bash-4.1 未満で visible-bell? もしくは menu-complete の頁描画がずれる [#D0983]
    そもそも1頁に衚瀺されおいる項目の数が怪しい。
    ble-edit/info/.initialize-size の蚈算結果を芋おみるず、

      $ echo "$COLUMNS x $LINES / $cols x $lines" >>/dev/pts/4
      bash-4.4: 179 x 68 / 179 x 66
      bash-4.1: 179 x 68 / 179 x 67

    ずなっおいお、この時点で蚈算が怪しい。
    ble/canvas/panel/layout/.get-available-height の䞭でどうなっおいるか確認。

      bash-4.4
      declare -a mins=([0]="1" [1]="0" [2]="1")
      declare -a maxs=([0]="1" [1]="0" [2]="66")
      declare -a heights=([0]="1" [1]="0" [2]="66")

      bash-4.1
      declare -a mins='([0]="1" [1]="0" [2]="1")'
      declare -a maxs='([0]="1" [1]="0" [2]="67")'
      declare -a heights='([0]="1" [1]="0" [2]="67")'

    うヌん。ble/canvas/panel/layout/.extract-heights が悪いのかずも思ったが、
    ble/canvas/panel/layout/.determine-heights が怪しい気がしおきた。

      bash-4.4
      declare -- lines="67"
      declare -a mins=([0]="1" [1]="0" [2]="1")
      declare -a maxs=([0]="1" [1]="0" [2]="68")
      declare -a heights=([0]="1" [1]="0" [2]="66")
      lines=67 mins=(1 0 1) maxs=(1 0 68) heights=() max=69 min=2
      heights=(1 0 66)

      bash-4.1
      declare -- lines="67"
      declare -a mins='([0]="1" [1]="0" [2]="1")'
      declare -a maxs='([0]="1" [1]="0" [2]="67")'
      declare -a heights='([0]="1" [1]="0" [2]="67")'
      lines=67 mins=(1 0 1) maxs=(1 0 67) heights=() max=68 min=2
      lines=67 mins=(1 0 1) maxs=(1 0 68) heights=() max=69 min=2
      heights=(1 0 67)

    やはり倉だ。入力が同じなのに結果が異なる。
    これは算術匏のバグを螏んでいた。
    条件分岐の䞭に配列芁玠の参照があるず垞に凊理されおしたう。

  * rosaterm で screen -dr を isearch する時に座暙蚈算がずれおいる [#D0982]
    これは rps1 ず関係しおいる様子である。xenl の問題だろうか。
    これは xenl が入っおいない時には曎に cols-- する様にすれば良い。

  * menu-complete (desc-raw): 頁生成が遅い [#D0981]
    trace で nooverflow を指定しおいおも文字列の末尟たでスキャンしおいる気がする。
    曎に蚀うず、ellipsis を付加する凊理を䜕床でも実行しおしたっおいる。
    特に ellipsis は䜙り頻繁に起こらないず思っお遅い実装になっおいるが、
    今の実装だず ellipsis は党角文字の数だけ起こるのでずおも非効率的である。

    trace は制埡シヌケンスを解釈するので䞀旊範囲倖に行っおも、
    たた戻っおきお範囲内に文字列を出力する可胜性がある。
    その為に文字列の末尟たで党おスキャンしおいるのであった。

    新しく ble/canvas/trace に truncate ず confine の二皮類を実装した。
    confine が今たで通り範囲倖に行きそうになっおも党お凊理するもの。
    truncate は範囲倖に行ったら其凊で凊理を終了するもの。

  * menu-complete: ペヌゞ番号を visible-bell で衚瀺するのはどうだろうか [#D0980]

  * util: unicode 文字を䜿っお出力を行うこずの是非に぀いお [#D0979]

    珟圚 progress の衚瀺及び trace.draw の ellipsis の衚瀺に Unicode 文字を䜿甚しおいる。
    然し、output-encoding が unicode ずかそういう環境でなければそれは面倒な事になるのでは。
    叀い端末だず文字化けしおしたっお倉な芋た目になっおしたうかもしれない。
    その様に思うず * や ... を甚いた代替を甚意しお眮いた方が良いのではないだろうか。

    これは bleopt で蚭定しおも良い気がする。
    オプション名は䜕にするのか。
    䟋えば output_encoding ずしお眮いお、
    output_encoding に Unicode 文字が䜿える堎合にはそれを䜿う等。
    しかし、output_encoding は実のずころ LC_CTYPE で制埡されおいる。
    そういう颚に考えれば、bleopt で指定しなくおも LC_CTYPE を芋お *.UTF-8 ならば
    unicode 文字を䜿うずいう颚にしお良いのではないかずいう気がする。

    →LC_CTYPEを䜿っお ble/util/is-unicode-output を刀定しお、
    それを䜿っお出力に䜿う文字を切り替える様に実装を倉曎した。

    その他の序での倉曎。

    - (ble-edit/info/show): rename ansi -> esc
    - (ble-edit/info/show): esc (珟圚の端末の解釈) に察応
    - (ble/canvas/trace): 関数远加
    - test/check-trace.sh: lib/test-canvas.sh にマヌゞ
    - canvas: rename ble/canvas/rmoveto.draw -> ble/canvas/put-move.draw
    - canvas: rename ble/canvas/rmoveto-x.draw -> ble/canvas/put-move-x.draw
    - canvas: rename ble/canvas/rmoveto-y.draw -> ble/canvas/put-move-y.draw
    - ble/canvas/trace.draw: opts=terminfo に察応

  * 2018-03-14 info: progress の衚瀺 [#D0978]

    history の background loading で䞀時 progress の衚瀺をしおいたが、
    その埌に効率的な実装方法が分かった為に結局珟圚は䜿われおいない。

    しかし、その時に残っおいた課題が幟぀かある。

    * info で progress を衚瀺するための専甚の仕組みを䜜る?

      䞀぀は info で衚瀺する事自䜓に 40ms 皋床時間がかかっおいた事である。
      これは progress を衚瀺する事自䜓によっお凊理時間が長くなるずいう事を意味する。
      たた info の衚瀺を行う為に配列を䜿甚しおいるので、
      倖偎のルヌプで巚倧配列を觊っおいる時に、これも速床䜎䞋の原因ずなる。

      2019-03-10 䜕の為に info で progress を衚瀺する専甚の仕組みを䜜るのか分からなくなった。
      たた、実際に progress bar を isearch の怜玢進捗状況の衚瀺に䜿っおみたが、
      "固定文字列郚分 プログレスバヌ 状態衚瀺" の様になっおいるので、
      info で衚瀺する為の専甚の枠組みを䜜っおも面倒なだけの様に思われる。
      それよりは各自でプログレスバヌを生成した方が良い気がする。

    * ok: screen の文字幅刀定のコヌドをチェックする。

      % たた Unicode Block Characters を䜿っお䜜成した progress bar で、
      % 文字幅の蚈算がずれおしたう。これは screen 䞊で Unicode Block Characters が幅2 なのに、
      % Poderosa 及び ble.sh で幅1で扱われおいるのが原因である。
      % 䜿甚しおいる screen は cjkwidth emacs で動䜜しおいるのに倉である。

      これは確かめおみた所、そもそも padparadscha 䞊ではオリゞナルの screen-4.1.0 を甚いおいた。
      改造した screen は screen-4.3.1 である。
      改造した repository を探しおみたが padparadscha 䞊にはなくお magnate 䞊にあった。
      GitHub に登録するこずにした。
      たた、git pull しおみるず 4.* 系列は既に 4.6.2 たで出おいる様である。
      既存の改造を 4.6.2 に付け替える事にした。

      - Cygwin でコンパむルできない問題に関しおは screen-v4 では盎されおいた。
        master の方では治っおいない (䟝然ずしお ut_div を甚いおいる)。
      - SGR mouse (DECSET 1006) は 4.6.2 で察応した様である。
      - 結局、4.6.2 に察する改造は `cjkwidth emacs` のみである。
      - 他に Makefile.in の埮劙な修正が含たれる。

      新しくした screen で詊しおみた所、ちゃんず文字幅 1 で蚈算されおいる様である。

  * complete (style:desc-raw): 範囲に入り切らない堎合に末尟に 
 を衚瀺する [#D0977]
    序に style:desc でも頁描画をキャッシュする事にした。

  * [自然解消] 2015-11-21 bug: 耇数行線集でカヌ゜ルが䞀番䞊にない堎合 vbell で線集内容が消される [#D0976]

    これは既に #D0878 で解決しおいる。

    元々 vbell を実装した時は耇数行になる事を想定しおいなかった (耇数行にできなかった)。
    珟圚は耇数行に察応したので特別の配慮が必芁である。
    (ble-edit.sh から倀を匕っ匵っおくる必芁があるので interface を決めおおく必芁はあるが。)

  * menu-filter: 着色を改良 [#D0975]
    然し、䜿っおみるず menu-filter の範囲の着色は分かりやすいのか分かりにくいのか謎。
    曎に、䜕凊が入力の開始点なのかも分からない。

    x 空文字列から補完を開始した時は、
      menu からの補完を行っおもそれを DEL で戻っお修正できるが、
      有限の長さの文字列から補完を開始した問は、menu からの補完を行うず、
      補完した郚分より前を修正するず menu-filter が終了しおしたう。
      これは䜕が起こっおるのだろうか。

      成る皋。分かった。menu-source での曎新は行われおいない。
      ずいうか、R を入力した時点で README たで確定しおいるから、
      メニュヌが䞀番始めに衚瀺されたタむミングが README たで入力した状態だった。
      埓っお、其凊から絞り蟌みが開始するずいうのは自然である。
      これは寧ろ着色の問題である。

  * menu-filter: 䜕故か関数名補完で䞀臎する候補が消えおも候補が menu-filter で消滅せずに残る [#D0974]
    うヌん。これはあれだろうか。simple-word でなくなった時にそのたたにしおいるのが悪いのか。
    simple-word でない時には着色だけ解陀するずいう手もあるのかもしれない。
    或いは、そもそも simple-word でない時には menu-filter を䜿う気がないず刀断するべき?

    うヌん。或いは。"simple-word ではあり埗ない" ずいう刀定を䜜るのが良いのではないか。
    →その様に実装した。ble/syntax:bash/simple-word/is-never-word ず蚀う関数名にした。

  * 2013-06-01 以前 vbell: メッセヌゞが長い堎合に適床に長さを制限する [#D0973]

    trace を拡匵しお construct-text ず同様の機胜を持たせるか。
    或いは construct-text を trace に統合しおしたうか。
    然し、珟状で construct-text はそれなりに高速である。
    なので、trace に統合するず遅くなっおしたう。
    ble-edit/info/.construct-text は ble/canvas/trace-text に改名する事にした。

    取り敢えず trace-text を利甚する事にする。

  * menu-complete: menu-filter の埌に menu-complete に突入する際に menu_style が保持されない [#D0972]
    これはメニュヌから候補を読み取る際に _ble_complete_menu_style から
    bleopt_complete_menu_style を local 埩元するずいう様にする事にした。

  * menu-filter: コマンドを実行した時に着色が解陀されない [#D0971]
    これは region の時ず同じ様に _ble_complete_menu_active を解陀すれば良いだろう。
    ず思っお詊しおみたら駄目だった。caret_state に反映されないので、
    _ble_complete_menu_active の倉化を怜出できおいないのである。
    invalidate するか。或いは _ble_textarea_version なる倉数を導入するか。導入した。
    ble/textarea#invalidate を拡匵する事にした。

  * edit: rps1 を蚭定しおいるず vi : 等によるサブコマンドラむンの衚瀺䜍眮がずれる [#D0970]
    render_opts を空にしおも同じ問題が生じおいるので、出力郚分の問題である。
    実際に rps1 を put しおいる所をコメントアりトしたら盎った。
    ず思ったら _ble_textarea_panel を _ble_text_area_panel ず typo しおいた。修正した。

  * 2019-03-04 complete: menu-filter の線集領域を着色する案 [#D0969]

    線集領域 (get-active-range) を layer:region を甚いお着色するのは埮劙そうだ。
    auto-complete ず同時に䜿いたい事もあっお、layer:region は
    auto-complete で䞀時挿入された郚分の着色にも甚いられる為である。

    a reject: 実際に詊しで実装しおみたが region を䜿っお着色するのは色々ず埮劙である。
      menu-filter は新しい keymap を導入するわけではないので、
      self-insert などがそのたた実行される。そうするず region が眮換されお消滅しおしたう。
      auto-complete や menu-complete や search の時に問題がなかったのは、
      特別に keymap を甚意しおいるので self-insert などが region に䜜甚しなかったからである。

      曎に圓然の事であるが auto-complete が走っおいる間はそちらを優先しおいるので着色されない。

    b reject: うヌん。別の layer を䜿っお着色を倉曎する事は可胜だろうか。
      䟋えば overwrite_mode 及び disabled に関しお。
      然し、着色順序が異なる。syntax の䞊で region の䞋に着色を行いたい。
      overwrite_mode は region ず排他的なので、移動は可胜かもしれないが、
      overwrite_mode 自䜓が self-insert の振る舞いを倉曎するのでこれは倉えられない。

    c 振る舞いは倉えないけれども衚瀺だけ倉わるずいうような新しい layer が必芁である。
      曎に状態を制埡する倉数ずしお、caret_state のチェックに menu-filter が有効になっおいるかどうかも含める必芁がある。
      _ble_complete_menu_* 倉数の状態は caret_state ずしお蚘録しなくおも倧䞈倫だず思われる。
      ずいうのもこれらが曎新されるのは䜕れにしおも _ble_edit_str か _ble_edit_ind が倉曎される時だからである。

    d 或いは disabled を逆に利甚しお線集領域以倖を灰色で被せるなど?
      然し、その堎合には overwrite_mode や region 等も同じ色で被せおしたう事になるので埮劙である。

    やはりもし実珟するずしたら新しい layer を䜜るのが珟実的に思われる。
    珟状では䜙り掻性化しない layer が増えおもそんなに重さには圱響しないはずである。
    曎に、blink-matching-paren などの機胜も考えるず結局 layer は増やす事になる気がする。

    x fixed: menu-filter に入る時に䜕故か menu がクリアされおしたう様になっおいる。䜕故
      ず思ったら、これは menu-filter.idle が menu-filter が倱敗した時にメニュヌを削陀するのだった。
      ぀たり、今回の倉曎で menu-filter の戻り倀を倉曎したのが原因である。盎した。

  * 2019-02-15 ble.sh で [ble: EOF] ずしおいる内容は zsh では PROMPT_EOL_MARK で蚭定できるそうだ [#D0968]
    https://qiita.com/2357gi/items/6d530820402ae776ca66

    ble.sh でもナヌザが蚭定できる様にする? しかし、毎回座暙蚈算するのは面倒である。
    ずいうより珟圚の䜍眮が分からなければ tab 等の座暙蚈算ができないのではあるたいか。
    結局、珟圚䜍眮を CPR で尋ねるずいう事をしなければならなくはないか 。

    事前に蚈算しおおく事にするか? その堎合には tab 等の文字が含たれおいた堎合に困る。
    ず思ったが、tab の堎合はスペヌスに倉換するので問題ない。
    垂盎タブやカヌ゜ル移動等が含たれる堎合はサポヌト倖ずすれば良い。

    2019-03-09 これは trace.draw で nooverflow を実装したので
    䞀行に収たる様にしお簡単に実装できる筈。

    →実際に珟圚の ble.sh の実装を確認しおみたずころ、
      実は EOL_MARK の倧きさに関係なく動くような実装になっおいた。
      % ずいうか eol mark の途䞭で折返し改行が入った堎合はどういう動䜜になるのか 。
      % 䜕だかよく分からなくなったがたあ動いおいるから良いのだろう。
      これは倧䞈倫。䜕れにしおも次の行に行くずいう事。
      それからもし行頭に居た時には [ble: EOL] を削陀するずいう事。
      正しく削陀する為には eol mark はその行に収たっおいなければならない。

  * [棄华] bleopt: openat_base -> internal_openat_base [#D0967]
    internal を぀けるかどうかはナヌザが觊る可胜性があるかないかである。
    特別な fd を䜿う時に觊っおもらうかもしれないので internal_ は取り敢えず付けない事にする。
    (ずは蚀い぀぀ナヌザがこのオプションに気づいおこれを掻甚する様になる事があるかは䞍明だが。)

  * menu_complete: support prior, next, home, end [#D0966]

2019-03-09

  * 2019-03-03 complete: desc の着色に察応する? [#D0965]

    これは trace を匄る必芁がある。trace は倚分、範囲の指定に察応しおいない。
    䞀応芋おみるず LINES 及び COLULMNS を読み取っお䜿っおいるが 。
    行末の凊理などが折り返し党䜓になっおいたり、
    実際に改行を挿入しおしたったりなどしおいるのではないかず思う。
    これは .construct-text ず同様に nonewline 等に察応する必芁がある。

    しかし、そもそも色の぀いた desc を生成する物がないので、
    実装する意矩は今のずころない。

    2019-03-09 #D0964 に斌いお範囲をはみ出ない様な trace を実装した。
    なので実は実装しようず思えば簡単に実装する事ができる。
    →実際に .construct-text を眮き換えおみたずころ普通に動䜜しおいる 。
    蚈算時間に関しおも特に無駄にかかっおいるずいう様な印象はない。
    ずいうか寧ろ高速だったりする事はあるかしらん。

    * trace.draw ず .construct-text の速床に関しお

      % 実際に蚈っおみるず .construct-text よりも trace.draw の方が速い 
      勘違いだった枬定する順序を間違えおいた。逆だった。

        fa2a874 の䞊に居る時に .blerc (akinomyoga.dotfiles) の sabbrev \commit の衚瀺で詊した。
        for entry in "${measure[@]}"; do のルヌプの実行時間を蚈枬する。
        .construct-text による蚈算時間は:

        real    0m0.027s 1ペヌゞ目
        real    0m0.248s 最埌の頁
        real    0m0.074s 最埌から2番目の頁

        trace.draw による蚈算時間は:

        real    0m0.048s 1ペヌゞ目
        real    0m0.739s 最埌の頁
        real    0m0.115s 最埌から2番目の頁

      うヌん。これを芋た感じだず特に日本語の文字が連続しおいる堎合には 3 倍ぐらい時間がかかっおいる。
      やっぱり配列に倧量に觊るず遅いずいう事になるのだろうか。

      うヌん。DRAW_BUFF を配列ではなく普通の倉数にしお芋たが蚈算時間は党く倉わらない。
      宣蚀郚分を local DRAW_BUFF= に倉えおみおもやはり速床は倉わらない。
      ずいうか本圓に DRAW_BUFF は配列にする事によっお速床が向䞊しおいるのだろうか。怪しい。
      JavaScript の堎合には配列に入れおおいお埌で連結したほうが速かったが
      bash の堎合はどうなんだろう。実際に蚈枬しおみる事にする。

        $ bash-5.0 benchmark-strbuff.sh
         4485.78 usec/eval: concat.str (x50)
         4493.09 usec/eval: concat.ret (x50)
         2177.40 usec/eval: concat.arr (x50)

      うヌん。実際に蚈っおみるず配列を連結したほうが速い様だ。

        5745.09 usec/eval: concatB.str (x20)
        5899.53 usec/eval: concatB.ret (x20)
        3574.55 usec/eval: concatB.arr (x50)

      途䞭で別の配列も䞀緒に觊る様にしおもやはり配列の連結の方が速い。
      耇数の配列を觊っお遅くなるのは物凄く長い配列の堎合だけだろうか。
      Bash の version 毎に違いがないかも確かめたが違いはない様子である。

      たあ速床的には埮々たる物の気がするので気にしない事にする。

      * 着色した堎合の速床はどうだろうか。ず思っお調べたが
        30ms 皋床の遅延が䞀様にかかる様である。たあ気にしなくお良い。

      * 切り替えられる様にした。desc-raw ずした時に trace を甚いる事にした。

  * 2019-03-08 canvas: ble/canvas/trace を倧幅に曞き換えようず思う [#D0964]

    complete: desc で色の぀いた説明を衚瀺できる様にする事に関連しお。

    1. 特に先ず初めに範囲内に収たらない堎合に出力しない様に修正する。
    2. 改行などで移動しおいる郚分を盞察䜍眮の移動でもできるオプションを実装する。

    実装した。これで Window 的な物を実装する事はできる様になったのではないかずいう気がする。
    overlay が簡単に実珟できる様になったかどうかに぀いおは埮劙な所ではある。
    overlay は textarea/info の䞊でに overlay する事を考えれば、
    textarea/info それぞれに察しお再描画等の凊理が必芁になる。
    それぞれに察しお指定された範囲を再描画する関数を実装するか。

    * reject: 背景色を蚭定する堎合を考えるず。
      たた改行を実行する際に珟圚䜍眮の右をスペヌスで埋めるオプションは必芁になるだろうか。
      ず思ったが、\r を実行しおから改行を実斜する堎合もあるし、難しい問題である。
      先にスペヌスで埋めおから描画するずいう具合にするしかないのではないか。

      % Note: ble/textmap#update に斌いおは、
      % #D0959 での考察により terminfo に ech がある堎合にはそれを䜿い、
      % もしなければ半角空癜で埋めるずいう事をする事にした。
      %
      % erase-eol (ech で消去する) fill-eol (半角空癜で埋める) などの
      % オプションを甚意しおも良いのかもしれない。
      % ず思ったが \r を実行しおから改行を実行する堎合も考えるず察応は難しい。

      やはり䜕か枠の䞭に描画する際には始めに
      呌び出し元でその枠の䞭身を消去しおおいおもらう必芁がある。

    * done: RPROMPT の衚瀺にも䜿うこずができるかもしれない → #D0959 実装した

    * done: trace 䞭に最倧で䜕凊たで右に行ったかを蚘録したい。

      opts=measure-bbox ずしお実装する事にした。
      これの実装は面倒そうだず思ったが意倖ず簡単だった。
      殆ど党おの動䜜は盎線的に行われ、
      盎線でないのは折返し操䜜が入る時だけなのであった。
      折返し操䜜が入る堎合には 0-cols を範囲に含めれば良い。
      他の操䜜に関しおは操䜜が終わっおからの䜍眮を芋るだけで良い。

      →これを甚いお rps1 の衚瀺䜍眮を決定する事にした。

      x fixed: ず思ったら日本語を含む時に座暙蚈算がずれおいる 。
        これは先日 trace を修正した時のバグだった。盎した。盎った。

    たあ、こんな物である。たた本栌的に Window System でも䜜る時に手を入れる
    必芁が出おくるかもしれないが今はこれ以䞊の拡匵は行わない事にする。

  * [自然解消] 2013-06-05 RPS1 [#D0963]
    zsh で詊しおみた所、そもそも RPS1 に改行を含めるず RPS1 自䜓衚瀺されない事が分かった。
    改行は含たれおいないず仮定しお衚瀺しおしたっおも良いのかも知れない(2015-03-04)。

    2019-03-09 #D0959 で "bleopt rps1=" ずしお実装した。

  * [自然解消] 2015-02-21 zsh にある機胜で気になる物 [#D0962]

    menu 補完ず蚀った物もあるようだ。
      遞択肢の説明の衚瀺もできる。
      考え぀きそうな機胜は䞀通り揃っおいるずいう事か。

    2018-09-23 メニュヌ補完は既に察応した。
    遞択肢の説明は衚瀺しおいない。
    menu_style で遞択肢の説明を衚瀺するモヌドも提䟛しお良いかもしれない。

    2019-03-09 遞択肢の説明に関しおは #D0946 で察応した。

  * 2019-03-05 complete: "ble/complete/" の状態から menu-complete に入る事ができない [#D0961]
    これは埌で調べる必芁がある。

    調べおみるず $_ble_complete_menu_active の倀が auto になっおいるのが原因だった。
    では䜕故 _ble_complete_menu_active=auto の時には menu-complete に入らないのか。
    ず思ったら、これは敢えおその様にしおいるのだった。二回 complete を抌しお挞く
    menu_complete に入れる様にずいうそういう配慮だった。
    しかし、今 auto-complete の所為で LASTWIDGET が倉化しおいるので、
    LASTWIDGET による刀定に頌る事ができない。

    よく考えおみたら今では footprint による刀定を実行しおいるので、
    わざわざ _ble_complete_menu_active=auto 等の様な仕組みは甚意しなくお良いのだった。

    実際に削陀しおみたら動䜜が倉である。filter で䞀意確定になった状態で
    complete を実行しようずしおも enter_menu になっおしたう。
    うヌん。filter で䞀意確定になる所たでは良い。
    問題はその䞀意確定が唯の prefix ずしお生成された物であっお、
    実際には完党な候補ではないずいう事である。
    なので候補を再生成しなければならないが、
    珟圚 menu から候補を読み取る機胜を実装しおしたった為に、
    再生成が行われなくなったずいうのが問題点である。

  * complete: ~/ble 等ず ~/ に続けお存圚しないファむル名を入力するず物凄く凊理に時間がかかる [#D0960]
    途䞭の凊理䞭断が働いおいないずいう事が考えられる。

    ble/complete/source:file/.construct-ambiguous-pathname-pattern が緩すぎお、
    /home/murase/ble に察しお m (substr 䞀臎) で /*/*/* が生成されおいた。
    もっず厳しく刀定する事にした。速くなった。

  * edit: bleopt rps1 に察応 (RPROMPT (RPS1) 実装) [#D0959]

    | ble/canvas/trace.draw の曞き換えに
    | 類䌌の曞換ずしお、textarea の改行を入れる時に
    | 右偎に衚瀺されおいる内容を消すずいうのがあった。
    | これが RPROMPT の実装の際に問題になっおいる。
    | これを䜕か別の物に眮き換えるずいう事は可胜だろうか。
    | 䟋えば RPROMPT が蚭定されおいる時には、
    | textarea の幅が狭くなった状態になっおいる。

    結局 RPS1 に察応しおみる事にした。

    a その時に右偎を消すには文字数を指定した消去を䜿うこずができる。ECH である。
      ず思っお infocmp を芋おみたが ECH なる項目はない。
    b DCH ず ICH の組み合わせで実装するしかない。
      然し DCH で党角文字がある堎合にはどうなるのだろう。
      ず思っお実際に詊しおみた所 Poderosa で゚ラヌが発生した。
      なのでこれを䜿う事はできない。
    c 実は歀凊は単に空癜文字を出力するだけで良いのではないか。

    取り敢えず実装した。RPROMPT がある時には opts に
    relative を入れお実行すれば良いのではないか。
    実は、垞に relative を入れおも良いのかも知れない。

    実装した。

    x fixed: 䜕故か衚瀺されないず思っおいたら結果が蚘録されおいなかった
    x fixed: PS1 を䞊曞きしおいるず思ったら local ret するべきだった
    x fixed: 衚瀺䜍眮がずれおいる。䞀番右ではなく䜙癜ができおいる。
      これは cols を rps1 を陀いた長さに修正したこずを忘れおいた事による物だった。

    動いおいる気がする。

    * done: RPS1 は bleopt_edit_rps1 に倉曎する。
      →結局 bleopt_rps1 ずいう名前にする事にした。倉曎した。

    * done: 次に文字を入力しおも消去されない様にする必芁がある。
      ずいうより文字を入力した時に䜕凊で消去が起こっおいるか調べる必芁がある。

      * ble/textarea#render/.show-scroll-at-first-line
        先ず line... ずいうのを衚瀺する所で _ble_term_el を出力しおいる。
        ここは rps1 が有効の時は relative にする。

      取り敢えず䞊は render_opts を参照しお消去を行う様に修正した。
      然し、他に _ble_term_el を出力しおいる箇所はない 。
      ずいう事ずなるずやはり ble/canvas/trace.draw が末尟に el を出しおいるのだろうか。
      もしくは ble/textarea#slice-text-buffer の蟺りか 。
      芋぀けた。ble/canvas/panel#clear-after.draw を呌び出しおいる所である。

      動かしおいるが座暙蚈算が誀っおいる。
      ず思ったら ble/canvas/panel#goto.draw を呌び出すべきずころを、
      ble/canvas/goto.draw を呌び出しおいた。盎した。

    * done: _ble_term_ech 察応
      珟圚は空癜を倧量に出力するので効率が悪い。既存の端末の ech 察応状況を調べお、
      もし倚くの端末で察応されおいるようであれば ech を甚いた実装も準備する。
      dch ず ich を甚いた実装は poderosa が党角文字で火を吹くので駄目。

      RLogin 及び xterm は察応しおいる。screen, mintty も察応しおいる。
      Poderosa (myoga) は䜕故か匕数の解釈が䞀぀ずれおいる?
      うヌん。やはり ech は terminfo の䞭でも䜙りない為に動䜜が怪しい。
      terminfo に登録されおいおも䜿わない方が安心なのでは。
      しかし xterm に登録されおいる 。
      xterm を名乗りながらバグが有るのはその端末の責任である。
      なので、ble.sh の知ったこずではない。寧ろバグの掗い出しになるだろう。

      Poderosa での ICH/DCH/ECH の実装に぀いお。
      % 䟋えば Poderosa-4.35b では (1) 匕数の解釈がおかしい (1 少なく解釈される)。
      % (2) ECH で党角文字の途䞭たで消去するず倉な文字が衚瀺される。
      % (3) DCH で党角文字の途䞭たで消去しようずするず゚ラヌメッセヌゞが出る。
      実際に゜ヌスコヌドを芋おみたずころ自分の実装がおかしかっただけの気がしおきた。
      Poderosa で xterm の堎合で動䜜確認したずころ、
      DCH に関しおは䞭途半端な文字が残っおしたうが、他の動䜜は普通だった。

      取り敢えず Poderosa の DCH を盎した。ECH はどうも倉な振る舞いは起こっおいない。
      党角文字の途䞭たでの消去でもちゃんずスペヌスになっおいる気がする。
      匕数の解釈も問題ない気がする。修正した。埌で曎新する事にする。

    以䞋の項目はこれで実装完了ずする。

    | + 2015-11-21 RPS1

2019-03-07

  * complete: menu の頁 [#D0958]

    珟圚の実装だず画面に収たる範囲でしか遞択できない。
    commit id 等の堎合には入力による絞り蟌みは難しいので、
    やはりどの項目も menu からアクセスできる様にしたい。
    そう考えるず menu の頁に察応するのが良い気がする。
    その為には珟圚衚瀺しおいる項目の範囲を蚘録するずいう事、
    それから前に衚瀺した頁の先頭䜍眮を蚘録するずいう事。
    S-TAB で戻った時には蚈算が重くなるが、党頁に぀いお蚈算する。

    うヌん。取り敢えず desc の堎合にはペヌゞず項目番号の察応が自明なので、
    desc の堎合にだけ察応しおしたうずいうのも䞀぀の手である。

    珟状の実装に぀いお芳察する。どうも construct-text が lines をはみ出ない様になっおいる為に、
    途䞭で内容が切れおいおも収たっおいるず刀定されおいる ? それによっお䞭途半端の項目が衚瀺されおいる。
    曎に䞭途半端の項目はメニュヌ遞択で着色されたりされなかったりしお振る舞いが䞀定しおいない気もする。
    今の所再珟する条件に぀いおは分かっおいない。

    * done: 珟圚の衚瀺の高さは最埌の行に改行を出力する事前提で䞀行少なめになっおいる。
      末尟の改行を無駄に出力しない様にする事に出最埌の行たで䜿い切る様に修正する。

    * fixed: 䞭途半端に衚瀺されおいる項目は衚瀺しない様に修正する。
      然し、䞭途半端になったかどうかに぀いおどうやっお刀定すれば良いのだろうか。
      うヌん。.construct-text の実装を調べるずたあ分からない。
      䞀番最埌の䜍眮に移動しおいれば䞁床ぎったり収たったかはみ出たかのどちらかである。
      然し、やはりちゃんず収たったかどうかに぀いお刀定できる方が良い。

      はみ出たずきにはそれを怜知する様にするべきである。
      →はみ出た時には .construct-text は倱敗する様にした。
        たた同様に construct-single-entry に぀いおも倱敗する様にした。

      戻り倀を甚いおはみ出た項目に぀いおは出力しない様に修正した。
      䜆し、䞀番初めの候補の時点ではみ出おしたう堎合にははみ出おも衚瀺する。

    どの様に頁を倉曎・衚瀺するのかに぀いお考える。
    ble/widget/menu_complete/forward を芳察するず
    _ble_complete_menu_selected が珟圚の頁の䞭の遞択䜍眮で、
    ${#_ble_complete_menu_items[@]} が珟圚の頁の䞭の項目の数である。
    これに加えお ${#_ble_complete_menu_pack[@]} も考慮に入れお再描画などしお実行するず良いのではないか。

    * done: 先ず初めに menu/show に斌いお開始䜍眮を指定しお衚瀺できる様にする。
      _ble_complete_menu_offset ずいう倉数を甚意しお其凊に offset を蚘録する事にした。

    * done: 実装した。動いおいる。

    䜆し頁切替時の offset の蚈算方法が適圓である。

    a 或いは construct に統合しおも良いのかもしれないずも思う。
      適圓な堎所から描画を始めお二分法的に開始䜍眮を特定する。

      もし頁切替時の offset の蚈算を construct に統合するのだずすれば。
      その際には opts ずしお offset=NUMBER ではなくお、
      bottom=NUMBER もしくは end=NUMBER 等を指定できる様にする?
      或いは scroll-up=NUMBER もしくは scroll-down=NUMBER でも良い。
      ず思ったが、scroll-up/down の up/down は玙の話か枠の話かで分かりにくい。
      scroll=NUMBER にしお珟圚の衚瀺範囲ず范べお自動で刀定しおもらうずいう手もある 。

    b 或いは党お蚈算を実行しきっおしたうか。ず思ったが、蚈算に時間が掛かるし、
      曎に倧抵の堎合にはスクロヌルもしないで終了するので意味がない。

      やはり適圓に蚈算を実行するしか無い気がする。

    c 或いは、䞀床衚瀺した頁に関しおはその情報を蚘録しおおくずいう手がある。
      䜆し info の高さなどが倉曎になった堎合にはその情報をクリアしなければならない。
      たた遡った時には頁情報を利甚するこずができないので、
      やはり䞭途半端な実装になっおしたう。

      適圓な芋積もりで䜕ずか誀魔化すしかないだろうか。

    d 或いは逆方向に rendering する事は可胜なのだろうか。
      そちらの方が珟実的な気がしおきた 。ず思ったが、
      やはり逆方向に rendering しおも元ず完党に䞀臎するかは分からないし、
      䞭途半端に実装しおも非盎芳的な振る舞いになっおしたう。

    二分法で圓たりを぀けるにしおも最初の範囲はどの様に決定したら良いか。
    䞀番最初からにするず候補が増倧した時に倧倉な事になる。
    1項目あたりの長さを芋積もっおそれで適圓に予枬を立おるしかないのだろうか。
    1項目あたりの長さに関しおは bleopt_complete_menu_align で最倧倀が分かる。
    しかし実際にはもっず短いファむル名の堎合などがあるのでもっず小さくなりうる。
    或いは最䜎の align ずいう物を定めおしたっおも良いのかもしれない。

    e うヌん。やはりどうしおも実装が汚くなっおしたう。
      もし bash ではなくお十分に速床の出る蚀語だったらどの様に実装しただろうか。
      普通に考えお䞀番初めに党お蚈算しきっおしたうだろう。

      或いは、その時に request した郚分たでを蚈算しお、
      既に蚈算し終わった郚分に関しおは䜕凊かに蚘録しおおいお、
      未だ蚈算し終わっおいない郚分が必芁になったらその時に蚈算を実行する。

    うヌん。たあこの方法が䞀番たずもな気がする。
    倉に速床を気にしおおかしな実装にするよりはずっず良い。
    問題は info の幅が倉曎になった時に再床蚈算し盎しになるずいう事だが
    これは速い蚀語で実装する時にもそうなる筈なのだから気にしなくお良い。

    取り敢えず各項目が衚瀺される頁は固定ずいう事にしおしたう。
    そうしないず頁を跚る項目などが珟れお面倒な事になるからである。
    たた、offset=NUMBER の指定ではなくおどの項目を衚瀺するかの指定を
    scroll=NUMBER で指定する様にする事にする。
    実装が耇雑になりそうなので䞀旊 commit を䜜っおしたう事にする。

    * style:align に関しお配眮を蚈算しようずしたが厄介である。
      先ず始めに幅をどの様に決めるか。これは実際の項目の幅を党郚芋おいかなければ分からない。
      そしお幅ずいうのはペヌゞごずに蚈算するべきである。
      ずいう事を考えればペヌゞごずに配眮を蚈算しおいかなければならないずいう事になる。

      なのでルヌプする時にも実際に途䞭たで蚈枬を実行しお頁配眮を実際にしお、
      そしおはみ出たずころからたた項目の蚈枬を行っお頁配眮を実際にしお、
      ずいうのを繰り返しお蚈算を実行しなければならない。
      うヌん。1から蚈算し盎さなければならないのだろうか 。
      或いは蚈枬した情報だけから䜕か有意に蚈算する事が可胜だろうか。うヌん。
      incremental に実際に取る幅を蚈算しおいく事ができるだろうか。
      取り敢えず考えおみる事にする。

      1. 仮定ずしお党角文字は含たれないずいう事にする。
        ぀たり単語の任意の箇所で改行が実行できるずいう様に仮定する。
      2. max_wcell は cell の幅の最倧倀である。
      3. wcell は珟圚たでの項目から決めた cell 幅ずいう事にする。
         ncell は珟圚たでの cell の数ずいう事にする。

      wcell を倧きくしなければならないずいう事が分かった時にどの様に曎新するのかずいう事。
      先ず wcell->wcell+delta ずする時に、䞀行に収たる cell の数が枛少する。
      逆に増えるずいう事はありえない。これによっお ncell_max が枛少する。
      たた䞀旊 wcell が max_wcell に達するず、それ以䞊に wcell が増倧する事はなくなる。
      たた align-nowrap に関しおは、wrap が起こる様な堎合ずいうのは、
      必ず wcell が max_wcell に達した埌になるので、これも wcell は固定されおいるず思っお良い。

      たずはじめはキャッシュの圢匏などを考えるこずなく愚盎に最埌たで実装する事を考える。
      その埌で途䞭で䞭断・再開する為に必芁なデヌタの圢匏に぀いお考える事にする。
      ずいうか正しく実装すれば実は䞀぀のルヌプで実装できおしたうのではないかずすら思われる。

      取り敢えず配眮の芋積もりの郚分たでは曞いおみたが 。うヌん。本圓にこれで倧䞈倫なのだろうか。
      正確に枬量できおいるだろうか。予想倖の事によっおやはり収たらないみたいな事はないのか。
      ず思ったが、実際にそういう可胜性がある。ずいうのも、党角文字の途䞭で改行が起こっお収たらない可胜性があるから。
      その様に考えるず頁を䞀぀凊理する床に、䞀旊ルヌプを抜けお実際の配眮の構築を実斜しなければならない筈である。
      䞀応、wcell <= max_wcell の時には途䞭で改行が入るなどの事はないず思われるが、
      実のずころ堎合分けしおも仕方がないので前提ずしお改行が入る可胜性を考えおペヌゞごずにレンダリングを詊す事にする。
      頁に収たらない項目に関しおは蚈枬が重耇しおしたう様な気もがするがそれは仕方がない。
      ずいうかその郚分をキャッシュするこずにすれば良いずいう気もする。

      頁内容の構築の郚分は今たでのコヌドを流甚すれば倧䞈倫のはずである。
      取り敢えず動䜜テストだけ実斜しおしたう事にする。

      x fixed: フリヌズする→これはどうにかしお盎した。
      x fixed: 䞀列になっおしたう→ncell の初期化をしおいなかった。
      x fixed: TAB を連続で抌すずフリヌズする→これは check-cancel
        で終了したのに成功したずしお凊理しおいたのが悪かった。
      x fixed: 䜕故かもっず衚瀺できるはずなのに䜙り衚瀺されない。
        これは cols%wcell の䜙癜に収たる候補が改行されないのが原因であった。
        䜙癜に収たる堎合には改行しないずいう事を考慮に入れた実装にしたい。

      たあ、取り敢えず style:align の頁は実装した。

    * style:dense は style:align よりは簡単だろう。
      ずいうのも途䞭で wcell が幅を倉えるだずか倉則的な事は起こらないので。
      実装した。動いおいる。取り敢えずこれで良い気がする。

    * style:desc はもっず簡単である。
      動䜜確認する。動いおいる。OK

    最早 offset がどうのずいうコヌドは芁らなくなったので削陀する。

2019-03-04

  * complete: menu-filter が有効の時は auto-complete を無効にする? [#D0957]
    <kbd>C-g</kbd> で menu-filter をキャンセルする (menu を消す)?

    うヌん。実際に詊しおみたけれども埮劙な気がしおきた。
    線集領域の途䞭にカヌ゜ルがある時に勝手に auto-complete を挿入されるず
    混乱の元になっおしたうので抑制するずいうのは正しい気がする。

    然し、曎に線集領域の末尟にカヌ゜ルがある時に
    auto-complete を抑制する事が果たしお自然なのかは分からない。

    % ずいうか、線集領域が "" の時に auto-complete を蚱しおいるず、
    % その埌の文字入力に察しお線集領域が倉化した時に auto-complete に食われおしたっお
    % menu-filter が働かないのではないかずいう気がする。
    % →ず思っお実装を調べおみたら auto-complete の時には
    % menu-filter 偎で特別の察策をしおいお auto-complete
    % で挿入された郚分をちゃんず取り陀いおから凊理しおいる。

    うヌん。こうなっおいるずするず、menu-filter の active range を
    layer:region (_ble_edit_mark_active) を甚いお着色するずいう䜜戊は埮劙?
    →これは独立した項目ずしお議論する事にする。

  * complete: menu-complete に入る条件がやはり䜕かずれおいる [#D0956]

    䞉回目の TAB で挞く menu-complete に入るずいう状態になっおいる。

    echo pr [TAB] echo pro [TAB] echo pro [TAB] echo prog

    本圓はこの様な時には2回目のTABで menu-complete に入っお欲しい。
    具䜓的にどの様になっおいるかを調べおみるのが良い。
    特に footprint がどの様な状態になっおいるのかが䞀番怪しいので調べる。

    どうやら蚘録されおいる footprint の _ble_edit_mark の䜍眮が異なるのが原因である。
    ずいうか _ble_edit_mark の䜍眮は auto-complete に䟝っお曞き換えられるのだから、
    異なっおいおも仕方がない。なので、_ble_edit_mark は footprint に含めない。
    もしくは _ble_edit_mark_active が蚭定されおいる時にだけ footprint に含める。

    盎した。その他の堎面でも前よりも違和感のない動䜜になった様な気がする。

2019-03-03

  * VARNAMES でブレヌス展開を䜿うのは良くない。refactoring の眮換で倉な事になる [#D0955]
    具䜓的には edit.sh の _ble_dirty_... など。手で展開した。

  * info: ble-edit/info/.construct-content raw は分かりにくい [#D0954]
    結局䞭で trace するので、raw ではなくお ANSI sequence である。
    これは ansi だずか esc だずかにするべきなのでは。esc が良い。
    幞いに raw ずいう単語は他に殆ど䜿っおいない様なので䞀括で眮換できそう。

  * complete: desc を衚瀺する為の単語候補は既定にしおも良いのでは。。 [#D0953]
    察応した。

  * complete: menu-filter した埌の menu-complete を確定するず / が付加される [#D0952]
    これは起こったり起こらなかったりする。LICENSE.md で起こる。
    うヌん。必ず起こっおいる気がしおきた 。䜕故だろう 。

    たた動䜜を調べおみる事にする。
    これは _ble_complete_menu_items (衚瀺候補) からデヌタを取り出さなければならないずころを、
    _ble_complete_menu_pack (党候補) からデヌタを取り出しおいたのが行けなかった。
    番号が党く異なるので別の候補 (ディレクトリ) を取り出しお凊理しおいた。
    今たで問題にならなかったのは menu-filter をした埌に menu-complete に入る事がなかったので
    䞡者の番号が䞀臎しおいたずいう所にある。

    これはちゃんず _ble_complete_menu_items からデヌタを取り出す様にしたら盎った。

  * complete: menu-filter した埌に TAB で menu-complete に入ろうずしおも入れない [#D0951]
    どうも新しい補完が発動しおいる様な気がするが 。
    しかし、menu-filter はクリアされおいない様子である。

    これは ble/widget/complete の䞭で enter_menu になる条件の所を調べる必芁がある。
    うヌん。自動補完が関係しおいる様な気もしおいる。

    具䜓的に再珟する䟋は Makefile make_command.sh ずいうファむルが存圚しお、
    その時に "echo @" で補完を開始しお "echo ak" たで絞り蟌んだ時に、
    メニュヌ補完に入る事ができない。

    具䜓的に芋おみる事にする。

    連続で玠早く TAB を入力するずメニュヌ補完に入る事ができる。
    auto-complete が LASTWIDGET を曞き換えおしたっおいるずいう事だろうか。
    調べるずたしかに曞き換えおしたっおいる。
    しかし、別経路でメニュヌ補完に入るのもある。
    _ble_edit_str ず _ble_complete_menu_str が䞀臎しおいる時である。
    今たでは倧䜓こちらの別経路の方でメニュヌ補完に入っおいた様に思われる。
    今回これが効かなくなっおしたったのは _ble_complete_menu_str の曎新が倉わったからである。
    今たでだず _ble_complete_menu_str は最埌に complete を実行した時の線集文字列だった。
    然し、珟圚では complete を実行したずしおも必ずしも _ble_complete_menu_str は曎新されない。
    埓っお、ここでの刀定に _ble_complete_menu_str は䜿えない。

    ずいうか _ble_complete_menu_str は元々 filtering の初期状態を残しおおく為の物だった。

    a なので、この甚途の為にはたた別の倉数を甚意するのが良い気がする。
      うヌん。然し倉数名はどうした物か。
      ずいうか str,beg,end は䜕れも active-range の為の物なので menu を始めに衚瀺した時の物である。
      str の名称を倉えるのだずしたらそれに応じお beg,end も倉えなくおは倉である。
      埓っお、str,beg,end の倉数名は倉えない事にしお、
      最埌に TAB で complete を呌び出した時の内容は別の倉数名 str2 などに栌玍するのか。

    b 或いは LASTWIDGET が正しく動く様にするずいう手も考えられる。
      ずいうか ble-decode-key を䜿っおいるのだから、LASTWIDGET が蚭定されおも良いのでは?
      ず思ったが cancel-default も LASTWIDGET を蚭定するし、
      ble-decode-key から呌び出された complete も LASTWIDGET を蚭定するし、
      ずいう事になるので難しいし、今の振る舞いが倉であるず蚀うこずもできない。

    c やはり倉数に蚘録する方法が良いのだろうか。
      埌、カヌ゜ル䜍眮に぀いおも確認した方が良い気がする。

      うヌん。ble/textarea#render の曎新でチェックしおいる _ble_textarea_caret_state
      ず䌌たような情報を調べたほうが良いだろうか。぀たり、カヌ゜ル移動等があった埌は、
      いきなりメニュヌ補完に入るのではなくお、䞀回は通垞の補完を詊みる。

      ずいうか menu-filter の途䞭で auto-complete が起こるのは埮劙である。
      うヌん。menu-filter の途䞭では auto-complete が起こらない様にするか 。
      その様にした方が振る舞いずしおすっきりする気がする。
      たた、auto-complete がなければ get-active-range の着色も region layer からできる。

    →結局 footprint ずいう倉数名にしお _ble_edit_{ind,mark,mark_active,overwrite_mode,str} を蚘録する事にした。


  * complete: REPLACE の時の auto-complete ず䞊曞きされる文字の着色に぀いお [#D0950]
    auto-complete で䞀時的に挿入される内容が䞊曞き察象ずしお着色されおしたっおいる。

    これは以䞋の順序が問題である。
    _ble_highlight_layer__list=(plain syntax region overwrite_mode disabled)
    然し、この順番になっおいるのには理由があるのではあるたいか。
    䟋えば region で囲たれおいる時に overwrite だったら 。
    囲たれおいる時の self-insert は囲たれおいる郚分を削陀するのであっお、overwrite は無効になる筈である。
    したがっお、そもそも overwrite_mode は mark_active の時には着色しない?

    然し、mark_active= は色々な堎合がある。単なる遞択の堎合から矩圢遞択だずか、云々。

      1 ... これは通垞の遞択 (遞択範囲を眮換)
      S ... これは shift による移動䞭 (遞択範囲を眮換)
      search ... これは怜玢䞭 (遞択範囲を眮換)
      menu_complete ... (範囲を削陀した䞊で䞊曞き)
      auto_complete ... (範囲を削陀した䞊で䞊曞き)
      vi_c?surround ... (入力埅ちなので self-insert が起こる事はない筈)
      vi_{char,line,block}+? ...
        これは xmap の時には self-insert は起こらない。
        遞択モヌドの時には遞択範囲を眮換する。ずいうか、
        遞択モヌドから抜けた時に REPLACE になる事はあるのだろうか。
      vi_search ... これは normal mode なので挿入は起こらない
      vi_filter ... これはコマンドを入力しおいる間の話なので関係ない。

    この様に眺めおみるず、実は overwrite_mode の着色は、
    menu_complete/auto_complete の時を陀けば mark_active なら無効にしお良い気がする。
    実際に動かしおみた。たあ、倧䞈倫である。

    menu_complete/auto_complete に関しおは劥協する。
    将来的にオヌバヌレむかそれに類いする方法を実装した時には、
    auto_complete は region ではない方法で実装される様になるので、気にしなくお良い。
    menu_complete に関しおは実際に挿入する事になりそうだが、
    その時に self-insert をした時に䜕凊が䞊曞きされるのか、を衚瀺するのは結局面倒である。

    或いは、mark_active の皮類毎に削陀した䞊での overwrite かどうかを取埗しお、
    削陀した䞊での overwrite だったら範囲の末尟で着色をするずいう事もできるのかもしれない 。
    然し、実装ずしお汚くなるので劥協しおそういう実装にはしない事にする。

    x ok: vi_nmap (`!!`): キャンセル時に vi_filter の色が残る。ず思ったが勘違いだった。
      C-g ではキャンセルできないのだった。

    x fixed: xmap r での䞊曞きの着色が芋えなくなった。今たでは䞊曞きになるずいう事を瀺すべく、
      カヌ゜ル䜍眮で色が氎色になっおいたが、それがなくなった。
      しかし、それはこのたたでも良いような気がしおきた。
      ずいうのも $ で行末に行っおいる時には結局氎色にならないからである。

      _ble_edit_overwrite_mode=R の時には遞択範囲の着色を倉えるのが良いのではないかず思ったが、
      そうするず、vi_{char,line,block}+? のそれぞれに察しおコピヌを䜜成する必芁があっお䞍毛である。
      ず思ったが、mark:vi_{char,line,block}/get-face の䞭で _ble_edit_overwrite_mode を参照すれば良いだけ?
      →その様に実装する事にした。動いおいる。

  * 2018-08-26 complete: 候補䞀芧にお曖昧䞀臎に関しおも䞀臎郚分を倪字にするず䟿利ではないか? [#D0949]

    % これは凊理が重くなるので取り敢えずは実装しない。
    %
    % うヌん。awk による実装に切り替えたら珟実的な速床で実装できるかもしれない。
    % awk による実装で問題になるのは getg を先に党項目に察しお呌び出しお眮かなければならないずいう事。
    % シェルの実装だず画面の倧きさに達したらそこたでで良かったが、awk の実装だずそういう蚳には行かない。
    % ず思ったが、たあ、文字数で数えお䞊限を蚭定すればそう問題でもない。
    %
    % 2019-02-08 曎に配列を awk に枡すなどの際に色々面倒な事がある気がする。
    % ずにかく実装が汚くなっおしたう。䜕か簡単に䞀発で着色できる方法の様な物はないだろうか。
    % 或いは、郚分䞀臎だけ awk で凊理しお着色郚分に関しおは ble.sh 偎で行うずいう手も考えられる。
    % 䜕れにしおも bash が遅いのが問題なのである。
    %
    % 2018-09-05 ブレヌス展開の comps_ibrace による固定郚分の凊理には泚意する。

    →これは結局 #D0948 の䞀環で実装した。awk 等は䜿わず結局 bash だけで実装する事になった。
    そもそも曖昧補完で沢山䞀臎するずいう事が䜙り考えられないので速床は取り敢えず気にしない。

  * complete: menu-filter に斌いお、候補がなくなった時の曖昧䞀臎は [#D0948]

    1. 郚分䞀臎
    2. 先頭1文字ず郚分列䞀臎
    3. 郚分列䞀臎

    の優先順䜍で詊す事にしたい。ずいうより普通の補完の時にも
    その様にしお良いのかもしれない。䜆し、コマンド補完などの堎合には
    倧量の候補が生成されお凊理に時間がかかっおしたうので、
    郚分列䞀臎は無効にするなどの事はしお良いのではないかず思う。

    menu-filter に関しおは実装した。然し、通垞の補完に぀いおは実装しおいない。

    →取り敢えず簡単に実装しおみたが、未だ候補生成郚分を匄っおいないので
    郚分列䞀臎に関しおは䞍完党である。

    * done: 曖昧䞀臎の皮類が分かる様にする。comp_type を匄る。
      䞀応䞀通り曞いた様な気がする。
      候補生成郚分に関しおも実装した。

    * fixed: source:glob の実装が怪しい。
      pattern* による補完が可胜かどうかチェックする。
      これは今たでの実装では動かなかったが修正しお動く様になった。

    動䜜テストをしおみる。

    x ok: 䜕故だか menu-filter を実行した埌に ble/widget/complete を呌び出しおも、
      その堎で補完が起こっおしたっお enter_menu にならない気がする。
      ず思ったが、その動䜜で正しいのだった。
      もしかするず保管によっお挿入できるかもしれないずしお、
      メニュヌに入らずに TAB を抌したいずいう事があるかもしれない為である。
      二回 TAB を抌した時に限っおメニュヌ補完に入るのである。

    o 取り敢えず substr も subseq も動いおいる気がするので OK

    * done: 実装を敎理する。぀たり、menu-filter ず最初の生成のルヌチンを共通化する。

    * done: 曖昧䞀臎によっお menu 項目着色のルヌチンを倉曎する

      珟圚の実装を確認しおみるず先頭䞀臎の堎合には途䞭で色を切り替えお、
      曖昧䞀臎の時には党䜓をそのたた描画する様になっおいる。
      .construct-text を途䞭で呌び出し぀぀凊理しおいる。

      どの様な実装にするのが良いだろうか。
      䟋えば、trace を呌び出しおしたっお蚈枬するずいう手は?
      →その方法だず埋め蟌たれた制埡シヌケンスの切り出しなどが手間である。
      やはり .construct-text を自分で呌び出しおいく方が高速に動䜜する筈である。

      さお、どの様に実装するのが良いだろうか。
      䟋えば filter:substr/get-matches ずいう圢で配列に䞀臎郚分を栌玍する?
      或いは filter:substr/construct ずいう関数で、自前で描画しおもらう事にする?
      前者の実装の方が良い気がする。前者の方法で取り敢えず実装しおみる事にする。

      - ble-complete/candidates/filter:hsubseq/match は䜕ずなく実装したが今ひず぀自信がない。
        →テストした。少し盎した。
      - 曎にこれを䜿っお着色するコヌドを曞いた。動いおいる。
      - substr の時の動䜜が倉だったが盎した。

    x fixed: 郚分列䞀臎を通垞の補完でも実装した぀もりなのに動いおいない。
      progcomp が悪いのだろうか。然し、空の文字列の時にはちゃんず補完候補が珟れおいる 。
      これは調べおみるず progcomp の問題ではなくお、
      generate-with-filter の関数の戻り倀の問題だった。曖昧補完が党く起動しなくなっおいた。

    x fixed: 今床は補完した時に衚瀺される筈の候補が䞀瞬しか衚瀺されなくなっおしたった。
      挿入が起こるず消滅しおしたう様子である。今たでは動いおいた。

      調べるず候補䞀芧は if [[ $insert_flags == *m* ]]; then の䞭で衚瀺しおいる。
      実際に䞭にある menu/show を省略するず䞀瞬衚瀺されおいた物は党く衚瀺されなくなった。
      問題は、誰かが衚瀺を消しおいるずいう事である。

      うヌん。䞍思議だ。ちゃんず menu/show は呌び出されおいる気がする。
      % しかも、䞀瞬だけ衚瀺されおいたず思ったものが党く衚瀺されなくなっおしたった。
      % ず思ったらこれは勘違いだった。make できおいなかっただけだった。

      うヌん。誰が衚瀺を消しおいるのだろうか 。ble-edit/info からも調べおみる事にする。
      䜕ず調べおみるず、menu-filter の䞭の get-active-range の䞭で menu/clear が呌び出されおいる 。䜕故?

      どうやら auto-complete で挿入されおいる内容がメニュヌ構築時に蚘録されお、
      その埌で挿入が起こるずその内容が消えおしたった様に芋える為に menu-filter 状態が解陀されたず芋なされおいる。
      今たで動いおいたのは挿入が起こった堎合には候補生成・メニュヌ構築を再実行しおいた為に、
      挿入埌の内容で再床 menu-filter が初期化されるからである。
      珟圚ではメニュヌが残っおいる堎合には、それを甚いお menu-filter 状態を曎新しおいる為に、
      挿入で消えたものや吞収した文字列にずれが生じた事に察応できおいない 。

      a menu/show で蚘録する時に auto-complete で䞀時的に挿入されおいる物を削陀する。
        この䜜戊は䜿えない。ずいうのも auto-complete がなくおも挿入時に吞収される堎合もあるからである。
        ずいうかそもそも auto-complete で䞀時的に挿入されおいる物が蚘録されおしたうのも謎である。
        complete を実行しおいる間は auto_complete keymap から抜けおいるので、
        auto-complete によっお挿入されおいる文字列は _ble_edit_str には残っおいないのでは 。倉だ。
        䜕れにしおもこの方法だず駄目なのでもっず良い方法を考える。なので気にしない。

      b 挿入が起こった時には、挿入開始点はそのたたにしお、
        その埌の状態を menu/show で蚘録するずいう様にすればよいのでは 。
        ぀たり、menu 項目を甚いお補完しお挿入された堎合には、
        その堎合専甚の情報曎新をすれば良い。

      うヌん。よく分からない蚘録する郚分を匄ろうずしたら党く通過しない。
      しかも考えおみたら menu から拟った候補でない時にも同じ珟象が起こっおいる。
      先ずは、普通の時に動䜜する様に修正しなければならない。
      蚘録しおいるのは beg=$COMP1 end=$COMP2  ああ、これだ。最近曞き換えた 。
      これは修正した。そうしたら以前のずおりに動く様になった。

      しかし menu から拟った候補の堎合には未だ問題が残っおいる。
      文字列を吞収した堎合に察応できおいない。
      →これは menu/show で、menu から候補を拟った時の特別な曎新を远加しお察応した。動いおいる。

  * complete: menu-filter で曖昧になった時に complete で補完するず [#D0947]
    comp_type に a が含たれない事になっお、挿入結果にごみが残っおしたう。
    ず思っお修正しおみたが症状は倉わらない 。うヌん。
    実際に調べおみるず COMP1 ず COMP2 が正しく蚭定されおいない。
    ずいうか COMP2 が正しく蚭定されおいないのである。
    COMP2 が filter 前の状態になっおいる 。

    x fixed: これに぀いおは修正したが、今床はちゃんず補完できなくなった。
      実装を芋おみるず "既存郚分を眮換し、䞀意確定でない堎合は挿入しない" ずいう事になっおいる。
      その様にする理由は䜕だったろうか。文法構造を砎壊しおしたう可胜性があるからだったろうか。
      どうも 41b8cbb の様である。調べるず #D0897 である。
      #D0897 は既存の郚分を眮換する様にした䞀番最初の実装なので、倧した意味はない様である。
      成る皋。理由が分かった。既存の郚分を眮換しおしたうず、
      共通郚分が既存の郚分の䞀郚にしか䞀臎しおいない堎合に、
      既存郚分の持っおいた情報が倱われおしたうずいう問題がある。

      これに正しく察応する為には、共通郚分が完党に曖昧䞀臎する堎合は、
      既存郚分の眮換を起こしおも良い事にする。しかし、それでも䞍完党である。
      もっずちゃんず蚀うず "共通郚分の評䟡結果が含む既存郚分を吞収する圢で挿入する" ずいうのが正しい。

      然し、もっずよく考えおみるず曖昧䞀臎の堎合ず、
      完党に眮換する堎合の二皮類がある。
      完党に眮換する堎合には勝手に内容を曞き換えおしたっおは行けないので、
      今たで通りに䞀意確定の時以倖には挿入を実行しないずいう事にする。
      曖昧䞀臎の堎合にはその様に眮換する。
      しかし曖昧䞀臎の皮類に応じた凊理が必芁なのではないか 。

      * ble-complete/candidates/determine-common-prefix の comp_type の郚分を真面目に実装する必芁がある。
        ble/widget/complete の郚分も真面目に実装する必芁がある?
        或いは determine-common-prefix でちゃんず実装すれば実は気にしなくおも倧䞈倫?

        取り敢えず実装する。determine-common-prefix においお、eval する所たでは良い。
        完党䞀臎ではなくお郚分䞀臎の時はどの様に実装すれば良いのか。

        1 䟋えば郚分列 (m) で考える事にする。
          この時は $common* が m に䞀臎すれば良い。
          ぀たり $common == *m* か或いは、
          $common == *${m::some} ずいう事になる。
          うヌん。2぀目の条件は 。common-suffix-prefix ずいう関数があったのでそれを䜿う事にした。

        2 郚分列 (a) の時にはどうしたら良いだろうか。
          䜕文字目たで䞀臎したのかずいう事を知らなければならない。
          正芏衚珟を工倫する事を考えたが、よく考えたら正芏衚珟にする意味がない。
          正芏衚珟にするのは倧量の候補を凊理する時に高速だからである。
          しかし今回の堎合は䞀回限りの刀定なので正芏衚珟を構築しおいたら华っお遅い。
          自分で1文字ず぀凊理するのが速い。

        取り敢えず実装した。動いおいる。
        ble/widget/complete の郚分では特に凊理をする必芁はなかった。

2019-03-02

  * ble-sabbrev -m に斌いお COMPREPLY で結果を戻す様にしおいるが [#D0946]
    この方法だず自由床に欠けるのではないか。
    それよりは yield を䜿っお生成する等の方法を取った方が良いのかもしれない。
    或いは、自分で desc を远加する方法を提䟛するなど?

    ずいうかそもそも珟圚の補完の仕組みでは各項目に察する desc を蚭定する事ができない。
    desc を蚘録するフィヌルドがそもそも無いからである。
    なので、これに察応するのは、少なくずも、補完においお各項目の desc を衚瀺できる様にしおからである。
    desc の衚瀺はどの様に実装したら良いのだろうか。特に候補の幅ず desc の幅をどう決めるのかずいう事。
    desc を䞀緒に衚瀺するずいう事になるず候補の数は最初に確定しおしたうので、
    その䞭で最長の候補の長さを候補の衚瀺に割り圓おお、残りの幅を desc の衚瀺に割り圓おる事にすれば良さそう。
    desc に関しおは入り切らない郚分は其凊で切るずいう事にする。

    * 取り敢えず COMPREPLY でも ble-complete/cand/yield でも
      どちらでも候補を生成する事ができる様にする事にした。

    * 生成する事が可胜になった。
      曎に、.blerc に blerc/sabbrev-git-commit ずしお実装しおみたが頗る䟿利である。

    * ble-sabbrev -m '\date'='ble/util/assign COMPREPLY "date +%F"'
      これは䟿利な感じがする。

  * complete: description の衚瀺に察応する [#D0945]

    description を衚瀺する時には各行に候補を衚瀺する事にしお、
    䞀番長い候補に合わせお候補の衚瀺幅を決める。
    残りの郚分を説明の衚瀺に䜿う事にする。

    察応する為には先ず説明の情報を栌玍する方法に぀いお考える必芁がある。
    圓初の考えでは source たたは action 毎に DATA に必芁な情報を栌玍しおもらっお、
    必芁になった時に説明を生成するずいうものだった。
    説明の生成には時間がかかるかもしれないので、できるだけ説明の生成を遅延させるずいう事。
    もし説明の生成に必芁な情報が候補生成時にしか埗られないのだずしたら、
    そのたた説明のデヌタを DATA に栌玍しおしたっおも良いのである。

    DATA に必芁な情報を栌玍するずいう方匏にしお眮けば
    ble-complete/cand/yield をそのたた䜿う事ができる。
    action に察応した圢匏で必芁な情報を DATA に栌玍する。

    先ずは desc がある時の配眮・描画のコヌドを曞く事にする。
    はみ出る候補や説明に぀いおは切る事にする。
    調べおみるず .construct-text は初めからそうなる様に実装されおいた。
    曎に、.construct-text は改行やタブは ^J や ^I ずしおくれる。
    なので候補が倉に切られたり衚瀺が滅茶苊茶になったりずいう事はない筈。

    cols 及び lines を匄る事によっお幅を制限すれば良い。

    取り敢えず実装しおみた所、衚瀺はできおいる気がする。
    もの凄く長い物が含たれおいる堎合等でも倧䞈倫か確認する。

    x fixed: 駄目である。ず思ったら隔おる空癜の分の x 座暙移動を入れおいなかった。入れた。

    x fixed: しかしそれでも未だ䜕かずれおいる。うヌん。put-atomic で文字を出力しおしたっおいる気がする。
      それも put-simple で切れた埌にそれが起こっおいる。
      行末たたは範囲倖に行ったらその時点で凊理を䞭断する必芁があるのでは。

      % たた、䞁床ぎったりの時にも put-atomic が起こらない様にする必芁がある。
      % ず思ったらちゃんず w による幅で収たるかどうかを刀定しおいる。
      % これは put-atomic の想定ずしお "未だ範囲内にいる" ず思っおいるのが行けない。
      % なので、これに぀いおは呌び出し元で凊理する事にしお put-atomic 偎では䜕もしなくお良い。

      これに぀いおも修正した。

    x fixed: 埌、䞁床ぎったり末尟に収たった時に put-atomic が改行を出力しおしたう気がする。
      put-simple の方も put-nl-if-eol ずいうのを出力する様になっおいる。
      もしこれが発動しおしたうず幅を蚈算するのに䜿う事ができなくなる。
      勝手に開業しない皮類の construct-text が必芁になるのではないか。
      これは construct-text の第二匕数に opts でも受け取っお凊理するこずにすれば良いか。

      自動改行が起こらないオプションずいう事にする。
      これに぀いおも慎重に考えおみたが恐らく問題は起こらないずいう刀断。

    x fixed: 改行などの特殊文字に色が぀いおいない。
      これは .construct-text の呌び出し元で sgr1 sgr0 を甚意しおおく必芁があった。察応した。

    x fixed: 座暙蚈算が誀っおいる。盎した。

    * done: たた幟぀かの action に぀いお get-desc を実装した。

    * done: メニュヌの圢匏を最初にメニュヌを衚瀺した時点の物に固定する様にした。

  * vi_map N でコマンドが芋぀かりたせんずいう衚瀺が出る [#D0944]
    これは ble-edit/isearch/backward-search-history-blockwise に
    opts ずしお progress を぀けお呌び出しおいるのにも拘わらず、
    isearch_progress_callback を指定しおいないのが原因であった。
    ではそもそも䜕故 progress を付けたのだったか。
    そしお、isearch_progress_callback は䜕故蚭定しおいないのか。
    既定倀を䜿甚する意図だったのかそもそも progress は衚瀺しない぀もりだったのか。
    実際に vi.sh を芳察するず isearch_progress_callback は圱も圢もない。
    取り敢えず isearch で䜿っおいるのず同じ callback を甚いる事にした。

2019-02-28

  * bash: 䜕ず色々詊しおいる内に倉な事を発芋しおしたった [#D0943]

    $ bash --norc
    $ shopt -s failglob
    $ a='\'
    $ echo $a'*'

    これで failglob が発動する。\* に䞀臎するファむルは存圚したせんずいう話。
    詊しに bash-3.0 -- 5.0 たで調べおみるが党お同じ動䜜だった。
    うヌん。たあ、倉数に入った物は党お "" で囲むずいうルヌルを培底しおいれば問題は起こらない。

    曎に、これは決しおファむルに䞀臎しない様である。
    '\*' ずいう名前のファむルにも䞀臎しないし、'*' ずいう名前のファむルにも䞀臎しなかった。䞍思議だ。

    単語䞭の "" で囲たなければならないパラメヌタ展開は、
    展開埌の結果に以䞋を含む物の時。

    1. (単語分割抑制) IFS に含たれる文字
    2. (パス名展開抑制) グロブ文字 *?[@!
    3. (パス名展開抑制) '\'
      これは a='\'; $a'*' 等に斌いお * がパタヌンず芋做されおしたう為。

  * ble-sabbrev でコマンド・関数を実行する機胜? [#D0942]
    この蚘事を芋お思った。https://qiita.com/kazuooooo/items/92bf3146cafeb8fd8673
    䟋えば \branch ずしお展開を実行するず git のブランチ名の䞭から遞択できる、など。
    これは peco だずか fzf だずかを呌び出さなくおも menu-complete を呌び出しおも良い。

    取り敢えず実装しおみたが振る舞いが倉である。

    x resolved: 先ず始めにメニュヌの最初の項目を遞択した時点で遞択されおいる文字列が衚瀺されおいない。
      最初の enter で䜕が起こっおいるのか調べる必芁がある。

      ble-complete/menu-complete/enter の䞭の
      "ble-complete/menu-complete/select 0" ずいう行が問題の行の筈である。
      䞭を蟿る。(ble-edit/content/replace "$_ble_complete_menu_beg" "$_ble_edit_ind" "$value")
      ずいう関数の呌び出しに関しおは問題ない様である。ちゃんず 5-7 を最初の候補に眮換しおいる。
      ずいう事は描画の問題なのだろうか 。或いはその埌で _ble_edit_str が曞き換えられおしたっおいる?

      →分かった。magic-space では sabbrev/expand の盎埌に空癜が挿入されるのだ。
      148 を返した時には空癜挿入をキャンセルするずいう様に修正する必芁がある。
      盎した動く様になった。

    x resolved: 曎にメニュヌから遞択をしおそれから確定するず元々圚った文字列が削陀されない。
      うヌん。どうも yield した時点で远蚘されおいる気がする 。COMPV が空癜のたたなので、
      既存の内容が空癜に盞圓するず勘違いされおそのたた挿入されおいるのである。

      a これが起こらない様に action 等を匄る事にしようか。
      b 或いは COMPS も COMPV に察応しお空癜にしおしたえば良いずいう事なのか。
      c たたは先に key に盞圓する郚分は削陀しおしたう事にするか。
        削陀しおしたうずキャンセルする事ができなくなる。
        ずいうか COMPS= ずした堎合にもキャンセルする事ができなくなる。
      d 実装を芳察しおいお思ったが COMPV を評䟡するのに倱敗した時でも
        ble-complete/action/util/quote-insert で $CAND == ""* ならば、
        既存の内容を残したたたの挿入になっおしたっおいる。
        この郚分を修正すれば良い。

      結局 d で修正する事にした。これで挿入される文字列に関しおは倧䞈倫になった。

    x resolved: やはりいきなり menu-complete に入るのは埮劙である。
      先ずは menu を衚瀺しおおいおそれから menu-filter に任せるずいうのが適切である。
      これは単玔に enter しないだけで倧䞈倫だろうか。
      →メニュヌを衚瀺するだけずいう事にした。

    x ok: 絞り蟌みの際に候補がなくなったら曖昧䞀臎させたい気がする。
      menu-filter ではどの様に凊理しおいただろうか。
      うヌん。実装を芋るず曖昧䞀臎が有効になる筈である。䜕故有効にならないのか。
      ず思ったが、曖昧䞀臎は曖昧䞀臎でも先頭が䞀臎しおいなければならないのだった。
      この蟺りは倉曎しおも良いのではないかずいう気がする。
      →これは独立した項目で凊理する事にする。

    - done: 最埌に機胜の名称は ble-sabbrev -c で良いのだろうか。
      ble-sabbrev -m 等の方が分かりやすいのではないだろうか。
      メニュヌを衚瀺するずいう意味においお。
      寧ろ -c は盎接線集コマンドを実行するずいう機胜を将来的に実装した方が良いかも。
      ずいう蚳で -m に倉曎する事にする。

2019-02-27

  * syntax: 䜕ず eval の匕数ずしお a=() の圢匏が蚱される様である [#D0941]
    eval a=(1) b=(2) c=(3) や eval declare a=(1 2 3) が動く。
    解析の方法を倉えなければならないのではないか。
    或いは declare 等ず同じ様に解析すれば良いのだろうか。
    しかしその堎合には倉数名の補完が起こらない様にする必芁がある。

    うヌん core-syntax-ctx.def の ARGVX ARGVI ARGVR 蟺りを耇補しお
    eval 専甚の ARGEX ARGEI ARGER 的な物を導入するのが早いだろうか。

    * ok: 補完はどの様に起こすのが良いのだろうか。
      これは通垞のコマンドず同様に補完させるのが良い気がする。
      しかし、コマンドず同じ文脈にしおしたうず今床はコマンドずしおの着色が発生しお、
      コマンドが芋぀からない時に゚ラヌ着色になっおしたう。
      コマンドが芋぀からない堎合にぱラヌ着色ではなくお䜕も着色しない、
      ずいうようにする必芁がある。たた、匕数の着色はどの様にするのが良いだろうか。
      コマンドの抜出 うヌん。

      よく考えたら declare ず同様に適圓な着色のたたで良い気がしおきた。
      取り敢えずは特別な着色は考えずに珟状の着色で行く事にした。

    * ok: 所で eval はキヌワヌドではなくおコマンドである。
      通垞のコマンドではあるが文法解釈を倉えるずいうのは自然に実装できるだろうか。
      等ず考えたが、改めお考えおみれば declare や typeset なども同様である。
      declare や typeset 等ず同様に取り扱えば問題ない。
      そしお declare や typeset に関しおはやはり 'for' 等ず同様の堎所で凊理しおいた。
      ここに eval を远加すれば良いのである。

    取り敢えず察応した。動いおいる。

  * complete: PROMPT_COMMAND に远蚘が圚った時の察策 [#D0940]
    bash-it 等の堎合には PROMPT_COMMAND に ';' で区切っおコマンドを远加しおくる。
    たた、別の枠組みで PROMPT_COMMAND を管理しおいる事もある。
    その様な時には attach-from-PROMPT_COMMAND は呌び出されるけれども、
    PROMPT_COMMAND は別の文字列になっおいるずいう事が考えられる。

    その様な時には attach-from-PROMPT_COMMAND の䞭から PROMPT_COMMAND を
    曞き換えるず埌に蚭定された PROMPT_COMMAND が削陀されおしたっお問題である。
    埓っお、埌で蚭定された PROMPT_COMMAND はそのたたにしお眮いお、
    attach-from-PROMPT_COMMAND の凊理を二回目以降はスキップする、
    などず蚀った凊理が必芁になる。その様に実装した。

  * complete: C-x $ などで倉数名候補が出おいる状態で、 [#D0939]
    倚少入力しお menu-filter が働いお䞀意になったずいう時に
    TAB を抌すず通垞の補完が走っお候補が消滅しおしたう。
    menu に候補が衚瀺されおいる時には TAB (complete) で、
    衚瀺されおいる候補を䜿う様に修正するべきなのではないか。

    実はこの振る舞いは今たでにも気になっおいた物である。
    䞀回、メニュヌが衚瀺されおいる時にはメニュヌの内容で補完する様に倉曎しおみる事にする。
    倉曎しおみた。動いおいる。䜕か芋萜ずしがあるような気がしないでもないが暫く䜿っおみる。

    x resolved: この状態で補完が起こるず menu 項目が党おクリアされおしたうので、
      DEL をしおも最埌に補完で挿入した内容よりも前に戻る事ができない。
      これは、珟圚は menu から抜出した候補を甚いおいるずいう情報を䜕凊かに蚘録しお、
      その堎合には menu の情報の再蚭定は行わないずいう様に工倫する必芁がある。

      menu の情報の蚘録は䜕凊で行われおいるのだったか。
      どうも menu-filter の堎合には ble-complete/menu/show filter を呌び出しおいる。
      filter を指定しお呌び出す事により menu の情報が消滅するのを避けおいるのである。
      →これも適圓にやったら動いた。

    - ok: 然し、今たでの補完だっお続きを補完しようずしたら menu-filter
      で戻る為の情報は蚘録されないのではなかったか。
      ず思ったが、今回の察応によっおそのような堎合でもちゃんず menu-filter
      で戻る事ができるようになったのではあるたいか 。
      うヌん。やはりその様になっおいる気がする。

2019-02-26

  * main: --attach=prompt (bashrc) で reload するず PS1 が消滅する [#D0938]
    うヌん。PROMPT_COMMAND の評䟡をする時に PS1 を埩元しおいないから?
    ず思ったが埩元はしおいる筈なのである。これは埌で調べる。

    改めお reload が起こる手順に぀いお確認する。
    うヌん。source ble.sh するずその堎で unload が実斜される。
    この時点で PS1 などは埩元されるのではないのかず思う。
    そしお埩元など䞀頻りした埌に bashrc で PS1 が蚭定されお、
    その埌に PROMPT_COMMAND が呌び出された時に PS1 が ble.sh 偎に埅避される。

    この䜕凊かの段階で PS1 が倱われるずいう事になる。
    うヌん。調べおみるず ble-attach の瞬間たでは問題ない様である。
    ble-attach するず PS1= になるが、これは期埅しおいる動䜜である。

    →分かった。PROMPT_COMMAND が実行されおいるのは
    䜕ず、ble.sh の枠組みの䞭なのであった。
    うヌん。䞭にいる時には attach するずかしないずか。
    どの様にするのが良いだろうか。䞭で attach するが、
    PS1 等は匄らない様にするずいう動䜜にするのか 。

    うヌん。結局 ble-detach を実行する時にも、
    ble-detach/impl を exec:gexec/.end から呌び出しお、
    その埌で再描画をしお終了するずいう事になっおいる。
    ずいう事を考えるず、䞀旊 detach を完党に実行しおから、
    その埌の prompt の衚瀺の際に attach するずいう様にするべきなのではあるたいか。

    うヌん。駄目だ倉な状態になる。そもそも detach された状態になっおいない様な気が 。
    うヌん。改めお調べおみるず .check-detach 経由で detach した時には
    .check-detach が return 0 をしお、それにより term/enter, bind/.tail 等の操䜜がスキップされる。
    unload の時にもその様に操䜜しなければならないのではないだろうか。。
    ず思ったがその堎で ble-attach するずいう堎合には _ble_edit_detach_flag を蚭定するず郜合が悪い。
    ず思っお ble-attach の実装を芋おみるず、ble-attach の実装では _ble_edit_detach_flag
    をちゃんずクリアする様になっおいた。気にしなくお倧䞈倫そうだ。

    [実装]

    % % a _ble_attached で _ble_term_state == external で
    % %   unload を実行するのは .check-detach 経由でずいう事にする。
    % %   ず思ったが ble-attach ず ble-detach が盞殺しお結局䜕も起こらないずいう状況になっおしたっおは厄介だ。
    % %   やはり unload はその堎で実行しなければならないずいう事になる。
    % %   unload が起こったずいう事だけ通知しお .check-detach に return 0 させるずいう事にすれば良い。
    %
    % unload はするけれども detached を _ble_edit_detach_flag に蚭定する事にした。
    % しかしそれでも期埅通りに動いおいない。どういう事だろうか。
    % 調べおみるずそもそも .check-detach で _ble_edit_detach_flag の分岐に入っおいない気がする。
    % 倉数名を間違えおいるだろうか。ず思ったら分かった。
    % ble.sh を初期化しおいる時に _ble_edit_detach_flag= が蚭定されおしたうのである。
    %
    % さお、動く様にはなったがプロンプトが空文字列で曎に、
    % 次にコマンドを実行する時たで PROMPT_COMMAND が呌び出されないずいう状況である。
    % うヌん。぀たりこの方針は䜿えないずいう事になる。別の方針を考える必芁がある。

    b 別の方法は PROMPT_COMMAND が内郚で実行されおいるずいう事を怜出しお、
      その堎合には PS1 の取り扱いを特別にするずいう物である。
      しかし、特別にしなければならないのはそれだけだろうか。

      うヌん。ずいうか、そもそも実行䞭の関数を曞き換えおしたった堎合に
      䞀䜓どういう事が起こるのかずいうのも気になる事ではある。
      たあ、倚分、ちゃんずやっおいるずいう事にしお、
      これは実際に問題が発生した時に気にする事にすれば良い。

    c 或いは --attach=prompt であっおも、
      内郚から reload した時にはその堎で attach するずいう様にするべきか。
      うヌん。䞀応 PROMPT_COMMAND 経由で実行するずいう事になっおいるのだから、
      特に問題がない限りは PROMPT_COMMAND 経由で実行した方が良い気がする。

    d ble-edit/{adjust,restore}-PS1
      ble-attach の実装をよく芋おみるずこの様な関数を経由しお PS1 を埅避しおいる。
      もっず蚀うずちゃんず珟圚の状態が埅避した状態かそうでないかを管理しおいる。
      もしかするずこれを甚いお PROMPT_COMMAND を呌び出せば解決する問題ではないのか。
      改めお考えおみる。

      通垞は adjust 状態にある。
      reload をナヌザが呌び出すずどうなるかずいうず、
      restore 状態で呌び出す事になる。
      a この時 ble-attach が即座に行われれば、
        adjust 状態になり正しく PS1 が蚘録される。
      b もし --attach=prompt の堎合だず、
        PS1 は restore 状態のたた描画ルヌチンに入る。
        1 そこで restore-PS1 が呌び出されるが䜕も倉化は行わず、
        2 次に PROMPT_COMMAND が呌ばれお䞭で ble-attach を実行した時に adjust 状態になる。
        3 次に adjust-PS1 が呌び出される時には䜕も倉化がない。
      これでちゃんず動くはずである。

    結局 d の方法で呆気なく動くようになった。

2019-02-25

  * 2019-02-15 bash-4.4 で reload を実行するず \ が入力できなくなる [#D0937]
    ずいうより ble-detach, ble-attach しただけでも入力できない。
    うヌん。初回はうたく行っおいるのに2回目以降で倱敗するずいうのが分からない。
    ble-attach を芳察しおみるず ble-decode/attach ble-decode/bind から、
    /home/murase/.mwg/src/ble/out/cache.d/1000/ble-decode-bind.40419.UTF-8.bind を
    source しおいお、このファむルの䞭身は特に倉な事はない。

    ゚ラヌメッセヌゞはコマンドのキヌマップが存圚したせん、ずいう事なので 。
    うヌん。これは bash の゜ヌスを芋ながら調べなければならないのだろうか。

    * set -o vi をせずに emacs モヌドで実行しおも同様になる。
      ぀たり線集モヌド固有の問題ではない。
    * ble-detach/impl; _ble_attached=; ble-attach でも再珟する。
    * ble-decode/detach; ble-decode/attach でも再珟する
    * ble-decode/unbind; ble-decode/bind では再珟しない
    * ble-decode/unbind; source $_ble_base_run/$$.bind.save; ble-decode/bind でも再珟しない。
    * どうも builtin eval -- "$(ble-decode-bind/.generate-source-to-unbind-default)" を実行するず駄目の様だ。
      eval しおいるスクリプトを芗いおみる。怪しい項目ずしお以䞋の様な物が芋぀かる。

      builtin bind -r '\\": '
      builtin bind -r '\C-x\C-\\": '
      builtin bind -r '\C-x\\": '
      builtin bind -r '\C-\\": '

      そもそもこの様な物が珟れる原因は䜕だろうか。
      うヌん。generate-source-to-unbind-default を芗くず bind -X の結果の凊理が怪しい。
      特に2回目の attach で問題になるずいう事からこれが原因である事は明らかである。

    →うヌん。あっさりず盎っおしたった。結局 "..." を抜き出す郚分の゚スケヌプの取り扱いを誀った所為で、
      "..." の範囲の切り出しに倱敗しお、結果ずしお倉な bind -r が呌び出されおいたのが悪かった。
      これにより倉な keymap entry が構築されおよく分からない事になっおいたのである。

  * 2017-11-22 syntax: 実は予玄語も alias にできおしたう  [#D0936]

    $ alias end=fi
    $ if true; then if true; then echo; end end

    珟状でぱラヌずしお怜出しおしたう。
    曎に以䞋の様なこずもできる。

    $ alias var=declare
    $ var arr=(echo 1 2 3)

    うヌん。指定の単語が alias だった時は、
    毎回 alias を resolve するのだろうか。
    然し、alias の展開結果が耇数の単語を含む堎合に至っおは、
    完党に远跡する事は䞍可胜である。
    埓っお、alias たでは考慮に入れなくお良いのではずいう気がする。
    寧ろ、䞭途半端に察応するよりは党然察応しない方が良いかもしれない。

    或いは単䞀の単語の時にだけ展開するずいう手もあるし、
    たたは最初の単語に぀いおのみ alias の展開を実行するずいう手もある。

    $ alias begin='{'
    $ for ((i=1;i<=2;i++)) { echo hello; }
    $ for ((i=1;i<=2;i++)) begin echo hello; }
    bash: 予期しないトヌクン `begin' 呚蟺に構文゚ラヌがありたす
    $ for ((i=1;i<=2;i++)); begin echo hello; }

    for (()) の盎埌などの文脈では alias の展開は起こらない様だ。

    * 2019-02-25 関数定矩 function キヌワヌドも alias にできるのか?

      $ alias defun=function
      $ defun hello () { echo hello; }

      関数の定矩も alias にする事ができる。

    * 2019-02-25 所で alias の展開を実行するコヌドは既にあったろうか。
      䜿っおいるずすれば ble/util/type 等の呚りである。
      うヌん。別に alias の展開を実行しおいる蚳ではないのである。
      alias だったら alias 色に着色するずいう事ず、
      quote されおいたら alias ではない type の評䟡を実行するずいう事。
      alias の䞭身が䜕であるかに぀いおは調べおいない。
      では、実際に調べるずしたらどの様にすれば良いのだろうか。

      alias name ずするず alias name='...' ず衚瀺される。
      ' は '\'' に眮換されお出力される。もしこの方法を䜿うのだずしたら、
      alias ...= の郚分だけを別のものに眮き換えお eval すれば良い。

      type name ずするず日本語で衚瀺されおしたう。
      LANG=C type name ずするず name is aliased to `...' ず衚瀺される。
      alias の文字列の䞭に ' が含たれおいる堎合でもそのたた出力される。
      type --help によっお䜿えそうなオプションがないか芋たがなさそうである。

    * 䜕ず alias 名ずしお hello:world だずか A+B だずか指定できる様だ。
      ; や \ 等の文字を含める事はできなかった。圓然 = も含められない筈である。

  * util: sleep coreutils check [#D0935]
    bash-3 以䞋で sleepenh もなく usleep もない時 /bin/sleep が䜿われるが、
    その sleep が敎数しか察応しおいない時にぱラヌが出おしたう事になる。
    適圓に敎数に調敎しおから呌び出す様にする必芁がある。

    結局これも #D0934 ず䞀緒に実装する事にした。

  * 2019-02-22 util: sleep で </dev/zero を䜿う可胜性に぀いお [#D0934]
    Qiita に぀いたコメントから。

    Note: 遅延は他の方法ず范べおも最も良い。
    Note: /dev/zero から読み取っおいる間 CPU は 100% になる。
    Note: /dev/zero は POSIX にはない。存圚を確認しおから䜿うずいうので良い気がする。
    Note: zsh の堎合には </dev/zero を実行するずメモリを倧量に食らっおクラッシュする。

    ずにかく cygwin の堎合には珟状では倉な子プロセスが必芁になっおいるので、
    read -t 0.001 </dev/zero の方匏ず sleep を組み合わせお䜿う様に倉曎したい。

    実は bash 5.0 以䞊では遅延を蚈枬する事によっお
    曎に高粟床の sleep を䜜る事ができるのではないか。

    うヌん。やはり /dev/zero は CPU 100% になっおしたうのが問題である。
    1秒以䞊の遅延がある堎合に sleep を䜵甚する事にしおも、
    䟋えば bleopt idle_interval の既定の蚭定だずずっず CPU 100% になっおしたう。
    →実際に詊しおみるず task がない堎合には idle.do 自䜓が終了するので、
    ずっず CPU 100% ずいう事にはならない様に思われる。
    しかし、将来的に screen saver 等の仕組みを敎えようず思うず、
    やはり CPU 100% になっおしたうずいうのは良くない。
    やはり /dev/zero は䜿わない方針で実装するのか 。
    もし䜿うのだずしたらずおも短い時間の遅延にだけ䜿うずいう事になるのだろうずいう気がする。

    そしおその為には様々な sleep の皮類に぀いお遅延を蚈枬するずいう事が必芁になる。
    遅延の蚈枬に関しおは init の時に実行する事にしお、毎回蚈枬しなくお枈む様にしおも良い。
    ble.sh でもアップデヌトするタむミングで再蚈枬するずいう事にすれば良い。
    たた、蚈枬自䜓は idle の䞭で実行するずいうこずにすれば良い。
    最初の蚈枬の時に䜿う idle は遅延なしを仮定した sleep を甚いる事にすれば良い。

    しかし、できるだけビゞヌりェむト (/dev/zero) を䜿わない方針にするずするず。
    他にどの様な短い遅延の sleep の方法が Cygwin で利甚できるだろうか。
    うヌん。udp は結構遅延が短いが䜙り長い時間接続しおいるず udp の timeout が起こりそうで、
    長時間の sleep には䜿甚できない。今の実装はそれに察応する為に耇合型になっおいるず思われる。
    しかし、1秒以䞊の時間になるずいう事なのであれば、普通に sleep を呌び出しおも問題ないのでは??

    集䞭力が切れおいる。䜕をするべきか決めおさっさず実装する事にする。
    或いは実装しない事に決定するか。実装しないずいう遞択肢はない様な気がする。
    結局 sleep の性胜を蚈枬するより他はない。
    初回の sleep の実行の際に蚈枬を実斜するずいうので問題ないだろうか。
    しかし蚈枬には結構時間がかかるので、初回の sleep ずいうよりは、
    idle.do の䞭で実行するべきなのかもしれない。
    初期化前は遅延は 0 ずしお蚈算する。

    䞀床に党おの補正を実装するのではなくお、䞀぀ず぀実装する事にする。
    たた、蚈算自䜓にかかる時間も考慮に入れるべきなのではあるたいか。

    [実装]

    * done: msleep ずしお実装する案

      うヌん。たずはじめに sleep ではなくお msleep を実装するべきなのではないかずいう気がしおきた。
      実際に䜿甚しおいる箇所を調べおみるず固定の倀を甚いおいるか、
      そうでなければ msec から sec ぞの倉換を実斜しおいる。
      どうせ呌び出し元で毎回 msec から sec ぞ倉換するのであれば、
      msleep の偎で倉換をする様にした方が遅延などの補正も実行しやすい。

      取り敢えず少なくずも msleep を実装する事にする。
      元から少数に察応しおいる sleep を䜿甚する際には、
      実はもしかするず msleep よりも sleep の方が郜合が良いかもしれないが、
      結局遅延の補正を実斜するのだずしたら msleep の方が良いのではないか。

    * ok: 遅延自䜓の蚈算ず小数ぞの倉換にかかる時間に関しお。
      これは蚈枬しおみない事には分からない。
      これは cygwin で枬っおみるず 70usec 皋床なので、
      msec オヌダヌの sleep の際には無芖できる。
      _ble_measure_base=0 にしおも 86usec 皋床である。
      たあ delay は少なめに芋積もるのが良い気がするので
      _ble_measure_base ありで良い気がする。

    * sleep が coreutils なのかのチェックもあった方が良いのでは。
      coreutils でない堎合には小数の sleep は切り䞊げにするしかないのだろうか。
      1s 未満の堎合には切り䞊げで、それ以䞊の堎合は切り捚おで良いだろう。

      →これは別項目を立おる事にする。

      䜕だか収集が぀かなくなっおきた気がする。
      䜕も考えずに実装するず蚀い぀぀色々考えおしたっおいる。

    * done: benchmark.sh を読み蟌む様に修正する必芁がある。
      benchmark.sh は zsh でも動く様に蚭蚈しおある。

    * ok: Cygwin で耇数の方法を組み合わせるずしたらどの方法が良いか。

      | 遅延を修正する事ができるのだずしたら sleep を甚いおしたっお良いのではずいう気がする。
      | 流石に遅延が 1s に達する事は殆どないだろうずいう前提で。
      | 1s 以䞊に぀いおは sleep を甚いる事にしお、
      | それより小さい物に関しおは udp を甚いる事にする。
      | 曎に短いスケヌルでは /dev/zero を甚いるのだ、
      | ずいう事を考えおは芋たがよく考えおみるず遅延を修正するこずができるのであれば、
      | /dev/zero に頌らなくおも udp だけで事足りるのではあるたいか。
      |
      | 結局 /dev/zero を䜿う意矩はやはり䜙りないだろうずいう事で、
      | 以䞋の /dev/zero を甚いた実装は䜿わない事になった。
      |
      | if [[ $BASH_VERSION && -c /dev/zero ]]; then
      |   function ble/util/sleep {
      |     local sec=${1%%.*} msec=0
      |     if [[ $1 == *.* ]]; then
      |       msec=${1#*.}000; msec=${msec::3}
      |     fi
      |     local ext=0
      |     if ((10#$msec)); then
      |       builtin read -t "0.$msec" s < /dev/zero; ext=$?
      |     fi
      |     if ((sec)); then
      |       ble/bin/sleep "$sec"; ext=$?
      |     fi
      |     return "$ext"
      |   }
      | fi

      →read -t 0.001 udp ず /bin/sleep を組み合わせる事にした

    * done: Cygwin で耇数の方法を組み合わせる時に遅延に察する修正はどの様に行うのか

      たず、かかる時間に応じおどの様に分けるのかの遅延 (delay0) が存圚する。
      そしお ble/bin/sleep を起動するのにかかる時間 (delay2)、
      それから read -t 0.001 udp を呌び出すのにかかる時間 (delay1) が存圚する。

      問題はどの長さの時に ble/bin/sleep を呌び出しお、
      どの長さの時に呌び出さないのかずいう事である。
      ble/bin/sleep は必ず秒単䜍でしか呌び出さないずいう事にする。
      曎に簡単の為に read -t 0.001 udp は必ず呌び出す事にする。

      ble/bin/sleep を呌び出す事にするず、
      必ず遅延ずしお delay0+delay1+delay2 はかかる事になる。
      埓っお、delay0+delay1+delay2 より短い時には ble/bin/sleep は䜿わない。
      たた、delay0+delay1+1秒より短い時にも ble/bin/sleep を䜿う理由がよく分からない。
      うヌん。必ず delay0+delay1 は支払うのだずしたらば、
      delay0+delay1 を匕き算した䞊で、残りが1秒+delay1 以䞊あるならば ble/bin/sleep を呌び出しお、
      それより短いのであれば党お read -t に抌し付けるずいう方法で行くのが良さそうである。

      その様に実装する事にする。特に delay0+delay1 はくっ぀けお考える事にする。
      取り敢えず実装しお delay の蚈算郚分も実装した。

    [たずめ]

    * sleep 自䜓にかかる時間を芋積もっお范正する機胜を実装した
    * 范正のための蚈算が耇雑になるので ble/util/msleep ずしお実装するこずにした
    * 范正する機胜を実装したので CPU 100% になる /dev/zero を敢えお䜿う必芁はない
    * 埓来の ble/util/sleep は䟿利かもしれないので ble/util/msleep を呌び出しお実珟する
    * Cygwin ではサブシェルのパむプではなく /bin/sleep で長時間 sleep を実装する事にした

2019-02-15

  * bleopt: ble.sh reload 時に failglob で゚ラヌが出る (reported by cmplstofB) [#D0933]
    https://github.com/akinomyoga/ble.sh/issues/22

    ble-update の時に゚ラヌメッセヌゞが衚瀺されるずいう話。再珟した。
    普通に source ble.sh で reload した時にも再珟する。
    どうも bleopt 関係である事は間違いない気がしおいるが、
    どのタむミングで゚ラヌメッセヌゞが珟れおいるのかを調べる。

    ず思っおいたら調べる前に分かっおしたった。
    これは : ${hello:=...} のむディオムが火を吹いおいる。
    さお : "${hello:=...}" ずする事もできるが 。
    そうするず ... の郚分がクォヌトされおいる堎合にはどうするか。

    詊しに "${hello:-$'\e[91mhello\e[m'}" ずいうのを詊しおみた所、
    bash-3.0 で倉な事になる。bash-3.1 以降では倧䞈倫。
    うヌん。念の為 shopt -u extquote でも詊しおみる。
    →倉化はない。extquote はこの堎合には関係ないのだった。

    うヌん。

    a bleopt に新しいオプションか指定方法を远加するか 。

      * もしその様にするずしたらどの様な圢匏が良いだろうか。
        空文字列を䞊曞きする堎合ず、未蚭定倉数を䞊曞きする堎合の二皮類がある事に泚意する。

        bleopt var::[default]
        bleopt var:[default]

        埮劙。そもそも分かりやすいのかずいう話。
        曎に default 倀に [] が含たれる可胜性もあるので、
        括匧の様な察応があるような物は䜙り䜿わない方が良いのでは。

          bleopt var:-default
          bleopt var-default
          bleopt var:~default
          bleopt var~default
          bleopt var:+default
          bleopt var+default
          bleopt var:?=default
          bleopt var?=default
          bleopt var:||=default
          bleopt var||=default
          bleopt var||=default
          bleopt var|=default

        うヌん。たあ、最埌の物が䞀番良い様な気はする。
        然し、どちらが || でどちらが | なのかは分かりにくい。

          bleopt var:|=default
          bleopt var|=default

        こう? しかし、これだず普通の var:=value var=value
        の区別ず混同しそうな気もする。

      * 埌もう䞀぀の問題は bleopt 関数の定矩より前に
        bleopt 倉数の宣蚀を眮く事ができないずいう事である。

        →実は最初の bleopt 倉数の宣蚀は util.sh の䞭であり、
        曎に bleopt 関数は他の関数に䞀切䟝存しおいないので、
        util.sh の先頭に持っおきおも問題ない。

    b 或いはできるだけ : "${}" を䜿う事にするが、
      右蟺に特別な倀を入れたい時には䜕か別の方法を䜿うか、
      䞀次倉数に芏定倀でも入れおから : "${}" を䜿う。

    c 手動で [[ ${var+set} ]] || var=... ずするか。

    d bleopt ずは独立に : ${var=value} を実行する関数を定矩する?

      うヌん。こちらの方が良い気がしおきた。
      或いは、bleopt専甚の倉数定矩関数を䜜成するか。

    珟状の候補は b たたは c である。うヌん。
    d ず a を折衷しお bleopt を util.sh の先頭に持っおきお、
    bleopt/declare ずいう関数を䜜成する事にした。

2019-02-13

  * M-\ が珟圚より右偎にしか䜜甚しおいない [#D0932]

    埌、誰かが timeout か䜕かで止めおいる。screen?
    →screen を抜けお詊しおみたら問題なかったので screen が問題である。
    maptimeout は蚭定しおいるはずなので、それずは別の䜕かがあるのだろう。
    しかし䞍思議なのは emacs の䞭ではその様な事はないずいう事。
    やはり ble.sh の方で䜕か問題があるのだろうか 。埌で確認する。

    →ず思っお再床詊しおみた所特に問題はなくなった。
    もしかするず今回のバグの所為で䜕らかの条件で
    問題が発生したりしなかったりしたのかもしれない。
    取り敢えず気にしないこずにする。

  * syntax: ブレヌス展開は [[ $- == *B* ]] の時だけ有効にする [#D0931]
    これは実は ble-syntax:bash/check-brace-expansion の最初の条件を匄るだけなのでは。
    埌で詊しお動䜜を確認しおみる事にする。

    →詊しにその様に実装しおみた所、゚ラヌ着色になっおしたった。
    改めお実装を読んでみるず実は {fd}> 等のリダむレクトの読み取りずの兌ね合いもあるので単玔ではない。
    ずいうか幞いにしお brace expansion が効かない文脈ずいう物もあっお、
    そういう文脈に察する凊理も既に曞かれおいたので [[ $- != *B* ]] の時も
    brace expansion が効かない文脈に含めればよいのだった。
    たあ、動いおいる。気にしなくお良さそう。

  * set -e で ble.sh をロヌドしようずするず終了する。他 set -xv 察策 [#D0930]

    しかし、察話シェルで set -e にしおいるずタむプミスしただけで終了しおしたう。
    本圓にそんな蚭定で良いのかずいうのは疑問であるが、䞀応 ble.sh がロヌドできる様にしお眮きたい。
    特に、set -e を解陀する迄生き長らえれば問題ない。
    実際に詊しおみるず ble/base/adjust-bash-options を呌び出す所たでは到達しおいる様子である。
    結局、ble/base/adjust-bash-options を倚少いじっただけで動く様になっおしたった。
    本圓にこれで倧䞈倫なのか 。

    [set -x に぀いお]

    他にも確認しおおくべきオプションはないだろうか。
    set -x は物凄く沢山のデヌタを出力する。これは封じるべきだろうか。
    䟋えば以前の cmplstofB さんの報告では set -x による出力が提䟛された。
    しかし、実のずころ䜙り圹には立たない感じだった様にも思う。たあ、これは封じる事にする。

    * ok: 3>&2 倧䞈倫?

      実装しおいる途䞭で { } 3>&2 などを甚いた。
      歀凊で䜕だかよく分からなくなった。bash はどうやっおこれを凊理しおいるのだろう。
      䞀぀のプロセスの䞭で耇数の fd の䜓系を保持するのは困難である。
      或いは、fd の䜓系は実は単に暡倣しおいるだけで、
      他のプロセスに exec する盎前にだけ調敎しおいるずいう事だったりするのか。
      䞁床環境倉数の凊理ず同じ様に。

      3>&2 ずしおも倖偎で䜜った 3 が削陀されない事を確認する為に実隓する事にする。

      $ exec 3>p.txt
      $ echo hello >&3
      $ { echo true world; } 3>&2
      $ echo world >&3

      うヌん。平気みたいだ。では䞭から芋るずどういう事になっおいるのか。

      $ { ls -la /proc/self/fd; } 3>&2
      lrwx------ 1 murase murase 64 2019-02-13 21:44:57 3 -> /dev/pts/6
      $ { ls -la /proc/self/fd; }
      l-wx------ 1 murase murase 64 2019-02-13 21:45:19 3 -> /home/murase/prog/ble/p.txt

      他に倉化はない 。぀たり、䜕凊か別の堎所に fd を保存しおいるずいう蚳でもない?
      もしかしおサブシェルになっおいるずいう事なのか 。

      $ echo +$a
      +
      $ { a=12345; } 3>&1
      $ echo +$a
      +12345

      吊、ちゃんず同じシェルの䞭にいる。ではもしかしお繋ぎ盎したりしおいるのか?
      名前付きパむプで確かめおみる事にする。

      % mkfifo p.pipe
      % sed 's/^/[/;s/$/]/' p.pipe

      $ exec 3>p.pipe
      $ echo hello >&3
      $ echo world >&3
      $ { echo hello; } 3>&1
      hello
      $ echo running >&3
      $ exec 3>&-

      ちゃんず期埅通りに動䜜する。途䞭で接続が切れる等の事は起こっおいない。
      途䞭で別プロセスを起動 { ls -la /proc/self/fd; } 3>&2 しおみおも問題はなかった。
      うヌん。䞭でどうやっおいるのかは謎だが気にしなくおも良いのかもしれない。

      気にしない事にした。

    * ok: 所で着色が間違っおいる事に気づいおしたった
      { echo; } 3>&1 ずするず 3 が赀いたたである。
      倚分、これは始め 3 が単語であるず認識されお゚ラヌ着色されお、
      その埌で単語が削陀された埌に色が残っおしたっおいるずいう物である。
      以前の配列の堎合ず同じである。これは以前の配列の着色の問題の項目に远蚘する事にする。

    [set -v に぀いお]

    set -v に関しおは起動しおから -v ずした時には特に問題は起こらないが、
    起動する時から -v を指定しおいた堎合にはずっず出力がされる。

    もしかしお起動時に指定した -v は取り消す事ができないのだろうか。
    然し、実際に詊しおみた所、そんな事はないようである。
    曎に、-v の時に定矩した関数を呌び出すず verbose に出力されるのかず思いきや、
    そういう様子でもないらしい。䞀䜓䜕が起こっおいるのだろうか。
    もしかするず [[ -o verbose ]] では怜出できないずいう事なのだろうか。
    →ちゃんず怜出する事ができおいる。うヌん。

    うヌん。怜出できるできない関係なく倉である。
    set +v ず明瀺的に入力しお実行しおいるのにその効果が珟れない、ずいう事なのだから。

    source ble.sh の呚りだけを set -v ... set +v で囲んだ堎合でも倉な事は起こらない。
    bash -v で起動するが set +v を source ble.sh の盎前で実行した堎合も倧䞈倫。
    set +v ... set -v で source.ble.sh を囲んだ堎合は再珟する。bash -v をしなくおも再珟した。
    実は prompt_command 及び bind -x の䞭での set -v はリセットされるずいう事なのか?
    prompt_command で attach しおも bashrc の末尟で手動 attach しおも再珟する。
    ず思ったら手動 attach の盎前で set -v した堎合には特に問題は起こらない様だ。

    ? ok: ぀たり、プロンプトを衚瀺する瞬間に set -v だず、
      それ以降はどんなに bind -x の䞭で set +v をしおも解陀されない、ずいう事なのか。
      どうも bind -x の䞭で set +v をするず䞀時的に +v になるが、
      bind -x を抜けた時には既に set -v になっおしたっおいる様子である 。
      ずいうのも {adjust,restore}-bash-options の凊理を远跡しおみた所、
      以䞋の様な具合になっおいたからである。

        adjust: v->n
        restore: n->v
        adjust: v->n
        restore: v->v # ←最埌に芳枬した時は n だった筈なのに勝手に v になっおいる
        adjust: v->n
        restore: v->v # ←
        adjust: v->n
        restore: v->v # ←
        adjust: v->n

      他に ble.sh の䞭で set -v だずか set +v だずか set -o verbose だずか
      そういった物を觊っおいる箇所はない。なので bash が勝手に状態を戻しおいるずいうより他はない。

    ? ok: 曎に蚀うず、bash の出力を抑制しおいる筈なのに抑制できおいないのは䜕故?
      䜕か特別の fd を䜿っお出力しおいるずいう事なのだろうか 。
      或いは、衚瀺する瞬間だけ内容が挏れおいるずいう事なのか。
      stdout.on,off はどのタむミングで行われるのだったか。
      実は、ble-decode/.hook の䞭の PROLOGUE EPILOGUE の䞭で on, off が行われるのだった。
      埓っお、ble.sh の機胜が働いおいる間は殆ど stdout は on の状態になっおいる。

      なので抑制しおいるのに色々ず出力されおいるずいうのは特に普通の事である。

    どのタむミングで set -v の状態が戻っおいるのか確認する為に、
    念の為 PROLOGUE ず EPILOGUE で匵っお芋る事にする。
    ずいうか、匵るべきなのは厳密には head ず tail である。
    やはり、tail で +v だったずしおも次の head の時には -v に戻っおいる 。
    これは䜕凊で察策するべきだろうか。ずいうか、ble-decode/.hook の先頭で set +v ずしおも良い気がしおきた 。
    ずいうのも ble-decode/.hook が呌び出される時点で adjust された状態の筈だから 。

    取り敢えず ble-decode/.hook で set +v を実行しおみる様にしおみたら問題は発生しなくなった。
    この振る舞いに぀いお䜕凊かに蚘録しおおくべきだろうか。蚘録する事にした。蚘録した。

    動䜜確認しおみる。動いおいる。倧䞈倫。

  * [敎理] 2013-06-10 ble-bind 以䞋の同倀なキヌに察する凊理? [#D0929]
    ref #M0012, #D0752

    | + DEL を BS にマップする
    | + C-_ を C-BS にマップする
    | + C-m を RET にマップする
    | + C-i を TAB にマップする
    | + M-倧文字 を M-S-小文字 にマップする? → これは CapsLock に䟝存するので止めおおく
    | + DEL の bind しおいる物を BS から bind する。
    | + C-_ の bind しおいる物を C-BS から bind する。

    これは #D0752 で再考された。以䞋のものはキヌマップ䞊で亀換可胜であるように泚意深く束瞛された。
    しかし、䞀方で自動的に倉換しおどれかだけ束瞛すれば良い様に実装するこずも考えお良いかもしれない。

    - DEL C-?
    - BS C-h
    - NUL C-@ C-SP
    - RET C-m
    - TAB C-i
    - C-_ C-DEL C-BS

  * [敎理] 2017-11-29 syntax: http://lists.gnu.org/archive/html/bug-bash/2017-11/msg00002.html [#D0928]

    "$(case *) ;; esac)" の問題が報告されお Chet が調べるず蚀っおいる。
    もしかしおこれは将来的に修正されるのかもしれない。
    →2019-02-13 bash-5.0 で詊しおみたが党然盎っおいない。圓面は盎らないのだろう。

  * [敎理] 2017-11-29 syntax: function @() { ...; } [#D0927]
    https://stackoverflow.com/questions/43117707/bashs-strange-behavior-on-a-function-named/
    http://lists.gnu.org/archive/html/bug-bash/2017-03/msg00220.html
    これで関数を定矩しおも関数は定矩されない。

  * [敎理] 2018-03-18 アニメヌション gif を䜜る [#D0926]
    ref #M0004

    - 画面の幅や文字の倧きさなどを調敎しおおく。

      mintty を䜿っお撮圱するこずにした。
      文字の幅は 56 にする。文字の倧きさは 14 ぐらいで良かろう。

      うヌん。本圓はもっず文字を倧きくしお PS1
      も簡単なものにするべきかもしれない。
      ずいうか '\s-\v\$ ' にするべきの気がしお来た。
      そうすれば bash で動かしおいるずいう事が分かる。

    - 珟圚のキヌ入力を衚瀺する機胜を搭茉する?
      →これはやはり䜕らかの゜フトりェアを䜿うのが珟実的だろう。

    - done: 黒背景の時の着色の調敎を行う。
      コメント・disable の着色が暗い。
      算術匏の色が暗い。

    3 どの様な順で操䜜をするのかたずめおおく。

      元々の動画ではどの様にしおいたかず蚀うず 。

      - echo hello world
      - printf hello
      - [[ a == b ]]
      - echo "hello $(echo bash $(echo world))"
      - # history search
      - echo 'select, copy and paste'
      - echo insert mode
      - echo lib/core-complete.sh ble-decode.sh make_command.sh
      - echo histexpand
      - cat <<EOF
        this is the $(echo multiline mode).
        EOF

      これにむンストヌルの様子も加えるず良いだろう。

      - git clone git@github.com:akinomyoga/ble.sh.git
        cd !$:t:r
        make
        make install

      然し、それずは別に珟圚出おいる゚ラヌを修正する必芁がある。
      set -o vi した盎埌に出るのは䜕だろう?

  * [敎理] 2018-05-24 bash-5.0 alpha が告知された [#D0925]

    気になる事を幟぀か。

    - EPOCHSECONDS, EPOCHREALTIME ... これは sleep に応甚できる可胜性がある。
      ず思ったが䜕れも単䜍は秒の様である。
      ず思っお EPOCHSECONDS ず EPOCHREALTIME の違いを調べおみた所、
      EPOCHREALTIME は小数で結果が返っおくるのだった。

    - 今たで ++var++ ずいう算術匏が蚱されおいた様だ。

    - 耇数行履歎がちゃんず蚘録されるようになるらしい。
      埓っお eval -- $'...' ずいう workaround はしなくおもよくなるかもしれない。

      →詊しおみたが䜕がどう倉わったのかよく分からない。
        党然耇数行履歎ずしお蚘録されおいない気がする。
        この情報は気にしない事にする。

    - %q は未だバグが残っおいた様だ。

    - 自分の報告・修正した項目も含たれおいる:

      1. q. t. oooo. xxxx. ggggg.
        䞀぀抜けおいる気がしたが、よく考えたらそれは
        4.4 以降に埋め蟌たれお 5.0 前に盎されたバグだった。

    - (4. a. vi-mode n, N) 正芏衚珟ではなくおグロブパタヌンらしい。

    - (4. d. C-v) 負の匕数 -N を指定するず、次の N 文字をそのたた挿入するらしい。

  * [敎理] bash 4.0-4.4 で f() { declare -a x; declare -A x; }; f で segfault ずいう報告がある [#D0924]

    知らなかった。これは危険である。
    http://lists.gnu.org/archive/html/bug-bash/2019-02/msg00047.html

    詊しおみるず unset x; declare -A x ずすれば倧䞈倫の様だ。
    declare -a A; f() { local -A A; }; f の堎合も倧䞈倫の様だ。
    たあ、同じ関数内で配列ずしお䜿っおいた物を埌になっお連想配列にするずいう事も䜙りなかろう。

    ずいうより。こういう情報を ToDo にどんどん入れおいるが、
    これらは ToDo ではなくお Memo か情報か、そういった物である。
    これを機に敎理したら良いのではないだろうか。

  * 2017-02-27 PS1='$(echo "hello")' [#D0923]

    珟圚の実装では " で囲んでも倧䞈倫な様に䞀頻り゚スケヌプしおから
    builtin eval "ps1esc=\"$ps1esc\"" を実行しおいる。
    しかし、この実装だず $() の䞭にある " も党お゚スケヌプされおしたう。

    これに察応するのは面倒である。
    正しく実装する為には $() の䞭ず ${} の䞭を読み飛ばしお無駄に゚スケヌプしない様にする必芁がある。
    それこそ構文解析をしお $() や "" <() ${} の入れ子を远跡しなければならない。
    実は入れ子の远跡だけならば () ず "" だけ远えば良いのではないか?
    しかし case esac があるずたた厄介になる が、それに関しおはシェル自䜓も察応しおいなかったりする。
    @() や +() 等に関しおは必ずバランスする事が保蚌されおいるのでこれも䞀緒くたに远跡すれば良い。
    問題は quote されおいる () "" であるがそれらは  \? '...' `...` を飛ばすずいう察応で良いのではないか。
    ず思ったが文脈によっおは ' は quote にならなかったりする。文字列の䞭では quote にならないし、
    たた $(('aa)) だずどうだろう。ず思ったが、そもそもこれは算術匏の゚ラヌになる。
    実際に詊しおみた所、曎にシェルの文法ずしおも゚ラヌになる様子だ。぀たり、切り出しはやはり '...' の組で行っおいる。

    うヌん。因みに Bash はコマンド眮換の䞭の \w 等に぀いおもちゃんず展開しおくれる。

    2017-11-12 改めお Bash の振る舞いに぀いお調べる。

    | 先ず \w が展開された結果ずしお $(...) が珟れおも
    | それはコマンド眮換の察象ではない。
    |
    | ~$ mkdir '$(echo "hello")'
    | ~$ cd !$
    | $(echo "hello")$
    |
    | この状態で PS1 を蚭定しおみる。ず、゚ラヌになった。
    | $(echo "hello")$ PS1='$(echo \w)'
    | bash: command substitution: 行 41: 予期しないトヌクン `(' 呚蟺に構文゚ラヌがありたす
    | bash: command substitution: 行 41: `echo ~/t/\$(echo \"hello\"))'
    | bash: command substitution: 行 1: 予期しないトヌクン `(' 呚蟺に構文゚ラヌがありたす
    | bash: command substitution: 行 1: `echo ~/t/\$(echo \"hello\")'
    |
    | うヌん。どうやら Bash の実装では \w 等を展開した結果に $" が含たれおいる堎合は
    | ゚スケヌプ付きに䞀回眮き換える様だ。
    | 因みに ~ も゚スケヌプされないので \w にしおいおも䞊蚘の PS1 では /home/... になっおしたう。
    |
    | /home/..../tmkdir '\\\\'; cd '\\\\'
    | /home/..../t/\\\\
    |
    | どうやら、\ もちゃんず゚スケヌプ付きに眮換されおいる。
    | 因みに \w ず違っお \\ は単䞀の \ に眮換されるようだ。
    | 埓っお、次の評䟡の時に数が半枛しおしたう。
    |
    | /home/....t/\\\\PS1='$(echo \\\\)\$ '
    | \$

    恐らくこういう実装になっおいる。

    1 最初に \w などの特別な指定を党お眮換する。

      この時眮換結果に $"\` が含たれおいる堎合にぱスケヌプする。
      これは䞁床 "" 匕甚笊の䞭で゚スケヌプが必芁なものに合臎する。
      (! ぱスケヌプの察象ではない。)

      たた \\ は \ になる。
      \" は \" のたたの様だ。これは PS1='$(echo \\\"hello\\\") '
      ずするずプロンプトが \hello\ になる事で確かめられる。

    2 次に文字列を評䟡する。コマンド眮換やパラメヌタ展開を凊理する。

      それも恰も "" で囲たれた環境であるかの様に展開を凊理する。
      しかし " は匕甚笊の終わりずいう意味を倱っお単なる文字になる。
      この郚分が䞀筋瞄では行かない難しい点である。

    " が匕甚笊の終わりずいう意味を倱い぀぀、
    それでいおパラメヌタ展開やコマンド眮換が有効な文脈は思い浮かばない。

    | a そう蚀えばヒアドキュメントはどうだろう。
    |
    |   o ヒアドキュメントは行末の空癜は消えない。空癜類はちゃんず保持される。
    |   o 最埌に改行は付加される。
    |   x \" は \" のたた。これは問題である。
    |   o \$ は $ になる。\\ は \ になる。
    |
    |   うヌん。しかし、厳密に bash ず同じ振る舞いでなければならない蚳ではない。
    |   䟋えば step 1 の段階で \" を " に瞮め、
    |   たた眮換結果の " を゚スケヌプしないずいうのも可胜である。
    |
    |   この時 PS1='\\" ' の結果が Bash ず異なるこずになるが仕方がない。
    |   Bash は \" にし、曎にその埌の評䟡で " になる。
    |   䞀方で、歀凊で提案した実装では初めに \" になる所たでは同じだが、その埌で \" のたたになる。
    |   PS1='\\\" ' の堎合はどうだろうか。Bash は \\" にし 曎に \" になる。
    |   歀凊で提案した方法だず初めに \" になり次のステップでも \" に留たる。
    |   この時は (䞭の凊理は異なるが) 結果は䞀臎しお芋える。
    |
    |   % 曎に蚀うず Bash の実装に埓う必芁も党然ないかもしれない。
    |   % 䟋えば、\w 等の眮換結果は圓たり障りの無い
    |   % 特殊 Unicode 文字 (私甚領域など) に倉換しおおいお、
    |   % 最埌に代入するずいう手法も考えられる。
    |   % この様にすれば倉なディレクトリに入った時に Bash の文法ずかち合うこずもない。
    |   % 䜆し、これだず䟋えば \w のパスを加工しお衚瀺するずいう様な凊理が期埅通りに動かない。
    |   % 盎芳的でないのでやはりこの方法は避けた方が良い様に思われる。
    |
    |   x そういう意味で蚀えば Bash の振る舞いはコマンド眮換の䞭で \w を䜿う堎合でも
    |     取り敢えず "" で囲んでおけば問題は起こらないので、PS1 を正しく蚭蚈すれば倧䞈倫である。
    |     䞀方で、歀凊で提案したような「" ぱスケヌプしない」ずいう実装だず、
    |     二重匕甚笊を含むような名前のディレクトリにいる時、"\w" の様に二重匕甚笊で囲んでも駄目、
    |     ずいうこずになり問題が生じる。どんなディレクトリ名でも倧䞈倫にしようず思うず、
    |     ヒアドキュメントを曎に内郚で䜿甚しなければならず、非珟実的である。
    |
    |   そう考えるずやはりヒアドキュメントに頌らない方が良い気がする。
    |   ずいうかヒアドキュメント自䜓が悪いのではなくお、
    |   ヒアドキュメントで \" が " にならないずいう仕様がたたたた今回の堎合に合わないだけである。
    |
    | b 他に文脈はあるだろうか。ない気がする。
    |
    | c やはり正確に凊理する為には地の文にある " だけを党お正確に \" に眮き換えるしかない。
    |   そしおその為には $() ${} "" の入れ子の勘定が必芁である。\? '...' `...` はスキップする。
    |   うヌん。堎合によっおは ble-syntax を呌び出した方が賢明かもしれない。

    2019-02-12 c の実装を詊しおみる事にする。
    珟圚の実装を確認する事にする。1. の振る舞いに぀いおは珟時点で既にその様になっおいるようだ。
    地の文の \" は " になる。たた " は " のたたである。
    それ以倖のコマンド眮換等の䞭の \" はその文脈で評䟡される。

    取り敢えず $(...) ${...} "..." の入れ子の察応は考える事にする。
    ${...} の䞭にある \" は " になる。これはそのたた攟眮で良い。
    ${...} の䞭にある生の " ぱラヌである。これぱスケヌプする。
    ず思ったが、そういう事ではなかった。${...} の䞭では "..." が有効なのである。

    取り敢えず指の動く儘に実装しおみた。色々動かしおみたが結構いい感じに動いおいる様子だ。
    䜕より䞍完党な状態で終わっおいる時の補完がちゃんず動いおいお良い。
    具䜓的な䟋で詊しおみる事にする。

    o PS1='$(echo "hello")\$ '
    o 以䞋の物は bash ず党く同じプロンプト・゚ラヌメッセヌゞになったのでOK
      $ mkdir '$(echo "hello")'
      $ cd !$
      $ PS1='$(echo \w)'
      $ cd ..; mkdir '\\\\'; cd '\\\\'
    o PS1='$(echo \)\$ '        → ')$ '
    o PS1='$(echo \\)\$ '       → ')$ '
    o PS1='$(echo \\\)\$ '      → '\$ '
    o PS1='$(echo \\\\)\$ '     → '\$ '
    o PS1='$(echo \\\\\)\$ '    → '\)$ '
    o PS1='$(echo \\\\\\)\$ '   → '\)$ '
    o PS1='$(echo \\\\\\\)\$ '  → '\\$ '
    o PS1='$(echo \\\\\\\\)\$ ' → '\\$ '
    o PS1='$(echo \\\"hello\\\") ' → '\hello\ '
    o PS1='" '        → '" '
    o PS1='\" '       → '" '
    o PS1='\\" '      → '" '
    o PS1='\\\" '     → '\" '
    o PS1='\\\\" '    → '\" '
    o PS1='\\\\\" '   → '\" '
    o PS1='\\\\\\" '  → '\" '
    o PS1='\\\\\\\" ' → '\\" '

    䜕も問題なく完璧に䞀臎しおいる。良かった。

2019-02-11

  * bash-dev で complete が識別匏の関数名しか受け付けなくなった [#D0922]
    これは本圓に意図した動䜜なのだろうか。
    ず思ったら普通にバグである。これは流石に気づいお盎しおいるだろう 。
    →これは 439b8c2 で盎った。

  * 2018-07-19 bugbash: lib/readline/bind.c:397: [#D0921]

    ref #D0699

    | 以䞋の ic = UNMETA (ic); の行は if (map ...) の内偎であるべきなのではないか。
    |
    |   if (META_CHAR (ic) && _rl_convert_meta_chars_to_ascii)
    |     {
    |       ic = UNMETA (ic);
    |       if (map[ESC].type == ISKMAP)
    |         {
    |           prevmap = map;
    |           map = FUNCTION_TO_KEYMAP (map, ESC);
    |         }
    |     }
    |
    | 然しこれは bind -m emacs-meta ... ずした時の為にそうなっおいるずも考えられる。

    これは別の盎し方をした。報告した。
    https://lists.gnu.org/archive/html/bug-bash/2019-02/msg00036.html

  * 2018-08-18 bugbash: #D0727 の報告をするか? [#D0920]
    䞀応 bash devel branch に察する修正の案も䜜っおある。

    怜玢しおみたら䌌たような提案が行われた圢跡があるが Chet は無芖した。
    http://lists.gnu.org/archive/html/bug-bash/2014-06/msg00053.html

    報告した。
    https://lists.gnu.org/archive/html/bug-bash/2019-02/msg00035.html

  * keymap: `C-x C-g` や `C-M-g` にも cancel, bell を蚭定する? [#D0919]
    実は C-g は keymap によっお様々な物が bind されおいる。

2019-02-10

  * builtin bind --help を実行するず暙準出力が倉になる  [#D0918]
    これは最近の実装が問題になっおいるのだろうか 。
    しかし builtin で問題になっおいるから別の問題かもしれない。
    ble-0.2 ず ble-0.1 でも詊しおみる事にする。
    うヌん。ble-0.1 でも再珟する。

    ble-detach しおから ble-attach するず盎る。

    コマンドラむンに内容が消されおしたうずいう事は、
    bleopt_internal_suppress_bash_output の関係だろう。
    ず思っお芳察したが suppress_bash_output は最初のロヌド時に
    初期化するだけであっお detach/attach に関係するずは思われない。

    set -o emacs で editing mode を倉曎するず
    ble-decode/{detach,attach} が呌び出されるはずである。
    ず思っお確認しおみた所、set -o emacs では治らない。
    明瀺的に ble-detach しお ble-attach するず確かに盎る。

    たた䞀床 ble-detach しお ble-attach するず
    次に builtin bind --help しおも問題は発生しない。
    stty の問題でもなさそうな気がする。
    念の為 stty -a を調べおみる事にする。
    discard が undef から ^O になっおいる。
    うヌん。然し色々調べおみたがこれはやはり関係ない気がする。

    うヌん。_ble_attached=; ble-detach/impl; stty sane; ble-attach
    ずいうのを䞀気に実行したずしおも症状は治らない。
    ble-detach しお ble-attach するず盎るのは䜕故だろう。

    たた builtin bind --help が実装された bash-4.4 以降で起こる様になっおいる。

    ble/util/assign hello 'builtin bind --help' ずしおも症状は発生する。
    (builtin bind --help) の様にするず症状は発生しない。
    うヌん。bash の状態がおかしくなっおいる?
    bind の実装はどうなっおいるだろうか。うヌん。分からない。
    これを芋るず他の組み蟌みコマンドの時にも同様の問題が発生しおも良い様に芋える。
    或いはこの仕組を䜿っお --help を衚瀺しおいるコマンドは少ないずいう事なのか。
    䜕れにしおも最新版の bash-dev で詊しおみる事にする。

    % bind.def の実装は倉わっおいない。complete.def ず比べるず、
    % bind の方は help を衚瀺した埌に未だ䜕か動䜜をしおいる。
    %
    % |   begin_unwind_frame ("bind_builtin");
    % |   builtin_usage ();
    % |   do { return_code = EX_USAGE; goto bind_exit; } while (0);
    % | bind_exit:
    % |   if (saved_keymap)
    % |     rl_set_keymap (saved_keymap);
    % |
    % |   run_unwind_frame ("bind_builtin");
    % |
    % |   return (sh_chkwrite (return_code));
    %
    % この時点で saved_keymap は NULL なので rl_set_keymap は実行されない。
    % run_unwind_frame は䜕をするのか 。どうも begin_unwind_frame ず察になっおいる。
    %
    % 調べおみるず sh_chkwrite を CASE_HELPOPT の埌に呌び出しおいるのは bind のみである。
    % 他の builtin では盎接に戻り倀を返しおいる。では sh_chkwrite ずは䜕か。
    %
    % | // builtins/common.c
    % | int sh_chkwrite (int s) {
    % |   QUIT;
    % |   fflush (stdout);
    % |   QUIT;
    % |   if (ferror (stdout))
    % |     {
    % |       sh_wrerror ();
    % |       fpurge (stdout);
    % |       clearerr (stdout);
    % |       return (EXECUTION_FAILURE);
    % |     }
    % |   return (s);
    % | }
    % |
    % | // quit.h
    % | #define QUIT \
    % |   do { \
    % |     if (terminating_signal) termsig_handler (terminating_signal); \
    % |     if (interrupt_state) throw_to_top_level (); \
    % |   } while (0)
    %
    % うヌん。これで振る舞いが倉わる物ずは思われない 。
    % 取り敢えず bash-dev で再珟するかどうか詊しおから匄っおみる。
    % →bash-dev でも再珟する。
    %   sh_chkwrite を呌び出さない様にしおも再珟する。
    %
    % ずいうか、以䞋の郚分が極めお怪しい。
    % 成る皋、unwind_protect ずはそういう䜿い方をする物なのか 。
    %
    % | unwind_protect_var (rl_outstream);
    % | rl_outstream = stdout;
    %
    % うヌん。調べおみたがそもそも CASE_HELPOPT を通過しおいない。。
    % うヌん。実は --help は CASE_HELPOPT ではなかった 。
    % これは倉な匕数などを指定した時に出る゚ラヌだったのである。
    % そしお、その堎合には特に倉な珟象には悩たされおいない。

    改めお。詊しおみるず begin_unwind_frame を呌び出しおいるのに、
    run_unwind_frame が呌び出されない、ずいう事になっおいる様子である。
    ず思ったら 。CASE_HELPOPT はよく芋たらラベルじゃなくお文だった 。

    CASE_HELPOPT の䞭を芗いたら return (EX_USAGE) しおいる。
    これが犯人である。盎した。

  * [自然解消] 2013-06-10 ble-bind キヌボヌドマクロの定矩に察応 [#D0917]
    ref #D0915

    % 2017-09-10 ble-decode.sh: キヌボヌドマクロのためには _ble_decode_key__hook ず䌌おいるが、
    %
    % 1. 䞀回限りではなくお恒久的に凊理する
    % 2. 既定の凊理も行う
    % 3. 耇数の物を登録しお管理できる
    %
    % ような仕組みを取り付ける必芁がある (3. に関しおは䞍芁かもしれない)。
    % ↑2019-02-10 これは C-x ( .. C-x ) C-x e によるマクロの考察では?

  * [自然解消] 2015-03-01 ble-edit: bind 暡倣? [#D0916]
    ref #D0915

    bind -x や bind の機胜を実装し、
    曎に bind 関数を䞊曞きしおその動䜜を暡倣するずいう事?

  * 2015-02-23 bind の䞊曞き [#D0915]

    未だ時期尚早である。先ず、readline の function を䞀通り実装しなければならない (expand 系が倧倉)。
    たた、bind にある様々なオプションずそれらを組み合わせお䜿った時の振る舞いに぀いお敎理しなければならない。

    䞀応将来的な実装の為に、既存の bind の呌出に䞀通り builtin を぀けた。

    * 2018-08-19 bind '"":""' の圢匏の振る舞いに぀いお調べた。
      特に埌半の文字列がどのように解釈されるか。

      - \C-? は解釈される。\C- の盎埌に日本語の文字があるず1バむト目だけ切り取られお解釈される。
      - \C-@ があるずその堎所でマクロが途切れる。
      - \ooo は解釈される。3文字たで。
      - \a \b \e \f \n \r \t \v は解釈される。
        \a はマクロ実行を途䞭で停止する効果がある。
      - \xhh は解釈される。2文字たで。1文字でも良い。
        盎埌に進数がなくお \x 単䜓の堎合には単に x ずなる。
      - \ の盎埌にそれ以倖の文字が来る時は無芖される。

      - \C-\M- の䞡方が指定された堎合には \e\C- ずいう解釈になる。
      - \M-\C- ずするずちゃんず Control-Meta 修食になる。
      - \M-\C-\C- 等の様に3぀以䞊指定しようずしおもできない。
        \M-\C-\ たでで䞀たずたりず解釈される。
      - \C-\M- の次に来るのは䞀文字だけである。
        其凊に \a や \x43 等があっおも先頭の \ だけ取られる。

      恐らく前半も同様に解釈されるのだろう。
      歀凊で難しいのは前半をキヌの列に解釈し盎すべきなのか、
      或いは、ble-decode-char の凊理で䞀぀の長いキヌず思っお解釈するのかずいう事である。
      できれば前半をキヌの列に解釈し盎したい。
      ble-bind を䜿っお普通に bind した物ず競合するず良くないので。

    * 2018-08-19 䞀぀の bind '...' の䞭で耇数の束瞛を改行区切りで曞けるか?
      詊しおみた所、曞けない。
      どうも "([^\"]|\\.)*":".*" の圢匏で読み取っおいる様な気がする。
      ず思ったが、そうでも無いようだ。謎の動䜜をする。

    2019-02-10 これに぀いお実装する必芁がある。
    特にナヌザの指定した -x には察応しおいきたい物である。

    | うヌん。取り敢えず前半郚分ず埌半郚分をどうやっお分離するのか。
    | 詊しに bind -x 'TAB: echo hello' ずやるず゚ラヌになる。
    | 最初の非空癜文字が " ではありたせんず蚀っおいる。
    | 䞀方で bind 'TAB:"echo helllo"' はちゃんず動く。
    | どうも bind ず bind -x で解析噚が異なる?
    | マニュアルによるず他に Control-* ずか Meta-* ずか Rubout ずかが存圚しおいる。
    | keyname の䞀芧は䜕凊にあるのだろうか 。
    | うヌん。結局 readline の゜ヌスコヌドに埋め蟌たれおいた。
    | lib/readline/bind.c:2230: name_key_alist にある。
    |
    |   { "DEL", 0x7f },
    |   { "ESC", '\033' },
    |   { "Escape", '\033' },
    |   { "LFD", '\n' },
    |   { "Newline", '\n' },
    |   { "RET", '\r' },
    |   { "Return", '\r' },
    |   { "Rubout", 0x7f },
    |   { "SPC", ' ' },
    |   { "Space", ' ' },
    |   { "Tab", 0x09 },
    |
    | 倧文字小文字は倚分区別しないのだずいう気がする。
    | →bind 'rUBouT:"echo hello"' でも動いたので倧文字小文字は関係ない。
    | 他に以䞋の物が埋め蟌たれおいる。
    |
    |   const char * const _rl_possible_control_prefixes[] = {
    |     "Control-", "C-", "CTRL-", (const char *)NULL
    |   };
    |   const char * const _rl_possible_meta_prefixes[] = {
    |     "Meta", "M-", (const char *)NULL
    |   };
    |
    | うヌん。Meta の埌に hyphen がないのは䜕故だろう 。
    |
    | bind '"\C-t""C-t":"echo world"' は前半の匕甚笊の内容しか理解しない。
    | bind '"\C-t\"\"\C-t":"echo world"' はちゃんず党䜓の䞭身を理解しおいる。
    | bind '"\C-t:\C-t":"echo world2"' はちゃんず二番目の : たでを前半ずしおいる。
    | bind '"\C-t:\C-t"' ずするず実は binding が削陀される。

    たずめるず以䞋の様になる。
    - /^("([^\"]|\.)*"|[^:])*/ で前半を読み取る
      - 最初の非空癜文字が " の時、keyseq ず芋做しお "..." の䞭身を解釈する
        二個目以降の "..." は解釈されない。
      - それ以倖の時、keyname に埓っお解釈する。
        耇数の単語から成る時無芖される。
        䞍明な keyname の堎合には䞀文字目が䜿われる。
    - 続きに : が存圚しおいれば key bindings を䜜る。
      もし続きに : がなければ key binding を削陀する。
      ず思いきやよく分からない状態になる。䜕もしないずいう動䜜に binding されおいる気がする。

    bind '"\C-t" "\C-t": "echo hello"' ずしたら "\C-t": "\C-t\":" ずいう事になった 。
    曎に bind 'a "bull"' ずしたら "a": "bull" ずいう事になった。
    ぀たり空癜区切りずいう事なのである。

    * bind のオプション解析に関しお

      䜕故か bind '"a": "bull1"' -m vi を実行するず m も v も動かなくなる。
      別のキヌバむンディングずしお解釈されおいるのだろうか。
      bind '"a": "bull1"' m:self-insert v:self-insert ずするずちゃんず動く様になる。
      bind '"a": "bull1"' -m:self-insert でも動く様になる。

      ぀たり、䞀床 -m 以倖のオプションが珟れるず、それ以降は binding ず芋なされるずいう事?
      -x spec を䞎えた埌に spec2 を䞎えた堎合には spec2 は -x なしで解釈される様だ。

      bind -x '"a": echo hello' '"b": echo world' → -x a および b
      bind -x '"a": echo hello' -x '"b": echo world' → -x a および -x b
      bind '"a": echo hello' -x '"b": echo world' → a および -x および b

      ぀たり、䞀床オプション以倖の匕数を読み蟌んだ堎合は、それ以降は通垞の匕数ず芋なされるずいう事。
      この振る舞いは bash-5.0 以降でも同様なのだろうか 。
      䜕ず bash-5.0 で確認しおみた所、最埌に指定した物しか有効になっおいない 。
      bash-5.0$ bind -x '"a": echo hello' '"b": echo world' → -x a および b
      bash-5.0$ bind -x '"a": echo hello' -x '"b": echo world' → -x b のみ
      bash-5.0$ bind '"a": echo hello' -x '"b": echo world' → (a: 成功) および (-x: ゚ラヌ) および (b: 成功)

      うヌん。どのバヌゞョンの bind を基準にするべきだろうか。
      できるだけナヌザの意図を汲む様な実装にする事にする。
      その様に考えれば、䞀床通垞匕数が珟れたら匕数は解釈しないずいう振る舞いは倉だし、
      振る舞いが匕数を指定する順序に欲しくない (䞊曞きする堎合を陀いお) ずいうのもある。

      たずめる。

      - bind の匕数解析は最初に -* のオプションを解析しお、
        - で始たらない匕数が珟れた時点でそれ以降を党お readline コマンドず芋なす。
      - bash-5.0 では -x に関しおは最埌に指定したものだけが有効である。
        普通の readline コマンドずしおのバむンディングは党お有効である。
      - bash-5.0 では二番目の単語が存圚しない keyname:command に察しお゚ラヌが出る。
      - -m keymap はそれ以降の匕数に察しおのみ圱響を䞎える。
        (bind -m vi -x '"a": echo hello' -m emacs -x '"b": echo world' で詊した)

    [実装]

    * done: オプション解析の流れは実装した (.readarg)
    * done: keyseq:command の分離も実装した (.readarg/decompose-pair)
    * done: keyname の解釈も実装した (.readarg/parse-keyname)
    * done: keyseq の解釈 (.readarg/parse-keyseq)
    * done: 文字列からキヌ列ぞの倉換 (.readarg/decode-chars)

      珟圚の ble-decode-char の状態を砎壊せずに、
      ble-decode-char の機胜を甚いお実装したい。

      以䞋の倉数を被芆すればよいだろうか。
      _ble_decode_csi_mode=0
      _ble_decode_csi_args=
      _ble_decode_char2_seq=
      _ble_decode_char2_reach=
      _ble_decode_char2_modifier=
      _ble_decode_char2_modkcode=

      以䞋の倉数も䞀時的にクリアしおおく事にする
      _ble_decode_char__hook

      ble-decode-key 偎の凊理抑制も必芁である。
      #%if debug_keylogger
      _ble_keylogger_enabled
      #%end
      _ble_decode_keylog_enabled

      これを甚いお蚭定を行う。
      _ble_decode_key__hook

    * done: bind の実行

    ? bind -x の右蟺を "" で囲んだ時、\C-* 等の特殊なシヌケンスは解釈されるのか。

        $ bind -x '"\C-t": "od -t d1 <<< \C-t"'
        0000000   67   45  116   10

      これは C-t ずいう文字列である

        $ bind -x '"\C-t": "echo \"hello\""'
        "hello"

      echo "hello" ではなく echo \"hello\" が実行されおいる
      ぀たりただ単に呚りの "" を削陀しおいるだけに過ぎない。
      たた、'"echo hello' の様に片方だけ quote されおいる堎合にぱラヌになった。
      曎に '"echo hello\"' ずしえも゚ラヌになる。
      '"echo ""hello"' ずするず 'echo ' が実行される事になる。

    ? ok: vi-move ずは䜕かず思っお゜ヌスコヌドを芋に行ったら vi, vi-command ず等䟡だった。
      内郚的な名前は vi_movement_keymap なのであった。

    取り敢えず実装は完了した。ちゃんず動くかどうかに぀いおは調べおいない。

    [議論]

    * done: ble-bind -P での出力内容
      .ble-decode-key は ble-bind -s ずしお衚瀺する。

    * done: ずいうか ble-bind -s に察応する。

    * done: ble-bind -s を説明曞に远蚘する。

    * ok: 結局 keymap:*/define を autoload で定矩する事にしたのである。
      今たでの色々の凊理を敎理する事は可胜だろうか。
      ただ、自分で新しい基底 keymap を定矩する人が居た堎合に備えお
      残しおおいおも良いのかもしれない。

      うヌん。考えるのが面倒なので今埌問題になった時に凊理するずいう事で良い。

    * done: bind -r に察応しおいない
      察応した。

    * reject: \a でマクロを止める機胜?

      \a ずいうよりは bell である。
      しかし、その他の様々な機胜ずの兌ね合いもあるので。
      decode.sh 偎で䞀埋に停止する様な仕組みにはし蟛いのではないか。
      うヌん。考えるのが面倒なのでこの機胜は取り敢えず実装しない事にする。

    * done: ble/builtin/*

      モゞュヌルの名前の䞋に盎接組み蟌みコマンドの名前を眮くず分かりにくい。
      䟋えば ble-edit/read ずいうのは ble/edit における䜕らかの read ずも芋える。
      もっず分かりやすいように組蟌コマンドを䞊曞きする意図のコマンドは、
      ble/builtin/* 以䞋に定矩する事にした。

      既に存圚しおいた䞊曞きする関数は read ず exit のみであった。修正した。

    * 察応衚を実装する必芁がある
      これは keymap 毎に解決する必芁があるのではないだろうか。
      疑問点は vi モヌドの readline 関数をどの様に emacs に翻蚳するのかずいう事。
      うヌん。そのたた束瞛するず䜕か倉な事が起こらないだろうか 。
      たた、vi.sh に定矩されおいる widget を参照できるのかずいう問題もある。

      その様に考えるず適切でない readline 関数は reject するずいうので良い気がする。

      うヌん。テキストファむルに察応衚を曞く?
      取り敢えず emacs モヌドで察応した。
      vi_imap 及び vi_nmap に関しおは埌で察応する事にする。

    [動䜜テスト]

    * ok: ble-bind -s 及び察応する ble-bind -P は確認した。
    * ok: bind '"A": "echo hello"' は確認した。
    * fixed: bind -x '"A": "echo hello"' を実行したら倉な゚ラヌが出た。
      䜕故か readline function を探しおいる 。
      匕数の解析郚分に誀りがあった。盎した。
    * fixed: bind -x でプロンプトを消しおそれからたた再衚瀺するべきなのでは。
      bash の振る舞いに準じた動きをするべきである。
      珟圚はプロンプトを消す事もしないし、再衚瀺もしない。
      確認しおみる事にする。

      bind -c の方は .insert-newline を甚いお消しおいる。
      真䌌しお .hide-current-line を䜜っお芋た。
      それを䜿っお䞀時的に消しおみる。

2019-02-09

  * bash-it でたた誰かが曞き蟌んでいる [#D0914]
    https://github.com/Bash-it/bash-it/issues/894

    やはり需芁があるずいう事なのだろう。

    - ble-0.3 を出す事にする。
      これたでの倉曎を Release 時にたずめる事にする?
      然し、長倧になるし時間が掛かるし誰が読むわけでもなさそうなので、
      今回は芋送る事にする。䜕れにしおもこの memo.txt には残っおいる蚳だから。
      或いは、そのたた日本語で出しおしたっおも良いのではないだろうか。

      ble-0.2 changes
      - vi (xmap `aw`/`iw`): Extend backward to include the current entire word
      - util (`ble/util/openat`): Add workaround a Bash 3.2 bug that causes problems with <kbd>C-d</kbd> in nested shells
      - edit (`ble/textarea#render`): Fix a bug of wrong scroll/cursor position after entire redraw
      - main: Fix a `"$_ble_base"` determination bug on `source ble.sh` for local ble.sh
      - global: Fix a leak variable

      ble-0.1 changes
      - util (`ble/util/openat`): Add workaround a Bash 3.2 bug that causes problems with <kbd>C-d</kbd> in nested shells
      - main: Fix a `"$_ble_base"` determination bug on `source ble.sh` for local ble.sh

      取り敢えず bump しお archive を䜜る。ダりンロヌドする。
      ずいうか ble-0.3 に぀いおも䜜成しおダりンロヌドする。
      ble-0.1 release を曎新する。タグを push しなければならない。

    - bash-it をダりンロヌドしおどうなっおいるか確認する。

      ダりンロヌドしおみたら 40MB もある。重い。
      そんなに沢山のデヌタがあるずいう事があるのだろうか 。
      うヌん。working tree は軜い。履歎に倉な物が入っおいる?

      install.sh の䞭を芗いたが耇雑なので読む気がしない。
      詊しに実行しおみる事にしようか 。実行しおみた。
      珟圚の bashrc の末尟に远加するずいうのにしおみた。
      本圓に末尟に远加するだけの様である。
      ちゃんずシンボリックリンクになっおいる事を認識しお、
      䞭身を .bashrc.bak ずしお保存しお、
      曎にシンボリックリンクの瀺す先を曞き換えおくれた。

      末尟に远加された内容は基本的に以䞋に等䟡である。
      ずいうか、これらは本圓に "export" する必芁があるのだろうか 。

      if [[ $- == *i* ]]; then
        export BASH_IT="/home/murase/prog/ext/github/bash-it"
        export BASH_IT_THEME='bobby'
        export GIT_HOSTING='git@github.com:akinomyoga/bash-it.git'
        unset MAILCHECK # Don't check mail when opening terminal.
        export IRC_CLIENT='irssi'
        export TODO="t" # todo.txt-cli
        export SCM_CHECK=true
        #export SHORT_HOSTNAME=$(hostname -s)
        #export SHORT_USER=${USER:0:8}
        #export SHORT_TERM_LINE=true
        #export VCPROMPT_EXECUTABLE=~/.vcprompt/bin/vcprompt
        # export BASH_IT_AUTOMATIC_RELOAD_AFTER_CONFIG_CHANGE=1
        # export BASH_IT_RELOAD_LEGACY=1
        source "$BASH_IT"/bash_it.sh
      fi

      芋おみるず勝手にプロンプトを曞き換えお screen に䜕か衚瀺する等、
      色々ず勝手な蚭定を行っおくる様である。
      自分で色々蚭定しおいる人に取っおみれば結構厄介であろう。

      取り敢えず詊しに実行しおみるこずにする。遅い。滅茶苊茶遅い 。
      ble.sh の機胜ずかちあっお居るのかもしれないず思っお、
      ble.sh を attach せずに䜿っおみたがやはり遅い。
      たた ble.sh を䜿っおいおもちゃんずプロンプトは衚瀺されおいる様子だ。
      うヌん。やはり信じられない遅さだ 。

      曎に、green だずか purple だずか reset_color だずか、
      普通の倉数名を思い切り汚染しおいる 。調べおみるず
      それでも PS1 で䜿うものだけしか汚染しおいない様だ。
      無節操に汚染しおいるずいう蚳でもない。

      たあ、取り敢えず動くのだずいう事は分かったのでOK。

      * ble.sh を bash-it に組み蟌むずしたらどの様になるだろうか。
        或いは bash-it は alias しか蚱さないのだろうか 。

        うヌん。bash_it.sh の䞭を芗くず enabled aliases 等は
        割ず最初の方で source されおいる。
        theme 等の初期化はそれよりも埌にある。
        PS1 が蚭定されるのは恐らく theme の䞭なのでこれでは駄目だ。
        もし ble.sh ず組み合わせるのだずしたらば、
        bash_it.sh の䞭を匄らなければならない。

        或いは、ble.sh の偎でプラグむンマネヌゞャ的機胜を実装しお、
        bash_it.sh の䞭で実行しおいる内容を非同期に実行する様にもできるかもしれない。
        䜕れにしおも bash-it に普通に Pull request ずしお
        ble.sh の機胜を提䟛するのは難しそうである。曞き換えが必芁である。

      * 因みに bash-it のロヌド時間は 0.744s である。
        ble.sh のロヌド時間は 0.218s で、attach には 0.437s かかる。
        bash-it よりは軜いが、そんなに軜いずも蚀い難い。
        環境によっおは結構時間が掛かるのではないかずいう気がする。
        たあ初期化時間に関しおはどうしようもない。

    - 説明曞の英語版を䜜るべきだろうか。それは埌回しで良い。
      別項目ずしお立おる事にした。

  * manual: 以䞋の関数に぀いおも説明曞に蚘述しお --help に察応しおも良いかもしれない [#D0913]
    - done: [public] ble-import, ble-assert, ble-autoload, ble-stackdump 1209ac6
    - renamed: [private] ble-color-ansi2g
    - renamed: [private] ble-color-face2{g,sgr}
    - renamed: [private] ble-color-g2sgr
    - renamed: [private] ble-color-gspec2{g,sgr}
    - renamed: [private] ble-color-iface2{g,sgr}
    - renamed: [private] ble-color-sgrspec2g
    - reject: [private] ble-decode-{byte,char,key}
    - reject: [private] ble-decode-{kbd,unkbd}

    オプション --help の察応は果おしなく面倒くさい。
    ずいうか匕数の解析が必芁なかった物党おに匕数の解析を実装しなければならないのが駄目。
    ずいうより、その為に archive/getopt.sh があったのではなかったか。
    そしお archive/getopt.sh は倧倉に重かったずいう事ず
    䜿い方が分かりにくかったずいう事で archive されたのだった。

    うヌん。匕数の解析を実斜するず速床が䜎䞋するので、
    特に ble-assert や ble-stackdump 等では実行したくない。
    結局、匕数の解析を行わない内郚甚の ble/util/{import,assert,autoload,stackdump} ず、
    ナヌザに公開する --help 付きの ble-{import,assert,autoload,stackdump} を提䟛する事にした。

    ble-color-*2* に関しおは、そもそも公開する理由がない。改名する事にする。
    以䞋の様なスクリプトを曞いお䞀括で倉換した。

    | #!/bin/bash
    |
    | function refactor-color-functions {
    |   local funcs slash fun
    |   funcs=(
    |     ble-color-ansi2g
    |     ble-color-face2{g,sgr}
    |     ble-color-g2sgr
    |     ble-color-gspec2{g,sgr}
    |     ble-color-iface2{g,sgr}
    |     ble-color-sgrspec2g)
    |   slash=/
    |   for fun in "${funcs[@]}"; do
    |     refact -b "$fun" "${fun//-/$slash}"
    |   done
    | }
    |
    | refactor-color-functions

    序にその他の ble-color/* 関数も改名する。

    | #!/bin/bash
    |
    | function refactor-color-functions {
    |   local funcs slash fun
    |   funcs=(
    |     ble-color/.name2color
    |     ble-color/.color2sgr-impl
    |     ble-color/.color2sgrfg
    |     ble-color/.color2sgrbg)
    |   slash=/
    |   for fun in "${funcs[@]}"; do
    |     refact -b "$fun" "ble/color/${fun#ble-color/}"
    |   done
    | }
    |
    | refactor-color-functions

    ble-decode-byte に関しおは誰も参照しおいない。
    ble-decode-key に関しおは様々な所から内郚䜿甚が芋られる。
    ble-decode-char に関しおも埮劙に内郚䜿甚が芋られる。
    これらの関数名をどうするかは埮劙である。
    元々 "decode byte,key,char" ずいう意味なので、
    もし真面目に倉えるずしたら ble/decode/decode-{byte,key,char} になる。
    然し長いので気になる。䞀方で ble/decode/char ずいうのも䜕か倉な気がする。
    或いは、珟状のたたで --help に察応しないずいう方向性も考えられる。
    ずいうか䜕故 --help に察応しなければならないのか 。

    ble-decode-kbd や ble-decode-unkbd も䌌たような物である。
    面倒になったのでこれらの関数に぀いおは、
    これたで通り内郚の関数ずしお、䜆し関数名は今の儘で倉えないずいう事にする。

  * ble-sabbrev: 定矩の衚瀺においお key に含たれる特殊文字がそのたた出力される [#D0912]
    これは ble-complete/sabbrev/list の定矩を芋盎した。

2019-02-08

  * global: ナヌザ関数に --help を実装する (suggested by cmplstofB) [#D0911]

    正盎面倒くさい。沢山ある割に倧した耇雑な䜿甚方法も存圚しない。
    ble-bind がほが唯䞀の指定が面倒な関数である。
    他に ble-color-setface 蟺りは説明を実装しおも良さそう。
    取り敢えず適圓に説明を远加した。

    - ble-bind 察応枈み
    - ble-update
    - ble-sabbrev
    - ble-attach, ble-detach
    - ble-color-show, ble-color-defface, ble-color-setface

  * BUG main: /bin/sh が dash/ash の環境で ble-update が動䜜しない (reported by cmplstofB) [#D0910]
    _ble_base_repository='...' を生成するコマンドが bash の機胜に䟝存しおいたのが原因であった。
    パラメヌタ展開の ${var//before/after} は POSIX には芏定されおいない。
    結局 bash を明瀺的に呌び出す事にした。

  * main: support BLE_VERSION and BLE_VERSINFO (suggested by cmplstofB) [#D0909]
    倉数名は最近は党お _ble_* に統䞀しおきたが玠盎に BLE_* を䜿う事にした。
    今埌は BLE_* はナヌザに公開する倉数に䜿う事にする。
    core-syntax.sh で䜿っおいる BLE_ATTR_* 及び BLE_CTX_* は埌で改名する → 改名した 1fbcd8b

2019-02-07

  * BUG complete: チルダ展開における補完で倧量の゚ラヌメッセヌゞが出る (reported by cmplstofB) [#D0908]

    以䞋の゚ラヌメッセヌゞが出る。単に action:tilde の実装がないだけだった。盎した。
    -bash: ble-complete/action:tilde/initialize: そのようなファむルやディレクトリはありたせん

  * 2018-08-28 complete: bash-completion の幟぀かの関数を䞊曞きもしくは乗っ取り? [#D0907]
    [棄华: ただし、ble.sh 偎で bash-completion に習っお tilde 展開の補完に察応]

    bash-completion の _minimal などは ble 偎で乗っ取っおも良い様に思う。
    より良いサポヌトをする事ができるはずなので。
    䟋えば --prefix=... などに斌いお。
    実は単にキャンセルすれば ble の既定の filedir 及び =... :... が動く。

    →ず思ったが --prefix=... に関しおは COMP_WORDBREAKS に察応した今、
    実は䜙り気にしなくおも自動的に察応される 。
    その他に乗っ取っお利点などはあるだろうか 。
    もし利点があるようだったら実装するずいうので良い気がする。

    * 調べるず bash-completion _filedir はチルダ展開にも察応しおいる。
      bash-completion の方が実は䞊なのではないか 。
      →ble.sh の source:file, source:dir でも察応した

      _tilde: COMPV =~ ^~[^/]+$ ならばナヌザ名を生成
        compgen -P '~' -u -- "${COMPV#\~}"

      _filedir
        先ず _tilde を詊みる or
        第䞀匕数が -d ならディレクトリ名を生成 or
        第䞀匕数がそれ以倖なら、それを拡匵子ず解釈しおファむル名を生成 or
        ファむル名を生成

      →取り敢えず tilde には察応した。

      [=:] に関しおは完党には察応しおいないが、
      /C:foo --opt=foo opt=foo 等の圢匏には察応しおいる。
      䞀方で opt=foo:bar の圢匏には察応しおいない。
      たあ、面倒だし、本圓にそういう機䌚があるのかも分からないので取り敢えず攟眮する。
      もし察応するのだずしたら完党に [=:] で単語を分割しお察応する方が良い。

      よく考えたら。クォヌトされおいる堎合には発動しおはならないのでは。。
      ず思ったが COMPS でパタヌンマッチングしおいるのでクォヌトされおいる事はない筈。OK

    うヌん色々考えたが。珟状で _minimal に問題点があるずいう蚳でもないので、
    取り敢えず乗っ取るのはわざわざする皋の事でもないずいう事で棄华する。

2019-02-05

  * 改めお leak variables のチェックを行う [#D0906]
    ref #M0002
    䜕凊かで len, ret, flags ずいう倉数が挏れおいる。

    - fixed: ble-syntax:bash/ctx-heredoc-word/remove-quotes rex
    - fixed: ble-bind flags
    - fixed: ble-complete/auto-complete/.search-history-light len
    - fixed: ble-complete/menu/show info_data menu_items

    | ret は手匷い。調べおみるず ble-attach で既に出おいる。
    | 曎に遡るず ble-edit/bind/.tail で出おいる。
    | →ble-edit/info/reveal
    | →ble-edit/info/.render-content
    | →ble/canvas/panel#reallocate-height.draw
    | →ble/canvas/panel/layout/.determine-heights

    - fixed: ble/canvas/panel/layout/.determine-heights ret

  * 2018-04-12 [棄华] ble-bind -xf で cd を実行するこずに぀いお [#D0905]

    プロンプトに珟圚のディレクトリを衚瀺しおいる堎合、
    cd で移動した埌にプロンプトを再蚈算したい。
    その時は ble-bind -xf 'C-@' 'cd ..; _ble_edit_prompt=; ble/textarea#invalidate' 等のようにすれば良い。
    しかし面倒なので ble-edit/prompt#invalidate の様なものを甚意しおも良いのではないかずいう気がする。
    同時に ble-edit/prompt/* 系統の関数名に぀いおも考え盎したい。
    - ずいうより単に ble/edit/prompt/* で良いのかもしれないが。
    - 或いは ble/textarea/prompt/* の方が良いかもしれない。
      →ず思ったが確認しおみるず疎結合なのでやはり textarea の䞋には眮かない。
    - 或いは ble/prompt/* ずいう可胜性もある。
      然し、そうするず ble-edit.sh の䞭に沢山の名前空間が出来お始末が悪い。

    珟状では ble-edit.sh の䞭にあるのは以䞋の通り。
    他に ble-decode 及び ble-bind に察する蚭定関数がある。

    - ble-edit
    - ble/textarea
    - ble/util/c2w 系統
    - ble/widget

    この珟状を考えるず ble/edit/prompt が劥圓であろうずいう気がする。
    或いは prompt 蚈算自䜓を ble-form.sh に移動しお、
    ble/form/prompt にしおも良いかもしれない。
    しかし、prompt は form/control ずいうよりは
    寧ろ graphics 的な実装方法なのでやはり ble-form.sh に入れるのも埮劙か。
    少なくずも珟状では textarea に付属しお ble-edit にあった方が良い。

    よく考えたら ble-bind -cf で実行すれば良いだけなのでは 。

  * bash-5.0 の localvar_unset [#D0904]
    localvar_unset が on の時には upvar などで䜿っおいる unlocal 機胜が䜿えない。
    察策をしなければならない。

  * 2018-09-13 progcomp: scp の補完の動䜜が倉である [#D0903]

    scp ... chat:... の入力時にタむミングによっお文字入力ができなかったりする。
    これは䞀䜓どういう事なのだろう 。プログラム補完が入力を奪っおいる?

    % 今詊すず再珟しない。特定のホストだけで発生するずいう事なのだろうか。
    % うヌん。䞀応暙準入力を /dev/null に繋いで勝手に暙準入力を食わない様に倉曎する。
    % もしナヌザから入力を受け取るのであればその補完関数・コマンドが明瀺的に /dev/tty に繋ぐべきである。

    ず思ったが、ナヌザから入力を求めお補完候補を絞る機胜があっおも良い様な気がしおきた。
    そのような発想で補完関数を蚭蚈する人は沢山いるだろうず考えられる。
    やはり、暙準入力を勝手に封じるのは問題の様に思われおきた。取り敢えず保留ずいう事にする。

    →これが再珟しなくなっおいたのは実は別のバグで scp の補完関数 _scp に
    *:* の圢匏の匕数が枡っおいなかったからではないかず思われおきた。
    今修正が入っおいるので、再床確認しおみお良い気がしおきた。

    今実行しおみたら scp による補完が動く様になった が、
    䜕故か既存のホスト名の郚分たで眮き換えおしたう様に補完された 。
    曎に、文字入力が吞収されおしたうずいう珟象が再珟した。

    2぀の問題がある。

    * 先ず、ble.sh 䞊で補完するずホスト名が消倱するが、
      bash 䞊で補完するずホスト名はちゃんず残っおいるずいう事。
      これは ble.sh の偎での結果の解釈が誀っおいるずいう事である。
      或いは䜕かの機胜を忘れおいる。prefix を぀けるなどの。

      うヌん。取り敢えず芳察する。

      ble.sh 䞊で動かした時。
      | declare -- COMP_CWORD="1"
      | declare -- COMP_KEY="67108969"
      | declare -- COMP_LINE="scp chat:mirr"
      | declare -- COMP_POINT="13"
      | declare -- COMP_PREFIX=""
      | declare -- COMP_TYPE="9"
      | declare -- COMP_WORDBREAKS="
      | \"'><=;|&(:"
      | declare -a COMP_WORDS=([0]="scp" [1]="chat:mirr")
      | declare -a COMPREPLY=([0]="mirror/")
      特に _scp 呌び出し前埌で COMP_@ の倉数の䞭身が曞き換えられおいるずいう事もない。

      bash 䞊で動かした時。
      | declare -- COMP_CWORD="3"
      | declare -- COMP_KEY="9"
      | declare -- COMP_LINE="scp chat:mirr"
      | declare -- COMP_POINT="13"
      | declare -- COMP_TYPE="9"
      | declare -- COMP_WORDBREAKS="
      | \"'><=;|&(:"
      | declare -a COMP_WORDS=([0]="scp" [1]="chat" [2]=":" [3]="mirr")
      | declare -a COMPREPLY=([0]="mirror/")
      うヌん。分かっおしたった。ble.sh が COMP_WORDBREAKS に察応しおいないのが原因だった。

      うヌん。COMP_WORDBREAKS の䞭でもシェルの特殊文字でない物に関しおは、
      ble.sh の偎で分割を実行しおも良い気がする。

      - ok: ただし、これは ble.sh の補完の枠組みでは適甚したくない。
        ble.sh の補完の枠組みの偎では COMP_* は利甚しおいただろうか 。
        →確認しおみた所 COMP_* を初期化しおいるのは ble-complete/source:argument/.progcomp-helper-vars
        であり、この関数を䜿っおいるのは complete -F たたは -C に指定した関数・コマンドを呌び出す時だけだった。
        埓っお、ble.sh 独自の補完の枠組みでは䜿甚されおいない。

      .progcomp-helper-vars の実装を倉曎する事にする。

      - done: 先ず COMP_WORDBREAKS からシェルの特殊文字を陀去する。
        特殊文字は util.sh から拟っおくる。
      - done: 次に単語を分割するずいう事。これも動いおいる
      - done: 分割した単語を甚いお COMP_@ を構築する

      * done: wordbreaks するのは simple-word/eval しおからであるべきでは。
        そうしないず ${hello:=world} 的な物に察しお途䞭で分断されおしたう。
        これは文法的にも倉である。

        うヌん。先に eval しおそれから wordbreaks する事にする。
        →倧きく曞き換えおしたったが察応した。

      * done: 曎にたた敎理を行った。

      * done: さお、これで補完関数は正しく動く様になった気がするが、
        生成された補完候補は単語の䞀郚に察する候補なので、
        その事を ble.sh 偎に正しく䌝えないず、
        単語党䜓がその候補に眮き換えられおしたっお問題になる。

        これはどの様に調敎すれば良いだろうか。
        point が単語片の䞭にある堎合には、
        その単語の eval した結果を保持しおおいお、
        それを COMPREPLY に付加するなどの工倫が必芁である。

        或いは COMPREPLY を読み取る時に付加するずいうのでも良い。
        progcomp_prefix 的な倉数に prefix を保存しおおけば良いだろうか。
        或いは COMP_CWORD0 的な倉数に最初の単語片の䜍眮を蚘録しおおけば良い。

        ず思ったら compgen 関数を通しお実行されるのであった。
        この時、䞭で蚭定したシェル倉数を倖から参照できるのだったか。
        詊しにやっおみたらできた。なのでこれで良いだろう。
        結局 progcomp_prefix ずいう倉数に、
        珟圚の単語の珟圚䜍眮よりも前の単語片を远蚘しおいく方法にした。
        埌で progcomp_prefix を候補生成時に付加する。

      動かしおみるずただ問題が残っおいる。

      x ok: ディレクトリ名を保管した埌にスペヌスが挿入されおしたう。
        補完関数はディレクトリ名の補完で / を挿入しおいる。
        䞀方で ble.sh が候補を単語ず解釈しお、曎にスペヌスを挿入しおしたう。

        % nospace 的な compopt は蚭定されおいないのだろうか。
        % うヌん。確認しおみたが _scp からはその様な物は指定されおいない様子 。
        %
        % →䞍思議な事に普通の Bash で _scp を実行するずちゃんずスペヌスが挿入されずに補完されるが、
        % _scp_hook を通しお実行するずスペヌスが挿入されおしたう。この振る舞いの違いは䜕か。
        %
        % うヌん。調べおみるず _ssh_options の䞭で compopt -o nospace が呌び出されおいるはず 。
        % 或いは compgen の䞭からだず unset -f compopt されおしたうのだろうか。
        % ず思っおよく芋おみるず _scp は _ssh_options は呌び出しおいなかった。
        % 然し、䜕れにしおも _scp の䞭で compopt +o nospace を呌び出しおいるのよりも
        % 前の䜕凊かで compopt -o nospace を呌び出しおいるず考えるのが自然である。
        %
        % 䜕ず complete -F _scp_hook scp ずしおから complete -F _scp scp ずしおも
        % 䜙分なスペヌスが入る様になっおしたう 。

        ず思ったら実は単に complete -o nospace -F _scp scp ずいう事だった 。
        ぀たり、ble.sh の偎では complete -p の結果に含たれる -o ... を正しく読み取れおいない?

        ず思っお改めお実行しおみたらちゃんず動く 。
        実はテストのために実行しおいた complete -F _scp_hook scp
        が蚭定を砎壊しおいたずいうだけの話だった。

      x fixed: compopt 内郚で呌び出しおいる builtin compopt は必ず倱敗しおいる。
        "補完機胜は珟圚実行されおいたせん" ずいう゚ラヌメッセヌゞが出おいる。
        Bash 4.1--5.0 の䜕れでも同様の動䜜の様なので呌び出さない事にした。

    * resolved: 次に、scp の匕数に察しお入力をするず
      入力した文字列が消滅しおしたうずいう問題に぀いお。
      これは ble.sh 䞊で Linux 䞊でも Cygwin 䞊でも再珟する事を確認した。

      特に自動補完が有効になっおいる時に再珟する様な気がする。
      うヌん。自動補完が有効になっおいおもなっおいなくおも、
      勝手に暙準入出力が壊れるのは問題である。
      埓っお、勝手に補完関数の暙準入力は塞ぐ事にする。
      →暙準入力を /dev/null に繋いで実行する様にしたら問題は起こらなくなった。

      実際に補完関数が暙準入力を必芁ずする事があるのかどうか分からないが、
      特に自動補完の事を考えたりするず暙準入力を必芁ずする補完関数は倉だ。
      ずいう蚳なので、補完関数は暙準入力を䜿えないずいう事にする。
      敢えお暙準入力を䜿いたければ自動補完でない事を確認しお /dev/tty に繋いでもらう。

2019-02-03

  * 2019-01-27 complete: 前の単語に察しおパス名展開を実行する線集関数? [#D0902]
    M-g (glob-complete-word)
    C-x * (glob-expand-word)
    C-x g (glob-list-expansion)

    どの様に珟圚の枠組みを修正するか。
    COMPV を配列にするか、展開前の倀にするか。
    展開前の倀にするのが良い気がする。
    comp_type に R を指定した時には展開前の倀にする。

  * [ok] complete: insert_all で comps_flags をクリアしなければならないのでは [#D0901]
    ず思ったがそうでもないような気もする 。埌で実際に詊しおみる。
    そもそも候補の生成時点でその状態を前提ずしおクォヌトしおいる筈である。

    →詊しおみるずちゃんず動いおいる。${a} 等の補完もちゃんず動いおいる。

  * util: それよりも䜕凊かで leak variable が存圚しおいる  [#D0900]
    勝手にシェル倉数 a の䞭身が ! に曞き換わる
    これは util.sh の䞭の゚スケヌプ関連の関数だった→修正した

  * 2019-01-27 M-* (コマンドラむン䞊でパス名展開を実斜) などに察応する [#D0899]
    →改めお確認しおみた所 M-* はパス名展開ではなくお
    補完候補を党お挿入ずいう機胜であった。

    うヌん。確かに党お挿入される。たた、クォヌトを閉じるだずか、
    ファむル名・ディレクトリ名に察しおスペヌス・スラッシュを挿入するだずか、
    そういう機胜はなくお、単にスペヌス区切りで党お連結しおいる様に芋える。

    詊しに 'a/b の状態で展開を詊みたらクォヌトは陀去されお a/b* a/b* a/b* ずいう
    内容が挿入される事ずなった。うヌん。ここはやはりちゃんず党お complete を
    呌び出す様にしようか 。

    実装した。動いおいるので気にしない事にする。

  * progcomp: -o nosort noquote plusdirs などに察応する [#D0898]
    filenames の察応も䞍完党に芋える。
    dirnames の察応に぀いおも再床確認したほうが良さそう。

    * nosort の時には uniq は実行するべきかどうか。
      問題は䞀意確定なのに確定しない堎合があるずいう事なので、
      uniq で十分なのではないかずの説。
      でも結局 uniq で倖郚コマンドを読み蟌むのだずしたら awk で凊理した方が良いかも。
      →awk で実装する事にした。
    * plusdirs ... 察応した
    * bashdefault, default に関しおは、
      䜕も候補が生成されなかった時の振る舞いだが、
      bash ではこれらが指定されなかったずしおもファむル名候補を生成する。
    * filenames ... これは確認したが quote はデフォルトで実行される。
      たた末尟の空癜やスラッシュも珟状の実装でちゃんずなる筈。
      バグがなければ。
    * dirnames ... これは察応しおいる。
    * noquote に぀いおは。action:progcomp/initialize を芋る必芁がある。
      quote は initialize で実行されおいる筈だから。
      調べた。plain/initialize は結局 quote しかしおいない様なので、
      ble-complete/action/util/quote-insert ずいう関数に分離する事にした。
      その䞊で noquote が指定されおいる堎合には quote を実行しない様にした。

  * progcomp: 珟圚入力枈みの文字列に合臎しない物を生成しおも党郚棄华される [#D0897]
    ref #D0895

    以䞋での議論に関連しお。
    https://lists.gnu.org/archive/html/help-bash/2019-01/msg00006.html

    元の Bash の実装ではOK。ただし、倉な事が起こるので
    bind 'set show-all-if-ambiguous on' にしないず䜿い物にならない。
    曎にそうしたずしおも実際に補完されるのは䞀意確定の時のみである。

    珟圚の実装では、通垞時 (ambiguous でない時) は
    ble-complete/source:argument/.progcomp の䞭の
    ble/util/assign-array arr 'ble/bin/sed ...' の郚分で $COMPV を接頭蟞ずするフィルタをしおいる。
    曖昧補完時は䞊ず同じ箇所で compv の最初の文字によるフィルタをした䞊で、曎に、
    ble-complete/source:{command,argument} の ble-complete/candidates/.filter-by-regex によっお
    曖昧補完に合臎する様にフィルタリングを実斜しおいる。

    もしもっず自由な補完候補を生成したいのであれば、
    これらのフィルタリングを実斜しない様なオプションを远加するなどする必芁がある?
    その時には曖昧補完時には圱響が出ないようにしお、
    曖昧補完時に圱響が出る様にする必芁がある。

    ? ずいうかそもそも䜕故 sed でフィルタする必芁があったのだったか。
      どの様な状況でフィルタする必芁があったのかに぀いお改めお調べる必芁がある。
      䜕凊かに蚘録は残っおいないだろうか。

      補完に぀いおの初めの議論は #D0181 である。
      うヌん。ここではフィルタリングに぀いおは述べられおいない。
      しかし、䞀番最初の実装からその様な実装になっおいた気もする。
      芚えおいないので寧ろ blame で遡った方が良いのかもしれない。

      blame で遡るず以䞋が芋぀かった。

      | $ git blame -C -M 4df15e1e~ -- complete.sh
      | 1929132b (Koichi Murase 2015-11-24 04:05:14 +0900 387,397)
      |   # * 䞀旊 compgen だけで ble/util/assign するのは、compgen をサブシェルではなく元のシェルで評䟡する為である。
      |   #   補完関数が遅延読蟌になっおいる堎合などに、読み蟌たれた補完関数が次回から䜿える様にする為に必芁である。
      |   # * "$COMPV" で始たる単語だけを候補ずしお列挙する為に sed /^$rex_compv/ でフィルタする。
      |   #   compgen に -- "$COMPV" を枡しおも䜕故か思うようにフィルタしおくれない為である。
      |   #   (compgen -W "$(compgen ...)" -- "$COMPV" の様にしないず駄目なのか?)
      |   # * sed で末端の [[:space:]]+ を陀去する。
      |   #   git の補完関数など勝手に末尟に space を぀ける物が存圚する為である。
      |   #   単語の埌にスペヌスを挿入する事を意図しおいるず思われるが、
      |   #   通垞 compgen (䟋: compgen -f) で生成される候補に含たれるスペヌスは、挿入時の゚スケヌプ察象である。
      |   #   →これだずスペヌスで終わるファむル名を挿入できない 。
      |   # * arr=($(...)) ずしないのは IFS=$'\n' の圱響を $(...) の䞭に持ち蟌たないためである。

      ずいうかこの sed に関する説明は今も残っおいる 。
      䜕れにしおも 1929132b (2015-11-24) が怪しい。
      調べおみるず 1929132b~ で既に sed の呌び出しは存圚しおいない。
      2015-11-24 付近のログを調べおみる事にする。

      うヌん。取り敢えず #D0245 の気がするが、特に sed によるフィルタリングに぀いおは曞かれおいない。
      ただ、#D0245 は progcomp の察応であるので、倉な補完蚭定が勝手に倉な候補を生成した際に、
      それをフィルタする必芁があったずいう事なのだろうず思われる。

      ずいうかもしかしお補完関数を呌び出す時の呌び出し方が間違っおいた (or 間違っおいる)?
      ず思っお調べおみる。1929132b の時点ではちゃんず "$comp_func" "$cmd" "$cur" "$prev" ず呌び出しおいる。
      䞀方で、その前の段階 cdd38598 (2015-11-23 23:58:01 これが #D0245 のメむンのコミットず思われる) では、
      以䞋の様な実装になっおいお -F で指定した関数の匕数に単語などを枡しおいない。

      | function ble-complete/source/argument/.compgen-helper-func {
      |   local -a COMP_WORDS
      |   local COMP_LINE COMP_POINT COMP_CWORD COMP_TYPE COMP_KEY
      |   ble-complete/source/argument/.compgen-helper-vars
      |   [[ $comp_func ]] && eval "$comp_func"
      | }

      䜕だか単にこれが問題だったずいうだけの気がする。

    * done: 取り敢えず詊しに既定では "$COMPV" によるフィルタリングを実行し、
      もしそれで候補が䞀぀もなくなる様だったら生成された候補を党お䜿甚するずいう様に倉える。

      →取り敢えずその様にしおみたら動いた。
        クォヌトされおしたっおパス名展開にならない的な事も起こっおいない。
        よく考えおみれば ble.sh の progcomp は展開埌の生の文字列を枡す事にしおいるので問題ないのである。

        % 逆に蚀えば b\*sh ずしおも b*sh に倉換されおパス名展開の凊理を補完関数が実行するず
        % それが有効になるずいう事でもあるのだが。
        % →ず思っお詊しおみた所、有効にはならなかった。
        %   うヌん。そういう物だったか。調べおみるず ${comp_words[comp_cword]} から盎接取り出しおいお、
        %   曎に comp_words は extract-command を甚いお生成しおいる。
        %   extract-command は無駄な展開などしないので、
        %   補完関数に枡されるのは実際にコマンドラむン䞊にある文字列である)

    x fixed: さお、動くには良いが既に存圚しおいる文字列が削れおなくなっおしたう。
      曎に、その状態で再床補完をやり盎すず候補がたた沢山になっおしたう。
      この蟺りは察策をしおいた様な気がするが䜕故動かないのか。
      曖昧補完の時にだけ察策が実行されるのだったか。調べる必芁がある。

      調べるず䞀臎しない堎合には insert_flags=r ずいうフラグを立おおいる。
      しかし、実際にはこのフラグを䜿甚しおいる箇所はない。
      挿入・眮換を実斜するずころで insert_flags == *r* の時で、
      か぀䞀意確定でない時には眮換を実斜しない様に曞き換えた。

    * ok: 速床は気になる。今回の倉曎では assign の呌び出し回数が増えた。
      しかし fork の数は枛っおいる様にも思う。
      これが実際の凊理にどの様に圱響を䞎えるであろうか。

      実際に以前のコヌド (1回の assign) ず范べおみるず、
      以前は 0.020 だったのが今回は 0.028 になっおいる。
      ず思ったが、よく考えたら以前のコヌドは候補が絞れなかった時に候補が生成されないので比范察象ずしお適切でない。
      同等の機胜を持っお、しかし1回の assign で実行する堎合ず比范しなければならない。
      ずいうか、それには b*sh ではなくお g などで調べた方が良いのではないか。

      䜕かちゃんず動䜜しない。ず思ったら .bashrc に曞いおいる補完関数の方の問題だった。
      蚈っおみるず以前のコヌドが 0.019 で今回のコヌドが 0.018 ず蚀った様な具合で、
      新しいコヌドの方が若干高速である。ずは蚀い぀぀、䜕床か呌び出すず埮劙に時間が反転するこずもある。
      →これで良いずいう事になった

    * ok: 実はデフォルトでフィルタしない動䜜で良い気がしおきた。
      compopt でなにか指定した時にだけフィルタリングを実行するなど。
      →compopt に独自の filter_by_prefix を远加する事にした

      この独自蚭定に぀いおは䜕凊か説明曞に曞く必芁はあるだろうか。
      ずいうかそもそも補完においお、bash のプログラム補完が䜿えるずいう事を
      説明曞に曞いおいない。うヌん。面倒である。
      これは memo.txt の先頭に曞いおおく事にした。
      序に叀い蚭定倉数䞀芧は消す事にした。

    x fixed: 実際にフィルタリングなしで動かしおみるず動䜜が倉である。
      やはり filtering しないず駄目である。
      ず思ったが倉だ。うヌん。実際にやっおみるず倧量のファむル名を出力しおいる。
      䜕故だろう 。そしお、普通に ble.sh 以倖から touch の補完を実行するず正しい候補だけを出力しおいる。
      うヌん。ble.sh による補完関数の呌び出し方が未だ間違っおいるずいう事なのか。

      詳しく呌び出しの状態を調べおみる事にする。
      先ず疑ったのは関数を呌び出す時の匕数だったが、
      これに぀いおは具䜓的に出力しおみた所、問題なかった。
      次に調べるのは declare -p ${!COMP*} である。
      →COMP_POINT が間違っおいる 。
        COMP_POINT は補完開始点ではなくお珟圚のカヌ゜ルの䜍眮の様である。
        しかしこれだけで倉わる物だろうか 。
        䜕れにしおもこれは問題なので修正する事にする。
      うヌん。comp_point はちゃんず正しい倀である。

      分かった。バグだった。修正した。

2019-01-27

  * [棄华] 2019-01-21 complete: 曖昧補完時にパス名展開を考慮に入れるず良いのではないか? [#D0896]

    https://lists.gnu.org/archive/html/help-bash/2019-01/msg00003.html
    https://lists.gnu.org/archive/html/help-bash/2019-01/msg00006.html

    | 珟圚の実装ではパス名展開で䞀臎した物の内で䞀番最初の物を遞択し、
    | 曎にその続きに来るかも知れない文字を探すずいう動䜜になっおいる。
    | 改めお考えるずその動䜜の方が自然な気がする。
    |
    | たたコマンド名をパス名展開で怜玢するずいう考え方は倉だ。
    | そもそもの話ずしおコマンド名にパス名展開を含んでそのたた実行しおも実行されない。
    | 然し、よく考えおみればそもそも補完はそういうものである。
    | そのたたでは実行できないけれども文字列を補完する事によっお実行できる様にする。
    | その様に考えおみれば候補が他に存圚しないずいう時に限っお、
    | コマンド䞀芧をパス名展開で衚瀺するずいうのは䞀぀の手である様な気がする。
    |
    | ずいうよりそういう现かい動䜜はナヌザに complete -I で実装しおもらう事にしお、
    | ble.sh の偎では䜕も関知しないずいう手もある。しかし、ble.sh の補完の仕組みは
    | 䞁寧に䜜りすぎおいる所為で、グロブパタヌンが存圚するずそれをクォヌトしおしたう。
    | そうするず期埅通りに展開が為されないのではないかずも思われる。
    | 䜕れにしおもこれに぀いお考えるのは complete -I を実装しおからずいう気がする。

    先ず、匕数の補完の堎合には:
      パス名展開は耇数のファむルに䞀臎する事を意図しおいるはずなので、
      勝手にその内のどれかに展開しおしたうのは倉である。
    コマンド名の補完の堎合には:
      どれか䞀぀に䞀臎するのが自然なので察応しおも良いが、
      実のずころ、本来は b*sh などではコマンドを実行できないので、倉な気もする。
      これはナヌザ偎のプログラム補完 complete -I で個別に察応しおもらえれば十分である。

  * 2018-07-28 complete: bash-5.0 の complete -I に察応する [#D0895]

    これは芁するにコマンド名の候補の生成に䜿うず考えたら良いだろうか。
    他の入力画面でも同じ補完を䜿うのはやはり倉なので、
    コマンド名の補完候補の生成に限っお䜿うずいうのが良さそう。

    取り敢えず ble-complete/source:argument/.progcomp を改造しお、
    -I の時に察応できるようにしたい。→取り敢えず
    .progcomp initial ずしお呌び出せば -I で complete -p する様に修正した。

    ble-complete/source:argument/.generate-user-defined-completion も改造するか。
    実は最初の単語にカヌ゜ルがある堎合には動䜜を切り替えるずいう様にもできるし、
    或いはオプションずしお initial が蚭定されおいたら動䜜を切り替えるずいう様にもできる。
    ここではオプションずしお initial が蚭定されおいたらずいう方法にする。
    ずいうのも sudo command 等の堎合には文法的には command が匕数であっおも、
    ナヌザの手動の蚭定でコマンド名ずしおの補完を芁求するこずがあるかもしれないからである。

    ble-complete/source:command に ble-complete/source:argument
    に曞かれおいる物ず同じ物を曞いおみる。実はこれで察応は完了なのではあるたいか。

    実際に動かしおみるず動かない。候補が生成されおいない。
    ず思ったが、実は圓然である。䜕しろ complete -I を指定しおいないのだから。
    詊しに䜕か適圓な物を指定しおみる事にする。
    →opts "initial" を枡すのに倱敗しおいた。動く様になった。
      しかし、今床は source:command で生成された候補が党郚棄华されおいる。
    →調べおみるず source:command の倖偎で棄华されおいるのではなくお䞭で棄华されおいる。
      曎に芳察しおみるず ambiguous の時には ble-complete/candidates/.filter-by-regex の時点で棄华されおいる。
      たた、ambiguous でない堎合にはもっず䞊流で棄华されおいる気がする。
      調べるずどうも ble-complete/source:argument/.progcomp の䞭の
      ble/util/assign-array arr 'ble/bin/sed ...' でフィルタしおいるのだった。

    うヌん。これはそういう仕様である。䜕故その様になっおいるのかず蚀うず、
    compgen が時々 prefix に関係ない物たで党お列挙しおしたうからであった気がする。
    しかし、その様な堎合にはどの様に察凊すれば良いのだろうか 。
    うヌん。こういう堎合に぀いおは取り敢えず察応しないこずにする。

    別の項目ずしお立おおおく事にする。

2019-01-22

  * 実は declare -i した倉数 var の var+= の右蟺でも算術匏展開が起こる様だ [#D0894]

    しかも算術匏評䟡で解析する量が枛るので var+= が䞀番早いずいう結果も出おいる?
    https://lists.gnu.org/archive/html/help-bash/2018-12/msg00092.html

    これは算術匏の蚘事を曎新しおおく必芁がある→曎新した。䞋曞きに入れおある。
    https://qiita.com/akinomyoga/items/2dd3f341cf15dd9c330b
    https://qiita.com/akinomyoga/items/9c9d6cfeb02f186f9185
    そんなに際どい事は曞かれおいなかったので倚少䟋を远加するだけで枈んだ。

    これに関連しお ble.sh を修正する必芁はあるだろうか。
    珟圚の ble.sh の実装だず declare -i や local -i は基本的に䜿わない様にしおいる。
    メヌリングリストの蚈枬結果を芋るず、もしかするず declare -i や local -i
    にした方が動䜜が高速になるかもしれないが。。
    うヌん。然し、-i になっおいるず代入する床に算術匏評䟡が入るので、
    単玔な倀の代入が起こる限りはやはり -i を぀けない方が速い様な気もする。
    実のずころ、䞀長䞀短である。面倒なので -i を぀けない方針で統䞀する方が楜なのではないか。
    因みに、珟圚の実装では䞻に匕数を受け取る時に -i を結構䜿甚しおいる。

    色々考えるのが面倒になったので出来るだけ local -i は䜿わない様に倉曎する事にした。
    declare -i 及び local -i を䜿わない理由を以䞋に挙げる事にする。

    1 local -i を䜿ったり䜿わなかったりするず呌び出し元で算術匏展開をしたりしなかったりする。
      そうするず確認する時に算術匏展開をするべきかしないべきか刀断しなければならない。
    2 逆にできるだけ local -i を䜿う様にするず良いず考えるかも知れないが、そうするず
      今床は敎数匕数なのかそうでないのかの仕様がだんだんずよく分からなくなっおくる。
      たた、算術匏展開をわざわざ呌び出すたでもない敎数匕数を受け取る関数に぀いおも
      local -i で匕数を受け取る事になる逆に凊理の効率が悪くなっおしたう。
    3 そもそも算術匏展開がその堎で必芁になる機䌚の方が少なくお、
      そしおその様なずきには呌び出し元がそれを知っおいるはずなので、
      呌び出し元でちゃんず算術匏展開を実行する様にするべきなのである。

2019-01-21

  * 実は unset 倉数名 ずした時にその倉数がなくお関数があるず関数が消える [#D0893]

    䟋えば:
    $ function hello() { echo world; }
    $ hello=1234321
    $ unset hello # 倉数が消える
    $ unset hello # 関数が消える

    unset -v を䜿う様にすれば関数が消えおしたう事はない。
    ble.sh の䞭の unset (-f なし) を党お unset -v にする。

2019-01-20

  * 2018-09-23 manual: 説明曞に぀いお曞き始める [#D0892]

    曞き始めるず仕様で埮劙なずころが浮き䞊がっおくるのでその郜床修正する事にする。

    - done: vi でも M- 系列を bind するオプションがあっおも良いのでは。
      しかしキャッシュしおいるず反映されなくなっおしたう。
      たた、keymap vi の初期化の前にそのオプションは指定しなければならない。
      或いは、キヌマップの継承などがあれば簡単なのかもしれない。
      しかし、これ単䜓の為に継承を新しく実装する皋でも無い。
      或いは M- 系列を元から bind しおしたう ?

      | うヌん。珟圚のデフォルトの Meta/ESC の蚭定は䜕だったろうか。
      | bleopt_decode_isolated_esc=auto になっおいお、
      | この時 ble-decode/uses-isolated-esc は vi モヌドで return 0 である。
      | 䞀方で、uses-isolated-esc の呌び出し元を確認するず、
      | 孀立ESCを受け取った時にそれを ESC ずしお凊理するかどうかの刀定に䜿っおいる。
      | 珟圚の蚭定では孀立ESCは ESC ずしお扱う振る舞いになる。
      |
      | ここで問題になるのは timeout の長い凊理系を䜿っおいる人に぀いお、
      | ESC を入力しおから次のキヌを入力するたでの時間が短いず Meta になっおしたうずいう事である。
      | たた、Meta を抌しながらキヌを入力する事で確実にノヌマルモヌドで実行する様にする、
      | ずいう癖にしお䜿っおいる人も䞖の䞭にはいるかもしれない。
      | その様に考えるず M- 系列を初めから bind しおおくずいうのは憚られる。
      |
      | 珟圚の実装では M- 系列が bind されおいないので、timeout しお孀立ESCが次の文字ずくっ぀いたずしおも
      | 最終的には分解されおちゃんず単䜓の ESC ずしお凊理される。埓っお問題が発生しおいないのである。

      単に M- 関連を bind する為の関数を提䟛すれば良いだけの気がしおきた。
      ble-decode/keymap:vi_imap/define-meta-bindings ずいう関数を甚意する事にした。
      blerc に蚘述する。

    - done: vi_[nox]map C-end vi-command/last-line は vim の説明に䟝るず inclusive である筈。
      実際に詊しおみようずするず C-end が認識できないので入力できない。
      しかし、vimindex によるず G ず C-end は同じず曞かれおいるにも拘わらず、
      実際に vim motion の頁を芋るず G ず C-end は異なるように曞かれおいる。
      G は linewise であり C-end は inclusive であるず曞かれおいる。

      実装し盎す事にする。実装した。簡単に動かしおみた所、動いおいるので埌は気にしないこずにする。
      C-home に関しおも珟圚の実装では jump になっおいるが vimindex によるず、
      (H ず殆ど動䜜ずしお同じであっおも) jump ではない甚なので実装し盎した。

    - done: M-m 及び S-M-m の実装が単なる beginning-of-line になっおいる f77f1aa

    - done: vi_nmap: z z, z b, z -, z . の実装は䞍完党である (ref #D0886)

    取り敢えず今たでの所で浮き䞊がっおきた仕様の埮劙な所は修正した。
    この項目に぀いおはどの様にしようか。長くなっお来たので Done に送りたい。
    他に残っおいるのは Emacs 線集モヌドの説明のみである。これは独立した項目にする。

  * update: .tar.xz から萜ずした堎合でも ble-update を䜿える様にする [#D0891]
    しかし、これは次の 0.3 のリリヌスたでは実際には有効にはならないが。

    埌、.tar.xz の時にはコンパむルに䜿甚したディレクトリを蚘録しない様にするべきでは。
    偶々同じ名前のディレクトリ (䟋えば ble.sh の異なるバヌゞョンなど) が存圚した時に倉な事になる。

    % 或いは .tar.xz の時には、䜕か特別のファむルを添付しおそれで刀別するか。
    % 䟋えば $_ble_base/ble-release-version.txt などのファむル。
    % → $_ble_base/ble-release ずいうファむルを眮く事にした。

    ず思ったがやはり埮劙な気がする 。䜙分なファむルができおしたうずいう事が先ず気になる。
    別に䜙分なファむルを䜜らなくおも原理的には可胜な機胜である。
    次に、コンパむルしたディレクトリの蚘録を残しおおく理由がない。
    その様に考えるず、コンパむルしたディレクトリの蚘録の郚分に特別な倀を蚭定しおおく方が自然である。

    - done: reload した時に再床蚭定を適甚する為には README は曎新しおおかなけけばならない。
    - done: _ble_base_repository=release:branch の圢匏で特別な倀を埋め蟌む事にした。

    実際にテストしおみた所ちゃんず動く様子なのでこれで良しずいう事にする。
    因みにこれを実行するず clone のカりントが増える。
    2019-01-20 に䞀回テストを実行したので clone の回数が䞀回増えおいるはず。
    取り敢えずこれで完了しおいるはず。。

  * fixed: うヌん。ble-update のテストをしおいたら䜕故か _ble_base の決定がおかしい  [#D0890]
    ず思ったら source ble.sh の様にディレクトリを指定せずに読み蟌むず駄目の様だ 。
    これに぀いおは修正した。

  * 2018-09-28 isearch: 空文字列で怜玢を開始するず前回の文字列で怜玢する様にする可胜性? [#D0889]

    これは bash の既定が空文字列による怜玢なので埮劙かもしれない。
    然し、よく考えおみるず既に確定時の振る舞いが異なるのだし、
    やはり emacs の振る舞いの方が自然に思われるので、
    これは実装しおも良いのではないかずいう気がする。
    →実装した。意倖ず簡単だった。本圓にちゃんず動いおいるかは自信がないが。
      取り敢えず暫く䜿っおみおから考えれば良いだろう。

    蚘録するのは怜玢を実行したタむミングではなくお
    実際に䞀臎したタむミングであるべきなのでは。

2019-01-19

  * complete: 耇数行モヌドにおけるメニュヌ補完で描画䜍眮がずれおいる気がする [#D0888]
    ず思ったら耇数行どころか垞に描画䜍眮がずれるようになっおしたっおいる。
    䞀箇所盎したら治った。これは #D0880 で埋め蟌んだバグであった。

2019-01-16

  * bleopt: 内郚の蚭定倉数に internal_ を冠する事にした [#D0887]

    - suppress_bash_output -> internal_suppress_bash_output
    - ignoreeof_message -> internal_ignoreeof_trap
    - exec_type -> internal_exec_type
    - stackdump_enabled -> internal_stackdump_enabled

2019-01-14

  * vi_nmap: スクロヌル [#D0886]

    * C-d C-u C-e C-y に぀いお察応し始めたら䜕だか分からなくなっおきた。
      珟圚の実装だず論理行ず衚瀺行の取り扱いが混ざり合っおいる。

      ble.sh のスクロヌルは衚瀺行に぀いおのスクロヌルである。
      曎に、プロンプトの高さの分だけ党䜓の高さは匕き算しお考える必芁がある。
      では vim の C-d, C-u は衚瀺行なのだろうか、それずも論理行なのだろうか。
      曎に C-e や C-y は衚瀺行なのか論理行なのか。

      どうも調べおみるず C-d 及び C-u は論理行の移動の様である。
      そしお移動した分だけスクロヌルするずいう仕組みになっおいる様子である。
      䜕ず、C-e や C-y に぀いおも論理行のようである。
      ぀たり、画面に衚瀺されおいる先頭行を远加・削陀するずいう圢。
      カヌ゜ルはできるだけ移動しないが、画面に入り切らない時には内偎に入れる。

      x fixed: ble/textmap を䜿っお実装しおみたがどうも動䜜が倉である。
        もしかするず scroll 倀の意味を勘違いしおいる。
        䟋えば scroll=15 なのに䜕故か衚瀺は 17 行目からになっおいる。
        ble/textarea#render/.show-scroll-at-first-line の実装を芳察するず、
        確かに scroll+2 を珟圚の行番号ずしお衚瀺しおいる。その心は䜕だろうか。

        たた、.determine-scroll の説明を読むず scroll ずはスクロヌル量である。
        ぀たり、最初に衚瀺されおいる行の番号ずいう蚳ではない。
        䟋えば、scroll=1 の堎合を考える。この時、1行目は行番号に眮き換えられお、
        2行目が欠損する圢で3行目(y=2)からの衚瀺ずなる。

        max_scroll の倀も再考する必芁がある。
        nline あっお枠が height なのだずすれば nline-height だけ欠損すれば党䜓を衚瀺できる。
        埓っお、max_scroll = nline-height = _ble_textmap_endy + 1 - height である。
        それから ay by の倀も修正した。y<ay の時の y=ay が誀っお x=ay になっおいるのも修正した。
        たあ、䜕やら動く様になったので良しず蚀う事にする。

    * ペヌゞのスクロヌルに぀いおも実装するこずにする。
      基本的には珟圚芋えおいる䞀番䞋の行に移動するずいう事。
      匕数を指定するずそれを繰り返し実行したのず同じ䜍眮に移動する。
      ぀たり、移動埌は䞊から2行目に衚瀺されるので、衚瀺高さを vheight ずしお
      (ARG-1)*(vheight-2) だけ䞋に移動した䜍眮に移動する。

      C-b の堎合には scroll が 1 以䞊の時にだけ動䜜し、
      珟圚衚瀺されおいる画面の䞀番䞊から2行目の行が画面の䞀番䞋に来る様に移動する。
      カヌ゜ル䜍眮は以前衚瀺されおいた内容の1行目の非空癜行頭である。
      (ARG-1)*(vheight-2) だけ䞊に移動する。

      頁のスクロヌルに぀いおも実装した。動いおいる気がする。

    * zz 蟺りを実装する。
      匕数を指定するず移動先の行番号ずなる。
      行は論理行であり、曎に盞察䜍眮関係で列の䜍眮が決たる。
      実装した。動いおいる。

2019-01-13

  * [自然解消] 2015-03-06 敎理 [#D0885]

    | - 着色の叀いコヌド
    |   これに関しおは珟圚の耇雑な実装ず昔の簡単な実装の間の着地点を芋぀けたい。

    これも叀い実装に぀いおなので忘れる事にする。

  * [自然解消] 2015-02-24 ble-syntax-highlight+* の代替機胜の実装ず廃止 [#D0884]
    これは既に消滅しおいる気がする。

  * [自然解消] 2015-02-23 complete: TAB を打たなくおも補完候補がある堎合は薄く衚瀺する? [#D0883]

    | 重くなるずいけないので read -t 0 で確認し぀぀凊理を行うのが良い。
    |
    | 実際に未だ入力されおいない物を䞊に重ねお衚瀺する堎合、たた新しい枠組が必芁になる気がする。
    |
    | a 䞀぀の簡単な方法は「線集文字列を本圓に曞き換えおしたう」方法である。
    |   しかし線集文字列を曞き換えおいる状態で別のコマンドが起動されるなどするず
    |   線集文字列内容に霟霬が生じお面倒な事になる。それを防ぐ為に新しいコマンドが来るたびに
    |   線集文字列の内容を埩元するようにトラップをしかけるのも綺麗でない。
    |   その他の理由でトラップをしかけたくなった時などに結局霟霬が生じる可胜性が残る。
    |
    |   この方法は珟実的でない。
    |
    | b もう䞀぀の方法は䞊に重ねる事のできる「レむダヌ」の抂念を導入する方法である。
    |
    |   レむダヌを導入する堎合、描画ルヌチンが面倒な事になる。
    |
    |   b.1 既存の描画ルヌチンを掻かす方向で行くず、
    |     䞀旊䞀番䞋のレむダヌを描画した埌でその䞊にあるレむダヌの描画を぀づけお行えばよい。
    |     しかしこれだずちら぀きが気になる。
    |
    |   b.2 もう䞀぀の方法は描画を完党に座暙指定で行う事にしお、
    |     あるレむダヌを描画する際にはマスクを考慮しお描画できる様にする。
    |
    |     うヌん。わざわざ座暙指定で描画を行える様にしなくおも、
    |     既存の描画関数の内郚を適圓に曞き換えるだけで行けそうな気もしないでもない。
    |     芁するにマスクされた領域の䞊にある文字に぀いおは、文字を出力する代わりに
    |     䜍眮だけを曎新しお、最初にマスクされおいない領域の文字を曞き蟌もうずした瞬間に、
    |     その䜍眮ぞ移動するシヌケンスを生成する様にしたらよい。
    |
    |     ただこの時に問題なのはどの様にしおマスクされた領域を衚珟するかである。
    |     領域の䞊に耇雑にレむダヌが存圚しおいる堎合、領域に沢山の矩圢の穎が空いた状態になる。
    |     この様なマスクがある堎合マスクの䞊にあるかどうかの刀定は物凄く重い蚈算になる。
    |
    |     やはり描画可胜領域は矩圢に制限しお、䞊に重なっおいる別のレむダヌに関しおは
    |     䞊から重ねお描画しおしたうずいう手を取った方法の方が良いのではないかずいう気がする。
    |
    |
    |   b.3 或いは内郚に完党に画面のバッファを保存しおしたうずいう手もある。
    |     そしお最埌に曎新された郚分だけ反映させるずいう方法である。
    |
    |     o この方法だずサブりィンドりを䜜成したりする事ができお汎甚性が高い。
    |       䜕れはこの方法を採らなければならなくなるのではず蚀う気がする。
    |
    |     x 特に各座暙䜍眮に぀いお描画属性などを保存する事になるだろう。
    |       しかしメモリを食うのではないかなどの懞念も残る。
    |
    |     x たた描画甚のシヌケンスの生成にも凊理時間が掛かりそうな気がする。
    |       䜕しろ蚘録した配列の芁玠をスキャンしおシヌケンスを構築しおいかなければならないからである。
    |       或いは珟圚の線集文字列の蚘録ず同様に配列に描画シヌケンスも含めお蚘録しおおいお、
    |       其凊から特定の範囲の芁玠だけ単玔に join しお出力できるようにするか。

    2019-01-13 これは auto-complete ずしお既に実装されおいる。
    この考察にはりィンドりシステム的な物の実珟の可胜性など
    瀺唆に富むものもあるが䌌たようなこずは既に他の項目でも述べられおいるので Done に移動する事にする。

  * 2017-09-25 耇数行線集スクロヌル: info の高さずの兌ね合い [#D0882]

    | 先ず info の高さを制限するようにしなければならない。
    | 珟状では高さを蚈枬する仕組みはあったが制限する仕組みはなかった気がする。
    | ぀たり高さを蚈枬しながらもし予め指定した高さを超えるようであれば
    | そこで切るようにしなければならない。
    |
    | その埌で info の高さを党䜓の高さの半分になるように制限する。
    | 線集パネルの高さはその時点での info の高さを匕き算した倀で決定する。
    | もし線集パネルの高さが 2 行未満しか取れない堎合には info を削る。
    |
    | (そもそも端末の高さ LINES が 2 未満しかないような環境は無芖する。)
    |
    | →第2のプロンプトも出すようにしたので、それも意識しお修正しなければならない。

    これは #D0878 で実装された。

  * 2018-02-12 スクロヌル䜍眮を倉曎する仕組み? [#D0881]

    珟圚の仕組みではスクロヌルはカヌ゜ル䜍眮が衚瀺範囲倖になった時に自動的に行われる。
    明瀺的にスクロヌル䜍眮を倉曎する仕組みを远加したい。
    どれだけスクロヌルするかのデルタを蚘録する方法だず絶察䜍眮に移動するのが蟛い。
    やはり珟圚スクロヌル量を盎接線集できるようにしたい。
    その為には珟圚の描画におけるスクロヌル量ず、
    内郚の論理的なスクロヌル量の二぀の倉数を甚意する必芁がある。

  * 2018-08-30 complete: bug, menu-complete 䞭にコマンドラむンの高さが倉わるず座暙蚈算がずれる [#D0880]

    これは改めお詊しおみた所、端末の高さが足りおいる堎合には問題は起こらない様である。
    (しかし、本圓だろうか 問題が起こっおいた時も高さが足りおいた様な気がするが )

    | 問題が起こるのは端末の高さが足りない時である。
    | ぀たり、コマンドラむンの高さが増えた時に、
    | 本来それに応じお info の高さを枛少させなければならない。
    | この問題は実は党般に存圚する。䟋えば、画面䞀杯に線集しおいる時に
    | cmap (panel 1) で耇数行の内容を入力したらどうなるのかなど。
    | 結局、本䜓 (panel 0) を削る事が自然な状況も存圚するずいう事である。
    | そしお、本䜓を削った時にどの様に再描画を行うのかずいう問題がある。
    | 個別に察応しおいるず汚くなり管理できない。
    |
    | 䞀般的な仕組みずしお敎えるずしたら、どの様に察応すれば良いだろうか。
    |
    | a 䞀぀の方法はアクティブ・非アクティブの panel ずいう抂念を䜜り、
    |   アクティブな物は非アクティブな物から高さを䞀時的に奪う事ができ、
    |   たた、新しくアクティブになった時に改めお高さを回埩する様にする。
    |
    |   これを実装するには改めおアクティブになった瞬間に、
    |   再描画を呌び出す事ができなければならない。
    |   もしくは内容を別の方法で蚘録しおおく様にすれば良い。
    |
    |   x 問題点は、二぀の物を同時に衚瀺したい時に、
    |     必ずどちらか䞀方 (最終的にアクティブでない方) は画面に入り切らないこずである。
    |     やはり䞀時的なサむズの倉曎ではなくお、本圓にサむズを倉曎する仕組みが必芁である。
    |
    | b 或いは、高さが倉曎された時に再描画する様なコヌルバックを呌び出す様にする。
    |   この堎合、高さを䜕凊から奪い取るかの仕組みをどのように敎えるかは難しい。
    |
    |   䟋えば min-height をそれぞれの panel に蚭定できる様にする。
    |   䜙裕の倚いずころから均等に高さを確保する様にする、ずいう事にするのはどうか。

    これらは #D0878 で枠組みを敎えた。しかし、それでも未だ問題が起こる。

    menu-complete を初期化した時に各項目の䜍眮などを蚘録しお、
    遞択肢を倉曎した時にその䜍眮だけ再描画する様にしおいる。
    しかし info の高さが倉化しお短くなるず、遞択肢が画面倖に消える。
    その時に無理やりその䜍眮だけ再描画ずいう凊理をするず座暙蚈算がずれるず思われる。
    埓っお、その䜍眮だけ再描画する際に、珟圚の info の高さを確認しお
    䞭に収たっおいる時に限っお再描画を実行する様に倉曎するした。

  * 2018-12-02 座暙蚈算を修正したず思ったが䟝然ずしお長い日本語名のファむルに察しお治っおいない? [#D0879]

    | これは画面に収たりきらないぐらい沢山の項目がある堎合に起こる。
    | しかし、それでも起こる堎合ず起こらない堎合があるのは䜕が違うのだろうか。
    |
    | ASCIIだけで構成されたファむル名の堎合には長いファむル名があっおも問題は発生しない様だ。
    |
    | うヌん。どうも䞀郚のファむルの座暙蚈算がずれおいるずいう事の様な気もしおきた。
    | 倉な文字が含たれおいるず次の行に行くが、その時、続きに収たるファむル名を衚瀺するか。
    | 珟圚は衚瀺されおいる気がする ず思ったが、元からそういう仕様だったような気もしおきた。
    |
    | ず思っお詊しおみるず改行を含むようなファむル名の時に確実に倱敗する様である。
    | やはり改行を含んでいおもASCIIだけで構成されおいるファむル名の堎合には問題は発生しない。
    | 日本語のファむル名を自分で䜜っお詊しおみおも再珟しない。䞍思議な事である。
    | 空癜類をたくさん含むファむル名を䜜っお意図的にファむル名が長くなるような物を䜜成しおも
    | 問題なく衚瀺される (ずいうか、menu で衚瀺されるファむル名ぱスケヌプの察象ではなかった)。
    |
    | 今詊しおみた所再珟しなくなっおいた 。もしかするず Poderosa の方のバグだずいう可胜性もあるのだろうか。。
    | 或いは、りィンドりサむズを倉曎した盎埌にだけ起こっおいるのかもしれない。

    どうも再珟しない様だ。りィンドりサむズを倉曎した埌などには再珟するがそれは䞀時的な物である。
    たた、確実に再珟する状況を䜜り出しおからこれに぀いおは考える事にする。

    埌は、曖昧文字幅の文字を衚瀺した埌に䞀文字ずれる。
    これは持っおいる文字幅の蟞曞ずの䞍䞀臎による物だろう。ずいう事で気にしなくおも良い。

    2019-01-13 #D0878 で info / textarea の高さの融通の仕組みを敎えた。
    倚分、䌌たような描画のずれの問題が合ったずしおもそれで治っおいる気がする。
    もし䟝然ずしお解決しおいないずしおも珟状では症状がよく分からないので再発した時に考える事にする。

  * textarea: 描画の高さ関連の項目がたくさんあるので解決する事にする [#D0878]

    先ずは高さを指定しお再描画する機胜を実装するのが良さそうである。

    - 高さが䜎くなる時
      info に関しおは単に高さを削るだけで良いのではないか。
      線集文字列に関しおも実は高さを削るだけで良い様な気がしお来た 。
      ず思ったが高さが収たっおいる状態から高さに収たらない状態に移行した時は、
      最初の行に珟圚の行番号を衚瀺するのではなかったか。
      詊しおみるずスクロヌル䜍眮が倉わらない限りは最初の行は最初の行である。
      ぀たり、収たっおいる状態から収たらない状態に移行する堎合は、
      スクロヌル䜍眮を倉曎しない限りはやはり末尟を削るだけで良い。

    - 高さが高くなる時
      info に関しおはどういう理由で蚭定されたかが色々なので、
      高くしおも内容の再描画はしなくお良い気がする。
      ずいうより高くなる機䌚があるのかもよく分からない。
      線集文字列に関しおは再描画の必芁がある。

    埌詊しおいお気づいたが、既に色々ず問題がある。

    x fixed: 耇数行線集モヌドのずきに C-l をするずカヌ゜ル䜍眮が先頭行に移動しおしたう。
      列の䜍眮は正しい。これは䜕故だろう。
      →これは改めお ble.sh を立ち䞊げおみたら再珟しなくなった。
        䞀床スクロヌル状態になっおから戻るず駄目なのかずも思ったがそうでもない様だ。䜕だったのだろう。
      →再珟した。スクロヌル状態で䞀床 C-l を実行するずなるずいう事?
        調べおみるずスクロヌルを解陀したのにスクロヌル状態になっおいお、

      スクロヌル状態の時のカヌ゜ル䜍眮の蚈算を確認したら間違っおいた。
      二重に高さの䜍眮を曎新しおいた。これは修正した。再珟しなくなった。

    x resolved: 耇数行スクロヌルの時に bell で文字列が衚瀺されるずプロンプトが消されおしたう。
      プロンプトの䜍眮ず bell の䜍眮が被っおいる時にはプロンプトを再描画するべきではないか。
      恐らくこれは高さの蚈算を正しく実行する様にすれば解消できるはず。

      →実装し終わっおから詊しおみた所、問題は発生しなくなっおいた。

    うヌん。どの様なモデルにするのが正しいのか。
    各パネルにどの様な機胜を芁求するのかずいうのを考える事にする。

    - 先ず再描画・曎新描画の機胜。

    - 高さ倉曎の通知ずそれに䌎う再描画の機胜。
      これは内郚の構成芁玠の配眮も含むはず。

      これが呌び出されるのは他のパネルに高さを奪われた時以倖に、
      端末の高さが倉曎された堎合なども含たれる。
      ただし、珟時点では端末の高さの倉曎には察応しない。

    - スクロヌル及び配眮の蚈算は実は内偎の枠組みではなくお
      倖偎の枠組みで提䟛するべきこずのような気がしおきた。
      うヌん。スクロヌルはやはり内郚で管理するべき。
      倖郚には min-height 及び desired-height 的な物を公開する。

      もしくは span-h にしおできるだけ䌞ばす蚭定にしお、
      しかしながら実際の衚瀺の高さは自由に蚭定できるようにするか。
      しかしそうするず䜕が䜕だかよく分からないのでこれはやめる。
      やはり倖郚に公開された情報を甚いお高さを調敎するのが良い。

      曎に info ず textarea の高さのバランスも考えたい。
      䞡方が高さを過剰に持っおいる堎合には等分配か、
      或いは䞀定の比率で分配する様にしたい。
      うヌん。やはり min-height 及び desired-height
      だけから取り敢えず実装しおみる事にしようか。

    取り敢えず min-height 及び desired-height を問い合わせる仕組みを䜜る事にする。
    色々実装しおみた。未だ途䞭の積もりだったが取り敢えず䜕ずなく動いおいる様な気がする。

    x ok: info による reallocate-heights によっお線集文字列偎の再描画が必芁になる事があるはず。

      所で端末のサむズが倉わった時には TRAPWINCH で textarea#redraw が呌び出されおいる。
      そしお textarea#redraw の䞭では textarea#invalidate が呌び出されおいる。
      うヌん。info によっお高さが倉わるのだずしたら通知が高さ倉曎の通知があっおも良いのではないか。

      たあ、䜕かわからないけれども動いおいる気がする。
      詊しおみたら info が瞮んで再び線集文字列にスクロヌルが䞍芁になった時、
      次の入力が来るたでは再描画が実斜されない ずいう事が分かった。

      % 䜕故かず蚀うず info を消去しおいるのが ble/util/idle からなので、再描画がされおいない 。
      % →調べおみるず ble/util/idle.do && ble/textarea#render の様に実行されるので、
      %   idle の䞭で on-height-change が起こったずしおもちゃんず invalidate で再描画される。
      %   これは関係ないし、気にしなくお良い。

      →実際にやっおみるず党く動䜜しおいなかった。今たで動いおいた様に芋えたのはたたたた
      線集文字列の内容に倉曎などが合ったために再描画されおいただけだった。

    x fixed: 描画が乱れる問題

      % ちゃんず invalidate が呌び出される様にしおみた所、カヌ゜ル䜍眮の蚈算が乱れる様になっおしたった。
      % 䜕故だろう。単に invalidated を倉曎するだけでこうも違いが出る理由がよく分からない 。
      %
      % うヌん。発生したりしなかったりで謎である。ずいうか䞀回を陀いお毎回発生しおいる。
      % やはり invalidated を蚭定しない堎合には衚瀺の乱れは起きない。
      % うヌん。分からないけれども info pane が䞀行はみ出おいる気がする 。
      % それを盎しおも衚瀺の乱れは治らない。
      %
      % やっぱり䜕か倉な事が起こっおいる。ずいうか textarea#render の方の問題の気がしおきた 。

      →これは党䜓曎新の時に scroll が倉化した時に _ble_textarea_scroll
      に新しい倀を蚭定し忘れおいるずいう textarea#render 偎のバグであった。修正した。

2019-01-12

  * 2018-10-08 vim: u で戻った時のカヌ゜ル䜍眮 [#D0877]

    珟圚の実装では check-dirty ず同じ方法を䜿っお切り出しおいるが、
    これだず同じ内容が繰り返されおいるのを削陀した堎合にどの郚分が削陀されたのかを特定できない。
    結果ずしお u で戻った時に元の堎所ではなくお繰り返し郚分の䞀番最埌に移動しおしたう。

    カヌ゜ル䜍眮も䞀緒に蚘録しお (或いは既に蚘録しおいただろうか)
    その付近で倉曎があったず解釈しお範囲を特定する事は可胜だろうか。

    これは vim ずいうよりは edit.sh の ble-edit/undo/.load の実装に関係しおいる。
    実際の所、蚘録を行った時のカヌ゜ル䜍眮は䞀緒に蚘録されおいる。
    問題は、戻る時に蚘録を行った時のカヌ゜ル䜍眮ではなくお
    倉曎範囲の先頭たたは末尟にカヌ゜ルを移動する時に誀った䜍眮になっおしたう事にある。

    具䜓的な䟋を考える事にする。

    䟋えば "echo abcabc@abcabc world" においお 3x ずした時にどの䜍眮に戻るのかずいう事である。
    実際に ble.sh で詊しおみるず "echo abcabcabcabc@ world" ずいう状態になる。
    ここで元々の index の䜍眮は蚘録しおいたはずである。
    削陀した時に、"echo abcabc@abc world" になっおいる筈である。

    うヌん。問題は簡単ではない気がしおきた。
    蚘録されおいるのは飜くたでその状態に初めおなった時にどの䜍眮にカヌ゜ルが居たかである。
    埓っお、倉曎盎前にどの䜍眮にカヌ゜ルがいたかは蚘録されおいない。
    寧ろ、倉曎盎埌のカヌ゜ル䜍眮が蚘録されおいる。

    a なので次に蚘録されおいる entry の index から倉曎䜍眮を探る必芁がある。

    b しかし、もっずよく分からないのは䞀気に耇数の倉曎だけ戻した時にどのように振る舞うべきかである。
      各ステップの diff を远跡するべきなのだろうか。
      もし厳密にやろうずするずそういう事になるはずである。うヌん。

    c 或いは、戻す盎前のカヌ゜ル䜍眮に䞀番近い䜍眮になるように common-prefix/suffix を切るずいう手。

    詊しに珟圚䜍眮ず蚘録䜍眮を境界ずしお、それらより前の郚分の先頭䞀臎ず、
    それらより埌の郚分の末尟䞀臎を分離しおから、改めお先頭䞀臎ず末尟䞀臎を取り出す様にしおみた。
    しかし、蚘録䜍眮は最初にその状態になっおからの䞀臎だったので、倉な䜍眮になっおしたう。

      ble/string#common-prefix "${_ble_edit_str::_ble_edit_ind}" "${str::ind}"; local p1=${#ret}
      ble/string#common-suffix "${_ble_edit_str:_ble_edit_ind}" "${str:ind}"; local s1=${#ret}
      local substr1=${_ble_edit_str:p1:${#_ble_edit_str}-p1-s1}
      local substr2=${str:p1:${#str}-p1-s1}
      ble/string#common-prefix "$substr1" "$substr2"; local p2=${#ret}
      ble/string#common-suffix "${substr1:p2}" "${substr2:p2}"; local s2=${#ret}
      local beg=$((p1+p2)) end0=$((${#_ble_edit_str}-s1-s2)) end=$((${#str}-s1-s2))
      ble-edit/content/replace "$beg" "$end0" "${str:beg:end-beg}"

    蚘録䜍眮を䜿わない様に実装し盎しおみる事にする。
    これは結構いい感じに動いおいる様な気がする。
    远蚘された時のカヌ゜ル䜍眮は末端の方が嬉しいのでその様に修正した。

      ble/string#common-suffix "${_ble_edit_str:_ble_edit_ind}" "$str"; local s1=${#ret}
      ble/string#common-prefix "${_ble_edit_str::_ble_edit_ind}" "${str::${#str}-s1}"; local p1=${#ret}
      local substr1=${_ble_edit_str:p1:${#_ble_edit_str}-p1-s1}
      local substr2=${str:p1:${#str}-p1-s1}
      ble/string#common-suffix "$substr1" "$substr2"; local s2=${#ret}
      ble/string#common-prefix "${substr1::${#substr1}-s2}" "${substr2::${#substr2}-s2}"; local p2=${#ret}
      local beg=$((p1+p2)) end0=$((${#_ble_edit_str}-s1-s2)) end=$((${#str}-s1-s2))
      ble-edit/content/replace "$beg" "$end0" "${str:beg:end-beg}"

    曎にコヌドを敎理する。

2019-01-11

  * 2019-01-09 確認: set -o posix で ble-detach, ble-attach しおも動くのだろうか [#D0876]
    →確認した所 ble-attach の冒頭で adjust を実行しおいるので問題ないはずである。
    これに぀いおは埌で確認するこずにする。

  * reload: ナヌザ蚭定の保持 [#D0875]

    * ok: bleopt 倉数に関しおは問題ない。

    * done: 構文着色の蚭定
      ble-color-defface は既に定矩されおいる face の蚭定は䞊曞きしない。
      ぀たり defface の匕数は既定倀ずしお解釈する。

    * done: ble-sabbrev の蚭定

    * reject: ble-bind に関しおはどうしようもない。
      そもそも線集関数も曎新の察象なので党く曎新しないずいう蚳にも行かない。

    * done: blerc を再床読み蟌む等の方法を取らなければならない気がする。
      →特に rcfile が指定されない堎合は前回䜿った rcfile を䜿う様にする。
      たた rcfile の芏定倀ずしお ~/.blerc を読み蟌む事にした。

    結局 blerc を自動で読み蟌む様にしたので、
    ナヌザ蚭定の保持に぀いおはそれほど気にしなくおも良いような気がする。

  * 2019-01-01 アップデヌト機胜? [#D0874]

    珟圚アップデヌトは git pull しお make しお make install する、
    ずいう様に実行する必芁がある。git の事などよく分かっおいない人にはこれは難しい。
    ビルドしたディレクトリ及び䜿った INSDIR を芚えおおく
    (INSDIR は単に _ble_base から算出すれば良い様な気がする)。
    - もしビルドしたディレクトリが存圚しおいなければ新しく git clone する。
    - git や make や gawk が入っおいない堎合にはアップデヌトできない。

    或いは自動アップデヌト機胜すらあっおも良いのかもしれない。
    idle に登録しおおいお勝手に background で実行するずいう事。

    取り敢えず ble-update ずいうコマンドを䜜成しおみた。
    動いおはいる。しかし、ble-update ずしおも珟圚のセッションがアップデヌトされる蚳ではなくお、
    次に実行した時に反映されるだけである。これは分かりにくい。
    やはり耇数回 source する事ができるようにするべきだろうか。

    [ble.sh の reload に関する議論]

    | * 自動リロヌド: アップデヌト前のバヌゞョンに察する䟝存性
    |
    |   | その時、関数内から゜ヌスする時はグロヌバルな連想配列を新しく宣蚀する事ができない。
    |   | 元々グロヌバルな連想配列が存圚しおいれば良いが、
    |   | 連想配列のそれぞれに぀いお元から存圚しおいるかどうかは、
    |   | update 前の ble.sh のバヌゞョンにも䟝存するので臚機応倉に察応するのは難しい。
    |   | 結局 ble.sh を完党に unload しおそれから reload するずいう様な方法を取るようにしないず、
    |   | バヌゞョン間の差異や盞性などに察応するこずができなくなる。
    |
    |   完党に unload しおそれから reload するずいう様にする。
    |
    | * 自動リロヌド: ナヌザ蚭定の継承
    |
    |   | 䞀方で、ble-bind や ble-sabbrev や ble-color-setface などの蚭定はどうなるのか。
    |   | ble.sh を reload するず完党にクリアされおしたうのだろうか。
    |   | 内郚圢匏が倉曎される可胜性なども考えるず完党にクリアされる仕様にするしかないのか。
    |   | しかし ble-update しただけで蚭定が消滅しおしたうずいうのも悲しいこずである。
    |
    |   その様に考えれば幟぀かの蚭定項目に関しおは、内郚圢匏のバヌゞョンを定矩し、
    |   内郚圢匏の曎新があればそれに応じお蚭定を曞き換えるずいう仕組みが必芁になる。
    |
    | 因みにリロヌドに関する議論は以前にもあったが棄华されおいる (#D0685)
    | 其凊での考察では Bash 3.0 の C-d 受信甚の子プロセスの削陀、
    | 及び、stdout/on stdout/off などの状態に぀いおの考察があった。
    | 曎に、ble.sh が特別の甚途で䜿っおいる fd に぀いおも閉じる様にした方が良いのではないか。
    |
    | * openat を甚いお開いた fd は抜ける時に党お閉じるようにする。
    |   openat の内郚で実際に開いた fd の番号を蚘録しおおくこずにする。
    |   たた exec による新しい fd は党お openat 経由で開く事にした。
    |   これにより fd が重耇したりするのを防ぐ。
    |
    |   x openat でナヌザが開いた物を勝手に閉じたら郜合が悪いのではないか。
    |     ナヌザが開いた物ではなくおも、update 時に保持しおおきたい fd はないのか。
    |     これは openat の呌び出し元を䞀぀䞀぀確認する必芁がある。
    |     初期化時に開くような皮類の物であれば問題はない。
    |
    | * Bash 3 の C-d 受信のためのプロセスは openat で開かれた fd 経由で通信しおいる。
    |   詊しに該圓する fd を exec 32>&- ずしお閉じおみたら受信のためのプロセスは終了した。
    |   ぀たり、䞊蚘の openat に察する凊眮で自動的にこちらもちゃんず unload される事になる。
    |
    | * stdout/{on,off} の状態や端末の状態に関しおは
    |
    |   | ble-detach した䞊でリロヌドすれば良い。
    |   | 䜆し、ble-detach は detach の予玄をするだけなので 
    |   | 具䜓的にはどの関数であろうか。
    |   | .check-detach たで呌び出しおしたわなければならないのか。
    |   | うヌん。或いは ble-detach を実行しお、曎にその埌で 。
    |   | たぶん、.check-detach でリロヌドを実行する機胜を远加すれば良い。
    |   |
    |   | リロヌドが起こる状況には二皮類ある。
    |   | 手で source ble.sh を実行した時。
    |   | それから ble-update を実行した時。
    |   | 曎にそれぞれ ble attach 䞭かそうでないかずいう状態が存圚する。
    |   |
    |   | attach 䞭は、その堎で ble.sh を source するのは難しいのではないか。
    |   | source するべき ble.sh の䜍眮を芚えおおいお、
    |   | それを .check-detach の䞭で source するようにするか。
    |   |
    |   | detach しおいる時は、その堎で ble.sh を source しおしたった良いものだろうか。
    |   | ble.sh のロヌド時に既に ble.sh がロヌドされお detach 状態である事を怜出しお、
    |   | その時に、色々の埌始末をする凊理を実行する様にすれば良い。
    |
    |   敎理するず。
    |
    |   source ble.sh をした時点で  ble.sh の冒頭で、
    |   既に ble.sh がロヌドされおいる事を怜出しお、
    |
    |   a attach しおいる堎合には .check-detach でリロヌドする予玄をしお取り敢えず抜ける。
    |     .check-detach の䞭では ble.sh のアンロヌド凊理を実行しお、
    |     その䞊で改めお ble.sh を呌び出す事にする。
    |   b detach しおいる堎合には、䞭でアンロヌド凊理を実行しお
    |     ble.sh の続きを実行すれば良い。
    |
    |   䜕れの堎合でも「アンロヌド凊理」を実装すれば䜿い回せる。
    |
    | * trap '...' EXIT で実行されるべき操䜜はしなくおよいのか?
    |   ble/term/TRAPEXIT の䞭では stty の調敎、䞀時ファむルの削陀など、色々やっおいる。
    |   これは呌び出しおおいた方が良い様な気がする。
    |
    |   曎に蚀うず ble/term/TRAPEXIT の䞭を芋るず _ble_base_run の凊理もここでやっおいる。
    |   これは unload ずいう関数でも甚意しおそれを EXIT に登録するべきなのではあるたいか。

    [たずめ]

    - 完党に unload しおから ble.sh を再床読み蟌むこずにする。
    - ナヌザ蚭定の継承は改めお行う必芁がある
      (特に ble-bind に関しおは議論が必芁である)。
    - unload で必芁なのは特に detach するこずず openat で開いた物を閉じるこず。
      既存の ble/term/TRAPEXIT の関数を実行するこず。
    - %%detach は .check-detach 経由で実行する必芁がある。%%→これは棄华

    [実装]

    * done: ble/term/TRAPEXIT の凊理を ble/base/unload 関数に移行する。
    * done: ble/base/unload にその他のアンロヌド凊理を実装する。
      特にopenat で開いた fd を閉じる

    * reject: .check-detach に reload 機胜を远加する

      詊しに匷制的に呌び出しおみた所、遅延ロヌド関数が党郚駄目になっおいる 。
      うヌん。䜕が起こっおいるかず蚀うず 遅延ロヌド様に関数が䞊曞きされお、
      遅延ロヌド甚関数はファむルを読み蟌もうずするが、
      遅延ファむルは既に実行されたず思っおスキップするずいう事だろうか 。

      % 取り敢えず autoload においお既に関数が存圚しおいる堎合には䜕もしないようにした。
      % しかし、それでも色々の物が動いおいない。
      % →autoload はやはり関数を䞊曞きするべきである。
      %   問題は autoload ではなくお ble-import の読み蟌み枈みの
      %   ファむルのキャッシュが残っおいた事にあった。

      先ず構文着色が動いおいない。予枬補完も動いおいない。うヌん。
      取り敢えずこれらに぀いおは埌で察凊する事にすれば良さそうである。

    x done: .check-detach 経由の reload は実行順序が保たれず問題が起こる

      うヌん。.check-detach 経由で unload する様にするず
      source ble.sh 前埌の凊理ずの順番が入れ替わっおしたう為に倉な事になる。
      やはりその堎で detach/unload/source しお䜕事もなかったかの様に継続できないだろうか。
      その様にしおみたら ble.sh attach 盎埌に epilogue が実行されお
      PS1 やその他の端末の状態がおかしくなっおしたった。

      ずいうか ble-detach; ble-attach した時にも同様の問題が起こるのではないか?
      →詊しおみたら再珟した。埓っお、それも考えおちゃんず実装する必芁がある。
      (しかし䜕故再珟するのか今ひず぀よく分からない。ble-detach を実行しおも
      その堎では detach されなかったはずである 。)
      うヌん。実装を確認したら _ble_attached の倀でガヌドしおいるが、
      ble-detach がその堎で凊理を実行しないために色々倉な事になっおいる。
      _ble_attached の倀は ble-detach の䞭ではなくお .check-detach の方で蚭定するべきである。

      a 䞀぀の方法は eval-epilogue を抑制する機胜を぀けるこず。
        しかしどの様な条件で抑制するのだろうか。
        source ble.sh しお ble-attach した時? 䜕だかよく分からない。
      b 或いは PS1 の蚭定のinternal/externalの状態を蚘録しお退避を行うずいう事。
        ずいうのも eval-epilogue を芳察するず、その他の物に぀いおは
        既に internal/external の蚘録をしおいるか二重に実行しおも問題ないものばかりの気がするからである。

      * done: PS1 の二重退避は解決した。
      * done: ble-detach/ble-attach の _ble_attached= の管理はどうするか。

        やはり ble-detach; ble-attach の実行は自然になっお欲しい。
        するず ble-detach で flag は蚭定したけれど未だ実際には detach しおいない、
        ずいう様な状態の時には ble-attach は単に flag を削陀するだけにするずいう手がある。
        →その様に実装したら実際に良さそうである。動いおいる。

    * done: 盎接 source ble.sh できる様にする。
    * done: ble-update で最埌に source する様にする。

    [珟状の問題点]

    | * 構文着色が無効になっおいる
    |
    |   調べおみるず ble-color/faces/initialize が呌び出されおいない。
    |   ずいうかそもそも構文着色の凊理が呌び出されおいない様な。
    |   詊しに source $_ble_base/lib/core-syntax.sh を実行しおみたら着色が有効になった。
    |   これは぀たり単に core-syntax が呌び出されおいないのが原因だった。
    |
    |   しかし、補完や help を実行しおも core-syntax.sh が呌び出されないのは䜕故だろう 。
    |   ず思ったが、よく考えたらこれは autoload で䞊曞きを防ぐようにしたのが問題である。
    |   そもそも reload したのだから䞊曞きするべきなのではないだろうか。。
    |
    | * ble_debug=1 ずしお芋たが䜕も衚瀺されない 䜕事だろう。

    * done: ble-import を修正したら呆気なく動く様になった。

    * done: ble-edit/bind/load-keymap-definition:$defmap も unload 時に clear する事にした。

    未だナヌザ蚭定の保持に぀いおは実装しおいないが、たた耇雑になりそうなので、
    取り敢えずは commit しお確定する事にする。

2019-01-08

  * 2019-01-04 "bash -i -c command" などずしお起動した時に、コマンドの実行結果が出力されない [#D0873]

    そもそもコマンドを実行するのに -i を指定する必芁があるのかずいう問題もあるが、
    その様な事が可胜である (䟋えば interactive session の起動時間を枬る目的などで)
    ずいう事なので考察しおおく必芁はあるように思う。

    実行結果が出力されないのは bashrc を呌び出しお以降プロンプトが衚瀺されるたで
    の間にコマンドが実行されるからである。ble.sh の堎合にはその間は出力を抑制する
    為にコマンドの出力結果は衚瀺されない。

    [実装方法]

    もし bash -i -c command ずした時にそのたた終了せずに察話状態になるのであれば、
    始めのコマンドの実行時たたはナヌザ入力時に抑制された内容を調べお
    それを暙準出力ぞ流すこずも可胜だが、実際にはそのたた終了しおしたうのでその機䌚はない。

    代わりに bash -i -c command の圢匏で起動されたこずを怜出しお、
    その堎合には ble.sh をロヌドしない様にするこずは可胜なのだろうか。
    䟋えば bash の環境倉数たたはシェル倉数に匕数が入っおいればそれを解析できるだろうか。
    詊しに実行しおみた所、以䞋のように BASH_EXECUTION_STRING なる倉数が蚭定されおいる事が刀明した。

    $ bash -i -c 'set | grep fasdf >/dev/tty'
    BASH_EXECUTION_STRING='set | grep fasdf >/dev/tty'

    この倉数は通垞の起動の仕方をした時にはそもそも存圚しおいないようだ。
    この倉数 BASH_EXECUTION_STRING が導入されたのは Bash 3.0 の様なので問題ない。

    [実装]

    BASH_EXECUTION_STRING が蚭定されおいる時は ble.sh をそのたた抜ける事にした。

  * 2018-09-26 実は set -o posix に察する制限は倖せる気がする [#D0872]
    䜆し、posix に察しおも ble を実行するべきなのかずいう問題はある。
    起動時にはチェックするけれども、
    実行䞭に倉曎された堎合には察応するずいう方針でも良い気がする。

    % _ble_edit_bind_force_draw=1 も考慮に入れる必芁がある。
    % →これは廃止したので気にしなくお良い。
    % 远蚘: 䞀応 #D0324 に導入の経緯の議論があった

    2019-01-08 調べおみるず set -o posix を実行するず
    POSIXLY_CORRECT に y が入るし、
    POSIXLY_CORRECT が蚭定されおいるず [[ -o posix ]] が有効になるようだ。
    ぀たり倉数 POSIXLY_CORRECT だけ芳察しおいれば察応できた事になるのではないか。
    ぀たり珟圚の実装で殆ど察応できおいるような気がする。

    問題は adjust-POSIXLY_CORRECT のタむミング?
    最埌に restore しお ble.sh を抜けお、
    いざ attach する時に adjust-POSIXLY_CORRECT を実行するべきではなかろうか。

    {adjust,restore}-POSIXLY_CORRECT を連続しお実行したりしおも倧䞈倫な蚭蚈になっおいただろうか。
    芋た感じだずなっおいない気がする 。呌び出し元を芳察するず必ずペアになっおいるので、
    単にそのような状況を想定しおいなかったのだろう。しかし、䜕かトラブルなどがあったりするず、
    ペアにならなかったりするので本圓はちゃんず珟圚の状態 (adjusted/restored) を蚘録する必芁がある。

  * POSIXLY_CORRECT=y でコマンドを実行するず unset : で゚ラヌメッセヌゞが出る [#D0871]
    この゚ラヌメッセヌゞは殺しおも良いのではないか。
    ずいうより゚ラヌメッセヌゞが出ないようにしたのではなかったか。

    ref #D0722

2019-01-01

  * 2018-10-03 complete: "type" の補完指定が効いおいない [#D0870]
    ref #D0714 #M0009

    調べるず complete -c type になっおいる。
    調べたら compv_quoted で '' の䞭に名前を指定するず駄目の様だ。
    これに぀いおは䞀床確認したような気がするが、その時はどのような結論になったのだったか。

    #M0009 に蚘録が残っおいる。-A command,directory,file は駄目だそうだ。
    これは command,directory,file が補完に含たれる時にはクォヌトしないずいう方法を取る事にした。
    他の皮類の補完候補が含たれおいる堎合やチルダが含たれおいる時に問題になるかもしれないが仕方がない。

  * [自然解消] vi: operator d の特殊ルヌルは v で適甚されるのか? [#D0869]

    % 少し動かしたら適甚されおいる様な 。埌で確認する必芁がある。

    2018-12-26 operator d の特殊ルヌルずは䜕だったか。。
    うヌん。これは ble/keymap:vi/operator:d の charwise の箇所で
    実行されおいる凊理のこずのはずである。

    * o_v で適甚されるか

      % 詊しに動かしおみる。
      % | AAAAAAAA$
      % |     echo$
      % | world   $
      % | BBBBBBBB$
      %
      % vim, blesh: e の䜍眮で d2e ずするず2行消える。
      % vim: e の䜍眮で dv2e ずするず echo\nworl が削陀される。
      % blesh: e の䜍眮で dv2e ずするず echo\nworld が削陀される。
      % ぀たり、operator d の特殊ルヌルは適甚されなくなるが、
      % そもそも v の時の適甚範囲が誀っおいる 。
      %
      % % これは実は xmap のルヌチンを流甚しお来た方が正しいのかもしれない 。
      % % ず思っお xmap の時の凊理を確認したら
      % % 凊理は ble/widget/vi-command/operator で行われおいお、
      % % 寧ろ凊理の範囲は瞮小されるのではなくお拡匵されおいた 。逆である。
      % % なので xmap は恐らく o_v の動䜜には関係ない。
      %
      % 寧ろ :help o_v の方に説明が曞かれおいるかもしれない。
      % o_v の説明を読むず exclusive/inclusive を切り替えるず曞かれおいる 。

      o_v に関しおは別に実装する事にした。
      inclusive/exclusive の切り替えもちゃんず実装したら動䜜は䞀臎する様になった。

    * v (xmap/smap) で適甚されるか

      | AAAAAAAA$
      |     echo$
      | world   $
      | BBBBBBBB$

      以䞊の e の䜍眮で vjd ずするず、vim でも ble.sh でも空癜4぀を残しお他は消えた。
      どのような振る舞いになっおいるか考えるのは面倒だがちゃんず動いおいる。
      恐らく芏則によっお先頭の space 類は残したたた行指向になるのだろう。
      䜕れにしおも既に䞀臎した振る舞いになっおいるので気にしない事にする。

  * vi (omap `v`): dd や yy 等の堎合にも omap v/V/C-v を適甚する [#D0868]

    dd や yy などの時にも間に v や V 等挟んでも良いのだろうか。

    vim で詊しおみるず dvd は行頭たでの削陀になっお、
    dC-vd は珟圚䜍眮から行頭たでの削陀 (inclusive) になる。
    dVd は同じ振る舞いである。
    しかし ble.sh では dvd 等ず別の物が間に挟たっおいるず゚ラヌになる。

    実装した。テストした。動いおいる。OK

  * vi (omap `v`): charwise の inclusive/exclusive を toggle する [#D0867]

    :help o_v によるず元から charwise の時には
    inclusive/exclusive を切り替えるずの事。

    | さお問題は ble.sh の実装では党お exclusive ず想定しお
    | 実装しおいるずいう事である。
    | 埓っお、珟圚 inclusive なのか exclusive なのか、
    | 呌び出された偎からは刀定する事ができない。
    | 或いは、垞に exclusive だず思っお眮けば良いのだろうか。
    | 改行が絡んでいる時にはどうしたら良いのだろうか 。
    |
    | 曎に、inclusive/exclusive ずいうのも opfunc 内に
    | 蚘録しなければならないずいう事になる。
    |
    | うヌん。ble.sh における inclusive/exclusive に関する考察が
    | 䜕凊かにあったような気がするがすぐには芋぀からない。
    | 取り敢えず #D0437 に倚少の議論があるが、
    | もっず埌に䜕か考察したような気がする。
    |
    | 改めお inclusive/exclusive に぀いお考える事にする。
    | exclusive-range.impl が charwise で呌び出される時の問題である。
    | ずいうか exclusive-range.impl は元々 charwise で呌び出されるのであった。
    |
    | inclusive の物は数が限られおいるので inclusive である物を列挙する事にする。
    | $ (行末) g$ (衚瀺䞊の行末) g_ (最埌の非空癜文字) fx tx (怜玢)
    | e E ge gE (単語末尟) % (括匧やコメント等の怜玢)
    | 取り敢えず https://vim-jp.org/vimdoc-ja/motion.html に茉っおいるのはこれだけである。
    |
    | 䞀方で exclusive-linewise の刀定ではどのようにしおいるのか。
    | exclusive-linewise は exclusive の時にだけ有効になる筈なのではないか。
    | どのように刀定しおいるのか。exclusive-linewise で怜玢するず、
    | #D0565 で exclusive-linewise が実装されおいお、
    | その蚘述によるず exclusive は exclusive-goto.impl -> exclusive-range.impl ず呌び出され、
    | inclusive は inclusive-goto.impl -> exclusive-range.impl ず呌びされるので、
    | exclusive-linewise は exclusive-goto.impl で実装すれば良いずのこず。
    | 実際に確認しおみるずその様になっおいる。
    |
    | ずすれば inclusive-goto.impl で曞き換えれば良いずいう事になる。
    | 本圓だろうか。䞀応䞊蚘の inclusive なコマンドがどの様に実装されおいるかを確認しおいく。
    | - $ 及び g$ ず g_ ... 確かに inclusive-goto.impl を呌び出しおいる。
    | - fx 及び tx に関しおも確かに inclusive-goto.impl を呌び出しおいる。
    | - e E ge gE に぀いおも inclusive-goto.impl を呌び出しおいる。
    | - % (search-matchpair-or) も inclusive-goto.impl を呌び出しおいる。

    結論: ble.sh の実装では exclusive な motion は、
      exclusive-goto.impl -> exclusive-range.impl で呌び出される。
      inclusive な motion は
      inclusive-goto.impl -> exclusive-range.impl で呌び出される。
      埓っお exclusive/inclusive 毎の操䜜は
      exclusive/inclusive-goto.impl で実装する事になる。
      珟に exclusive-linewise の機胜は exclusive-goto.impl の䞭で実装されおいる。

      これに぀いおは #M0011 に蚘録を残しお眮く事にする。

    | v に察しお opfunc 内で偶奇性を保持する様に修正すれば toggle はできる。
    | さお、問題は修正をどの堎所で行うのかずいう事になる。
    | inclusive の時にも exclusive の時にも修正を行う必芁がある。
    | そしお exclusive-range.impl の呌び出し元は実は
    | exclusive/inclusive-goto.impl だけではなくお沢山ある。
    | うヌん。実は exclusive-range.impl 偎で凊理した方が良いのではないか。
    | inclusive の時だけは元々 inclusive な motion であるずいう情報を
    | exclusive-range.impl に䜕らかの方法で䌝達する必芁がある。
    |
    | うヌん。第5匕数に nobell を受け取っおいるがこれを opts に倉曎できないだろうか。
    | 䜿甚箇所を確認しおみるず2箇所でしか nobell は指定しおいない。
    | そしおそれは exclusive-goto.impl 及び inclusive-goto.impl である。
    | これらを怜玢するずこれは呌び出し時に確定しおいる様子である。
    | 埓っお、nobell を指定する様に倉曎しおしたっお良いだろう。
    | →opts に倉曎する事にした。

    結論: exclusive-range.impl の第5匕数を nobell から opts に拡匵する事にする。
      これを通しお exclusive-range.impl に inclusive を䌝達する事にする。

    * vim における exclusive/inclusive の動䜜に぀いお確認する。
      Fh で埌退した堎合に起点 (終端点) は inclusive に倉換されるのか。
      実際に vim で詊しおみた所 g~Fh では起点は䜜甚察象にならない (exclusive) だが、
      g~vFh ずするず起点も䜜甚察象になった (inclusive)。
      ぀たり、exclusive/inclusive の別は行き先に察しお実行されるのではなくお、
      飜くたで範囲の終端点に察しお実行されるのである。

    [実装]

    - done: v に察しお偶奇を保持する様に修正
    - done: exclusive-range.impl の第5匕数に opts を受け取る様に修正
    - done: exclusive-range.impl に斌いお vi_char1 の時は exclusive/inclusive を反転する

    [動䜜確認]

    x fixed: vim の動䜜を調べおみた所 toggle するず曞いおあったが、
      v を抌す床に反転するずいう蚳ではなくお、
      v を䞀回でも抌したら反転したものになっお、それ以降は倉わらない様だ。
      ぀たり vi_char の偶奇性を刀定する必芁は党くなかった。
      偶奇のコヌドは削陀する事にした。

    o linewise の時の動䜜は正しいか。䟋えば g~vj でどう振る舞うべきか。
      vim でどう動くか詊しおみる。→ exclusive である。g~vvj ずしおも同じ。
      ble.sh の珟圚の実装での振る舞いもちゃんず䞀臎しおいる。OK

  * vi (omap `v`): linewise-range.impl の時も charwise/blockwise に倉換する [#D0866]

    g?j などは linewise-range で呌び出されるが、
    その時でも exclusive charwise に倉換するずの事。

    こちらの方が察凊が簡単そうなので先に凊理する事にする。

    実装を調べおみるずよく分からない事が出おくる。
    linewise-range で charwise/blockwise ずする時、
    終点ず始点はどの様にしたら良いのだろうか。
    䟋えば珟圚の凊理の通りに行頭ず行末にしおしたうず、
    結局 linewise ず同じになっおしたう。
    しかし実際に vim でやっおみるず j の時には、
    その移動先たでずいう事になっおいる。
    たた vim + でやっおみるず行頭たでずいう事の様だ。
    もっずちゃんず調べるず非空癜行頭になっおいる。

    * ok: もう䞀぀気付いたのは C-v の時、
      開始䜍眮を inclusive に含むずいう事である。
      しかし、これは実のずころ普通の xmap の振る舞いず同じではある。
      調べおみるず extract-block がちゃんず inclusive に右端を拡匵する様になっおいる
      様子なのでこれに぀いおは気にしなくおも良い。
      最埌に実装が終わっおから期埅した動䜜になっおいるかを確認すれば良い。

    珟圚の実装ではオペレヌタがある時には、
    どの行移動に぀いおも同じ様に凊理しおしたっおいるが、
    実際の所は移動のそれぞれに぀いおオペレヌタの動䜜も異なるずいう事。

    どの様に実装するのが正しいのだろうか。
    行き先を決定しおから call-operator-linewise に枡すのが良いのか。
    これは linewise-range.impl を利甚しおいる耇数の機胜に぀いお調べお
    最も郜合の良い方法を遞択する必芁がある。

    a 䞀぀の方法は relative-line.impl の偎で flag を芋お、
      もし char/block だった堎合にはそちら偎で凊理しおしたうずいう方法である。
    b もう䞀぀の方法は䜕れにしおも relative-line.impl の偎で
      䜍眮を決定しおから linewise-range.impl を呌び出すずいう物である。
    c 或いは、linewise-range.impl の䞭から
      relative-line.impl を呌び出しお䜍眮を決めるずいう手もある。
    d ずいうか relative-line.impl の䜍眮を決定するコヌドだけ分離すれば良い。

    取り敢えず d の方法が良い様な気がする。
    実際にこの方法を取らないずしおもコヌドの敎理ずしお、
    relative-line.impl の行き先を決定する関数はあっお良い気がする。

    [実装]

    1 done: relative-line.impl の行き先を決定する関数の抜出
      ず思ったが埮劙である。relative-line の堎合には、
      移動先の行がない堎合 (最終行たたは第1行を超えお移動しようずする時) には、
      はみ出た行数の分だけ履歎行を移動する。はみ出た行数の蚈算を
      行き先を決定する関数の内郚で実行しおいる。
      初めに行数を数えおから行き先の蚈算を実行する様に倉曎したい。
      →取り敢えず実装した
    2 done: linewise-range.impl の実装
      relative-line.impl ではなくお先の項目で䜜成した
      get-index-of-relative-line ずいう関数を䜿う様に修正した。
      曎に charwise/blockwise の時の範囲の蚈算も適切に実装した。

    [動䜜確認]

    x fixed: jk などの relative-line.impl の動䜜がおかしくなっおいないか。
      →芋事に動かなくなっおいる。確認する必芁がある。
      䞀箇所盎した。j は動く様になった。しかし k が動かない。
      →もう䞀箇所盎した。取り敢えずちゃんず動いおいる。

    x fixed: guvj 等が動䜜するか。
      動かない 次の行頭たでになっおいる。
      →これも簡単なミスだった。修正した。

    o C-v の時右端が inclusive になっおいるか。
      これはちゃんず動いた。


2018-12-31

  * 2018-10-08 vi (omap v): o_v o_V に察応する? [#D0865]
    オペレヌタの振る舞いに圱響を䞎える。
    詳しくは help o_v ず help o_V を参照すれば良い。
    オペレヌタ d の charwise の時の特別な振る舞いも無効化する。

    実際に詊しおみお分かった振る舞いに぀いお以䞋にたずめる。
    - omap C-v も効いおいる。
    - omap v, V, C-v を実行しおも衚瀺は倉わらない。

    [実装方針に察する考察]

    珟圚の状態をどのように保持するのが良いのかずいう考察。

    | どの様に実装するのか。
    | ble/keymap:vi/operator を芋る。omap の時にはそもそも operator は呌び出されない。
    | nmap で operator が呌び出されるず opfunc が蚭定されお、
    | それを元にしお移動などが起こった時に実際の動䜜に入るのである。
    | そしお、コメントを芋るず恐らく opfunc ず同等の倉数ずしお新しく opmark を぀ける予定だった。
    |
    | 他の実装方法はないのだろうか。ずいうのも opfunc や oparg ず同様に実装するず、
    | たた新しく倉数を远加する事になっおしたい、管理がたた倧倉になりそうだからである。
    |
    | a opfunc に付加する圢にするのは難しい。ずいうのも opfunc は二文字以䞊も可胜にしおいるから。
    |   䞀応 opfunc に䜿える文字の皮類を限定しお : で区切っお付加情報も蚘録できる様にする事も可胜かもしれないが、
    |   それはそれで倧倉である。
    | b では oparg に蚘録する事は可胜だろうか。
    |   oparg はそのたた _ble_edit_arg をコピヌする事によっお倀が蚭定されおいる。
    |   たた、蚘録しおいた物を再生する時には ARG がそのたた _ble_keymap_vi_optarg に蚭定されおいる。
    |   やはり面倒そうな気がする。もし oparg に蚘録するずしおも ARG に情報を䌝達するず、
    |   ARG を敎数ずしお扱っおいる数々の関数で問題が起こる事になる。
    |   䜕れにしおも ARG FLAG REG に新しい倉数を远加するか、
    |   或いは ARG FLAG REG ずは別に local _ble_keymap_vi_opmark なる倉数を甚意しお、
    |   それを経由しお倀を䌝達するずいう事になる気がする。
    | c 新しく倉数を䜜成するずしたら oparg ず䞊列になる様に倉数を䜜成すれば良い様な気がする。
    |   しかし、その時に ARG FLAG REG の3倉数に曎に新しい倉数を远加する事になるのだろうか。。
    |   或いはグロヌバルの倉数を経由しお operator を呌び出せば良いのだろうか。
    |   グロヌバルの倉数を経由しお呌び出す堎合には入れ子で operator を呌び出した時にどうなるのか。
    |   (ずいうかそもそも入れ子で operator を呌び出すずいう事があるのかどうかも分からないが )
    |
    | うヌん。色々考えおみるず実は opfunc/FLAG の䞭に情報を栌玍する方針の方が良い様な気がしおきた。
    | opfunc 及び FLAG はどの様に䜿われおいるだろうか。
    | 䜿甚方法を調べおみるず FLAG は䞊に䌝達する時にしか䜿われおいない気がする。

    結論: 取り敢えず opfunc 及び FLAG を拡匵する方向で考えおみる事にする。

    opfunc/FLAG を拡匵するずいう方針で問題がないかの考察。

    | done: FLAG を枡されおいる関数は以䞋の通りである。
    |
    |   - ble/keymap:vi/text-object.impl "$ARG" "$FLAG" "$REG" "$type"
    |     これは蟿っおいくず (flag が䜿甚される堎合には) 䜕れも以䞋の䜕れかに垰着する。
    |     -> ble/widget/vi-command/exclusive-range.impl "$beg" "$end" "$flag" "$reg"
    |     -> ble/widget/vi-command/linewise-range.impl "$beg" "$end" "$flag" "$reg" goto_bol
    |   - ble/widget/vi-command/backward-word-end.impl "$ARG" "$FLAG" "$REG" "$_ble_keymap_vi_REX_WORD"
    |     -> ble/widget/vi-command/inclusive-goto.impl "$index" "$flag" "$reg"
    |   - ble/widget/vi-command/backward-word.impl "$ARG" "$FLAG" "$REG" $'[^ \t\n]+'
    |     -> ble/widget/vi-command/exclusive-goto.impl "$index" "$flag" "$reg"
    |   - ble/widget/vi-command/forward-word-end.impl "$ARG" "$FLAG" "$REG" "$_ble_keymap_vi_REX_WORD"
    |     -> ble/widget/vi-command/inclusive-goto.impl "$index" "$flag" "$reg"
    |   - ble/widget/vi-command/forward-word.impl "$ARG" "$FLAG" "$REG" $'[^ \t\n]+'
    |     -> ble/widget/vi-command/inclusive-goto.impl "$index" "$flag" "$reg"
    |     -> ble/widget/vi-command/exclusive-goto.impl "$index" "$flag" "$reg"
    |   - ble/widget/vi-command/goto-mark.impl "$index" "$FLAG" "$REG" "$opts"
    |     -> ble/widget/vi-command/linewise-goto.impl "$index" "$flag" "$reg"
    |     -> ble/widget/vi-command/exclusive-goto.impl "$index" "$flag" "$reg" 1
    |   - ble/widget/vi-command/graphical-relative-line.impl "$ARG" "$FLAG" "$REG"
    |     -> ble/widget/vi-command/exclusive-goto.impl "$index" "$flag" "$reg"
    |   - ble/widget/vi-command/relative-first-non-space.impl 0 "$FLAG" "$REG" charwise
    |     -> ble/widget/vi-command/exclusive-goto.impl "$nolx" "$flag" "$reg" 1
    |     -> ble/widget/vi-command/linewise-goto.impl "$nolx" "$flag" "$reg" require_multiline:bolx="$bolx":nolx="$nolx"
    |   - ble/widget/vi-command/relative-line.impl $((-ARG)) "$FLAG" "$REG" history
    |     -> ble/widget/vi-command/linewise-goto.impl "$_ble_edit_ind:$offset" "$flag" "$reg" preserve_column:require_multiline
    |
    |   結局諞々の関数の呌び出しは以䞋の関数に垰着するようにである。
    |
    |   - ble/widget/vi-command/exclusive-goto.impl "$beg" "$FLAG" "$REG" 1
    |     -> ble/widget/vi-command/linewise-goto.impl "$index" "$flag" "$reg"
    |     -> ble/widget/vi-command/exclusive-range.impl "$_ble_edit_ind" "$index" "$flag" "$reg" "$nobell"
    |   - ble/widget/vi-command/inclusive-goto.impl "$index" "$FLAG" "$REG" 1
    |     -> ble/widget/vi-command/exclusive-range.impl "$_ble_edit_ind" "$index" "$flag" "$reg" "$nobell"
    |   - ble/widget/vi-command/linewise-goto.impl 0:$((iline-1)) "$FLAG" "$REG"
    |     -> ble/widget/vi-command/linewise-range.impl "$_ble_edit_ind" "$@"
    |
    |   曎に以䞋の関数に委譲されおいる。
    |
    |   - ble/widget/vi-command/linewise-range.impl
    |
    |     | ((end<${#_ble_edit_str}&&end++))
    |     | if ! ble/is-function ble/keymap:vi/operator:"$flag"; then
    |     |   ble/widget/vi-command/bell
    |     |   return 1
    |     | fi
    |     |
    |     | # オペレヌタ呌び出し
    |     | ble/keymap:vi/call-operator "$flag" "$beg" "$end" line '' "$reg"; local ext=$?
    |     | if ((ext)); then
    |     |   ((ext==148)) && return 148
    |     |   ble/widget/vi-command/bell
    |     |   return "$ext"
    |     | fi
    |
    |     䞻に以䞊の箇所 $flag で䜿甚されおいる。
    |     先ず初めに operator:$flag に関しおは修正が必芁である。
    |     埌ろの方で $flag == [cd] ずいう刀定があるこれも修正が必芁である。
    |     曎に良く考えおみるずこの関数は linewise の関数なので、
    |     flag に charwise や blockwise が蚭定されおいたずしおも
    |     linewise ずしお凊理を実行しなければならないのではないか。
    |
    |     call-operator の実装に぀いお確認しおおく事にする。
    |     call-operator の実装では第䞀匕数をそのたた vi/operator:$1 の様に呌び出すのに䜿っおいる。
    |     ぀たり、䜕れにしおも operator 名で呌び出さなければならないのである。
    |     たた、linewise-range から call-operator-linewise を呌び出すのではなくお、
    |     盎接に call-operator を呌び出しおいるのは、呌び出し元で行指向にする凊理をしおいるからである。
    |
    |     埓っおこの郚分は単に挔算子名にすれば良いのである。
    |
    |   - ble/widget/vi-command/exclusive-range.impl
    |     これは以䞋の箇所で䜿われおいるのみである。
    |
    |     | ble/keymap:vi/call-operator-charwise "$flag" "$src" "$dst" '' "$reg"; local ext=$?
    |
    |     さお今から実行しようずしおいる事は䜕かずいうず、
    |     この call-operator-charwise を珟圚蚘録されおいる矩圢の皮類に眮き換えるずいう事である。
    |
    | ok: その他の FLAG の気になる䜿い方をしおいる箇所は以䞋の通りである。
    |
    | - ./keymap/vi.sh:2381:    if [[ $FLAG ]]; then
    | - ./keymap/vi.sh:2576:    if [[ $FLAG || $_ble_decode_keymap == vi_[xs]map ]]; then
    | - ./keymap/vi.sh:2601:    if [[ $FLAG || $_ble_decode_keymap == vi_[xs]map ]]; then
    | - ./keymap/vi.sh:3380:  [[ $FLAG ]] || ble/keymap:vi/mark/set-jump # ``
    | - ./keymap/vi.sh:3386:  [[ $FLAG ]] || ble/keymap:vi/mark/set-jump # ``
    | - ./keymap/vi.sh:3393:  if [[ $FLAG ]]; then
    | - ./keymap/vi.sh:3418:  if [[ $FLAG ]]; then
    | - ./keymap/vi.sh:3444:  [[ $FLAG ]] || ble/keymap:vi/mark/set-jump # ``
    | - ./keymap/vi.sh:3765:  [[ $FLAG ]] || ble/keymap:vi/mark/set-jump # ``
    | - ./keymap/vi.sh:4764:  if [[ $FLAG || $_ble_decode_keymap == vi_[xs]map ]]; then
    | - ./keymap/vi.sh:4777:  if [[ $FLAG ]]; then
    | - ./keymap/vi.sh:5833:  if [[ $FLAG ]]; then
    | - ./keymap/vi.sh:5893:  if [[ $FLAG ]]; then
    | - ./keymap/vi.sh:6013:  if [[ $FLAG ]]; then
    | - ./keymap/vi.sh:6096:  if [[ $FLAG ]]; then
    | - ./keymap/vi.sh:6518:  if [[ $FLAG ]]; then
    |   これらは基本的に FLAG に opname が指定されおいるかどうかだけを確認しおいる。
    |   opfunc を拡匵するずしおも既に䜕か蚭定されおいる時にのみ ~wise を付加するのだから関係ない。
    |   問題は具䜓的に倀を䜿っお䜕かを実行する時だけのはずである。なのでこれらは気にしなくお良い。
    |
    | - ./lib/vim-surround.sh:690:  local WIDGET=ble/widget/vim-surround.sh/nmap/csurround.repeat ARG=$arg FLAG= REG=$reg
    |   これは FLAG を空にするずいう動䜜であっお、
    |   ~wise は FLAG が非空の時にのみ意味があるのでこれで良いのである。
    |
    | - ./keymap/vi.sh:649:   FLAG=$_ble_keymap_vi_opfunc
    | - ./keymap/vi.sh:3399:    _ble_keymap_vi_opfunc=$FLAG
    | - ./keymap/vi.sh:3419:    _ble_keymap_vi_opfunc=$FLAG
    | - ./keymap/vi.sh:3724:    _ble_keymap_vi_opfunc=$FLAG
    |   opfunc ず FLAG は䞀臎する扱いずすればこれで良い。
    |
    | - ./keymap/vi.sh:2469:  local -a repeat; repeat=("$KEYMAP" "${KEYS[*]-}" "$WIDGET" "$ARG" "$FLAG" "$REG" '')
    |   ぀たり 4 番目の芁玠に FLAG が栌玍される。調べおみるずこれが実際に䜿われるのは
    |   ./keymap/vi.sh:2531:  _ble_keymap_vi_opfunc=${_ble_keymap_vi_repeat[4]}
    |   ずいう箇所のみであり、これも opfunc ず FLAG が䞀臎しおいるずいう前提の䞋で気にしなくお良い。
    |
    | 2018-12-31 少し時間を眮いたら分からなくなった。今の状況を敎理する事にする。結局、
    | 1. FLAG が空文字列かどうかを刀定しおいる箇所は、FLAG の内容の圢匏が倉曎されおも問題はない
    | 2. FLAG の内容を蚘録しおいる郚分に぀いおも、FLAG の内容の圢匏には関係ないので問題ない
    |   蚘録時に FLAG の内容によっお動䜜が倉わるなどのこずはしおいないので問題ない。
    |    たた、蚘録される内容も v だったか V だったか C-v だったかたで䞀緒に蚘録するのが自然に思われる。
    |   実際の vim の振る舞いがどちらなのかは確認しおいないけれども。
    |   しかし v/V/C-v を忘れお再生されるずいうのは䞍自然なので圓然 vim でもその状態を蚘録しおいるはずである。
    | 3. その様に考えるず実際に問題になるのは FLAG の䞭身を芗いおいるコヌドのみである。
    |   それに぀いおは未だ確認しおいない関数のリストがあるので䞀぀ず぀確認しおいく事にする。

    結論: 䜿甚箇所で修正が必芁なのは以䞋の二぀の関数である。

      - ble/widget/vi-command/linewise-range.impl
      - ble/widget/vi-command/exclusive-range.impl

      $flag を operator 名ずそれに付属するオプションに分離する。
      linewise-range ではオプション郚分を無芖しお operator 名だけ䜿甚するようにすれば良い。
      exclusive-range においおはオプションによっお呌び出す charwise/linewise/blockwise を倉曎すれば良い。

    opfunc/FLAG の圢匏を決定する必芁がある。

    | どの様な物が良いだろうか。既存の opfunc 名ず被らない様にしたい。
    | そもそも opfunc は operator:opfunc の圢匏で呌び出すのだから、
    | ":" 区切りにするのが自然な気がする。
    | wiki の operator 蚭蚈の箇所ではどの様に曞いただろうか。
    | 特に MyOperator を構成する文字列に察する制限は曞かれおいない。
    | 䞀応 MyOperator.record ずいう関数を䜿っおいるので、
    | "." を含む事を可胜にするのは䞍味いだろうずいうぐらいである。
    | 恐らく識別子ずしお䜿える名前に制限しおいる぀もりの気がする。
    | ず思ったら既に surround-extract-region ずいうのがある 。
    | たあ、然しそんなずころだろう。
    | ":" を䜿うずいう事はない気がする。

    結論: /Operator(:options)?/ の圢匏ずいう事にする。
      たた Operator には ":" や "." を含んではいけない事にする。

    [実装]

    1 done: o_v o_V o_C-v の実装
    2 done: 䜿甚箇所の修正

    取り敢えず動いおいる気がする。
    埌は面倒なので䞍具合報告が出おきた時に察応する事にする。

2018-12-30

  * color (ble-color-setface): "face:..." による蚭定が正しく蚭定されない (reported by cmplstofB) [#D0864]
    https://github.com/akinomyoga/ble.sh/issues/20

    これは調べおみたずころ ble-color-face2g 及び ble-color-iface2g の䜿い方を間違えおいた。
    これは盎した。

    * fixed: しかし、face2g/iface2g の呌び出しに倱敗するだけで、
      埌に沢山の゚ラヌメッセヌゞが出おくるのはこれはこれで別のバグである。
      調べおみるず、単語着色に斌いお g 倀が空文字列になった時に、
      _ble_syntax_tree に蚘録されおいる項目がずれおしたう問題があった。
      そもそも _ble_syntax_tree に蚘録される項目は空癜区切りの単語列なので、
      空の単語が蚘録されない様に泚意する必芁があった。これも盎した。

    * ok: では䜕故 "echo" 等の時は問題にならないのに "[" の時は問題になるのか。
      曎に bash の゚ラヌメッセヌゞに斌いお "-" ずいうのがコマンド名の劂くに衚瀺されおいるのは䜕か。
      cmplstofB さんのログによるず tree-enumerate の䞭で起こっおいる様に芋えるが解せない。
      % ず思ったら分かった。tchild= だずか tprev= の右蟺は算術匏で蚈算されおいお、
      % 算術匏の䞭身に "[" が単䜓で存圚しおいるず問題になるのだ。
      % "echo" 等が単䜓で存圚しおいる堎合にはそれは倉数名ず解釈されるので問題が起こらない。
      % ず思ったがそれも䞍思議な話である。コマンド名は _ble_syntax_tree の内郚に蚘録しない。
      曎に衚瀺されおいる゚ラヌメッセヌゞを芋る限りは問題になっおいる芁玠の内容は "-" である。
      ずれおダミヌで蚭定しおいる "-" の倀が算術匏に枡されおいるのが原因である。

      もしかしお echo ず [ で着色の仕組みが異なる? ず思ったが、
      最終的に echo も [ もちゃんず同じ色で着色されおいるので、
      やはり着色の過皋は同じになっおいるような気がする。
      䜕が echo ず [ の違いを生んでいるのだろう。 

      →ble_debug=1 で dump しお -/wattr を衚瀺する様にした所、
      実は echo の時には䞀぀の単語であるが、
      "[" の時には普通のコマンドずしおの単語の䞭に
      word="none":0-1 ずいう単語が蚭定されおいるずいう事が分かった。
      そしおこれは glob の [...] の怜知の為に蚭眮されおいる物の筈である。

      ぀たり、特に䜕か問題があっお "[" の時にだけ問題が発珟したずいうよりは、
      同じ䜍眮でネストされた word がある時にだけ発珟するずいう、
      元々発珟しにくい問題がたたたた "[" の時にようやく発珟したずいう事である。
      なので、この動䜜の違いに぀いおは気にしなくおも良いのである。

2018-12-17

  * syntax (filename_ls_colors): 実は coreutils ls は二重拡匵子にも察応しおいる [#D0863]

    * done: 二重拡匵子には察応した。

    * ok: 拡匵子以倖のパタヌンには察応しおいない様である。

    * done: できるだけ長い拡匵子から順番に詊すずいう様に実装する必芁がある?
      % →coreutils ls で詊しおみるず長い拡匵子から順番に詊すのではなくお、
      %   LS_COLORS に登録されおいる物の内、䞀番始めにあるものが優先される。
      % ず思ったら勘違いだった。coreutils ls でも最初にあるものではなくお、
      % 長いものの方が優先される様に芋える。
      →これには察応した。

    * done: もう䞀぀確認しおおきたいのは . から始たるファむルである。
      → . から始たるファむルも拡匵子ずしお取り扱われおいる。
      →察応した。

  * 2016-07-20 ファむル名の色付けに LS_COLORS を参照する? [#D0862]
    https://github.com/trapd00r/zsh-syntax-highlighting-filetypes

    ble.sh の枠組で䜿甚する為には ble-color.sh/gflags に倉換しなければならない。
    しかし、実際に䜿っおいる terminal ず sequence が異なる堎合に霟霬が生じる。
    埓っお盎接 LS_COLORS を甚いるよりは、bleopt_filename_ls_colors 的な倉数に指定しお貰う事にする。
    そのたた LS_COLORS を䜿甚したい堎合は bleopt_filename_ls_colors=$LS_COLORS などずする。
    展開を実行するようにする。

    2018-12-16 https://github.com/akinomyoga/ble.sh/issues/19 に関連しお。
    意味は䟋えば http://www.bigsoft.co.uk/blog/2008/04/11/configuring-ls_colors に曞かれおいる。

    | no  NORMAL, NORM  Global default, although everything should be something
    | fi  FILE  Normal file
    | di  DIR Directory
    | ln  SYMLINK, LINK, LNK  Symbolic link. If you set this to ‘target’ instead of a numerical value, the color is as for the file pointed to.
    | pi  FIFO, PIPE  Named pipe
    | do  DOOR  Door
    | bd  BLOCK, BLK  Block device
    | cd  CHAR, CHR Character device
    | or  ORPHAN  Symbolic link pointing to a non-existent file
    | so  SOCK  Socket
    | su  SETUID  File that is setuid (u+s)
    | sg  SETGID  File that is setgid (g+s)
    | tw  STICKY_OTHER_WRITABLE Directory that is sticky and other-writable (+t,o+w)
    | ow  OTHER_WRITABLE  Directory that is other-writable (o+w) and not sticky
    | st  STICKY  Directory with the sticky bit set (+t) and not other-writable
    | ex  EXEC  Executable file (i.e. has ‘x’ set in permissions)
    | mi  MISSING Non-existent file pointed to by a symbolic link (visible when you type ls -l)
    | lc  LEFTCODE, LEFT  Opening terminal code
    | rc  RIGHTCODE, RIGHT  Closing terminal code
    | ec  ENDCODE, END  Non-filename text
    | *.extension   Every file using this extension e.g. *.jpg
    |
    | mh  MULTIHARDLINK for "Regular file[s] with more than one link"
    | ca  CAPABILITY for "File with capability."
    | rs  ???? "Reset to ordinary colors"

    取り敢えず *.extension に関しおは察応した。

    * ok: うヌん。LS_COLORS の具䜓的な振る舞いが分からない。

      | ? 耇数の項目が圓おはたる堎合には属性は合成されるのか、
      |   それずもどれか䞀぀だけが遞択されるのか。
      |
      | 面倒なので coreutils を芗いおみる事にする。
      | 䞁床 ~/local/build/coreutils-8.28 があったのでそれを芋る。
      | 恐らく src/ls.c:4677: get_color_indicator (const struct fileinfo *f, bool symlink_target) である。
      | これを芋る限りは、通垞ファむルに぀いお setuid, setgid, exec, multihardlink を順に詊しおいる。
      | たたディレクトリに぀いお other-writable/sticky を詊しおいる。

      順番に詊しお先に䞀臎した着色を採甚する様である。
      拡匵子に぀いおは通垞ファむルの時
      (setuid, setgid, exec, multihardlink の䜕れも適甚されない時) に適甚される。

    * done: 曎にファむルの皮類に぀いお増やす?

      | - do       これはSolaris限定らしい
      | - or mi    or に぀いおは察応可胜である。
      | - su sg st Bash から setuid 及び setgid を刀定する方法はあったか → -u -g -k だった。
      | - tw ow    Bash から other writable を刀定する方法は無い気がする。
      | - lc rc ec これらは ble.sh では登堎しないのではないか。

      これに関しおは or su sg st に぀いお察応した。
      tw ow do に぀いおは察応できない。
      lc rc ec は ble.sh では䜿わない。
      mi に぀いおは着色はしない。

    * done: menu-complete で䜿う着色も core-syntax.sh の関数を呌び出しお決める事にする。
      これは ble-syntax/highlight/getg-from-filename ずいう関数で察応するこずにした。

    新しい機胜名は以䞋の通り
    - bleopt:filename_ls_colors
    - face:filename_ls_colors
    - face:filename_orphan
    - face:filename_setuid
    - face:filename_setgid
    - face:filename_directory_sticky

    取り敢えず動䜜テストした。
    o 拡匵子の着色
    o setuid setgid sticky orphan の着色の確認
      これは色を調敎した。
    o menu-complete における着色

2018-12-16

  * color (ble/color/read-sgrspec): 色番号の察応が䞍完党なのでは [#D0861]
    #D0860 を取り敢えず実装したが色番号に぀いお考慮しおいなかった。

    端末の蚭定に基づいお読み取るのだから
    (1) 最初の 8 色もしくは 16 色に関しおは
      _ble_term_sgr_{af,ab} を参照するようにする。
    (2) 88 色の堎合には index color の翻蚳を実行する

    | (1) に関しおはどのように実装するのが良いだろうか。
    | _ble_term_sgr_af が単䞀の番号であれば、
    | その逆写像を䜜成すれば良いのではないだろうか。
    | →どうもちゃんず単䞀の番号になっおいる気がする。
    | ず思ったが init-term.sh の実装を芋る限りはそうずも限らない。
    | 単䞀の番号の時のみに限り解釈する事にした。
    |
    | 䞖の䞭には 1; や 5; ずの組み合わせで highlight color を衚珟する堎合もあるが、
    | それらに぀いおは面倒なので察応しない事にする。

    →(1) に぀いおは _ble_term_sgr_term2ansi ずいう配列を䜿っお、
    SGR倀を読み取り時に ANSI の倀に眮き換えお解釈する事にした。

    | (2) に関しおは数匏を確認する必芁がある。#D0824 の蚘録を芋るず、
    |
    |   16-79 4x4x4 0,58*v+81
    |   80-87 gray 46+25*v
    |
    | ずなっおいる。6x6x6 に関しおはどうだったろうか。
    | 0-255 は 5 等分にする事ができるので、等間隔なのだろう。
    |
    | 0.58*v+81 ずはどういう事か。0, 81, 139, 197, 255 ず考えるず 5 段階になっおしたう。
    | 或いは䞀番暗かったずしおも 81 ずいう事になるのだろうか。
    | うヌん。6level->4level の倉換は R=(R*3+2)/5 ずいう数匏で行っおいる。
    | もっず単玔に考えお R=(R*5+o)/3 ずすれば良いのだろうか。
    | ずいうか4倀を6倀に割り圓おるだけなので実際の明るさなどはどうでも良くお、
    | できるだけ区別が残る様にするのが正しいのであろう。
    | その様に考えるず元の倀は関係なく倉換するのが良い。
    | 適圓に詊しお察称的になる o=1 を採甚する事にした。
    |
    | 232-255 = 23段階 であるが実際には䞀番明るい色ず暗い色が含たれおいないので 25 段階である。
    | 同様に 80-87 は 7 段階の様に思われるが、実際には䞀番明るい色ず暗い色が含たれおいないので 9 段階である。
    | 結局、以䞋の関数のセットずしお䜜成する事にした。
    | - ble/color/convert-color88-to-color256
    | - ble/color/convert-color256-to-color88

    →(2) 88色時の index color の翻蚳にも察応した。

  * ble-color-setface で様々な圢匏に察応する (requested by cmplstofB) [#D0860]
    https://github.com/akinomyoga/ble.sh/issues/19
    圓初は SGR の匕数による指定の芁望だった。様々な圢匏に察応する圢で実装した。

2018-12-14

  * サブシェル (...) 内で command-help が効かない (reported by cmplstofB) [#D0859]
    https://github.com/akinomyoga/ble.sh/issues/18

    どうやら調べおみるず extract-command に倱敗しおいる様である。
    extract-command の䞭を芗いおみるずちゃんず抜出できおいる様である。
    ず思ったら、抜出できおいるのにも関わらず return 1 になる様になっおいた。盎した。
    これは前に extract-command を修正した時 #D0799 の修正忘れであろう。

2018-12-02

  * 最近思っおいたが menu-complete においお日本語の文字が含たれおいるず座暙がずれる [#D0858]

    実際に詊しおみるずやはりずれおいる。どうも日本語の文字が半角の幅で蚈算されおいる様である。
    幅の蚈算を実行しおいる郚分を確認する必芁がある。

    うヌん。関係するのは ble-complete/menu/construct-single-entry の䞭の、
    ble-edit/info/.construct-text を呌び出しおいる郚分である。
    もしかするず Cygwin 䞊だず倉な事になるずいう事なのかもしれない。
    locale 関係が理由で。padparadscha の䞊で再珟するかどうかを確かめおみる事にする。
    →詊しおみた所 padparadscha の䞊でも再珟する。぀たり locale の問題ではないはず。

    construct-text の呌び出し前埌での様子を出力させおみる事にする。
    結果、芋事に単に文字数が蚈䞊されおいるずいう事が刀明した。
    おかしい。construct-text が壊れおいるのだずすれば
    今たでの info も壊れおいたのではないか。
    或いは LC_COLLATE が効いおいない?
    LC_ALL が蚭定されおいるずそういう事もあるかもしれない。

    * fixed: construct-text の方を芳察しおバグを芋぀けおしたった。
      存圚しない倉数 tail を参照しおいる。
      tail は基本的に空文字列である事を考えれば
      必ず「特殊文字が存圚しない」ず刀定されお文字数だけのカりントになっおしたう。
      これで起こっおいる珟象を説明する事ができる。
    * done: 序に LC_ALL 察策も実斜する事にする。LC_ALL= ず内郚で蚭定する。
      意図的に ble.sh の動䜜を倉曎する為に LC_ALL を倉曎するずいう事は考えにくいのでこれで問題ない。

    動䜜確認もした。ちゃんず動䜜する様になった。OK

2018-10-18

  * 2018-10-06 edit (reported by Kikurage): Bash-3.2 で C-d で exit できない [#D0857]
    https://github.com/akinomyoga/ble.sh/issues/15

    曎に、詊行しお以降党おのキヌ操䜜に察しお "ゞョブがあるので exit できない" の旚が衚瀺される。
    これは C-d の受信に関係しおいるず思われる。
    たた、これより埌に stty 等のゞョブが途䞭状態で停止した状態になっお残るのも確認された。
    しかも、入れ子のシェルでのみ発生するずいう珟象である。謎。

    曎に蚀うず PS1 の䞭身が消倱しおしたうずいうのたである。
    これが起こるのは無理矢理抜けた埌のシェルでの様である。

    % 調べおみるず䜕故か C-d は TRAPUSR1 経由で受信しおいる蚳ではない様だ。
    % 勘違いだった。デバグ甚に匄っおいるのは devel だったのに
    % 0.2-master でテストを実行しおいた。

    調べおみるず実は毎回 "Use "exit" to leave the shell."
    ずいうメッセヌゞを受け取っおいる。
    ぀たり、Bash 3.2 が毎回そのメッセヌゞを送信しおいるずいう事?
    うヌん。䞍思議だ。

    * checked: 再珟する状況に぀いお再床詳しく調べおみる。
      Bash 3.0 では再珟しない。Bash 3.1 では再珟する。
      Bash 4.0 では再珟しない。぀たり、Bash 3.1 ず 3.2 だけで再珟する様子だ。

    * checked: どのタむミングでこの問題が発生する様になったか

      % たた、今たでは動いおいたのだろうか。ble-0.1 では問題なく動いおいる。
      % ずいう事は䜕凊かのタむミングで問題が発生する様になった様だ。

      - 32037b9 (support-vi-mode merge) 再珟する
      - f15f8c5 再珟する
      - 97923a9 再珟する

      ず思ったら ble-0.1 でも再珟する様だ 。
      ぀たり、これは䜕らかのミスで察応が壊れたのではなくお、
      特別に察策を考えなければならないケヌスの気がする。

    * もっず単玔化した状況で再珟できないだろうか。

      C-d で 'Use "exit" to leave the shell' が衚瀺される。
      これは IGNOREEOF を蚭定しおいる時には出るのである。
      この次に USR1 ずいうシグナルを受け取る。
      そこで C-d に察応した凊理が実行される。
      ゞョブが存圚しおいるので exit 等の凊理は行われない。

      結局䜕が特別なのかが分からない。
      USR1 ずいうトラップを実行するずいう事が鍵なのだろうか。
      うヌん。適圓に単玔化した bashrc でやっおも再珟しない。

      ずいうよりそもそも単玔化すれば治るずいう物ずも限らない。
      単玔化すれば発生の条件が分かっお察策方法が分かるかもしれないずいう事。

    * suspend 状態になっおいる stty を殺すず
      キヌを抌す床にゞョブが衚瀺される問題は止たる様である。

    * 埌の気になる点は、䜕故 Done ずなったゞョブが毎回衚瀺され続けるのかずいう事である。

    改めお。どうしお Bash が毎回メッセヌゞを発するのか。
    うヌん。少しず぀機胜を少なくしお行っお詊すずいう事をしなければならないのか。
    ble-attach を分解しお行っお機胜を少なくしお詊すずいう䜜戊。
    終了できなくなるかもしれないがそれは kill で 。
    或いは ble-decode/.hook を乗っ取る。
    うヌん。ずりあえずは ble-decode/.hook を乗っ取った状態で C-d を抌しお再珟するのかずいう事。
    D0728.bashrc で䌌たような事をしおいるから参考になるかもしれない。

    * ずいうか入れ子で起動した時にのみ倉な事になるずいうのはどういう仕組なのか。

      | 状態が継承されるずしたら環境倉数たたは stty による蚭定である。
      | しかし、入れ子元が Bash 4.0-4.4, 5.0 だず発生しないずいうのも劙である。
      | 環境倉数や stty は Bash の version に関係あるずは思われないのだが。
      | 䜕れにしおも、もしも原因の蚭定を特定できれば修正できる可胜性もある。
      |
      | ? reject: 取り敢えず起動した瞬間の環境倉数ず stty を出力する事にする。
      |   うヌん。違いは MODULEPATH ず NLSPATH ず SHLVL のみである。
      |   stty に぀いおは diff で匕っかからなかったので違いはないのだろう。
      |   そしお、macOS でも再珟しおいる事を考えるずこれらは関係ない。
      |
      |   {
      |     stty -a
      |     export
      |   } > debug-C-d.$SHLVL.txt
      |
      | ? reject: 暙準出力・暙準入力が䜕凊に繋がっおいるかも関係あるかもしれない。
      |
      |   {
      |     ls -la /proc/self/fd/{0,3,2}
      |   } 3>&1 > debug-C-d.$SHLVL.txt
      |
      |   これで確かめおみたが倉化はない。
      |
      | ? 或いは fork の時に特別な凊理をしおいる可胜性?
      |   バむナリが同じだったら exec を省略するなど。
      |   然し、3.1 から 3.2 に入った時でも再珟する事からそれはない。
      |
      | 埌、bash-3.2 bash-4.4 bash-3.2 ず起動した時にはどうなるのだろうか。
      | →うヌん。今床は C-d を党く受信できなくなっおしたった。
      | stty を調べおみるず -echoe ずいう状態になっおいる。
      | stty echoe ずしたら戻った、それでも関係なく受信できない。
      | C-d を抌すずたた stty -echoe に戻っおしたう。
      | この蟺りに䜕らかの鍵があるのかもしれない。
      |
      | ? reject: うヌん。䞀回コマンドを実行するず盎るずいう事を思うず、
      |   やはり stty の状態がおかしくなっおいる事による問題ずも捉えられる。
      |   詊しに stty を実行しないずどうなるのか確かめおみるのも䞀぀の手である。
      |   →詊しに ble/bin/stty() { :; } を実行しお stty が呌び出されない様にしたが、
      |   再珟されるし、たたコマンドを実行するず盎る。うヌん。䜕故だろう。
      |
      |   これは䞍思議である。䜕をきっかけずしお盎るのだろうか。
      |   絶察に䜕か盎るきっかけが存圚しなければならない。
      |   stty 以倖で䜕があるのだろうか 。
      |
      |   ble/term/enter, ble/term/leave を䞞ごず消したがそれでもコマンド実行で盎る。
      |   だずするず ble-edit/bind/stdout.on, ble-edit/bind/stdout.off が鍵なのだろうか。
      |   然し、䞍思議な事に M-z を抌しおも盎らない ず思ったが、
      |   vi mode では M-z は束瞛しおいないのだった。C-z で盎った。
      |   ずいう事はやはり確実にコマンド実行が関係しおいる。
      |
      |   詊しにいい加枛な widget を䜿っお実隓しおみるのも良いかもしれない。
      |   詊しおみたずころ stdout.on, stdout.off では盎らない様である。
      |   続けお色々 widget を詊す。少なくずも .begin/.end を実行すれば盎る。
      |   そのどれが効いおいるのだろうか。絞り蟌んでいくず term/enter, leave で盎る。
      |
      | - 色々詊しおいお気づいた。これは芪 bash が TRAPUSR1 を捕たえおいる。
      |   ぀たり、コマンド実行䞭は TRAPUSR1 を解陀する様にしなければならない。
      |   →うヌん。TRAPUSR1 を解陀しお実行したら USR1 を受け取っお
      |   セッションごず党お萜ちおしたった。うヌん。
      |   曎に残された subshell が無限に Use "exit" to leave the shell のメッセヌゞを受け取っおいる。
      |   これも謎である。䜕故 pipe を通じお無限にデヌタが送られお来るのか 。
      |
      |   代わりに '' で無芖する様にしお芋た所、反応しなくなっおしたった。
      |   うヌん。実は芪の subshell が受信しおいるずいう事か 。
      |   そしお芪に TRAPUSR1 を送っおいるずいう事 。

      仕組みは分かった。C-d を受信するず芪 Bash 3.2 の偎で
      Use "exit" to leave the shell のメッセヌゞが衚瀺され、
      子 Bash 3.2 の偎には䜕も通知が行かない。
      本圓は Bash 3.2 に C-d を送信したい所であるが、どうしようもない。
      stty の蚭定を確認しおみるが矢匵りどうしたら良いか分からない。

    問題は2぀ある。

    1 メッセヌゞが倧量に出るずいう事。
      % stty を実行しお盎るのはこちらだけである。

      →これに関しおは単に $_ble_term_state == internal の時にだけ
        反応する様にすれば良い。取り敢えず抑制できる事は確認した。

    2 % 子Bash (ずいうより子プロセス党お) に C-d を䌝達する事ができない。
      % ゚ラヌメッセヌゞを抑制したずしおもこれに察凊する事はできない気がする。
      %
      % ず思っお詊しに子プロセスに党然 C-d が行かない事を立蚌しようずしたが、
      % cat に察しお C-d を実行したらちゃんず受信できるずいう事が分かった 。
      % stty の状態によっお Bash が C-d を奪うかそうでないかが決たるずいう事だろうか。
      % そしお芪 Bash 3.2 が子を起動する時には stty をちゃんず蚭定するが、
      % 子 Bash の偎で ble.sh をロヌドしお stty を調敎するず、
      % その所為で芪 Bash 偎での凊理が再床有効になっおしたうずいう仕組みである。
      %
      % ずいうか Bash 3.2 から Bash 4.0 を呌び出した時に C-d が動いおいた様に芋えたのは䜕だったのか。
      % →うヌん。動いおいる。ずいう事は䜕らかの条件を満たせばちゃんず子に䌝達される。うヌん?
      % うヌん。やはり 4.0 ではちゃんず C-d を受信する事ができおいる。
      % C-d を入力した埌でも同様である。䞡方共 eof は ^D になっおいる。

      これに関しおは Bash 3.2 以倖の子孫に察しおは
      途䞭に Bash 3.2 が含たれおいたずしおもちゃんず C-d を䌝達できおいる。
      ただただ子 Bash 3.2 で ble.sh をロヌドした時にのみ芪 Bash 3.2 が匕っ掛かる。

    * うヌん。珟圚の暙準入力に察しお奜きな文字を流し蟌むずいう事はできないのか 。
      擬䌌端末のマスタヌ偎が必芁である。そしおそれは普通芋えない 。
      或いは子Bash偎から C-d が欲しいずいう事を䞊に䌝達する。

    * internal の状態における stty に぀いお Bash 3.2 ず 4.0 で確認したい。
      →stty -a を䞡者で実行しおみたが違いはない様に芋える。

    ? reject: 䜕故 stty の蚭定で eof が ^D のたたになっおいるのだろう。

      | これを undef にしたら解決したりしないのだろうか。
      | ずいうか䜕故元々 C-d を IGNOREEOF で受信せざるを埗なかったのかの議論を遡る必芁がある。
      | 議論を遡っおみるず #D0141 ずいう物があるが、
      | ここでは stty で蚭定を倉曎する事に関しおは議論されおいない。
      | 詊しに stty で eof を undef に蚭定しおみるこずにした。しかし倉化はない。
      | 曎に bash-3.2 甚の特別の凊眮を解陀しおみたが、
      | そうするず単玔に入れ子かどうかに関わらず C-d が党く効かなくなった。
      | 埓っお stty で eof を解陀するかどうかは党く効かない。
      | ゜ヌスコヌドを元の状態に戻す。

      結論 stty で eof ^D を倉曎しおも䜕も効果はない。埓っお動かさない方向で行く。

    ? 目䞋の謎は、䜕故 Bash 4.0 がぶら䞋がっおいる時には芪 Bash 3.2 が反応しないのに、
      Bash 3.2 がぶら䞋がっおいる時には芪 Bash 3.2 が反応するのかずいう事である。
      ずいうか、本圓にその様な構造になっおいるのだろうか。

      - Bash 3.2 -> 4.0 は C-d が䜿える。
      - Bash 3.2 -> 4.0 -> 3.2 だず C-d が䜿えない。
      - Bash 3.2 -> 4.0 -> 3.2 -> 4.0 では C-d が䜿える。
      - Bash 3.2 -> 3.2 だず芪 Bash 3.2 で Use "exit" を怜知しおいる。
      - Bash 3.2 -> 4.0 -> 3.2 だず芪 Bash 3.2 では怜知できおいない。
        子 Bash 3.2 でも怜知できおいない。うヌん。間の 4.0 に吞い蟌たれおいるのだろうか 。
      - Bash 3.2 -> 3.2 -> 3.2 の時には最初の Bash 3.2 が怜知しおいる。

      うヌん。norc だず読み取る事はできるのだろうか。
      - 3.2(ble) ** 3 -> 3.2(norc) でちゃんず C-d を読み取れおいる。
      - 3.2(ble) -> 3.2(ble/nostty)
        もしかするず stty を䜕も実行しなければ受信できるのかもしれない、
        ず思ったがやはり受信はできない様だ。
        この時もやはり芪 Bash が代わりに受信をしおいる。
      - 3.2(norc) -> bindx 内から 3.2(norc)
        stty sane を実行しないず䜕も衚瀺されないが、
        stty sane さえ実行しおしたえば特に問題なくコマンド実行できる。
        C-d もちゃんず動䜜しおいる。

      やはり暙準゚ラヌ出力をリダむレクトしおいるか
      しおいないかにも関わっおくるのだろうか。

      結局䜕がどうなっおいるのかはよく分からない。
      Bash 3.2 だけのチェむンになっおいる時には最初の 3.2 が怜知する。
      途䞭に Bash 3.2 以倖が含たれおいるず誰も怜知しおいない様に思われる。
      どの様なチェむンになっおいたずしおも Bash 4.0 など他のプログラムは
      C-d を読み取れる。Bash 3.2 も ble.sh をロヌドしおいない限りは読み取れる。
      Use "exit" 云々のメッセヌゞも子 Bash 3.2 から発しおいる気がする。

    珟圚分かる範囲での察策方法ずしお䜕があるだろうか

    a reject: 䞀぀の解決方法は子 Bash 3.2 を起動した時に芪 Bash 3.2 に通知をしお、
      芪 Bash 3.2 が怜知した時に今䞀番䞋にいる Bash 3.2 に察しお通知を転送する方法である。
      しかし、この方法だず耇数の Bash 3.2 の子䟛がいる堎合 (ずいうのが可胜化は知らないが)
      にどう察応するのかは非自明だし、子 Bash のリストをどの様に管理するのか、
      管理に䞍敎合が起こった堎合にどの様に凊理するのかなどを考察しなければならない。

      たた、Bash 3.2 -> Bash 4.0 -> Bash 3.2 の堎合にはそもそも誰も怜出できないので、
      この方法は完党な解決になっおいるずは蚀い難い。
      䟋えば Bash 3.2 -> screen -> Bash 3.2 ずしたら䜕が起こるのだろうか。
      或いは、screen の堎合には擬䌌端末ずセッションを䜜るので実は問題にならないのかもしれない。

      䜕れにしおもこの方法は䞍完党であるし埮劙。

    b もう䞀぀の解決方法は具䜓的に䜕が C-d の受信を劚げおいるのかを特定するずいう事。
      これは実際に調べおみないずどの様な事になるか分からない。

      取り敢えず bind -x '"\C-d": hello' は Bash 3.2 で動くのだったろうか。
      Bash 3.2 with ble.sh の䞭から Bash 3.2 with test2.bashrc で起動しお詊す。
      詊しおみるず実は有限の文字列が蚭定されおいる時には C-d は効くのだった。
      曎に、文字列が空の時には問答無甚で Use "exit" の様だ。
      䜆し、ちゃんず子 Bash の偎で Use "exit" が衚瀺されおいる様に思われる。
      ぀たり、子 Bash から怜出可胜なのではないか。

      どの様な蚭定を行う事によっお Use "exit" が䜿えなくなっお
      芪 Bash 3.2 によっお凊理されるずいう事態になるのか確認が必芁である。
      取り敢えず ble.sh を単に load するだけでは問題は起こっおいない。
      attach するず問題が起こる。

      * attach した堎合でも以前の実隓により、
        stty を封じおいおも受信できなくなるずいう事は分かっおいるので、
        特に stty の蚭定の倉化が悪いずいう蚳でもないず考えられる。
      * 取り敢えず bind だけ実行しおみるずいうのも手である。

      % ble-attach から始めおどんどん絞り蟌んで行っお
      %
      % | function ble-decode/.hook {
      % |   ble-decode/PROLOGUE
      % |   local byte
      % |   for byte; do
      % |     case $byte in
      % |     (20) echo C-t; exit ;;
      % |     (4) echo C-d ;;
      % |     (*) echo $byte;;
      % |     esac
      % |   done
      % |   ble-decode/EPILOGUE
      % | }
      % | source $_ble_base_cache/ble-decode-bind.$_ble_bash.UTF-8.bind
      %
      % ずいう所たで絞り蟌めた。
      % この PROLOGUE たたは EPILOGUE が悪さをしおいる様である。
      % どうも ble-edit/bind/stdout.off を実行した状態だず駄目の様だ。
      % この時芪 Bash 3.2 で怜知される様になる。
      % ble-edit/bind/stdout.on の埌には倧䞈倫になる。
      %
      % % - reject: うヌん。もしかしお openat で倉なファむルを開いおいる可胜性?
      % %   確かめおみたがちゃんず自プロセスのファむルを開いおいる気がする。
      % % - reject: 或いは同じ fd で開いおいるから䜕か倉な干枉が起こっおいるのだろうか。
      % %   % →_ble_util_openat_nextfd=33 ずしおみお起動しお、
      % %   % fd を芪 Bash 3.2 ずずらす様にしお詊しおみた。それでも駄目
      % %   bleopt_openat_base=33 ずしなければちゃんず fd がずれおいなかった。
      % %   しかしそれをしお fd がずれおいる事を確かめおも C-d は受信できなかった。
      % % - 詊しにぜんぜん違うファむルにリダむレクトするのを詊しおみる。
      % %   exec 1>>$_ble_edit_io_fname1 2>test.stderr
      % %   これだずちゃんず受信する事ができおいる。
      % % - 次に別の名前付きパむプを䜿っお芋る事にする。
      % %   䜕ず自分で新しく䜜成した名前付きパむプを䜿うず受信できおいる 。
      % %   違いは䜕だろうか。
      % %
      % %   % しかし䞭を芗くず受信しおいる内容は滅茶苊茶になっおいる。
      % %   % 文字が色々抜け萜ちたりしおいる。これはどのタむミングで起こるのだろうか。
      % %   % →滅茶苊茶になっおいるのは䞀぀のパむプに耇数のプログラムがぶらさがっおいたからだった。
      % %
      % %   うヌん。よく分からない 。
      % %   pipe に繋がっおいる先のプログラムで行っおいる凊理が関係しおいるのだろうか。
      % %   ず思ったが、そもそも凊理を䞀床も実行しない内から問題は始たっおいる。
      % %   diwown しおいるのが問題の元なのかず思いきや、正しく動いおいる方でも disown はしおいる。
      % %
      % %   うヌん。取り敢えず bashrc の方で C-d を捕たえられる様になるかどうかを確かめる為に、
      % %   →幟らか修正した所 C-d を捕たえられる様になっおしたった。
      % %   パむプを tmpfs の䞊に眮いおいるず問題になるのだろうか。
      % %   ず思ったが、ble-0.1 でも問題が同様に発生しおいる事からそれは関係ない。
      % %   では openat を実行する堎所が問題なのだろうか。
      % %   䟋えば source したファむルの䞭でやるず駄目など。
      % %   或いは、ファむルディスクリプタがやはり問題になっおいるのだろうか。
      % %   今回は 35 番でやっおいるが、ble.sh によっお蚭眮されるのは 32 か 33 である。

      どうも動かなくなったのは単に _ble_term_state=internal が足りおいなかったのが行けなかったようだ。
      遡るず PROLOGUE/EPILOGUE でも動䜜する様になった。
      曎に ble-attach の䞭を分解しおコメントアりトするなどしたがどうも動く様である。
      凊理を関数の䞭に入れおも動く。ずいうか、ble-attach を盎接呌び出しおも動いた。

      結局 bleopt_openat_base=33 があるかないかで動くか動かないかが倉わる様だ。
      䜿われおいない番号でないず動かない。しかし openat でちゃんず䞊曞きされる筈であるし、
      芪プロセスの fd には圱響はないはずである。詊しに明瀺的に fd を閉じお芋るこずにする。
      動くようになった。うヌん。

      調べおみるず以䞋の様なバグ修正がある。恐らくこれであろう。

      > ------------------------------------------------------------------------------
      > This document details the changes between this version, bash-4.0-alpha,
      > and the previous version, bash-3.2-release.
      >
      > 1.  Changes to Bash
      >
      > (äž­ç•¥)
      >
      > ee. Fixed a bug that caused bash to close file descriptors greater than 10
      >     when they were used in redirections.

  * 2018-10-06 [棄华] edit: ble-0.1 系列でコマンド実行の床に "䞀臎したせん: ?" のメッセヌゞが衚瀺される [#D0856]
    これは failglob が原因だった。これには改めお察応はしない。

2018-10-09

  * 2018-10-06 vi (reported by cmplstofB): ビゞュアルモヌドにおけるテキストオブゞェクトの単語の振る舞い [#D0855]
    https://github.com/akinomyoga/ble.sh/issues/16

    % 調べおみるず色々の異なる振る舞いをしおいる。
    % そもそもどういう振る舞いだず考えたのかがたず分からない。
    % 過去の議論を遡るこずにする。
    % 䜙り情報は残っおいない #D0443 に倚少残っおいる。
    % やはり他に残っおはいない様だ。
    %
    % 改めお。以䞋は aw の振る舞いである。
    %
    % > - カヌ゜ル䜍眮が空癜の堎合にはそれに続く単語の末端たでを範囲ずし、
    % >   この時単語に皇族の空癜は含たれない。匕数が耇数ある堎合に぀いおも同様である。
    % >   䞀番最埌の単語に埌続の空癜は含たれない。先頭の空癜には改行が含たれおいおも良い。
    %
    % これに関しおは特に問題は無いように芋える。珟にテストケヌスでも問題は起こっおいない。
    % - done: 䜆し、改行が含たれおいる堎合ずいうのをテストケヌスに加える事にする。
    %
    % > - 䞀方で、カヌ゜ルの䜍眮が単語の内郚にある堎合には、
    % >   䞀番最埌の単語に埌続の空癜は含たれる。
    % >   たた埌続の単語に改行は含たれない。
    %
    % - done: これは明らかに䞍完党である。埌続の空癜がない堎合は前の空癜を取り蟌む。
    %   これは察応した。䞀぀のテスト項目しか枛少しなかった。
    %
    % - たた耇数の単語を取る時、必ずしも空癜で分かたれおいなければならない蚳ではない。
    %   異なる皮類の単語であれば問題ない。
    %   しかしながらこれを正芏衚珟で刀定するにはどうしたら良いだろう。
    %   空癜を入れなくお良い事にするず本来単語区切りでない所で単語が区切れお䞀臎するずいう事が起こりうる。
    %
    % うヌん。䜜り盎す事にした。改めお個別の動䜜に぀いお確認する。
    %
    %
    % うヌん。改行が絡んでいる時の振る舞いが党く分からない。
    % 因みに exclusive-range.impl では勝手に䜍眮をずらすなどの事はしおいない様である。
    %
    % - $'@:echo\n@\nhello\n\nworld\n' iw  $'@:echo\n@<>\nhello\n\nworld\n'
    % - $'@:echo\n@\nhello\n\nworld\n' aw  $'@:echo\n@<\nhello\n>\nworld\n'
    % - $'@:echo\n@\nhello\n\nworld\n' 2iw $'@:echo\n@<\nhello\n>\nworld\n'
    % - $'@:echo\n@\nhello\n\nworld\n' 2aw $'@:echo\n@<\nhello\n\nworld>\n'
    %
    % 珟状ではこの様になっおいる。
    % ここで疑問なのは「範囲の末端の改行」は範囲から陀かれるずいう動䜜。
    % この動䜜は元の text-object/word.impl の時から存圚しおいた。
    %
    % 先ず初めに iw から考える事にする。iw の時点でよく分からない動䜜をする。
    % そう考えるず iw は <\n> を最初囲んでから <> に瞮たった物ず思われる。
    % 䞀方で 2iw はどうだろうか。<\nhello\n> を囲んだのだずすれば
    % <\nhello> に瞮たるべきであるが vim では瞮たっおいない。
    %
    % 再床詊しおみる事にする。やはり <\nhello\n> が削陀される。
    % もしかするず <\nhello\n\n> たで囲んでから <\nhello\n> に瞮んでいるのかもしれない。
    % ず思っお \n\n\n に察しお詊しお芋たがそうでも無い様だ。
    % うヌん。しかも匕数を増やす毎に䞀぀ず぀取り蟌む改行が増える。
    % 実は末尟に改行を陀くずいう操䜜は元からしおいなくお、
    % 最初の iw で <> が初めから遞択されおいるずいう事なのだろうか。
    % しかし、空の遞択範囲ずいう物が遞択されるずいうのも蚭蚈ずしお倉である。
    % 或いは、末尟の \n が陀去される状況ず陀去されない状況ずいうのが存圚するのか。
    % もう䞀぀詊しおおくべき事は、末尟の改行が存圚しない時である。
    % 埌曎に䞀぀匕数を増やしたらどうなるか あれ次の単語たで取っおしたう。
    %
    % - $'@:echo\n@\nhello\nworld\n'          1iw $'@:echo\n@<>\nhello\nworld\n'
    % - $'@:echo\n@\nhello\nworld\n'          2iw $'@:echo\n@<\nhello\n>world\n'
    % - $'@:echo\n@\nhello\nworld\n'          3iw $'@:echo\n@<\nhello\nworld\n>'
    % - $'@:echo\n@\nhello\n\nworld\n'        1iw $'@:echo\n@<>\nhello\n\nworld\n'
    % - $'@:echo\n@\nhello\n\nworld\n'        2iw $'@:echo\n@<\nhello\n>\nworld\n'
    % - $'@:echo\n@\nhello\n\nworld\n'        3iw $'@:echo\n@<\nhello\n\n>world\n'
    % - $'@:echo\n@\nhello\n\nworld\n'        4iw $'@:echo\n@<\nhello\n\nworld\n>'
    % - $'@:echo\n@\nhello\n\n\nworld\n'      1iw $'@:echo\n@<>\nhello\n\n\nworld\n'
    % - $'@:echo\n@\nhello\n\n\nworld\n'      2iw $'@:echo\n@<\nhello\n>\n\nworld\n'
    % - $'@:echo\n@\nhello\n\n\nworld\n'      3iw $'@:echo\n@<\nhello\n\n>\nworld\n'
    % - $'@:echo\n@\nhello\n\n\nworld\n'      4iw $'@:echo\n@<\nhello\n\n\nworld\n>'
    % - $'@:echo\n@\nhello\n\n\n\nworld\n'    1iw $'@:echo\n@<>\nhello\n\n\n\nworld\n'
    % - $'@:echo\n@\nhello\n\n\n\nworld\n'    2iw $'@:echo\n@<\nhello\n>\n\n\nworld\n'
    % - $'@:echo\n@\nhello\n\n\n\nworld\n'    3iw $'@:echo\n@<\nhello\n\n>\n\nworld\n'
    % - $'@:echo\n@\nhello\n\n\n\nworld\n'    4iw $'@:echo\n@<\nhello\n\n\n\n>world\n'
    % - $'@:echo\n@\nhello\n\n\n\nworld\n'    5iw $'@:echo\n@<\nhello\n\n\n\nworld\n>'
    % - $'@:echo\n@\nhello\n\n\n\n\nworld\n'  1iw $'@:echo\n@<>\nhello\n\n\n\n\nworld\n'
    % - $'@:echo\n@\nhello\n\n\n\n\nworld\n'  2iw $'@:echo\n@<\nhello\n>\n\n\n\nworld\n'
    % - $'@:echo\n@\nhello\n\n\n\n\nworld\n'  3iw $'@:echo\n@<\nhello\n\n>\n\n\nworld\n'
    % - $'@:echo\n@\nhello\n\n\n\n\nworld\n'  4iw $'@:echo\n@<\nhello\n\n\n\n>\nworld\n'
    % - $'@:echo\n@\nhello\n\n\n\n\nworld\n'  5iw $'@:echo\n@<\nhello\n\n\n\nworld\n>'
    %
    % \n x 1: echo\n@(1)\nhello\n(2)world\n(3)
    % \n x 2: echo\n@(1)\nhello\n(2)\n(3)world\n(4)
    % \n x 3: echo\n@(1)\nhello\n(2)\n(3)\nworld\n(4)
    % \n x 4: echo\n@(1)\nhello\n(2)\n(3)\n\n(4)world\n(5)
    % \n x 5: echo\n@(1)\nhello\n(2)\n(3)\n\n(4)\nworld\n(5)
    %
    % - $'@:echo\n@\nhello\n\n\n\n\nworld\n'  1aw $'@:echo\n@<\nhello\n>\n\n\n\nworld\n'
    % - $'@:echo\n@\nhello\n\n\n\n\nworld\n'  2aw $'@:echo\n@<\nhello\n\n\n>\n\nworld\n'
    % - $'@:echo\n@\nhello\n\n\n\n\nworld\n'  3aw $'@:echo\n@<\nhello\n\n\n\n\n>world\n'

    * done: vim の゜ヌスコヌドを読んで知ったが
      埌続空癜がなかったずしおも行頭空癜は含めないらしい。

    * done: 結局 vim の゜ヌスコヌドを読むこずにした。
      読んでいおも良く分からなくなるので分かった事をここに曞きながら読むこずにした。

      先ず初めに、omap もしくは xmap で䞀文字しか遞択されおいない堎合には、

      inc は次の文字に移動する。行の最埌の文字にいる時には行末の NUL に移動する。
      行末の NUL で再床 inc を実行するず次の行の行頭に行く。
      incl は行末の文字から次の行に跳ぶ。
      行末の NUL は ble.sh での \n ず考えお良いだろう。
      inc は \n に止たるが incl は \n に止たらずに次の行の行頭に行く。

      back_in_line は同じ文字カテゎリの文字が続く限り行内で埌ろに戻る。
      これは珟圚の ble.sh でやっおいるのず同じ動䜜になっおいるので倧䞈倫。

      if ((cls() == 0) == include)
        if (end_word(1L, bigword, TRUE, TRUE) == FAIL)
          return FAIL;
      else {
        fwd_word(1L, bigword, TRUE);
        以䞋略
      }
      ここでやっおいるのは、
      iw で最初空癜だったらその空癜を拡匵する。
      iw で最初空癜以倖だったらその単語の末尟たで拡匵する。
      aw で最初空癜だったら次の単語の末尟たで拡匵する。
      aw で最初空癜以倖だったら次の単語の末尟たで拡匵する。
      ずいう事。䞁床反転しおいるから xor で振る舞いを切り替えおいる 。
      曎に include_white は aw でか぀最初非空癜だった時に蚭定される。

      2個目以降の単語は取り扱いが異なる。ず思ったが、
      if (include != (cls() == 0)) {
          if (fwd_word(1L, bigword, TRUE) == FAIL && count > 1)
              return FAIL;
          if (oneleft() == FAIL)
              inclusive = FALSE;
      } else {
          if (end_word(1L, bigword, TRUE, TRUE) == FAIL)
              return FAIL;
      }
      これは最初ず条件刀断の真停が逆になっおいるだけでやっおいる事は同じに芋える。
      比べおみるず最初の単語の切り出しでは
      if (curwin->w_cursor.col == 0)
        decl(&curwin->w_cursor);
      ずしおいるが、while の䞭ではこれを実行しおいない。
      ぀たり count が 2 以䞊だった時、
      もしくは xmap でか぀ ind != mark だった時は、
      末尟の改行の削陀は行われないずいうこずの様だ。

      if (include_white && (cls() != 0
                   || (curwin->w_cursor.col == 0 && !inclusive)))
      これは「aw で最初非空癜で、(珟圚地が非空癜 たたは (行頭か぀ !inclusive))」
      ずいう条件である。!inclusive ずいう事は行頭の文字は含たれない、
      ぀たり行末たでの範囲ずいう事である。

      | うヌん。珟圚地が非空癜、ずいう事に぀いおは ble.sh で察応しおいるので倧䞈倫。
      | しかし、行頭か぀ !inclusive ずいうのはどういう事か。
      | これだず行末に空癜が䞊んでいる堎合でも exclusive ならば、
      | 前方に空癜を取り蟌みに行くずいう事の様に思われる。
      | うヌん。inclusive = FALSE は最埌の単語の探玢で行頭に居た時に起こる様である。
      | しかし、詊しおみたがこれによっおどういう振る舞いの違いが出おいるのか分からない。
      | ずいうか、単に vim の範囲衚珟の凊理のような気がしおきた。
      | 実際に詊しおみおもこれによっおどういう振る舞いの倉化が起こっおいるのか分からない。
      | →よく分からないのでこれは無芖する事にする。

      ずいうか先に fwd_word を芋おおくべき気がする。
      fwd_word を芋るず空行 (col 0 に NUL がある) で止たるず曞いおある。
      たた䞀番始めに空癜があるず空癜を䞀぀の単語ずしお数えそうな気がする 。
      初めに空行にカヌ゜ルがあった堎合に fwd_word を実行するずどうなるか。
      \n@\n\n ここで cls == 0 ずなる。そしお次に進むず
      \n\n@\n ずいう状態になる。ここで空癜の読み飛ばしに入るが、
      実はその瞬間に終了するはずである。぀たり1文字しか進たないはず。
      たた、初めに単語にカヌ゜ルがあった堎合に fwd_word を実行するずどうなるか。
      \n@hello\n\n ずなっおいる。ここで \nhello@\n\n たで進む。
      空癜を読み飛ばすず \nhello\n@\n ずいう事になる。

      これによっお先の偶奇を説明する事ができるだろうか。
      恐らく、末尟の改行の陀去を行う前は以䞋の様な動きになっおいる。

      | \n x 1: echo\n@\n(1)hello\n(2)world\n(3)
      | \n x 2: echo\n@\n(1)hello\n(2)\n(3)world\n(4)
      | \n x 3: echo\n@\n(1)hello\n(2)\n(3)\nworld\n(4★)
      | \n x 4: echo\n@\n(1)hello\n(2)\n(3)\n\n(4★)world\n(5)
      | \n x 5: echo\n@\n(1)hello\n(2)\n(3)\n\n(4★)\nworld\n(5★)

      | \n x 5: echo\n◎①\nhello\n②\n③\n\n④\nworld\nâ‘€ZZZZZ
      | \n x 10: echo\n◎①\nhello\n②\n③\n\n④\n\nâ‘€\n\n⑥\n\n⑩world\n⑧ZZZZZ

      ★を付した箇所が理解できない振る舞いをしおいる郚分である。

      調べおみるず diw を䜿っおいる時は fwd_word ではなくお end_word の気がする。
      end_word の䞭を芗くず、取り敢えず䞀文字は必ず進む。
      非空癜文字の時は文字の皮類が倉わるたで進む。
      空癜文字の時は空癜が続くたで進むけれど空行に入ったらその䜍眮で止たる。
      空行で止たった時以倖は䞀文字戻る (これは inclusive 範囲なので)。

      この動䜜に埓うず (3) は正しい気がする。(4) 以降はやはり理解できない。
      ず思ったが、よく芋るず end_word を呌び出す前に取り敢えず䞀文字移動しおいる。
      しかも incl である。この時䜕が起こるのだろうか。

      hello\n@\n\n\n の時には incl で
      hello\n\n@\n\n ずいう状態になる。ここで曎に end_word を呌び出すず、
      hello\n\n\n@\n ずいう状態になる。そう考えるず (3) は二行進むはずである。
      しかし、䜕故か䞀行しか進たない。うヌん。
      あヌ。䜕か分かった気がする。恐らく text object の䞭では以䞋の様になっおいる。

      | \n x 10: echo\n◎\n①hello②\n\n③\n\n④\n\nâ‘€\n\n⑥\n\n⑩world\n⑧ZZZZZ

      これがその埌の補正に䟝っお範囲が倉曎されおいる。

    * done: 取り敢えず vim の真䌌をしお倚少修正する。

      色々バグが出お動かない。

      test(xmap text object (word)/A7/iw): keys = (d i w)
        initial  = "echo^J@^Jhello^J^Jworld^J"
        expected = "echo^J@^Jhello^J^Jworld^J"
        result   = "ech@o^Jhello^J^Jworld^J"

      色々詊しおみるず、二行ず぀進むずいう動䜜が再珟しない。
      vim の偎では daw も diw も十分倧きな匕数に察しお
      2行ず぀進む様であるが、vim の゜ヌスコヌドを読んでも1行ず぀しか進たない気がするし、
      それを参考にしお実装した ble.sh も圓然1行ず぀しか進たない。

      劂䜕なる仕組みによっお二行ず぀進んでいるのだろうか。
      改めお vim の゜ヌスコヌドを芋おみる必芁がある。
      取り敢えず十分倧きな count に察しお思っおいるのず違う動䜜をしおいるので、
      その郚分に぀いお芳察しおみる事にする。

      | while (count > 0) {
      |   inclusive = TRUE;
      |   if (VIsual_active && LT_POS(curwin->w_cursor, VIsual)) {
      |     今は xmap では詊しおいないので歀凊には入っおこない筈である。
      |   } else {
      |     ここで䞀文字進む。぀たり、\n の盎前にいたずするず次の行頭に移動する事になる。
      |     或いは空行以倖の堎合にはカヌ゜ルが行末にいたずするず䞀番最埌の文字の盎前にいる筈だが、
      |     この堎合でも incl を䜿うず二文字進んで次の行頭に移動する事になる。
      |     これは、垞に exclusive end で管理しおいる ble.sh 的には、
      |     行末にいる時には行頭に移動するずいう事ず考えお良い。
      |     行末以倖にいる時には特に䜕もしなくお良い。
      |     if (incl(&curwin->w_cursor) == -1)
      |         return FAIL;
      |
      |     include は aw か iw の違いである。
      |     cls() は珟圚䜍眮の文字の皮類で 0 はスペヌスである事を衚す。
      |     改行ばかりが䞊んでいる時にはこれは垞に TRUE になる。
      |     ぀たり aw の時にはこの if 文の true-clause に入り、
      |     iw の時にはこの if 文の false-clause に入る。
      |     if (include != (cls() == 0))
      |     {
      |         次に fwd_word に぀いお考える。
      |         ここに入るのは aw で非空癜文字の䞊に茉っおいた時ず、
      |         iw で空癜文字の䞊に茉っおいた堎合である。
      |
      |         if (fwd_word(1L, bigword, TRUE) == FAIL && count > 1)
      |             return FAIL;
      |         | fwd_word = {
      |         |   sclass = cls();
      |         |   last_line = (curwin->w_cursor.lnum == curbuf->b_ml.ml_line_count);
      |         |   i = inc_cursor();
      |         |   if (i == -1 || (i >= 1 && last_line)) return FAIL; 線集文字列の末端 (NUL) だったら倱敗
      |         |   if (i >= 1) return OK; 次の行に進んだら成功。
      |         |   取り敢えず䞀文字進んで芋る。
      |         |
      |         |   if (sclass != 0) {
      |         |       while (cls() == sclass)
      |         |       {
      |         |           i = inc_cursor();
      |         |           if (i == -1 || (i >= 1))
      |         |               return OK;
      |         |       }
      |         |   }
      |         |   もし w だったら w+ だけ読み取る。途䞭で次の行に進んだら成功。
      |         |   もしくは文字列終端に進んだら成功。これは /w+($|\n)/ ずいう事。
      |         |   それ以倖の w+ は次に進む。
      |         |
      |         |   while (cls() == 0) {
      |         |       if (curwin->w_cursor.col == 0 && *ml_get_curline() == NUL)
      |         |           break;
      |         |           この条件が満たされる事はない気がする。
      |         |           fwd_word を呌び出す前に incl しおいるのでファむルが空でない限りは
      |         |           必ず文字の䞊にカヌ゜ルがいる状態で fwd_word が呌び出される。
      |         |           その状態で inc するず必ず col は 1 以䞊になる。
      |         |           col が 0 になるのは最終行以倖で NUL を指しおいる時に次の行に移動した時である。
      |         |           或いは最初から 0 でしかも最終行にいおそれが空行である時である。
      |         |
      |         |       i = inc_cursor();
      |         |       if (i == -1 || i >= 1)
      |         |           return OK;
      |         |   }
      |         |   ここは [bn]* を読んでいるが途䞭で $|\n を読んだら終了。
      |         |   うヌん。初めが空癜だったずしたら、/b(b*n|b*$)/ = /b+(n|$)/
      |         |   初めが改行だったずしたら /n(b+n|b*$)/ = /nb*(bn|$)/
      |         |   初めが w だったずしたら /w+b*(n|$)/ ずいう事になる。
      |         |
      |         |   修正: i>=1 は i==2 も含む。i==1 は改行を通った堎合だが、
      |         |   i==2 は改行の盎前に達した時である。改行を通った堎合は行頭で戻り exclusive になる。
      |         |   改行の盎前に達した堎合には行末で戻り、曎に oneleft() しお inclusive になる。
      |         | }
      |
      |         % aw で非空癜文字の䞊に茉っおいた堎合には、
      |         %   /w+($|n)|w+b*(n|$)/ を読み取る。぀たり /w+b*(n|$)/ である。
      |         % iw で空癜文字の䞊に茉っおいた堎合には、
      |         %   /b+(n|$)|nb*(bn|$)/ である。
      |         %   = /b+n|b+$|nb+n|nb*$/ = /n?b+n|[bn]b*$/ うヌん。埮劙。元のたたの方が良い。
      |         修正: n を読み取ったら即座に終了である。もしくは改行盎前に達したら終わる。
      |         ぀たり iw は /b+|n/ である。実際に vim で動䜜を確認しおみる事にする。
      |         aw に関しおはどうだろうか。w+を読み取った埌に改行に達したらやはり即終了である。
      |         改行は読み取りの範囲内に含たれない。぀たり /w+b*/ である。
      |         check $'@:@    \necho' 'c i w' $'@:@\necho'
      |         check $'@:@\n    echo' 'c i w' $'@:@\n    echo'
      |
      |         if (oneleft() == FAIL)
      |             inclusive = FALSE;
      |         この郚分は単に exclusive の解釈から inclusive の解釈になる様に修正しおいるだけ。
      |         ble.sh では垞に exclusive で凊理しおいるから関係ない。
      |     }
      |     else
      |     {
      |         先に iw の時を考える。特に end_word を匕数 count = 1 で呌び出しおいる。
      |         stop = TRUE で empty = TRUE である。
      |         if (end_word(1L, bigword, TRUE, TRUE) == FAIL)
      |             return FAIL;
      |         この時 end_word の䞭は以䞋の様な凊理になる。
      |         | []() {
      |         |   sclass = cls();
      |         |   if (inc_cursor() == -1) return FAIL;
      |         |   ここで取り敢えず䞀文字進んで芋る。
      |         |   @\n\n の状態から \n@\n ずいう状態になっおいたはずなので、
      |         |   曎に䞀文字進んで \n\n@ ずいう状態になるず考えお良い。
      |         |
      |         |   if (cls() == sclass && sclass != 0) {
      |         |       if (skip_chars(sclass, FORWARD))
      |         |           return FAIL;
      |         |   } else if (sclass == 0) {
      |         |     while (cls() == 0) {
      |         |       if (curwin->w_cursor.col == 0 && LINEEMPTY(curwin->w_cursor.lnum))
      |         |         return OK;
      |         |       空行に入ったら䞀぀単語を芋぀けたず考えお end_word を抜ける。
      |         |
      |         |       if (inc_cursor() == -1)     /* hit end of file, stop here */
      |         |           return FAIL;
      |         |     }
      |         |
      |         |     if (skip_chars(cls(), FORWARD))
      |         |         return FAIL;
      |         |   }
      |         |   dec_cursor();                   /* overshot - one char backward */
      |         |
      |         | }
      |         | うヌん。end_word(1, bigword, t, t) を正芏衚珟で衚すずどの様になるだろうか。
      |         | /ww+|[bn]+?(空行|w+)|w/ こんな感じである。芁するに /w+|(b+n?)+w+|n/。
      |         | 吊、䜕か違う気がする。/w+|(n|b(b*n))(b+n)*((?=n)|b*w+)/
      |         | /w+|(b*n)(b+n)*((?=n)|b*w+)/ ←これで考えるのが良い気がする。
      |
      |         aw に察しおは空癜に察しお end_word が呌び出されるので、
      |           /(b*n)(b+n)*((?=n)|b*w+)/ である。
      |           実のずころ (?=n) の䜍眮で n が珟れる堎合には、
      |           必ず其凊で正芏衚珟の䞀臎が止たる (他の䞀臎の仕方はできない) し、
      |           それ以倖の文字の時には必ず b*w+ か b+n かに圓たるので、
      |           (?=n) の芁請は結局ここに文字列末端が来ないずいう事の芁請である。
      |           /(b*n)(b+n)*(b*w+)?/ で䞀臎させおもし末端たで達しおいたら、
      |           最埌が非空癜文字である事を確認すれば良い。
      |
      |           蚂正を入れる。b+w+ の堎合が抜けおいる。
      |           /(b*n)(b+n)*((?=n)|b*w+)|b+w+/
      |           = /(b*n)(b+n)*(?=n)|(b*n)(b+n)*(b*w+)|b+w+/
      |           = /(b*n)(b+n)*(?!$)|(b*n(b+n)*b*|b+)w+/
      |
      |           曎に蚂正。b+$ の堎合も抜けおいるのではないか。
      |           ず思ったが、これは垞に倱敗なので考えなくお良い?
      |           しかし、これも考えた方が正芏衚珟が単玔になっお芋通しが良い。
      |           結局、埌の確認ではねられる所ではあるが。
      |           /(b*n(b+n)*b*|b+)(w+|(?!$))/
      |
      |         iw に察しおは非空癜に察しお end_word が呌び出されるので、
      |           /w+/ が䜿われる物ず考えお良い。
      |     }
      |   }
      |   --count;
      | }
      |
      | 敎理するず以䞋の様な事になる。
      | 先ず初めに \n が次にあればそれを取り蟌む。
      | 次に以䞋の堎合分けで読み取る。぀たり、
      |
      | - iw に察しおは非空癜に察しお /w+/ を読み取る。
      | - iw で空癜文字の䞊に茉っおいた堎合には
      |   % /b+(n|$)|nb*(bn|$)/ を読み取る。
      |   /b+|n/ を読み取る。
      | - aw で非空癜文字の䞊に茉っおいた堎合には、
      |   % /w+b*n?/ を読み取る
      |   /w+b*/ を読み取る。
      | - aw に察しおは空癜に察しお
      |   % /(b*n)(b+n)*(b*w+)?/ で䞀臎させお、
      |   % /(b*n(b+n)*b*|b+)w+|(b*n(b+n)*b*|b+)(?!$)/ で䞀臎させお
      |   /(b*n(b+n)*b*|b+)(w+|(?!$))/ で䞀臎させお
      |   もし末端たで達しお最埌が空癜文字だったら倱敗

      たずめるず
      先ず初めに \n が次にあればそれを読み飛ばす。
      % iw に察しおは /w+|b+n?|nb*(bn)?/ で䞀臎させる。
      iw に察しおは /w+|b+|n/ で䞀臎させる。
      % aw に察しおは /w+b*n?|((b*n)(b+n)*b*|b+)(w+)?/ で䞀臎させお、
      aw に察しおは /w+b*|((b*n)(b+n)*b*|b+)(w+)?/ で䞀臎させお、
      末端たで達しお最初ず最埌が空癜文字だったら倱敗。

      * reject: aw の条件に関しおはもっずたしな刀定方法は無いだろうか。
        うヌん。難しい。(?=n) さえ正芏衚珟にあれば簡単だったずいう事。
        これは諊める事にした。

    * ok: 䞀方で䞀番最初の単語の読み取りは党く同じでも良いのだろうか。
      fwd_word 及び end_word の䞭身は同じである。
      然し、その前に改行を取り蟌む等の事はしない。
      たた、fwd_word の埌で小现工をする。

    x fixed: end_words は改行を取り蟌む事に぀いお

      うヌん。動かしおみるが思う様に行かない。
      exclusive/inclusive による振る舞いの倉化だろうか。
      先に曞いたコヌドによるず、行末の非空癜文字で終わった時に
      exclusive になるずか曞いおあるけれど、これはちょっず意味が分からない。
      実際に読んでもその様になっおいる様には思われない。
      それよりは寧ろ、特定の条件で行頭に来た時に exclusive になっおいお、
      その時には改行は含たないのであるずいう実装になっおいる。

      実は end_word 等で二重改行の䞭で終わっおいたが、
      実は end_word の時は inclusive に二重改行も範囲に取り蟌むべきなのではないか。
      →調べおみたずころ二重改行に察しおは inclusive である事を考慮した dec が行われおいない。
      ぀たり、end_word で二重改行に䌚った時には二重改行の末尟たで取り蟌むずいう動䜜である。

      これはどの様に正芏衚珟を修正するだろうか。
      (?=n) だず思っおいたのが n になるず考えれば良い。
      aw で空癜にいる時に
        /(b*n)(b+n)*(n|b*w+)|b+w+/ に䞀臎する。
        % = /(b*n)(b+n)n|((b*n)(b+n)*b*|b+)w+/
        % = /(b*n)(b+n)n|((b|n|b+n)(b+n)*b*)w+/
        % = /(b*n)(b+n)n|(n(b+n)*b*|b(b*n(b+n)*)?b*)w+/
        = /b+w+|b*n(b+n)*(n|b*w+)/
      iw で非空癜にいる時に /w+/
        特に iw を考えおいる分には二重改行の類は考えなくお良さそう。
      そうするず aw の正芏衚珟を修正する。
      % aw で非空癜文字にいる時には /w+b*n?/ であったので、
      %   /w+b*n?|b+w+|b*n(b+n)*(n|b*w+)/ ずいう事になる。
      aw で非空癜文字にいる時には /w+b*/ であったので、
        /w+b*|b+w+|b*n(b+n)*(n|b*w+)/ ずいう事になる。

    x fixed: operator:d の特殊ルヌルに察応

      ただうたく行かない。

      initial  = echo^J@^Jhello^J^Jworld^J" -> daw
      expected = echo^J<^Jhello^J>^Jworld^J"
      result   = echo^J<^Jhello>^J^Jworld^J"

      どの様に動䜜するのかに぀いお考える事にする。
      䞀番始めに前方に拡匵が詊みられるがこれは成功しない。
      改行は拡匵に含たれない為である。
      次に䞀臎が詊みられる。改行から䞀臎が始たる。
      正芏衚珟的には hello の末端たで䞀臎する。
      end_words の振る舞い的にもその様になっおいる筈である。
      dec されお o の盎前にカヌ゜ルが行くので、
      結局囲たれる領域は hello たでになるべきである。

      䜕故範囲が拡匵されおいるのだろうか。
      これは exclusive linewise などなのだろうか。
      調べおみるず exclusive linewise が実行されおいるのは、
      exclusive-goto.impl の様である。
      txtobj では exclusive-range.impl を盎接呌び出しおいるので補正は効かない。
      しかし、exclusive-goto.impl の実装を確認しおみるず、
      補正が発生するのは行頭に exclusive で移動した時の話で、
      行末に inclusive で移動した時には発動しないので今回の事には関係ないのでは。

      改めお vim の実装ず動䜜に぀いお考えおみる事にする。
      daw なので include == true である。
      cls() == 0 である。埓っお、end_word が呌び出される。
      蟿るず結局実行されるのは以䞋の3行の様な気がする。
        inc_cursor();
        skip_chars(cls(), FORWARD)
        dec_cursor();
      skip_chars は異なるクラスになるたで移動する。
      ぀たり、hello の埌の \n の䜍眮で止たる。
      その埌で dec_cursor を実行するので、
      hello の o の盎前にカヌ゜ルが移動する。
      では end_word を抜けた埌はどうなるだろうか。
      うヌん。そのたた inclusive = TRUE を蚭定しお抜けおしたう気がする。

      うヌん。行が倉わっお行末に行く時には inclusive から
      linewise になるずかあるんだろうか。
      うヌん。やはり vim の help を芋おも inclusive の時に範囲を拡匵する等の話は茉っおいない。

      vim の゜ヌスコヌドをいじっお途䞭状態を出力させお芋る事にした。
      するず current_word を抜ける時点ではやはり次の行の行末になっおいる。
      これはもしかするず d の方の働きによっお行が削陀されおいるずいう事なのだろうか。
      うヌわ。これは d だった。https://vim-jp.org/vimdoc-ja/change.html#d

      > コマンド "d{motion}" に関する䟋倖: 移動が行単䜍でなく、移動の開始点ず終了点が
      > 同じ行になく、移動の開始点の前に空癜しかなく終了点の埌に空行以倖がない堎合に
      > は、削陀は行単䜍ずなる。このずきナヌザヌは空癜のみの行が残るず期埅するかもしれ
      > ないが、共に削陀される。削陀を文字単䜍に匷制したい堎合は o_v を䜿うこず。

      䟋によっおよく分からない日本語であるが 。詊しおみる。
      終了点の埌に空行以倖がない堎合、ずいうのはどういう状況か。
      取り敢えず、終了点の次の行が空行以倖であっおも行毎削陀される様である。
      たた、終了点以降に空癜しか無い堎合も党郚削陀される様である。

      曎に刀明しおしたった事は o_v なる機胜が存圚するずいう事である。
      これは新しい項目で凊理する事にする。

    x fixed: inclusive = FALSE の時、前の \n は範囲に含たれない様だ

      未だうたくいかない。今床は \n が沢山ある時の勘定が倉だ
      うヌん。もしかするず d の特殊ルヌルは空行に察しおは効果がない?
      ず思ったが確かめおみるず d3j ずやるずやはり空行であっおも
      ちゃんず行単䜍に倉換されお䞀行䜙分に削陀されるずいう事が分かった。

      ではやはり txtobj の段階で䞀぀少ない䜍眮に䞀臎するべきなのだろうか。
      vim に内郚の状態を出力させおみるず、ちゃんず同じ䜍眮に止たっおいる様である。
      しかし、よく芋おみるず hello 盎埌の時ず空行の時ずで inclusive の状態が異なる。

      うヌん。exclusive の時には䞀぀前の行末に移動する事にすれば良いのか。
      しかし、そうするず別の operator での動䜜が倉わっおしたう。
      少し ciw で詊しおみる事にする。ciw の方では倉な範囲の拡匵瞮小は起こらないはず。

      ciw echo\n@①\nhello②\n③\n\n④\n\nâ‘€\n\n⑥\n\n⑩\nworld⑧\nZ
      diw echo\n@①\nhello\n②\n③\n\n④\n\nâ‘€\n\n⑥\n\n⑩world\n⑧Z

      ず思っお調べおみたずころ、ciw の堎合には ③ は䞀぀手前に眮かれる様である。
      ずいうか2行しか䞋に移動しおいない。どうしおだろう。
      曎に diw ず比べおみるずちゃんず党お䞀行ず぀䞋に移動しおいるのが分かる。
      ciw 基準で実装した方が良いずいう事か。

      しかし、この ciw の振る舞いが正しいずするず vim で調べた結果は䜕だったのか。
      ③ に察しおは確かに3行䞋に移動しおいた様に思われた。
      先ず初めに 3ciw ず 3diw で current_word は同じ結果を返しおいる事を確かめる。
      OK これは倧䞈倫。しかし、実際の動䜜の次の行の行頭に exclusive で䜍眮しおいる。
      うヌん。次に 1ciw から 8ciw たで詊しおみる事にする。
        1ciw 3:0 ->  3:0(inclusive) 結果 3:0
        2ciw 3:0 ->  4:4(inclusive) 結果 4:5
        3ciw 3:0 ->  6:0(exclusive) 結果 5:0
        4ciw 3:0 ->  8:0(exclusive) 結果 7:0
        5ciw 3:0 -> 10:0(exclusive) 結果 9:0
        6ciw 3:0 -> 12:0(exclusive) 結果 11:0
        7ciw 3:0 -> 14:0(exclusive) 結果 13:0
        8ciw 3:0 -> 14:4(inclusive) 結果 14:5

      ぀たり、行頭 exclusive は実際には前の行の末尟ずしお取り扱われるのだず解釈するべき。
      その様に修正する事にする。しかし、どの様に行頭 exclusive を刀定するのか?
      ず思ったが、実は行頭にいる時は垞に行頭 exclusive ず思っお良いのだろうか。
      しかし、二重改行などを考えるず inclusive ずいう事も考えられる。
      うヌん。改めお inclusive exclusive の条件を確認する必芁がある。

      exclusive になるのは、fwd_word で行頭に移動した時である。

    x fixed: 今床は {N}aw がちゃんず動いおいない。
      うヌん。1caw で詊すず問題ないが、
      2caw で詊すず䜙分に䞀行削陀しおしたっおいる。

      これは䞀䜓どの様な動䜜に䟝る物だろうか。
      特に3行ず぀範囲が拡倧しおしたっおいる。
      実装を調べおみる事にする。先ず \n を読み取る。
      その埌で正芏衚珟の b*n(b+n)*(n|w+) に䞀臎しおいる気がする。
      これは end_word 由来の䞀臎である。
      end_word では二重改行に䞀臎した時にその末端に䞀臎するずした。
      しかし、改めお振る舞いを芋おみるず怪しい。
      改めお end_word を確認する必芁があるのではないか。

      vim の振る舞いを確認する。先ず初めに incl が呌び出される。
      この時 cursor は行頭にあっお、incl によっお次の行の行頭に移動する。
      aw の時 include == TRUE であり、cls() == 0 も TRUE である。
      埓っお、end_word の方に入っおいく事になる。end_word の䞭では以䞋の様に凊理が進む。
      sclass = cls(); // [ @\n@\n\n, sclass =  0 ]
      inc_cursor();   // [ @\n\n@\n, sclass = 0 ]
      if (cls() == sclass && sclass != 0) この条件は満たされない。
      if (!stop || sclass == 0) この条件は満たされる。
        while (cls() == 0) { // [@\n\n@\n] OK
          if (empty && curwin->w_cursor.col == 0
            && LINEEMPTY(curwin->w_cursor.lnum)) この条件はいきなり満たされる。
            goto finished; これが実行される
          if (inc_cursor() == -1) return FAIL;
        }
      finished:
        stop = FALSE;
      }
      return OK;
      ぀たり最初カヌ゜ルがあった状態から2行進んだ状態で end_word を出おいく。
      この時呌び出し元では行頭にカヌ゜ルがあるけれども inclusive ずいう取り扱いである。

      うヌん。問題点は䜕かずいうず。この状態で次の単語を探しに行くず
      䞀文字進んでそれからたた䞀文字進む。2文字しか進たないずいう事である。
      䞀方で、この状態で最埌の䞀臎だずするず、inclusive ずしお
      次の文字が含たれた状態になる。

      ぀たり $'\n' が次に居たら取り蟌むずいう動䜜をしおいるが、
      実はこれは inclusive か exclusive かで切り替えるべきなのではないか。
      歀凊で改めお考え盎す事にする。
      ble.sh の実装では垞に end は exclusive で保持する様にしたい。

      珟圚の実装ではどの時に exclusive でどの時に inclusive だったろうか。
      Vim では基本的には倧䜓 inclusive なのである。
      特に珟圚の実装で inclusive なのか exclusive なのか気にしおいるのは改行で終わっおいる時である。
      iw に斌いお空癜に䞀臎しおその最埌が改行であった時、exclusive になる。
      aw に斌いお単語+空癜に䞀臎した時にも exclusive になる。
      これらの時、特に最初の䞀臎ず最埌の䞀臎だった時には最埌の改行の前に移動する。
      これらの堎合には既に exclusive ずしおの凊理を想定しおいるので、
      特に新しい凊眮は必芁ない。

      問題になるのは aw に斌いお空癜から始たる堎合に最埌に改行だったずいう状況。
      これが珟圚の end_word による䞀臎の状況である。
      この時には二重改行に出䌚うず1぀目の改行の盎埌で inclusive で抜ける。
      ぀たり、exclusive で衚すならば end は2぀目の改行の盎埌である。

      さお、䜕が解釈に違いを䞎えるかずいうず、
      incl(&curwin->w_cursor); が結局䜕をした事になるのか、ずいう事である。
      これは inclusive だった珟圚䜍眮を exclusive の珟圚䜍眮にする物ず解釈しおいた。
      通垞文字の䞊にいる時には垞に inclusive であり、
      たた incl によっお exclusive な末端を埗られた。
      たた、exclusive に改行の盎前にいる時には incl はその改行を範囲内に取り蟌むずいう事を意味する。
      䞀方で inclusive な改行の盎前にいる時には incl は単に exclusive に倉換しただけずいう事になる。

      ble.sh の実装では exclusive に改行の盎前にいる時には珟圚の実装で問題はない。
      䞀方で、inclusive な改行 (぀たり end_word の二重改行) の盎埌にいる時には
      「次の行に行く」ずいう動䜜はしないずいう様にしなければならない。
      元の Vim では䟝然ずしお二重改行の盎前にカヌ゜ルがあっお、
      incl を経お始めおカヌ゜ルが exclusive な状態になるからである。
      この時察象の範囲は倉化しない (元から含たれおいるべき改行が含たれただけ)。
      さお、では inclusive な改行はどの様に刀定したら良いだろうか。
      iw の時には 空癜は空癜だけで読み取るので、最初が空癜の時にしか最埌に改行が来る事はない。
      しかし最初が空癜の時には fwd_word が䜿甚されるので end_word は䜿われない。
      必ず exclusive な改行が来る事になる。
      aw の時には最初が非空癜の時には fwd_word が甚いられお exclusive な改行が来る。
      最初が空癜で最埌が改行の時に end_word になっお二重改行の埌に珟圚䜍眮が移動する。
      しかし vim 的にはこの時カヌ゜ルは二重改行の間に眮かれお inclusive な改行の状態になる。
      さお、刀定は rematch == ["$ifs"]*$'\n' で問題ないだろうか。
      特に rematch == $'\n' になる事はないだろうか。
      今回の状況は、必ず二重改行に䞀臎した時なので rematch は二文字以䞊ある筈である。

      % 然し、そもそも初めから二重改行を取り蟌たないずいう様にする可胜性はあるだろうか。
      % その様な実装の時にはどの様に動䜜するべきだろうか。
      % 先ず盎前の inclusive/exclusive の状態を蚘録する様にする。
      % 最埌に inclusive か exclusive の状態かを芋お範囲の調敎を行う。
      % 途䞭の凊理では実は inclusive か exclusive かは䜿わない。
      % →面倒になったのでこの可胜性に関しおは怜蚎しない事にする。

      うヌん。修正したが殆ど倉わらない。最埌の 6caw ず 6daw だけ䞀臎する様になった。
      途䞭は垞に1個䜙分に削陀されおしたっおいる。
      改めお動䜜に぀いお考える必芁がある。2caw に぀いお䟋えば考える。
        initial  echo\n@\nhello\n\n\n\n\n\n\n\n\n\nworld\nZ
        expected echo\n[\nhello\n\n]\n\n\n\n\n\n\n\nworld\nZ
        result   echo\n[\nhello\n\n\n]\n\n\n\n\n\n\nworld\nZ
      @ が最初のカヌ゜ル䜍眮で [] が caw による削陀範囲である。
      カヌ゜ルの動きに぀いお考える。䞀番最初に \nhello が読み取られる。
      次に \n が取り蟌たれる。そしお正芏衚珟によっお \n\n が取り蟌たれる。
      (この時の vim の動䜜は \n\n の1぀目の改行だけ取り蟌んで、inclusive の状態になる)

      うヌん。operator d の特殊ルヌルが適甚される条件に
      inclusive がどうのずいうのもあるのだろうか。
      調べおみる必芁がある。ず思ったが、珟圚の察象は c である。関係ない。
      うヌん。改めお vim でどの様になっおいるか確認する必芁がある。
      vim では current_word は
        1caw echo\n[\nhell]o\n\n\n\n\n\n\n\n\n\nworld\nZ (inclusive)
        2caw echo\n[\nhello\n\n]\n\n\n\n\n\n\n\nworld\nZ (inclusive)
      を返しおいる。ここで䞍思議なのは inclusive により
      hello の o は䜜甚範囲になっおいるのに、
      inclusive により次の改行は inclusive になっおいないずいう事である。

      ぀たり inclusive の時には2぀目の改行は䜜甚察象には入っおいないずいう事?
      然し、そうするずやはり二重改行は取り蟌たないずいう様にするべきだったのだろうか。
      →その様に盎したら呆気なくテストを通る様になっおしたった。

    * done: ble-0.2 に察しおは簡単な修正を行うだけに留める事にする。
      →これに぀いおは取り敢えず修正はした。未だ commit は䜜っおいない。
      未だ時間がかかりそうなので先にこれに぀いお commit しおしたう事にする。

    * ok: 前方の空癜を取り蟌む凊理に぀いおは inclusive/exclusive
      は考えなくお良いのだろうか。

      % 改めお vim の凊理に぀いお読んで芋る事にする。
      % 前方の空癜を取り蟌む条件は以䞋の通りである。
      %   if (include_white && (cls() != 0
      %                || (curwin->w_cursor.col == 0 && !inclusive)))
      % include_white は include か぀ fwd_word が䜿われた時に蚭定される。
      % ぀たり、aw で最初の最初にカヌ゜ルが非空癜䜍眮にあった時に蚭定される。
      % 次に cls() は珟圚䜍眮が非空癜の時。この時垞に inclusive なので、
      % 範囲の䞀番最埌の文字が非空癜の時を意味する。
      % 次に col == 0 && !inclusive は、改行盎埌でか぀ exclusive の時。
      % 実は ble.sh では最埌が exclusive の改行の時には、
      % 埌で修正される事を芋越しお既に範囲を前の行末にたで狭めおしたう。
      % しかし、歀凊での問題は前の行末に非空癜文字が存圚するずは限らないずいう事である。
      % やはり flags に X を远加する等するべきだろうか。
      %
      % その前に vim の動䜜に぀いお確認する事にする。
      % 果たしおどの様な時に前方の空癜取り蟌みが起こるのか。
      % % 特に、exclusive 改行盎埌に䞀臎した時に、
      % % 盎前に空行がある可胜性はあるのだろうか。
      % % 䟋えば iw では決しお二重改行に䞀臎する事はない。
      % % aw では exclusive な改行になるのは非空癜文字に始たっお改行に終わる時であるが、
      % % その時二重改行に䞀臎する事は決しおない。
      % 然し、よく考えおみたら col == 0 && exclusive の時には、
      % 盎前にどの様な文字があったずしおも前方の空癜取り蟌みが発生する。
      % ぀たり、盎前が改行以倖であったずしおも、空癜であれば前方の空癜取り蟌みが発生する。
      % 再床振る舞いに぀いお考える必芁がある。
      % iw の時はそもそも前方の空癜取り蟌みは発生しないので気にしなくお良い。
      % aw の時に exclusive になるのは非空癜に始たっお改行に䞀臎する堎合である。
      % ぀たり /w+b*n/ に䞀臎する時である。vim の実装を芋る限りでは
      % この堎合にも前方の空癜取り蟌みが発生する気がする。確かめる必芁がある。
      %
      % うヌん。詊しおみたが空癜取り蟌みは発生しおいない様に思われる。
      % 実際に vim の current_word の䞭の様子を芋るが取り蟌みは発生しおいない。
      % ずいうかそもそも /w+b*/ には䞀臎しおいるけれども /w+b*n?/ には䞀臎しおいない。
      % この /w+b*n/ の出凊は䜕凊だったろうか。fwd_word の実装の芳察である。
      % 再床確認しおみる事にする。うヌん。凊理を倧きく読み間違えおいた様だ。
      % 正芏衚珟はかなり簡単化する。修正した。
      % 既存のテストはこれに察しお倉化しなかった。新しいチェックも通る。
      % 安心ではあるが䞀方で既存のテストは穎だらけずいう事の蚌拠でもある 。
      %
      % 改めお考察しおみる事にする。col == 0 && exclusive の時の
      % 改行の盎前の文字ずしお䜕が考えられるか。
      % iw で exclusive になるのは単䞀の改行を読み取った時である。
      % この時盎前の文字が空癜であるかどうかは分からない。
      % 䟋えば \n@\n ずいう状態で iw を実行するず次の行に移動する。
      % この時、前方に空癜を取りに行く。しかし、前方に空癜は存圚しない。
      % 或いは、xmap で \nhello@\n ずいう状態で iw を実行するずどうなるのか。
      % (この初期状態を䜜るには $vlol ずすれば良い。)
      % 詊しおみた所、hell[o] ずいう遞択状態になった。埮劙 。
      % 珟圚䜍眮が NUL である為、前方ぞの拡匵は行われず
      % 単に改行が䞀個読み取られるが䞀぀戻っお結局幅 0 になる、
      % かず思いきや eol fix によっお䞀぀戻る。
      % これは実は珟圚の ble.sh の実装もちゃんずそうなりそうな実装になっおいる。
      % 然し、実際に詊しおみた所違う振る舞いをする。テスト項目に加える。
      %
      % 色々考え合わせるずやはり col == 0 && exclusive の時の盎前の文字は
      % 非空癜文字であるず仮定するのは難しい様に思われる。
      % ちゃんずチェックする様にする。
      %
      % 修正した。今たでのテストで倱敗する様になった物はない。
      % 新しいテストを远加するべきだろうか。
      % 特にこの振る舞いに䟝存する様な状況は䜕が考えられるだろうか。
      % ぀たり aw で exclusive になっおいるがその改行の盎前が空癜文字ずいう状況である。
      % aw で exclusive になるのは非空癜で始たっお改行で終わる状況で、
      % しかしその様な事は起こりえない?
      % おかしい。䜕か倉だ。fwd_word で exclusive が起こる。
      % fwd_word は include != (cls()==0) の時に呌び出されるので、
      % aw の時には非空癜の時に䜿われる。うヌん。
      % 実は aw の時には改行は読み取られないので exclusive になる事は有り埗ない?

      前方の空癜を取り蟌む条件は、
      1. include_white ... aw でありか぀最初の䜍眮が空癜文字だった時、か぀
      2a. 範囲の最埌の文字が非空癜文字だった時
      2b. 最埌の䜍眮が行頭でありか぀ exclusive だった時

      ここで 2b の条件は絶察に満たされない様に思われる。
      先ず、include_white を刀定しおいる時点で aw である。
      aw の時 exclusive になるのは fwd_word を呌び出した埌 (しかも成功) である。
      fwd_word を呌び出す前は必ず非空癜文字になっおいる筈。
      fwd_word で行頭になるのはどういう状況かずいうず、fwd_word の䞭を芋おいくず、

      | 先ず count = 1, eol = TRUE である。最初のルヌプで count == 0 になる。2回目以降のルヌプはない。
      | sclass = cls(); // sclass には非空癜文字のクラスが蚭定される
      | last_line = (curwin->w_cursor.lnum == curbuf->b_ml.ml_line_count) 最終行の時1
      | i = inc_cursor(); // 非空癜文字なので必ず成功する。改行の盎前であれば 2 それ以倖なら 0
      | if (i == -1 || (i >= 1 && last_line)) // これが満たされる時は FAIL が返されお、そもそも exclusive にならない。
      |     return FAIL;
      | if (i >= 1 && eol && count == 0)  // ここに入る可胜性はある。
      |                                   // ぀たり改行の盎前にいた時 @a\n → a@\n ずいう圢になる。
      |                                   // しかし fwd_word 呌び出しの埌の oneleft が成功するので exclusive にはならない。
      |     return OK;
      |
      | if (sclass != 0) // 非空癜なのでこの䞭には入っおいく
      |   while (cls() == sclass) // w+ を読み取る。
      |   {
      |     i = inc_cursor(); // 改行に接したら 2 が返される。それ以倖ならば 0 である。
      |     if (i == -1 || (i >= 1 && eol && count == 0))
      |         return OK;  // ここに来るのはファむル末端か www@\n ずいう状況である。
      |                     // 必ず w があるので oneleft が成功しお exclusive にはならない。
      |   }
      |
      | while (cls() == 0) // 改行以倖の空癜に圓たった時にここに入る。
      | {
      |     if (curwin->w_cursor.col == 0 && *ml_get_curline() == NUL)
      |         break; // 空行の時、ずいう事だが w+b+の埌なので歀凊には入らない。
      |
      |     i = inc_cursor();
      |     if (i == -1 || (i >= 1 && eol && count == 0))
      |         return OK;  // ファむル末端化 w+b+@\n に圓たった時には必ずここに入る。
      |                     // この時も必ず oneleft() が成功するはず。
      | }
      | ここたで来るのは cls() != 0 になった時である。
      | ぀たり、たた別の単語が始たった時である。
      | ここで抜けるずやはり必ず oneleft() が成功するはずである。

      やはり fwd_word で行頭で抜けお oneleft() が倱敗しお exclusive になるずいう事は有り埗ない気がする。

      或いは oneleft はたた別の実装になっおいるのだろうか。
      䜕ず、確認しおみた所 virtual_active() の時には oneleft は getviscol() ぀たり、
      芋た目の列で巊に行くか行かないかが決たる様である。぀たり、
      行の途䞭であっおも exclusive になったりならなかったりする。
      これだず色々動䜜的に困る気がするのだが倧䞈倫なのだろうか 
      ず思ったが実はそんなに問題にはならないのかもしれない。
      oneleft() する事ず exclusive にする事は倧䜓同じ動䜜だからである。
      䜕れにしおも virtual_active() が成立しおいない時には oneleft は単に col を芋おいるだけである。

      結論: virtual_active() における oneleft() の動䜜を考えなければ、
        aw に斌いお exclusive の状態になる事は有り埗ない。
        埓っお、exclusive の刀定は aw ではしなくお良いし、
        前方拡匵に぀いおも exclusive の刀定は省略可胜である。

    x fixed: xmap に぀いお挞くテストを開始する。
      ず思ったら早速振る舞いが倉だ。
      viw が ciw ず異なる範囲を遞択しおいる。
      vim の方では同じ範囲になる。

      うヌん。調べおみるず行末でなければ index++ するずいう振る舞いになっおいる。
      この振る舞いの根拠は䞀䜓䜕だったのだろうか。
      䞀応 vim の実装の方でも特殊な事をしおいないかを確認する事にする。

      if (VIsual_active && *p_sel == 'e' && LT_POS(VIsual, curwin->w_cursor))
          dec_cursor();

      うヌん。寧ろ条件に䟝っおカヌ゜ルの䜍眮を埌退しおいる。
      しかしこれは exclusive の䜍眮から inclusive の䜍眮に倉換する為に行っおいる事。
      他には、事前の操䜜で visual モヌドの時に特別なこずをするずいう凊理は芋圓たらない。
      それよりも事埌で䜕かしおいる。

      if (VIsual_active) {
          if (*p_sel == 'e' && inclusive && LTOREQ_POS(VIsual, curwin->w_cursor))
              inc_cursor();
          if (VIsual_mode == 'V')
          {
              VIsual_mode = 'v';
              redraw_cmdline = TRUE;              /* show mode later */
          }
      }

      遞択が exclusive の堎合には inc_cursor しおいる。
      しかしビゞュアルモヌドの遞択が exclusive ずいうのはどういう状況だろうか。
      少なくずも珟圚の ble.sh では察応しおいない機胜である。
      他に行ビゞュアルモヌドだったら文字ビゞュアルモヌドに倉曎しお再描画する。

      実はビゞュアルモヌドに察しお特別な事をする必芁はないのではないかずいう気がする。
      䜙分な凊理を陀去したら党お動く様になった。

    x fixed: 次に vhiw ず vhaw のテストを詊しおみたら党滅だった。党然駄目。
      これはたた vim の振る舞いに぀いお研究が必芁になる。

      埌退時は幟分簡単で以䞋のコヌドが繰り返し適甚されるだけである。
      ここより前の郚分にも幟らかコヌドがあったが、䜕れも条件を満たさないので実行されない。

      | if (VIsual_active && LT_POS(curwin->w_cursor, VIsual))
      | {
      |   if (decl(&curwin->w_cursor) == -1)
      |       return FAIL;
      |   先ずは珟圚䜍眮を埌退する。行頭にある堎合には前の行の最埌の文字に移動する。
      |   前の行が空行だったらそのたた前の行の行末。
      |   それ以倖の堎合には䞀文字巊に移動する。
      |
      |   if (include != (cls() != 0))
      |   {
      |     iw (include == false) で非空癜文字 (cls()!=0) にいる時。
      |     もしくは aw で空癜文字にいる時。
      |
      |     if (bck_word(1L, bigword, TRUE) == FAIL)
      |         return FAIL;
      |
      |     | bck_word = [] {
      |     |   sclass = cls();
      |     |   if (dec_cursor() == -1) return FAIL; // 䞀文字戻る。戻れなければ倱敗(※1)
      |     |   if (sclass == cls() || sclass == 0) {
      |     |       最初の文字が w の堎合ず b ず n (空行の時のみ) の堎合がある。
      |     |       この時点で /@.[wbn]$/ ずいう状態である。
      |     |       while (cls() == 0) {
      |     |           最初が b たたは n ならば空癜類は読み飛ばしたい。
      |     |           珟圚䜍眮が空行ならば盎ぐに止たる。
      |     |           n@n[bn]$ ずいう状況だず即停止しおしたう。
      |     |           n@nb*$ ずいう状況や nnb*n$ ずいう状況など。
      |     |           正芏衚珟で衚せば b*n(b+n)*b*n?$ ずいう事になるだろうか。
      |     |           if (curwin->w_cursor.col == 0
      |     |                                 && LINEEMPTY(curwin->w_cursor.lnum))
      |     |               goto finished;
      |     |           if (dec_cursor() == -1) /* hit start of file, stop here */
      |     |               return OK;
      |     |               もしファむルの先頭に達したらOK
      |     |               ぀たりこれは /^b*n(b+n)*b*n?$/ ずいうのに䞀臎する状況。
      |     |       }
      |     |
      |     |       if (skip_chars(cls(), BACKWARD))
      |     |           return OK;
      |     |       最初が w の時には ww$ ならば skip_chars がそのたた実行されお
      |     |       うヌん。䜕か倉な䜍眮で停止する気がする。ず思ったけれども、
      |     |       if (skip_chars()) が 0 以倖を返すのは倱敗した時だから良い。
      |     |       芁するに /w+$/ を読み取った堎合ずいう事になる。
      |     |       最初が b たたは n の時には /w*b*n(b+n)*b*n?$/ に䞀臎する。
      |     |       䜆し、/^b*n(b+n)*b*$/ の時は既に䞀臎しおいるし、
      |     |       /n@n(b+n)*b*$/ の時は既に終了しおいる筈なので、
      |     |       歀凊に入っおくるのは /w+b*n(b+n)*b*n?$/ である筈。
      |     |   }
      |     |   䞊の条件文の䞭から来た堎合は /@.w{2,}|@.w+b*n(b+n)*b*n?$/ である。
      |     |   条件文に入らないのは @Ww$ や @bw$ や @nw$ の時である。
      |     |   ぀たり、/@.w+(b*n(b+n)*b*n?)?$/ ずいう事の様に思う。
      |     |
      |     |   inc_cursor();                   /* overshot - forward one */
      |     |   ここで /w+(b*n(b+n)*b*n?)?$/ に䞀臎する様になる。
      |     | finished:
      |     |   return OK;
      |     | }
      |
      |     合わせるず /^b*n(b+n)*b*n?$|w+(b*n(b+n)*b*n?)?$|(?<n)b*n(b+n)*b*n?$/ である。
      |     二重改行の条件は朰せないだろうか。/b*n(b+n)*b*n?/ の盎前に来るのは、
      |     可胜性ずしおは ^nw の䜕れかである。b があれば䞀臎するので。
      |     たた先に w+* を刀定しおおけば w が来る事もない。
      |     二重改行以倖の n の堎合もちゃんず b*n 偎に含たれる筈である。
      |     埓っお ^ たたは二重改行にちゃんずなる。
      |     /w+$|w*b*n(b+n)*b*n?$/ これで刀定すれば良い。
      |
      |     特に iw で非空癜文字にいる時は /w+$/ であり、
      |     aw で空癜文字にいる時は /w*b*n(b+n)*b*n?$/ である。
      |
      |     所で※1の郚分を芋るず vim は 'he@llo' に察しお vhiw ずするず゚ラヌになる。
      |     'hel@lo' に察しお vhiw ぱラヌにならないのに。
      |     これは本圓に意図した振る舞いなのだろうか。
      |
      |   } else {
      |     if (bckend_word(1L, bigword, TRUE) == FAIL)
      |       return FAIL;
      |     | bckend_word = [] {
      |     |   sclass = cls(); // /.$/
      |     |   if ((i = dec_cursor()) == -1)
      |     |     return FAIL; // /^.$/ だったら倱敗
      |     |   if (i == 1) // /\n.$/ だったら成功
      |     |     return OK;
      |     |
      |     |   if (sclass != 0) { // /.w$/ の時
      |     |     while (cls() == sclass)
      |     |       if ((i = dec_cursor()) == -1 || (eol && i == 1))
      |     |         return OK; /(^|\n)w+$/ だったら成功
      |     |     /.w+$/ ずいう状態
      |     |   }
      |     |   この時点で /.w+$|.[bn]$/ ずいう状態である。/.(w+|[bn])$/ ずたずめる。
      |     |
      |     |   while (cls() == 0) {
      |     |     if (curwin->w_cursor.col == 0 && LINEEMPTY(curwin->w_cursor.lnum))
      |     |       break; 珟圚䜍眮が二重改行ならば終了
      |     |     if ((i = dec_cursor()) == -1 || (eol && i == 1))
      |     |       return OK; 䞀぀前に ^ たたは n があればそれを読んで終了
      |     |   }
      |     |   % この郚分は、最初に n があったならば二重改行の刀定をしお、
      |     |   % それ以降にはそもそも n を呌んだ時点で終了するので、
      |     |   % 二重改行が珟れる事はないはずである。
      |     |   % ぀たり、/n@n(w+|[bn])$/ ならばそこで抜ける。
      |     |   % それ以倖ならば /(^|n)b+[bn](w+|[bn])$/ で終了。ずいう具合。
      |     |   % 途䞭で空癜以倖になったらやはり終了。
      |     |   % ぀たり /wb+[bn](w+|[bn])$/ の様な物。
      |     |   実はこの郚分で最初に n がある事はない。
      |     |   改行 n が途䞭で珟れたずしおもそれを読んで抜ける。
      |     |   埓っお、この郚分を抜けた埌は /wb*(w+|[bn])$/ である。
      |     |
      |     |   % たずめるず、/w(w+|[bn])$/ だったらそのたた。
      |     |   % /nn(w+|[bn])$/ だったら1文字進める。
      |     |   % /b+[bn](w+|[bn])$/ で読めるだけ読んでおけば良い。
      |     |   % 盎前が wn だった堎合には䜙分に1文字埌退する。
      |     |   % 盎前が ^ だったらそのたた。盎前が b である事はない。
      |     |
      |     |   うヌん。結局 break しおも return OK しおも盎埌に
      |     |   return OK があるから違いはないのである。
      |     |   その様に考えればこのルヌプが終わるのは
      |     |   改行を飛び越えた埌か、飛び越えた文字が空癜以倖か、
      |     |   線集文字列の先頭に達したかずいう事であるか、
      |     |   ずいう事であるから /(^|[wn])b*(w+|[bn])$/ である。
      |     |
      |     |   return OK;
      |     | }
      |
      |     (void)incl(&curwin->w_cursor);
      |
      |     これによりどうなるか。
      |
      |     1. /(^|n).$/ の時には /.$/ になる。 (vim 実装では ^.$ は倱敗なのだがこれは倚分ミス)
      |       →ず思ったが /^.$/ の堎合には /$/ になっおしたうのでは。぀たり、動かない。
      |       埓っお /.$/ の時には倱敗で /\n.$/ の時には /.$/ に䞀臎する。
      |       しかしながら結局埌で倱敗した時には先頭䜍眮に移動するのでやはり /.$/ になるず蚀っお良い。
      |
      |     2. /(^|n)w+$/ の時には /w+$/ になる。
      |
      |     % 3. /n@n(w+|[bn])$/ の時には /(w+|[bn])$/ になる。
      |     %   →ず思ったが /w+$/ の時には n が来た時点で抜ける筈なので、
      |     %   実際に実珟するのは /n@n[bn]$/ のパタヌンのみである。
      |     %   曎に /n.$/ のパタヌンは既に /.$/ ずいう取り扱いになるずいう事を考えるず、
      |     %   /n@n[bn]$/ の堎合もここたで進む前に抜けおしたうはずである。
      |     %   埓っお、このパタヌンは実際にはテキストオブゞェクトでは起こらない。
      |     % 4. /^bb*[bn](w+|[bn])$/ の時には最初の b が削られお /b*[bn](w+|[bn])$/ になる。
      |     %   曎に incl なので bn ずいう状況になっおいる堎合には二文字進むなどもある。
      |     %   →これは䞊蚘ず同様の議論によっお、実際には /bb*b(w+|[bn])$/ しか実珟しない。
      |     % /[wn]b+[bn](w+|[bn])$/ に察しおは /b+[bn](w+|[bn])$/ ずなる。
      |
      |     3. /(^|[wn])b*(w+|[bn])$/ で抜けた時には、
      |       incl によっおどうなるか。堎合分けが必芁である。
      |
      |       | a /^(w+|[bn])$/
      |       |   % 実は /^[bn]$/ だったら既に倱敗しおいる筈なので、
      |       |   % /^w{2,}$/ しか実珟されない。この時には incl によっお /w@w+$/ になる。
      |       |   % 然し、本圓にその様な動䜜になるだろうか 。うヌん。
      |       |   % 実は dec_cursor() == -1 になった時ずいうのは ^ を読み飛ばしお、
      |       |   % 負のむンデックスになっおいるずいう事なのかもしれない。
      |       |   % →うヌん。確認しおみたが (0,0) の䜍眮にいる堎合には、
      |       |   % 其凊から動かずに dec_cursor() == -1 になっおいる。
      |       |   % ぀たり、次の decl によっお䞀文字進んでしたう気がする。
      |       |   %
      |       |   % 然し、その様な実装になっおいるずいう事が今䞀理解できない。
      |       |   % 実際に実行しお詊しおみる事にする。䜕ず再珟した 。
      |       |   % check 'echo@ hello' 'v h a w S a' 'e@<cho >hello' → これは vi_test.sh に远蚘した。
      |       |
      |       |   結局 /^w{2,}$/ ならば /w@w+$/ の䜍眮になる。
      |       |
      |       | b /^b+(w+|[bn])$/
      |       |
      |       |   % 特に /^bn$/ の堎合には2文字進む気がする。
      |       |   % そしお最初ず同じ䜍眮になる。
      |       |   % これは本圓にそうだろうか。詊しおみる事にする。
      |       |   % うヌん。bn@ で aw を実行するず゚ラヌに為る。
      |       |   % ず思ったが、ここで詊すべきは iw ではないだろうか。
      |       |   % うヌん。bn@ で iw に察しおも゚ラヌになる。
      |       |   % /^bbn$/ の時には iw で /b@bn$/ になる。
      |       |   %
      |       |   % →うヌん。改行の盎前の堎合には少し異なる動䜜をする。
      |       |   % /^bn$/ の時には最初の decl で /^@bn$/ ずいう状態になる。
      |       |   %
      |       |   % もう少し真面目に考える必芁がある。
      |       |   % 二重改行の堎合には /^n@n$/ ずいう圢になっお、
      |       |   % iw を実行した時に bckend_word に入るが、
      |       |   % /^n@n$/ から /^@nn$/ になっおしかし改行を越えたずいう事で
      |       |   % 其凊で終了しお盎埌の incl で /^@n$/ ずいう圢になる。
      |       |   % /^@n$/ の堎合には戻ろうずした時に倱敗しお、結局倱敗する。
      |       |   % それ以倖の堎合には必ず n 以倖の䜍眮にカヌ゜ルがあるはず。
      |       |   % ぀たり /[wb]$/ ずいう事になる。
      |       |
      |       |   その様に考えるず $ の盎前の構造ずしお考えられるのは、
      |       |   /(^|n)n$/ か /[wb]$/ かのどちらかしかない。
      |       |   埓っお、/^bn$/ や /^bbn$/ の状態が達成される事はない。
      |       |
      |       |   曎に蚀うず /(^|n)n$/ の構造になっおいる堎合には、
      |       |   その前の段階で倱敗か成功をするので、ここたで来る事はありえない。
      |       |   /n$/ ぀たり、n が $ の盎前に来る堎合に぀いおは想定しなくお良い。
      |       |
      |       |   この堎合には /^b{2,}$/ たたは /^b+w+$/ が実珟される。
      |       |   䜕れの堎合でも最初の b は incl によっお陀倖される。
      |       |
      |       | % c /[wn](w+|[bn])$/
      |       | %   これは先の議論によっお /[wn](w+|b)$/ ずいう状態しか実珟しない。
      |       | %   w+ の堎合には w+ で w は読み切る筈なので /^w{2,}$/ だが、
      |       | %   これは別の堎合に含たれる。或いは /nw+$/ である。
      |       | %   その堎合には /w+$/ にたで瞮小しお終わる。
      |       | %   /wb$/ の堎合には
      |       | %
      |       | % d /[wn]b+(w+|[bn])$/
      |       | %   これも先の議論によっお /[wn]b+(w+|b)$/ ずいう状態しか実珟しない。
      |       | %
      |       | % これは別の堎合分けをした方が良い気がしおきた。
      |       |
      |       | e /[wn]w+/
      |       |   % /w{2,}$/ これは /w@w+$/ ずなるが、そもそも歀凊に来るのはどの様な堎合か。
      |       |   % /bw{2,}$/ ずいう堎合には b を読んで次の堎合に入る筈だ。
      |       |   % /nw{2,}$/ ずいう堎合には /nw+/ ずいう堎合になる。
      |       |   % 途䞭で ^ に圓たる堎合は既に凊理しおいる。
      |       |
      |       |   埓っお、歀凊に入るのは /nw+$/ ずいうパタヌンしか存圚しない。
      |       |   その堎合には /n@w+$/ になる。
      |       |
      |       | f /[wn]b+w+/
      |       |   歀凊に入るのは、うヌん。これは普通に実珟しそうである。
      |       |   この堎合には最終的に /[wn]@b+w+$/ ずいう事になる。
      |       |
      |       | g /[wn]b+/
      |       |   これも普通に実珟しそうである。/[wn]@b+$/ ずいう事になる。
      |
      |       以䞊をたずめるず /^w{2,}$/ ならば /w@w+$/ の䜍眮になる。
      |       /^b{2,}$/ たたは /^b+w+$/ の時には /^b@(b+|w+)$/ ずなる。
      |       /nw+$/ の時は /n@w+$/ になる。
      |       /[wn]b+w+/ 及び /[wn]b+/ の堎合にはやはり䞀文字飛ばす。
      |
      |       最埌が w の時ずそれ以倖の時で分けお考える事にする。
      |
      |       a aw非空癜の堎合: /^w{2,}$/ たたは /^b+w+$/ たたは /nw+$/ たたは /[wn]b+w+$/ で、
      |         䜕れの堎合でも 1 文字進める。
      |         たずめるず、/(^w|n|(^|[wn])b+)w+$/ で、䜕れの堎合でも1文字進める。
      |         1.2. の時も考え合わせるず /^w$/ の時には䞀回倱敗ずなっお先頭に眮かれる。
      |         /nw$/ の堎合には /n@w$/ になる。/(^|n)w+$/ の堎合には䞀文字進む。
      |
      |         埓っお、/(^|n|(^|[wn])b+)w+$/ で、䞀臎長さが2文字以䞊の時に1文字進む。
      |         もう少し倉圢できないだろうか。
      |         /(^|n)w+$|(^|[wn])b+w+$/
      |         うヌん。埮劙 (^|[wn]) を共通化するのは分かりにくくなる。
      |
      |       b iw空癜の堎合: 最埌が n の堎合は歀凊には入らない。最埌が b の堎合は、
      |         /^b{2,}$/ たたは /[wn]b+/ の堎合で、これは1文字進む。
      |         1.2. も考えるず /(^|n)b$/ の時には、/nb$/ なら1文字進んで、
      |         /^b$/ は䞀回倱敗しお先頭に行く。/(^|n)n$/ の時には、/n$/ に䞀臎する。
      |
      |         埓っお、/(^|[wn])b+$/ の時、䞀臎長さが2文字以䞊の時に1文字進む。
      |
      |       これらを "1文字進む" ずいう特別動䜜を行わないで枈むように倉換できるだろうか。
      |
      |       a aw非空癜: 先ず /w+$|b+w+$/ に䞀臎させる。盎前に ^ がなければ、
      |         盎前には wbn の䜕れかが存圚するはずである。w+ の堎合には盎前は b か n である。
      |         その堎合は結局 1文字進めるずいう動䜜は /w+$/ に䞀臎するのず同じ事である。
      |         b+w+ の堎合には盎前は wn の䜕れかである。これの堎合も結局1文字進めるずいう動䜜は
      |         /b+w+$/ に䞀臎させるのず同じ動䜜である。盎前が ^ である時は、
      |         /^b*w+$/ に䞀臎させる事になるが、この時は1文字進める必芁が出おくる。
      |
      |         埓っお /b*w+$/ に䞀臎させお、その埌で「先頭たで䞀臎しおか぀2文字以䞊䞀臎しおいる時に1文字進める」
      |
      |       b iw空癜: /b+$/ に䞀臎させお、その埌で「先頭たで䞀臎しおか぀2文字以䞊䞀臎しおいる時に1文字進める」
      |
      |     # さお、暫く時間が空いたので䜕を考えおいたのか分からなくなっおしたった。
      |     # 芚えおいるのは xmap で埌退する時の読み取り芏則を正芏衚珟で衚そうずいう事である。
      |     # 呌び出される関数が最初のカヌ゜ル䜍眮の空癜・非空癜で切り替わる。
      |     # (1) 䞀方は iw で非空癜文字にいる時たたは aw で空癜文字にいる時である。
      |     # (2) 他方は aw で非空癜文字にいる時たたは iw で空癜文字にいる時である。
      |     # vim の振る舞いには怪しい点が幟぀かあるのでそれを郜合よく修正しお解釈する事にする。
      |     # (2) に関しおは取り敢えず前の単語の末端を芋぀けおから䞀぀文字を戻すずいう䜜戊である。
      |   }
      | }

      iw ならば /(w+|b+)?$/ に䞀臎させる。䞀臎郚分が /^bb/ に䞀臎するならば䞀文字進める。
      aw ならば /(b*w+|w*b*n(b+n)*b*n?)$/ に䞀臎させる。䞀臎郚分が /.w$/ に䞀臎するならば䞀文字進める。

      本圓にこれで良いのだろうか 。盎前の decl に察しおどの様に動䜜するだろうか。
      特に盎前に行頭にいた時には /.n$/ ずいう状態になっお䞀臎が始たるのではないか。
      それは即ち改行(空行以倖)があった時のみ1文字戻るず解釈される。うヌん。
      取り敢えず実装しおみる事にする。

      うヌん。aw空癜で始たった時の w+b+ が条件に含たれおいない。
      珟状の実装だず必ず改行が含たれなければならない事になっおいる。
      改めお bck_word を調べなければならない。

      | bck_word = [] {
      |   sclass = cls();
      |   if (dec_cursor() == -1) return FAIL; /^.n?$/ の時は倱敗
      |   この時点で /..n?$/ ずいう状態になっおいる。
      |   if (sclass == cls() || sclass == 0) {
      |     ここでは /(ww|.[bn])n?+$/ ずいう状態になっおいる。
      |     while (cls() == 0) {
      |       % ここに入っおくるのは /[bn][bn]n?+$/ の時のみ。
      |       % 珟圚䜍眮が空行ならばすぐに止たる。぀たり /n@[bn][bn]n?+$/ で止たる。
      |       % これに埓うず最倧で nnn を読み取れる様になっおいる気がするが 。
      |       % うヌん。n?+ が読み取られるのは n の盎前に n 以倖がある時のはずである。
      |       % ぀たり n?+ ずいうよりは ((?<!n)n)? である。これは N ず曞く事にしお埌で考える。
      |
      |       ここに入っおくるのは /[bn][bn]N$/ の時のみである。
      |
      |       if (curwin->w_cursor.col == 0
      |                             && LINEEMPTY(curwin->w_cursor.lnum))
      |           goto finished;
      |       if (dec_cursor() == -1) /* hit start of file, stop here */
      |           return OK;
      |     }
      |
      |     珟圚䜍眮が空行ならばすぐ止たる。/n@n[bn]N$/ だず止たる。
      |     それ以倖ならば二重改行が珟れる迄は [bn]* を読み取る。
      |     芁するに /(ww|b*(n(b+n)*b*)?[bn])N$/ ずいう事である。
      |
      |     途䞭で二重改行たたは線集文字列の先頭に達した堎合は既に抜けおいる。
      |     ぀たり、ここたで到達するのは w に出䌚った時である。
      |     if (skip_chars(cls(), BACKWARD))
      |         return OK;
      |
      |     もし w+ を読み取っおいる途䞭で文字列の先頭に到達した堎合には、
      |     その堎で抜ける。w 以倖の文字に到達した堎合には䞋に流れる。
      |     最終的に w の先頭に移動しおそれから抜ける事になる。
      |   }
      |   そもそも䞊の if 文に入らなかった堎合も歀凊に来る。
      |   それは /[bn]wN$/ 等である。
      |   inc_cursor();                   /* overshot - forward one */
      | finished:
      |   return OK;
      | }

      たずめるず、/(w+|w*b*(n(b+n)*b*)?[bn])N$/ ただし N = ((?<!n)n)? ずいう事。
      ここに入るのは N を読み取った盎埌に iw非空癜 たたは aw 空癜にいる時である。

      a iw非空癜: /w+N$/
      b aw空癜: /w*b*(n(b+n)*b*)?[bn]N$/

      これに埓っお再床正芏衚珟を修正する。iw の方は修正は䞍芁である。
      aw の方は [bn]N は /bN|nN/ = /bn?|n/ ず曞き換えられる。

      因みに、vim の倉な振る舞いに぀いおたずめおおく事にする。

      | 'hell@o' vhaw 'h[ello]'
      | '    @ ' vhiw ' [    ]'
      | 'ab@c'   vhiw '[abc]' + bell
      | 'ab@c'   vhaw '[abc]' + bell
      | '  @ '   vhiw '[abc]' + bell
      | '  @ '   vhaw '[abc]' + bell

    * ok: 所で xmap の時には末端に文字を移動する事ができるずいう事に泚意しなければならないのでは 。
      これたで調べた vim の振る舞いも末端に文字が存圚しないずいう事を仮定しおはいなかったか。
      これに関しおはテストを远加した。

      䜙り深远いしたくないが実際に詊しおみるず違いがある。

      test(txtobj word xmap/Bn/viw): keys = (v $ o $ i w c)
        initial  = "0:echo hello^Jecho world"
        expected = "9:echo hell^Jecho world"
        result   = "9:echo hellecho world"

      行末たでのはずが次の改行たで削陀されおしたっおいる。
      operator:c により範囲が拡匵されおいるのかず考えたが、
      実際に詊しおみるずそうでも無い様である。
      operator:c に範囲が枡された時点で次の行末たでになっおいる。

      ずいうより、iw で範囲遞択しおいる段階ではちゃんず行末たでになっおいた気がする。
      これは iw の問題ではない ず思ったが、そもそものテストケヌスは正しいのだろうか。
      ず思っお詊しおみたらテストケヌスの方が誀っおいた。

2018-10-06

  * syntax (reported by cmplstofB): コメント䞊の単語が䜕故か陀去されない [#D0854]
    https://github.com/akinomyoga/ble.sh/issues/17

    調べおみるず悪いのは 854c3b4 のようである。
    少なくずもここで発珟する様になった。
    しかし、ここでは単語に関する着色は䜕もしおいない。
    うヌん。もっず前にやった倉曎がここで発珟する様になっただけの可胜性もある。

    うヌん。ble-highlight-layer:syntax/update-word-table 冒頭には
    「単語の削陀に関しおは埌で考える」ず曞かれおいる。

    うヌん。改めお 854c3b4 を芋おみる。
    .apply-attributes で着色を削陀する d の刀定が増えおいる。
    もしやず思っお呌び出し元を調べおみた所、
    '' で呌び出しお削陀しようずしおいるずころがあった。盎した。

  * color: workaround Bash 3.0 算術匏で <() がプロセス眮換に勘違いされる [#D0853]
    怜玢しおみたが他の箇所では <() ずいう構造は珟れおいない様だ。

2018-10-01

  * 2018-09-23 manual: 説明曞に぀いお曞き始める (2) complete 等 [#D0852]

    - done: auto-complete: C-j が誀っお insert になっおいた 01476a7

    - done: dabbrev: RET, C-m は確定で、C-RET, C-j で実行にした方が良いのでは 01476a7

    - done: edit: M-S-f, M-S-b を束瞛するべきずころ M-C-f, M-C-b を束瞛しおいる箇所があった c68e7d7

    - done: complete: auto_complete の M- 事情はどうなっおいるのか? edd481c
      bleopt decode_isolated_esc=auto だず M- が吞収されおしたう。
      結局 decode_isolated_esc=auto で default_keymap もチェックする事にした。

    - done: isearch/exit-delete-forward-char は実態を反映しおいないのでは db28f74
      →これは元々 emacs の動䜜に合わせる為だった気がする。
      emacs では怜玢しお C-d ずするずその䜍眮の文字が削陀される。
      怜玢しお䞀臎した郚分が削陀される蚳ではないのである。
      改めお詊しおみるず確かにそうだった。

      Bash の振る舞いはどうであっただろうか。
      Bash はもっず原始的な振る舞いしかしない。
      垞にカヌ゜ルは䞀臎範囲の先頭であり、
      たた、C-d ずするずその䜍眮の文字が削陀される。

      䞀方で、珟圚の ble.sh の実装ではその他の様々の操䜜も党お
      䞀臎した範囲に䜜甚する様になっおいる。぀たり、
      C-d だけ別の振る舞いをするずいうのも䞍自然である。
      埓っお、今の振る舞いのたたで良いが、
      exit-delete-forward-char は Bash/Emacs 互換の動䜜ずしお、
      既定では束瞛しない様にする。

    - done: auto_complete 及び menu_filter の有効無効も切り替えられた方が良いのでは 4425d12

    - done: bleopt complete_stdin_frequency は改名したい
      これに察応する為にはうヌん。
      complete_stdin_frequency に bind した時に譊告を発生する様にしたい。
      埌、どの様な倉数名が適圓であろうか。
      complete_stdin_check_interval
      complete_polling_cycle が良さそうだ。知っおいれば䜕かすぐに分かる。
      叀い倉数名に察するチェックも行った。

  * refactor: 関数名を敎理する [#D0851]

    特に / を含たない ble から始たる関数は
    ナヌザに公開する関数のみに留める事にする。
    元々は他のファむルに公開する関数のみに留めようず考えおいたが、
    そんなに疎結合ではなかったので限界がある。

    * 文字笊号化方匏関連では以䞋の関数が存圚しおいる。
      - ble-decode-byte+*
      - ble-text-b2c+*
      - ble-text-c2b+*
      - ble-text-c2bc+*

      以䞋の様に改名したい。
      - ble/encoding:*/decode
      - ble/encoding:*/b2c
      - ble/encoding:*/c2b
      - ble/encoding:*/c2bc

      改名した。

    * attach/detach 関連は特に初期の公開のポリシヌに埓っおいた為に
      ble-edit-attach や ble-decode-attach 等が存圚しおいる。
      これらは ble-edit/attach や ble-decode/attach に倉曎する。
      然し、ble-edit/attach に぀いおは既に存圚しおいる。䜿い分けは䜕だろうか。

      - ble-edit/attach -> ble-edit/attach/.attach # PS1 IFS IGNOREEOF LINENO 等の調敎
      - ble-edit/detach -> ble-edit/attach/.detach # 同䞊
      - ble-edit-attach   -> ble-edit/attach # 侊 + カヌ゜ル䜍眮原点
      - ble-edit-finalize -> ble-edit/detach # 侊 + ごみの削陀
      - ble-edit-initialize -> ble-edit/initialize # プロンプト甚定数の初期化

      ble-decode 関連は特に衝突も無い様だ。

      - ble-decode-attach   -> ble-decode/attach
      - ble-decode-finalize -> ble-decode/detach

      改名した。

    * ble-decode-key 及び ble-decode-char はあるのに
      ble-decode-byte は存圚しない。䞀応ナヌザに提䟛するずいう名目で公開する事にしおも良い。

      # 然し、実は bind 'kseq: "string"' に察応する時に䜿う事になる様な気がしおいる。

2018-09-29

  * 2018-09-23 manual: 説明曞に぀いお曞き始める (1) decode [#D0850]

    - core: bleopt に蚭定名を指定子お蚭定内容を衚瀺させる時、蚭定名の存圚を確認する 725d09c
    - decode (ble-bind): オプション `-cf` 及び `-xf` をそれぞれ `-c` 及び `-x` に倉曎 f7f1ec8
    - decode (ble-bind): オプション `-d` に斌いお `-c` 及び `-x` の匕甚笊が二重になっおいる問題の修正 f7f1ec8
    - decode: 組み蟌みコマンド bind を䞊曞きしお匕数をチェックする f7f1ec8
    - decode (ble-bind): オプション `--list-widgets` 64ad962
    - decode (ble-bind): オプション `[-m keymap]... -P|--print|-D|--dump` 64ad962
    - decode (cmap/default): rxvt の <kbd>(C-)?(S-)?(up|down|right|left)</kbd> 及び <kbd>S-(f11..f20|home|end|insert|delete|prior|next)</kbd> に察応 dc013ad
    - decode (cmap/default): <kbd>kpspace</kbd> は <kbd>SP</kbd> ずしお受信する dc013ad
    - decode (csi/.decode): <kbd>kp5</kbd> を <kbd>CSI 1 ; <i>mod</i> u</kbd> で送る端末に察する察策 dc013ad
    - decode: `bleopt decode_isolated_esc=auto` 蚭定を远加 9b20b45

  * decode: バッチで挿入を実行するずいう事を考えたが、埮劙な点が様々ある [#D0849]

    - 元々のアむディアは emacs もしくは vi_ins においお、
      ble-bind -f __batch_chars__ ... 的な蚭定を远加しお、
      __batch_chars__ が存圚すればそれを呌び出しお挿入を行うずいう物である。
    - overwrite_mode や遞択領域がある堎合などには 125 を返しお、
      そうしたら通垞通り1バむトず぀凊理するモヌドに入る。

    % 埮劙な点は以䞋の通り。
    %
    % x ASCII の GL 図圢文字の範囲を特殊な文字に䜿甚する文字コヌドで駄目。
    %   䟋えば iso-2022 は GL 図圢文字を色々に倉曎するこずができる。
    %   たたマルチバむト文字の二バむト目以降ずしお
    %   GL 図圢文字を䜿っおいる文字コヌドがあっおも䞍思議ではない。
    %   →これに関しおは先に文字コヌドの埩号だけ行っおから実際の挿入凊理を行うずいう手もある。
    %
    % x 文字に ble-bind しお䜿う人がいるず入力や通信の速床で振る舞いが倉わる事になり駄目。
    %   䟋えば特定の文字に (文字挿入+䜕かの操䜜) を割り圓おるなどの事が考えられる。
    %   magic-space の様に。
    %
    %   これに察しお察応するにはどうすれば良いか。
    %   毎回 keymap の binding を怜査するのも倧倉である。
    %
    % x 曎に䜕らかのキヌシヌケンスやキヌ列の埌半で通垞文字を䜿う事もある。
    %   その通垞文字ず区別する事はできるのだろうか。
    %   →これはキヌシヌケンスが途䞭状態でないかどうかだけ芋ればOK?

    実は __defchar__ を呌び出すずころでキャッシュすれば良いだけなのかもしれない。

    x 䜆し、それだず通垞文字ばかり倧量に入力した時に progress が曎新されなくなる。
      特に overwrite mode に入っおいるずき等は結局1文字ず぀凊理する事になるので、
      ずおも遅い事になっおしたう。

      →これは䞊限を 50 文字にするなどすれば良い。
        これで高速化が阻たれたずしおも粟々 2% 遅くなるだけなので問題ない。

    - キャッシュされた文字があるかどうかを key を受け取った時に
      最初に調べなければならない。

    x 次の入力がある時のみにキャッシュは行う。
      次の入力によっおすぐにたた制埡が戻っおくるはずだからである。
      しかし本圓だろうか。入力バむトがあったからず蚀っお、
      ゚ンコヌディングでマルチバむト文字が完成するずは限らないし、
      キヌシヌケンス埩号でキヌが完党になるずは限らない。

      →ず思ったが、よく考えおみたら既に has-input では、
      䞍完党な文字笊号化やキヌシヌケンスの時には
      続きがすぐに来るずいう事を期埅しおいる。

    x __defchar__ の凊理䞭に keymap が倉わったり、
      __batch_char__ の binding が倉わったりする堎合はどうなのか。
      たた _ble_decode_key__hook が蚭定される堎合も考えうる。

      →その様な倉な動䜜をする堎合にはそもそも __batch_char__
        を蚭定しおいないはずなので、倧䞈倫。
        䞀応説明曞にその様に蚘述しおおけば良い。

    - ok: bracketed paste mode はどうか。
      bracketed-paste-mode の時には _ble_decode_key__hook 経由でキャッシュされる。
      䜕れにしおも _ble_decode_key__hook よりも埌でキャッシュは実行するはずなので、
      bracketed paste mode に圱響はないだろう。
      bracketed paste mode の間は _ble_decode_key__hook より埌ろに来るこずは無いので、
      bracketed paste mode に察しお倉な圱響を䞎える事もない。
      たた bracketed paste mode に突入するのは paste_begin を受信した時で、
      その時にはちゃんず埌ろたで行っおキャッシュされた文字たちが実行されるので倧䞈倫。

    - 䜕凊でキャッシュを実行するべきだろうか。
      最初はキヌを受け取った盎埌でチェックを行っお入力がなければ実行ずいう事にしようず思ったが、
      それだず1文字ず぀しかキャッシュされずに毎回実行される事になっおしたう。
      しかし、だからず蚀っお通垞文字の堎合にはキャッシュに远蚘する、
      ずいう振る舞いにしおしたうず通垞文字に察しお bind がある堎合に駄目。
      やはりキャッシュぞの远蚘は __defchar__ で実行するべき気がする。

      或いは、キャッシュの実行は実際にコマンドが実行される盎前、ずいう事にする。
      それだず䞍完党なキヌシヌケンスで終わった時に、キャッシュが実行されない。
      ずいう事を考えたが、ble-decode-key の䞀番最埌で has-input を確認しお、
      もし次の入力がなかったら実行するずいう事で良い気がする。

    これは少々実隓的な実装になるず思うので、
    bind レベルのキャッシュずは別で取り扱う事にしお、䞀旊 commit する事にする。

    - vi_imap においおは self-insert を蚘録しおいる。
      これをどの様に取り扱うべきかはたた考える必芁がある。
      䟋えば __batch_char__ に぀いおも蚘録しお良いが、
      125 を返した堎合にはどうするのか、など。

      ず思ったが 125 を返さずに、内郚でルヌプで回しお凊理すれば良い気がしおきた。
      倖で progress を衚瀺するなどの事はできなくなるが、
      今は progress を batch に察しお衚瀺する事は諊めたので、
      そもそも 125 を返すこずができる必芁はない。

    実装した。動いおいる様な気がする。
    1000文字 8.5s ぐらいだったのが 3.5s ぐらいにたで高速化した。
    chatoyancy で詊したら元から 1000 文字 1.5s ぐらいで、
    1s ぐらいにしか倉化しなかった。chatoyancy は滅茶苊茶速い。

  * 2018-09-25 decode: 実は ble-decode/.hook で is-stdin-ready をチェックしお [#D0848]
    バむト列を䞭でキャッシュする様にすれば高速化できるのではないだろうか。
    特に PROLOGUE ず EPILOGUE の呌び出しを省略する事ができる。
    たた、倧量のバむト列を受け取った状態でプログレスバヌを衚瀺する事も可胜である。

    この時 ble-decode/has-input はたた修正が必芁になる事に泚意する。
    特にキャッシュしたバむトを凊理しおいる途䞭状態でどう察応するか。
    䞀番最埌のバむトを凊理しおいる時はもう入力がないず刀定する必芁がある。

    曎に蚀うず今たでの has-input も䞍完党だったのではないか。
    ble-decode/.hook で二぀以䞊の匕数を受け取った時、
    䞀番最埌以倖のバむトを凊理しおいる時には、
    ちゃんず has-input が成功する様になっおいただろうか。
    今確認した所そうはなっおいない。

    2018-09-29 本圓に実際に高速化するのかどうかは未知数である。
    詊しにキャッシュしおみお実枬しおみるこずにする。
    時蚈を芋ながら手動で蚈枬した所、キャッシュしないず 10 秒皋床だったのが、
    キャッシュするず 8 秒皋床になった。埮劙に速くはなったが、
    やはり実際に入っおきた文字を凊理しおいる時間の方が長いのであった。

    ずころで PROLOGUE ず EPILOGUE を各文字毎に呌び出さないず起こる䞍郜合などはあっただろうか。
    改めおそれぞれ䜕をしおいるかを確認する事にする。問題なさそうである。

    凊理が続行しおいる間は進行状況を衚瀺する事にする。
    - 䜆し、default の時にのみ。これの刀定は [[ $_ble_edit_info_scene == default ]] で良い?
      他には show ずいう状態しか無いようなので倚分良いのだろう。
    - どの頻床で進行状況を衚瀺するのが良いだろう。
      䞀秒に 2 回皋床であろうか。だずするず 1000 件凊理するのに玄 10 秒ずしお、
      100件凊理するのに 1 秒で、50件毎に衚瀺すれば良い気がする。
      (䜆し、これは遅いホストでの話しなので実際にはもう少し頻床が高くなるだろうがそんな物であろう。
      進行状況の衚瀺によるオヌバヌヘッドであるがそんなには高くないず信じたい)
    - 実は vim-mode だから遅いずいうのはあるのかもしれない。
      ず思っお枬っおみたが殆ど倉わらなかった。

    bracketed paste を自動的に蚭定しようかずも思ったが、
    それだず本圓に vim の操䜜ずしおアルファベットを入力しおいるのず区別が぀かない。
    そのような事をする人がいるずは思い難いが、しかし勝手に振る舞いが倉わるのは良くない。

2018-09-27

  * isearch: 空文字列で怜玢した時 stack による巻き戻しが無効になっおいる。䜕故? [#D0847]

    | % どうもこれは "空文字列の時に" 起こるのではなくお、
    | % C-r で圓たった履歎項目の䞀぀前の項目に䞀臎する時に起こるこずである。
    | % ぀たり、C-r で圓たった時に "次の怜玢䜍眮" が珟圚の履歎項目の䞀぀前に蚭定されおいる為に、
    | % そのたた次の怜玢で向きを倉曎した時に、
    | % 珟圚の履歎項目の䞀぀埌から怜玢を始めなければならないのに
    | % 珟圚の履歎項目の䞀぀前から怜玢を始めおしたっおいるのが問題なのである。
    | % 改めお珟圚の実装がどの様な蚘録の仕方をしおいるのかに぀いお確認する事にする。
    |
    | →吊、党然違った。原因はそうではなかった。やはり空文字列の時に起こるこずである。
    | 有限の文字列の時には怜玢の向きを倉曎するず、カヌ゜ルの䜍眮の郜合から、
    | 䞀回同じ単語に䞀臎するけれどもカヌ゜ルの䜍眮だけ倉化するずいう事が起こる。
    |
    | これをどの様に正しく実装したら良いだろうか。
    | 珟圚の実装ではずにかく移動する時には必ず蚘録する様にしおいる。
    | これは DEL を抌した数ず戻った回数の敎合性ずいう芳点から望たしい。
    | そしお、蚘録する時には远加するか或いは消去するずいう凊理になっおいる。
    | 既に同じ䞀臎がトップにあれば消去し、それ以倖は远加する。
    | 然し、本来は「同じ䞀臎がトップにあれば」ずいうよりは、
    | 次にどちらの方向ぞ進むかを考慮に入れお実行したい。
    |
    | 或いは、空文字列の時でも䞀回は同じ䜍眮で䞀臎する
    | ずいう様にした方が䞀貫性がある様にも思う。
    | うヌん、前回の怜玢方向ずいうのを芚えおおいお、
    | 怜玢方向が前回ず同じであればそのたた怜玢しお、
    | 怜玢方向が前回ず異なれば䞀回は転回凊理を実行する、
    | ずいうようにしたい。
    |
    | その様に実装した。
    |
    | x 動かしおみたら党く動かない。
    |   改めお考察しおみるずこの修正では党然駄目である。
    |   しかし段々ず䜕がどうなっおいるのか分からなくなっおきた。敎理する。
    |
    |   先ず、_ble_edit_isearch_arr の蚘録の仕方。
    |   これは新しい䞀臎が芋぀かった時に、
    |   今たでの䞀臎の䜍眮・怜玢文字列ず、珟圚の怜玢方向を栌玍する。
    |   怜玢方向だけ新しい物を栌玍しおいるのが良いのかは分からないが
    |   取り敢えず其凊は今回の問題ではない。
    |
    |   ABCD ず䞀臎した時、ABC は _ble_edit_isearch_arr の䞭にあり、
    |   D はグロヌバル倉数 _ble_edit_isearch_* に蚘録されおいる。
    |   怜玢方向の転回をここで実行するず D に察する転回ずなる。
    |
    |   % % さお、この状態で再びその方向に怜玢を実行するずどうなるか。
    |   % % 新しく C に䞀臎するだろう。そうするず配列の末尟にある C ず察消滅する。
    |   % % これは珟圚の実装でちゃんず動く。
    |   % %
    |   % % しかしそうするず逆に今たでの実装で䜕故ちゃんず動いおいたのかが䞍思議である。
    |   % % 今たでの実装で䜕が起こっおいたかを考える ABC|D の状態で転回を実行する。
    |   % % そうするず再び D に䞀臎する。この堎合 ABCD|D ずいう事になる。
    |   % % この埌で再床怜玢するず C に䞀臎する。この時元々の状態の D が
    |   % % 配列に push されお察消滅しお ABC|C ずいう状態になる。
    |   %
    |   % ずいう事はやはり珟圚の実装で動くずいうのは勘違いだ。
    |   % ABC|D の状態で転回を実行するず ABC|D のたたである。
    |   % この状態で元に戻ろうずするず C が䞀臎する。
    |   % この時に珟圚の状態の D が push されお、ABCD|C ずいう状態になる。
    |   % これだず氞久に察消滅は起こらない。
    |   %
    |   % a 䞀぀の方法は䞊から配列の二番目の状態を調べるずいう物である。
    |   %   でもそうするず A|B ずいう状態で転回しお元に戻ろうずするず、
    |   %   AB|A ずいう状態になっお この堎合はちゃんずうたく行く。
    |
    |   やはり䜕か違う。ABCD ず入力する。この時点で ABC|D ずなっおいる。
    |   転回した時再び D になる。その時 _ble_edit_isearch_arr は匄らないので ABC|D のたた。
    |   この次に怜玢を実行するず C に䞀臎する ABC|D の状態で C を push しようずするので、
    |   C は察消滅する。この時 D は蚘録されない。結果ずしお AB|C ずいう状態になる。
    |   (別に「察消滅」する蚳ではなくお pop されるずいうのが正しい衚珟である)。
    |
    |   今たでに動いおいたのは䜕故だろうか。
    |   ABCD ず入力するず ABC|D になる。ここで転回するず D が push されようずする。
    |   % C != D なので ABCD|D ずいう状態になる。次に怜玢を実行するず C に䞀臎する。
    |   ず思っおよく芋たら index ず beg:end:needle が同じならば dir に䟝らずに
    |   push が省略される様だ。぀たり、ABC|D ずいう状態になる。埓っお、次に C が来るず、
    |   ちゃんず消滅が起こっお AB|C ずいう状態になる。
    |
    |   そうするず今床は䜕故今たで空文字列で動かなかったのか、ずいう事になる。
    |   ABC|D ず入力する。転回するず C に䞀臎する。そうするず AB|C ずいう状態になるはずである。
    |   これは確認しおおく必芁がある。どうも C に䞀臎しおいない様だ。
    |   →分かった。$beg:$end が䞀臎しおいない。䜕故か -1:-1 になっおいる。
    |   もしくは -1:-1 になる方が正しくお 3:3 や 4:4 になっおいるのが間違っおいるのだろうか。
    |   呌び出し元を芳察するず beg==end の時には䞡方 -1 にする様に明瀺的に曞いおいる。
    |   では䜕故 3:3 や 4:4 の様な物が可胜なのであろうか。
    |   ず思ったら push する時には obeg==oend のチェックをしおいないのだった。
    |   →あっさり盎っおしたった。ず思ったが、実際にそうしおみるず、
    |     今床はキャンセル時に状態を埩元する時に _ble_edit_ind, _ble_edit_mark が埩元できずに倱敗する。
    |
    |     # 所で、この埩元のコヌドは誀っおいる様な気がする。怜玢の方向によっお
    |     # beg ず end ず _ble_edit_ind ず _ble_edit_mark の察応は切り替わらなければならない。
    |     # これは別項目で埌で修正する事にする。
    |
    |     やはり -1:-1 を蚘録するのではなくお実際の䜍眮を蚘録するべきなのだろうか。
    |
    |   ? 逆に䜕故 beg==end の時に beg=end=-1 ずしたのかの方が謎である。
    |     blame したら分かるだろうか。探すずこれは最初からそうだった様だ。
    |     https://github.com/akinomyoga/ble.sh/commit/d10d5364e812d302f8c36d0b8a8729bb00761ec9
    |     しかも 3 幎前のコヌドで git 䞊にある䞭ではかなり最初の方の実装である。
    |     この時の議論は残っおいるだろうか。2015-11-29 である。しかし memo.txt を芋るず䜕も蚀及がない。
    |     昔はそのたた実装できるず思ったものはそのたた実装しおいた様だ。
    |     commit message を芋るず䞀臎範囲も蚘録するずしか曞いおいない。
    |     % 特に考察した圢跡もないので、詊しに -1 に蚭定するのをやめお芋る事にする。
    |     % 恐らく範囲がない == 䞀臎しおいないずいう事ず圓時は解釈したのだろう。
    |
    |     →これは実際に beg=end=-1 にしないでやっおみたずころ、
    |       空文字列の堎合には各履歎項目に䞀回しか䞀臎しないずいう条件により、
    |       backward search では履歎行の末端に䞀臎しお、
    |       forward search では履歎行の先端に䞀臎する。
    |       これにより forward search にしおも同じ状態にならないので埩元できないずいう事の様だ。
    |
    |   うヌん。珟圚の振る舞いのたたの方が良いのかもしれない 。
    |   もし戻りたければ DEL を入力すれば良いだけなのである。

    やはり埓来の振る舞いで適切ずいう結論である。
    空文字列で怜玢しおいる時は䞀臎の振る舞いが倚少異なる。
    各行で䞀回ず぀しか䞀臎しない様に制限をしおいる。
    backward search の堎合には線集文字列の末端に䞀臎する。
    forward search の堎合には線集文字列の先頭に䞀臎する。
    通垞の C-s ず戻る C-s の振る舞いの䞀貫性を保぀には、
    そしお C-s が本質的にはカヌ゜ルの移動ず考えるならば、
    行きず戻りは異なる経路ずしお蚘録するべきである。

    * done: 所で、修正する途䞭で気づいた事だが、

        _ble_edit_bind_force_draw=1

      ずいう物があった。これは䟋えナヌザヌ入力があったずしおも、
      行の再描画を匷制するずいう芁求である。
      実は、これは dabbrev 及び nsearch でも蚭定する必芁がある。

      ず思ったが、これは本圓に効果があるのだろうか。
      これは実際に抜けた時に実行される物の筈である。
      ずいう事は #resume を実行しおいる間は実行されないのではないか。
      それよりはすぐに redraw を実行しおしたった方が良いのではないか。

      その様に曞き換えた。たた、そうなるずそもそもこの
      _ble_edit_bind_force_draw=1 は必芁なのか疑問である。
      䜕凊で䜿われおいるか確認しお䞍芁そうだったら削陀する。

      →今確認したずころ誰も䜿っおいない。削陀する。

      远蚘: 䞀応 #D0324 に導入の経緯の議論があった。埌で確認しおも良い。

    * fixed: ble/widget/isearch/cancel: _ble_edit_ind ず _ble_edit_mark の察応が違う
      これは別に蚘録しなければならないのではないか。
      ずいうのも最初の _ble_edit_ind ず _ble_edit_mark の状態は、
      怜玢前の状態なので怜玢の方向などから刀定する事は䞍可胜である。

      先ず ble-edit/isearch/prev の実装を確認するず、
      ble-edit/isearch/prev は うヌん。䞀番最初の状態には戻らない。
      実際にやっおみるず必ずカヌ゜ルが埌ろになっおしたう。
      .set-region で蚭定を行う為である。

      最初の状態だけは beg:end ではなくお ind:mark を
      蚘録する様にするずいう手もある。
      ず思ったら既に _ble_edit_isearch_save ずいう倉数に蚘録しおあった。
      _ble_edit_isearch_save は C-s で移動しお確定した時に、
      ちゃんず領域を拡匵できおいるようにする為に導入した物で、
      exit する時にそれに応じお調敎する様にしおいた。
      cancel も内郚で exit を呌ぶようにしおいたが、
      よく考えおみたら cancel の時は領域を拡匵するのではなくお、
      本圓に元の状態に戻すずいう事なので操䜜が異なる。

    * done: ここで䞀぀の可胜性が出おくる。
      forward search の堎合にも線集文字列の末端に
      䞀臎する様に倉曎しおも良いのではないか。
      䟋えば history-prev/next に぀いおは䞊に移動しおも䞋に移動しおも
      カヌ゜ルの䜍眮は文字列の末端に移動する。

      確認しお眮かなければならないのは空文字列の時の
      行内䞀臎はどうなっおいるのかずいう事。
      䞍思議だ。コヌドを確認しおみたが、空文字列に察する察策は特に実行されおいない気がする。

      実は isearch/search は䞀箇所でしか呌び出されおいない。
      .next-history.fib からは呌び出されおいない様だ。
      改めお確認したずころ .next-history.fib の䞭では盎接パラメヌタ展開を䜿っお切り出しおいる。
      埓っお、最初の䞀臎ず二回目以降の䞀臎は元から凊理の仕方が異なるのであった。
      forward search で䞀臎するのを末尟に倉曎する為には、
      .next-history.fib の䞭で [[ ! $needle ]] の時だけ特別扱いすれば良い。

      実装の方法はずもかくずしお、䜕故行内で䜕床も䞀臎しないのかの謎は解けおいない。
      ここは少し出力しおみる事にする。
      →なんず、isearch/search に察しお空文字列で怜玢を実行するず䜕にも䞀臎しない。
        䜕故かずいうず isearch/search は ${target#*"$needle"} ず ${target%"$needle"*}
        を甚いおいるので空文字列を䜿うず最小䞀臎は幅0なので、䜕にも䞀臎しなかった堎合ず区別が付かない。
        正芏衚珟を甚いおいる方は、逆偎から最倧䞀臎を実行しおいる筈なので埮劙である。
        しかし正芏衚珟の方はそもそもどのように䞀臎の長さを事前に怜知するのかは非自明である。

      うヌん。isearch/search の蚭蚈ずしおは空文字列を指定した堎合にも䞀臎する様にしたい。
      䜆し、珟圚地に䞀臎するのではなくお、次の䜍眮に䞀臎する様にする。
      修正した。

    * reject: 因みに逆方向に怜玢を実行するずきに垞に配列の末尟を取り出しお
      巻き戻しの怜玢になっおいたら単にそれを埩元するずいう実装にする事も可胜である。
      しかし、その時には needle が䞀臎しおいる事などを確認する必芁がある。
      逆に蚀えば needle が䞀臎しおいるかどうかだけ芋れば、
      そのたた取り出しお再利甚しおよいかどうかが分かるのではないか。

      もう考えるのも面倒なのでこれはやらなくおも良い。珟状の動䜜で十分動いおいる。

    * fixed: 珟状では怜玢方向の転回に必ず䞀操䜜を芁しおいるが、
      C-s, C-r の本質がカヌ゜ル移動だず思うのであれば、
      やはり空文字列に察しおは転回に察しお䞀回䜿わない方が自然なのではないか。

      ここで bash の振る舞いを調べる事にする。
      先ず bash は空文字列で怜玢を開始する事はできない。
      曎に有限の文字列で怜玢を実行するずしおも転回に1回は䜿わない。
      今たでの動䜜は Emacs の振る舞いを真䌌た物だったが Emacs では空文字列での怜玢はできない。
      空文字列で怜玢しようずするず前回の怜玢が䜿甚される。
      その様に考えるず、やはり転回に察しお䜿わない方が自然である。

      以䞋の断片は転回に必ず (空文字列であっおも) 1回芁する時のコヌド断片で、
      元々 ble-edit/isearch/.next.fib にあったものであるが、
      削陀する事にした。

      | local old_dir=$_ble_edit_isearch_dir
      |
      | äž­ç•¥
      |
      | # 向きを転回する時はカヌ゜ルの䜍眮を移動するだけ
      | if [[ $_ble_edit_isearch_dir != "$old_dir" ]]; then
      |   if [[ $_ble_edit_mark_active ]]; then
      |     local tmp
      |     ((tmp=_ble_edit_ind,
      |       _ble_edit_ind=_ble_edit_mark,
      |       _ble_edit_mark=tmp))
      |     ble/textarea#redraw
      |   fi
      |   ble-edit/isearch/.show-status.fib
      |   return
      | fi

  * complete: dabbrev も fiberchain で再実装する [#D0846]

    % ず思ったが、そんなに面倒ではないかもしれない。
    % ず思ったが、やはり色々面倒な事になっおしたった。

    dabbrev でも無駄に start を蚘録しおいたがこれは実際䜿われおいないので廃止する。
    代わりに最埌に䞀臎した䜍眮 match を蚘録しようずしたが、
    実は垞に最埌の怜玢䜍眮 index ず䞀臎しおいる様な気がする。
    ずいうのも履歎の䞀番最初に行ったらたた履歎の最埌たで戻るためである。

    * done: うヌん。䜕だかよく分からなくなった。
      dabbrev-expand の時は芋぀からなければたた最初に戻る。
      ぀たり、cyclic に怜玢するずいう事になる。
      倖偎から指定しようず思ったが、
      よく考えるず元の怜玢噚の方にその機胜を远加した方が自然である。
      cyclic ずいうオプションで指定できる様にした。

      % これで履歎内に怜玢察象が党くない堎合に限り怜玢が倱敗する様になる。
      % ぀たり、再䞀臎を dabbrev 偎で再詊行する必芁はなくなった。

    * done: ず思ったら埮劙なこずが刀明した。dabbrev は単に䞀臎したらではなくお、
      珟圚䞀臎しおいる内容ず異なる内容だったら、ずいう远加条件がある。
      これを拡匵正芏衚珟で衚珟するのは困難である。
      䞀応できなくはないが、珟状の様に倖偎で耇数回䞀臎させる方が自然の様に思われる。
      さお、それに圓たっおは start を固定したたたで
      backward-search-history を耇数回呌び出せば良い。
      折り返しお再床元の堎所に戻っおきたら必ず backward-search-history が倱敗するので、
      無限ルヌプになるずいう事はない。

      取り敢えずその様に実装し盎した。埮劙な間違いなども芋぀けた。
      動䜜確認はしおいないが埌でたた確認すれば良いだろう。

    取り敢えず现かい調敎をしお実装した。
    詊しに動かしおみる事にする。

    * done: dabbrev で䜕故か cyclic にならずに終了しおしたう。

      単に䞀個しか䞀臎する物がないので、exclusive に怜玢しおいる為に䞀臎しないのか?
      ずいう事を思ったが、二個䞀臎する物に察しおも cyclic にならずに終了しおしたう。
      cyclic の条件刀定のずころを芳察しおみる事にする。
      →単に $1 を $opts に栌玍しおいなかっただけだった。
      これを盎したら2個䞀臎する時にはちゃんず cyclic になる様になった。

      | * しかし、自分以倖に1個しか䞀臎がない時にはやはり抜けおしたう。
      |
      |   倉である。よく考えおみたら自分自身にも䞀臎しお良いのではないか?
      |   ず思ったが、自分は履歎に登録されおいないずいう事を考えれば䞀臎しないのは圓然である。
      |   因みに、珟圚の実装だずもし珟圚地が過去の履歎であれば自分自身に䞀臎する事になる。
      |   その蟺りの䞀貫性をどのように確保するのかも課題の䞀぀である。
      |
      |   仕様: 自分自身には䞀臎しない
      |   仕様: 自分以倖に1぀しか䞀臎がない堎合は、巡回しお戻っおきたらそれに䞀臎する
      |
      |   →珟圚地が過去の履歎にある時には _ble_edit_history_edit には
      |     最新の未実行のコマンドが登録されるので、${#_ble_edit_history_edit[@]}-1 番目の芁玠
      |     (これは ble-edit/history/get-count (-1 しない) 番目の芁玠に同じ)
      |     も怜玢する様にすれば問題ない。実際にその様になっおいる。
      |
      |   →たた自分自身に䞀臎しない様にするために predicate 内郚で
      |     index もチェックする事にした。
      |
      | * 自分自身に䞀臎する様に start を 1 ずらしお定矩しおみる事にした。
      |   するずずっずルヌプしお怜玢が停止しなくなっおしたった。
      |   "珟圚の内容ず厳密䞀臎する時にはスキップする" ずいう機胜の所為である。
      |   これは次の項目の "遅い問題" ず䞀緒に解決できる。
      |   ぀たり関数を䜿っお䞀臎刀定を実行するずいうこずである。
      |
      | * hello の様な頻出の単語で怜玢するず速床が著しく䜎䞋する。
      |   厳密に䞀臎する単語に䜕床も匕っかかっおしたっお、
      |   その床に blockwise で 1000 件走るからである。
      |   本来は䞀回スキャンすれば良いはずなのにである。
      |   これは関数を倖から指定しお刀定する事ができるようにするべきなのではないか。
      |
      |   →関数にしおみたが埮劙に遅くなった。eval しおくれる cond 的な物の方が良いのでは。
      |
      | * 䞀番初めのpos 初期化: 末端?

      取り敢えず関数を枡しお怜玢するのを実装したので
      䞀぀䞀぀に぀いお動䜜を確認する事にする。
      その前に様々の問題が発生したのでそれを修正しお行く。

      | x fixed: 先ず党く䞀臎しなくなっおしたった。これは盎した。
      |   backward-search-history 偎で predicate オプションを認識しおいなかった。
      |
      | x fixed: 䞀床䞀臎しおも blockwise search の途䞭で dabbrev_pos=0 に再蚭定されおしたうずいう問題がある。
      |
      |   % →これに぀いおは盎した。倖偎で dabbrev_pos=0 に蚭定しお、
      |   % 䞭では䞀臎した堎合を陀いおは勝手に匄らない様にする 
      |   % ず思ったが駄目だ。そうするず䞀床 dabbrev_pos を蚭定するず、
      |   % それ以降の怜玢に圱響を䞎えおしたう。
      |
      |   →search-in-history-entry では dabbrev_pos は蚭定しない事にしお、
      |     dabbrev_match_pos に返すだけに留める事にした。
      |     倖郚で dabbrev_match_pos を dabbrev_pos に適甚すれば良い。
      |
      | x fixed: 同じものに䜕床も䞀臎しおいる
      |
      |   % →これは blockwise search だからである。
      |   % 䞀番最埌に䞀臎した物に぀いおの結果しか埗られない 
      |   % ず思ったが、よく考えたら blockwise search の堎合は
      |   % 䞀番最埌に䞀臎した物を採甚するのだから問題ない気がする。
      |
      |   これは別の物に䞀臎しおいたが、毎回 dabbrev_match を代入しおから刀定しおいたため、
      |   䞀臎しおいない物の dabbrev_match で䞊曞きされおしたっおいたずいう事だった。
      |   䞀臎した時にのみ dabbrev_match に曞き蟌むように倉曎する事で解決した。
      |
      | x fixed: 䜕故かタスクがどんどん増えおいく
      |   怜玢の最䞭に曎に次の怜玢を芁求するず発生する様だ。
      |   どんどんタスクが増えおいく時は同じ履歎項目の間を振動しおいる。
      |
      |   →これは fib_suspend をクリアし忘れおいたのが原因だった。
      |   その為に折角䞀臎しおも fib_suspend したず刀定されおすぐに停止するのだった。
      |   曎に、怜玢を再開しおも䜕床も同じ怜玢を実行しおいた事になる。
      |
      | x fixed: 同様の問題が isearch, nsearch でもないか確認する必芁がある。
      |   →確認しおみた所䞡方共倧䞈倫だったが、それぞれ別の曞き方をしおいる。
      |   分かりにくいので fib_suspend を確認しお読み取ったらすぐに空文字列を蚭定する様に倉曎した。
      |
      |   ず思っお nsearch で実隓しおみたら駄目だった。
      |   fib_suspend を確認する前に関数を抜けおいる箇所がある?
      |   →䜕凊で抜けおいるか分かった。
      |   新しいコヌドの方が正しくお、今たでのコヌドの方が間違っおいた。
      |   今たでのコヌドの方で再珟しお、新しいコヌドの方では再珟しないずいう事が分かった。
      |
      |   isearch の方では問題は起こらない様である。
      |
      | x fixed: 実は nsearch で C-s で戻り切るずその埌の怜玢が倉である。
      |   これは C-x C-p しお C-s するだけで再珟する。
      |   fiberchain の偎の問題ではないようだ。
      |
      |   詊しおみるず途䞭で index=-1 になっおしたっおいる様だ。
      |   backward-search から戻った時の index の倀が怪しい。
      |   うヌん。これは forward-search で倱敗した時に index
      |   が䞀番最埌にいるず思っおいるのがいけない。
      |   実際には空文字列が蚭定されるのである。
      |
      |   ちゃんず backward-search の戻り倀に応じお
      |   _ble_edit_nsearch_index を曎新する様に修正した。盎った。

      取り敢えず芋぀かった問題は解決したので
      改めお元々の問題が解決されおいるかに぀いお確認しおいく。

      * fixed: 自分以倖に1個しか䞀臎がない堎合に抜けおしたう問題に぀いお。
        これは単に既に䞀臎しおいる堎合には bell を鳎らすだけで
        動かさないずいう様にすれば良い。

      * ok: 自分自身を飛ばす
        これは今たで詊したずころだずちゃんず動䜜しおいる様に思われる。
        ず思ったが、よく考えたら今たでは最新の履歎項目で線集しおいたので分からないだけかもしれない。
        →叀い履歎項目を曞き換えお ring ずやっお ringo, 呚回, ringing の順に䞀臎しお
        ちゃんず自分を飛ばしおたた ringo に䞀臎するずいう事を確認した。

      * ok: 無限怜玢ルヌプになるこずに぀いお
        これは構造䞊今回の実装では起こりえないし、今たでにも起こっおいない。
        ぀たり backward-search-history-blockwise の cycle 刀定がちゃんず動いおいるずいうこず。

      * ok: 䞀番初めのpos 初期化: 末端?
        →これに぀いおは今たでのずころ問題は発生しおいない。

      * ok: 怜玢速床が遅いこずに぀いお

        頻出単語に察する怜玢の遅さは著しく改善したが、
        各行に察しお関数を呌び出す為に党䜓に遅くなっおしたった。
        詊しに eval を甚いる方法に぀いおも実装しおみる事にする。

        うヌん。䜕故か垞に䞀臎する感じになっおしたっおいる。䜕故だろう。
        条件匏を間違えおいた。修正した。

        然し、predicate よりも䜙蚈に遅くなった。
        倉数代入に続けお eval を曞くのはもしかしお遅いのかもしれない。
        時間を蚈枬しおみるこずにする。

        | a for ((j=i-block;++j<=i;)); do
        |     LINE=${_ble_edit_history_edit[j]} INDEX=$j eval "$needle" && index=$j
        |   done
        |
        |   これは 1000 件で 0.156 秒皋床である。
        | b local LINE INDEX
        |   for ((j=i-block;++j<=i;)); do
        |     LINE=${_ble_edit_history_edit[j]} INDEX=$j eval "$needle" && index=$j
        |   done
        |   これは 0.154 秒皋床である。
        |
        | c eval "function ble-edit/isearch/.search-block.proc {
        |    local LINE INDEX
        |    for ((j=i-block;++j<=i;)); do
        |      LINE=\${_ble_edit_history_edit[j]} INDEX=\$j
        |      { $needle; } && index=\$j
        |    done; }"
        |   ble-edit/isearch/.search-block.proc
        |   これは 0.086 秒皋床である。倚少速くなった。
        |   しかし、今たでず范べるずやはり遅い様な気がする。

        うヌん。取り敢えず c を遞ぶずいう事にしおも遅い。
        ず思っおいたら、どうも ring は string に匕っかかるので、
        頻繁に関数呌び出しの方を実行しおいるずいう事の様に思われる。
        ず思ったが本圓だろうか。盎前に区切り文字がない限りは反応しない筈だ。
        その様に思うずやはり䞍思議だ。単に正芏衚珟が重いずいう事なのだろうか。

        | needle に以䞋の様に 1 行目を远加したずころ 0.045s にたで短くなった。
        | 因みに1぀目の条件コマンドず2぀目の条件コマンドを結合するず 0.046s である。
        | 殆ど違いはない。぀たり、ちゃんず遅延評䟡にはなっおいる様である。
        |
        |   [[ $LINE == *"$_ble_complete_dabbrev_original"* ]] &&
        |     [[ $LINE =~ $_ble_complete_dabbrev_regex1 ]] &&
        |     ble-complete/dabbrev/search-in-history-entry "$LINE" "$INDEX"
        |
        | 実は glob で党郚実装した方がもっず速いのかもしれない。
        | 䞀時的に wordbreaks を埩掻させる事にする。
        | もしくは glob escape すれば良いのかもしれないが 。
        | 以䞋の様に glob だけで実装しおみたずころ䞀定しなくなった。
        | それでも 0.140 皋床なので华っお遅くなった。
        |
        |   [[ $LINE == "$_ble_complete_dabbrev_original"* ||
        |       $LINE == *["$_ble_complete_dabbrev_wordbreaks"]"$_ble_complete_dabbrev_original"* ]] &&
        |     ble-complete/dabbrev/search-in-history-entry "$LINE" "$INDEX"
        |
        | 倉数名が長いのが気になるず思っお local dabbrev_{original,wordbreaks}
        | に入れおみたが速床ずしおは倉わらない様だ。

        結局、local dabbrev_original による枝刈りず
        local dabbrev_regex1 による刀定で実装する事にした。0.044s
        たあ蚱せる速さではある。

    * done: cycle した時には bell を鳎らしたい

    * done: うヌん。気づいたが show-status の䞭で ntask を参照しおいる。
      然し、show-status を #resume の倖で呌び出しおいる様な気がする。
      これは isearch/nsearch を改めお調べお修正する必芁がある。

      調べおみたずころ nsearch は問題なかった。
      isearch ではそもそも #resume の䞭から呌び出され時にしか ntask を確認しおいない。
      #resume の倖で .draw-line を呌び出した時にも fib_ntask を䜿っお描画する事にした。
      それに䌎っお呌び出し元をたどっお修正した。
      関数名の敎理も行った。

2018-09-26

  * 2015-12-23 isearch: C-r C-s で mark が砎壊されおしたう [#D0845]
    (珟状の実装だず、範囲遞択に C-r C-s を䜿う事ができない。)

    䟋えば mark が蚭定されおいる堎合は珟圚の履歎項目の䞭で、
    mark を解陀せずに怜玢を行うなどの様にするず良い。

    履歎項目を移動した堎合には解陀するずいうので良い。
    (たた戻っおきた堎合には埩元する。)

    % 問題になるのは着色である。layer を远加するか、
    % 遞択範囲の衚瀺に䜿っおいる layer を拡匵するかする必芁がある。
    →抜けた時に埩元すれば良いずいう事にした。
      遞択範囲ず䞀臎範囲の䞡方を衚瀺するのも芋にくいし、
      たた遞択範囲だけしか衚瀺しないずいうのも分かりにくい。
      なので、怜玢䞭は䞀臎範囲だけ衚瀺するずいうので問題ない気がする。

    実装した。動くこずを確認した。OK

  * edit: ble/widget/accept-single-line-or/accepts は別の名前を割り圓おる [#D0844]
    珟圚の名前だず ble-bind -L に衚瀺されおしたう。盎した。

  * edit: history-search [#D0843]

    dabbrev-expand でもそうだが、履歎の怜玢は遅い。
    連打したりするず応答がなくなる可胜性がある。
    かず蚀っお単に has-input で停止しおいるず入力が消滅した様に芋える。
    特定の回数連打した時に期埅した䜍眮に行かないなどの事が起こる。
    そうするず isearch の様に fiber を組み合わせお実装する事になる。

    思うに fiber を沢山重ねお実行する統䞀的な枠組みを䜜っおも良いのではないか。

    * fixed: progress は _ble_edit_isearch_* に䟝存しおいる。
      曎に怜玢が完了したら毎回 clear する必芁がある。

      これはどの様に実装するのが正しいだろうか。
      珟状の実装では forward/backward-search-history が
      ble-edit/isearch/.draw-line-with-progress "$i" を呌び出す圢になっおいる。

      % 取り敢えずこの関数の内容を確認しおみた所、
      % 特に isearch 特有の衚瀺はしおいない。
      % なので、この関数自䜓を任意の堎合に䜿える様に拡匵するのが良い。
      %
      % _ble_edit_isearch_str は needle で眮き換えられる筈である。
      % .draw-line-with-progress の呌び出し元を確認する。
      % - backward-search-history-blockwise 及び forward-search-history は倧䞈倫。
      % - .draw-line は様々な堎所から呌び出されおいる。
      %   これは needle が定矩されおいない文脈からも呌び出される。
      %   .draw-line の䞭で needle を定矩する事にすれば良い。

      ず思ったが、やはり埮劙に思われおきた。
      珟圚䜍眮も衚瀺しおいるが、nsearch の堎合には珟圚䜍眮は移動しない。
      やはり倖郚から衚瀺内容を蚭定する事ができるようにするのが良さそうである。
      →倖郚から isearch_progress_callback を指定する事にした。
      今たで無意味に isearch_ntask に䟝存しおいたのを眮き換える圢である。

    * done: 実は蚘録されおいる珟圚䜍眮ず次に怜玢開始する䜍眮は異なる。

      | 珟圚は _ble_edit_nsearch_start を最初に怜玢を開始した䜍眮 (nsearch に入った時の䜍眮) ずしお、
      | たた _ble_edit_nsreach_index を次に怜玢を開始する䜍眮兌最埌に䞀臎した䜍眮ずしおいる。
      | しかし、䞀番最埌に䞀臎に倱敗した時は index の䜍眮はどうしたら良いか分からない。
      | 䞀回䞀臎に倱敗したのだから次に怜玢を開始する䜍眮は履歎の䞀番端であるべきだが、
      | 䞀方で最埌に䞀臎した䜍眮は動いお欲しくない。
      |
      | isearch の堎合には index は蚘録しおいなくお、党お history/get-index に䟝っおいた。
      | ぀たり、最埌に䞀臎した䜍眮ずなっおいる。
      | その為、䞀臎しなかった時にはキヌを連打した回数だけ、
      | 最埌に䞀臎した䜍眮から履歎の橋たでを繰り返し怜玢する事になる。
      | isearch の堎合にはキヌを入力する床に怜玢の条件が倉わるため、
      | 繰り返し怜玢を実行する事に意味があった。
      |
      | しかし、nsearch の堎合には前に行くか埌ろに行くかの二皮類しかないので、
      | 毎回怜玢の条件は同じである。埓っお繰り返し怜玢を実行するずいうのは䞍自然である。
      | やはり最埌に䞀臎した䜍眮ず次に怜玢するべき䜍眮ずいうのは別に管理するのが良いのではないか。
      |
      | たた、珟圚の実装では start はどの様に䜿われおいるだろうか。
      | 新しい nsearch の実装では start は nsearch に入った時の䜍眮ずしおいる。
      | しかし、どうも isearch の堎合には start は珟圚凊理しおいるキヌ入力に察する怜玢の開始䜍眮の様である。
      | そういう意味で蚀えば、実は start を最埌に䞀臎しおいた䜍眮ずしお、
      | index を次に怜玢するべき䜍眮ず考えるのが良いのかもしれない。
      | 或いは、そもそも start を蚘録する意味はないのかもしれない。
      | 珟に isearch の実装では start は蚘録しおいない。
      | suspend の時に suspend デヌタに蚘録しおいるだけである。

      以䞋の様に実装する事にする。
      - _ble_edit_nsearch_start は廃止する。
        start は各入力に察しお最初にどの䜍眮に居たかを蚘録する事にする。
        各入力に察しお䜿甚するだけなので、これは fib_suspend に蚘録する。
      - _ble_edit_nsearch_index は最埌に怜玢した䜍眮を栌玍する事にする。
      - _ble_edit_nsearch_match に最埌に䞀臎した䜍眮
        (珟圚衚瀺しおいる行内容がどの䜍眮に察応しおいるか) を入れる事にする。

      倉曎した。動いおいる。

    * fixed: nsearch を抜けた埌に怜玢状況の衚瀺が残っおしたう。
      isearch は ble-edit/isearch/.erase-line を呌び出しおいた。
      これは䞭で ble-edit/info/default を呌び出しおいる。
      同様に nsearch でも ble-edit/nsearch/erase-status ずいう関数を䜜る事にする。

    * fixed: C-r しお C-s しお最初の状態にたで戻った時、
      囲たれおいない。これは最初に nsearch を開始した時に
      _ble_edit_mark を調敎しおいない為である。
      _ble_edit_mark を保持する理由もないので _ble_edit_mark を倉曎する事にする。

      ず思ったが、よく考えたら non-incremental-history-search で
      ナヌザに入力しおもらった時には珟圚の行で䞀臎があるずは限らない。
      C-s で戻る事ができるのは実際の䞀臎に察応する ${_ble_edit_nsearch_stack[1]}
      以降ずいうように制限するのが良さそうである。盎した。

    * fixed: 実は C-r を連打するず fib_suspend した内容が消滅しおいる?
      確認しおみた所、別に C-r によっお fiberchain の最埌の項目が
      キャンセルされおいるずいう事ではないようだ。

      もしくは正しく怜玢状態を埩元できおいない?
      確認しおみた所、䜕ず、index= になっおいる。
      ぀たり、fib_suspend で start も蚘録する様に倉曎したのずは別に、
      元からちゃんず resume できおいなかったずいう事になる。
      然し、䜕故 index= になっおいるのだろう 。
      →恐らく isearch/{for,back}ward-history-search の仕様であろう。
      ず思ったが、改めお説明を呌んでも 148 を返した時にはちゃんず index を返す筈である。
      isearch/{for,back}ward-history-search の偎のバグであろうか。

      詊しおみたら実は今たでの isearch の振る舞いも倉だった様だ。
      盎した方で詊すず C-r を連打した回数だけちゃんず蚘録されおいる様だ。
      C-g で溜たっおいたものを党おキャンセルする様になっおいる。

    * done: 未凊理の入力がある時、cancel でそれらをクリアする。

    * done: defface で region_search を远加

    * changed: `ble/widget/isearch/accept-line`

      今たでは䜕故か exit-default を実行しおいたが、
      これだず accept-line に束瞛しおいるキヌによっお振る舞いが倉わっおしたう。
      % 明瀺的に accept-single-line-or-newline を呌び出す事にした。
      % もしくは isearch/accept-{line,single-line-or-newline} を䜜るべきかもしれない。
      % autoload し忘れおいたのを远加した。
      調べおみるず vi_imap などでは特殊な関数を呌び出す必芁がある。
      やはり `RET` を実行する様に倉曎する事にした。

    取り敢えずこの時点で commit を䜜成する事にする。

    * done: key binding ずしお up down を䜿った物も甚意する。

    * done: 埌で mark の皮類の名称を倉曎する事にする。
      mark:search -> mark:vi_search mark:nsearch -> mark:search
      これに䜵せお char block line に぀いおも倉曎したい。

      mark_active を蟿れば良いず思う。
      - mark_type に぀いおも確認する必芁がある。
        䞀応䞀通り芋た。
      - _ble_keymap_vi_search_activate も蟿る。
        これも䞀通り芋た。
      - _ble_keymap_vi_xmap_prev_visual も調べる。
        これは単に mark_active を蚘録・埩元しおいるだけの様だ。

      芋逃しがないか䞍安である。改めお mark_active を芋る。远加で以䞋も倉曎する。

      - _ble_keymap_vi_xmap_prev_edit
      - ble/widget/vi-command/visual-mode.impl
      - ble/widget/vi_xmap/switch-visual-mode.impl
      - ble/keymap:vi/xmap/switch-type も確認した。

      - ble/keymap:vi/call-operator 及び operator の context は倉曎しなくお良い。

      たあ、取り敢えず詊しにやっおみお動けばよいだろう。
      衚瀺は OK C-v による操䜜も確認した。たあ、問題なかろう。

    * done: isearch も fiberchain で実装し盎す
      盎した。fiberchain で fiber に匕数を指定できる様に拡匵した。
      䞀応動いおいる。

      たた isearch で region を埩元するのもこれを機に実装するのが良い。
      →これは #D0845 で実装した。

    * done: non-incremental-* も実装する。
      これには emacs 偎でも vi_cmap 的な枠組みが必芁になる。
      read を盎接䜿おうかずも思ったが、実は今の read の仕組みだず C-c に反応しおしたう。
      同じプロセス内で実行できないだろうか。或いは、今の read の仕組みで実は問題ないだろうか。
      うヌん。よく考えおみるず問題ないのではないだろうか。
      今の read の仕組みでも C-c を受け付けお自分で凊理しおいる気がする。

      面倒になった。䜕も考えずに read で良い様な気がしおきた。
      わざわざ vi_cmap を䜿わなくおも良いずいう気分である。

2018-09-24

  * complete: よく考えたら ble-sabbrev ぱクスポヌトするべきなのでは [#D0842]
    https://github.com/akinomyoga/ble.sh/issues/5 で cmplstofB さんの質問で、
    ble-sabbrev は _ble_complete_load_hook で蚭定するのかずいう問いに察しお。
    修正した。然し、䜕れにしおも遅延ロヌドを有効にする為にはやはり load hook の䞭で実行する方が望たしい。

    埌で core-syntax.sh `ble-syntax:bash/is-complete` も autoload されおいない事に気づいた。
    これも autoload する様に倉曎しおおく。

  * complete: "echo dist/ble1423@" に察しお曖昧補完が効かない [#D0841]
    "cd dist; echo ble1423@" は効く。

    調べおみるず generate の所ではちゃんず曖昧補完に入っおいる様である。
    䜆し、source:argument に入っおいる。source:argument が悪い気がしお来た。
    動䜜を芋おみるず source:argument は "d" で始たる候補を列挙しお成功しおいる。
    ぀たり、d*/b* による候補が列挙されおいない。
    曖昧補完の時にはこれで諊めおはならないはずなのである。
    しかし、だからず蚀っお曖昧補完の時には垞に source:file を実行するずいうのも倉である。
    本来はフィルタした埌に候補が党おなくなったら、source:file による曖昧補完を詊みる、
    ずいう圢でなければならない。

    䞭でフィルタをかける事にした。
    フィルタをかけた䞊で候補の数が増えおいなかったら
    source:file たたは source:dir を䜿う。

  * [自然解消] 2015-06-28 color: PATH=filename の filename の郚分 (ref #D0839) [#D0840]

  * highlight: wtype==CTX_VALI (a=(1@)) 及び wtype==ATTR_VAR (v=1@) の着色? [#D0839]

    core-syntax.sh: ble-highlight-layer:syntax/word/.update-attributes/.proc では
    wtype が CTX_CMDI, CTX_ARGI, CTX_RDRF, CTX_RDRS の時にのみ単語着色しおいる。
    CTX_VALI たたは ATTR_VAR の時は倉数名や []= の郚分を陀いお着色する必芁がある。
    その為には先ず範囲を切り出さなければならない。

    []= の圢匏の時に = の䜍眮を特定するコヌドは、completion-context にあったはず。
    敎理しお ble-syntax:bash/find-{end-of-array-index,rhs} ずいう関数にした。
    曎にそれを利甚しお右蟺の䜍眮を特定しお着色する様にした。
    単語の描画属性 (wattr) に぀いおも今たでの単玔な物から、
    単語内で色分けできる様に m(len:attr)+ の圢匏に察応した。

  * highlight (reported by cmplstofB): 単語着色で配列の指瀺初期化子が failglob 刀定されおいる [#D0838]
    https://github.com/akinomyoga/ble.sh/issues/13
    ble-highlight-layer:syntax/word/.update-attributes/.proc を盎した。
    察応しおいない wtype に぀いおは無芖する事にした。

2018-09-23 自然解消

  * [自然解消] 2016-06-22 timer の実珟方法に぀いお [#D0837]

    䞀぀の方法は read -t 0.1 < 䜕凊か などずいう颚にするこずである。
    しかしこの方法は䞀定時間の sleep を行うだけで定期的な凊理を実行する timer にはならない。
    凊理自䜓に時間が掛かっおいるず遅延が生じおしたう。

    もう䞀぀の方法は別のプロセスを起動しおそのプロセスでひたすら時を刻みながら
    自プロセスに察しお通知を行うずいう方法である。
    通知を行う方法は色々考えられる。シグナル、mkfifo、mkdir など。

    a シグナルには䜙り頌りたくない。思いがけずクラッシュしそうな気がするからである。
      シグナルハンドラの起動䞭にシグナルハンドラが呌び出されるずクラッシュするので、
      シグナルハンドラの内郚ではカりンタをむンクリメントをするだけにする。
      しかしその様にしたずしおも䜕らかの遅延により
      シグナルハンドラが二重に呌び出される可胜性は排陀できない。
      たた、別の問題点ずしおタむマヌの開始・終了を制埡する方法がないずいう事がある。
      →たあ、単玔に生成したサブシェルを kill すれば良いだけずも蚀える。

      $ trap -- '((ble_timer_count++))' USR2
      $ (while xsleep 0.1; do kill -USR2 $$; done) & disown

      →実際にやっおみたが思う様に動いおいない様に芋える。
      どうも芪プロセスでキヌボヌド入力をした回数だけしか発生しおいない様な 。
      ずいうわけでそもそもこの方法は䜿えないずいう事なのかも知れない。

    b mkfifo による方法に関しおは 。これは凊理する偎で遅延が発生するず、
      延々ずパむプにデヌタが流し蟌たれメモリに悪そうだずいう問題がある。
      しかしバッファが䞀杯になったら郜合良く停止するだろうか (バッファのサむズによる)。

      →或る皋床呌び出したら停止した。ず思ったらそんな事は無かった。
        ずいうか 1 秒間に 10 文字皋床ではすぐには buffer は䞀杯にならない。

      $ exec 3< <(trap -- '' INT QUIT; while echo -n t; do sleep 0.1; done)
      $ while read -t 0 <&3; do IFS= read -r -d '' -n 1 byte <&3; ((count++)); done; echo $count

      所で timer を停止したい堎合にはどうしたら良いのか 。プロセス番号を取埗するには?
      ず思ったらプロセス眮換の堎合でもちゃんず $! にプロセス眮換のプロセス番号が入っおいた。
      なので $! さえ䜕凊かに蚘録しおおけば問題ない。

      曎に実際に動かしおみるず安定しお動いおいる様に芋える。

    c もし自プロセス内で閉じた方法があればそれが䞀番良い。
      䟋えばミリ秒単䜍で時刻を蚈枬するこずができれば経過時間に応じお
      sleep 量を調敎する事ができる。

      printf -v '%(%s)T' を甚いる方法だず秒より䞋の単䜍は取埗できない。
      GNU coreutils の date はその様な機胜 (%N) も持っおいる様だが、拡匵に過ぎない。

      あった。procfs をマりントしおいれば (そしお珟圚のシステムでは殆どそうだろう)
      cat /proc/uptime でシステムを起動しおからの時間を芋るこずができる。
      ず思ったが linux, cygwin には /proc/uptime があるが、mac os x ではそもそも /proc がない様だ。
      FreeBSD でも /proc はあるが、BSD にはなかったからの様だ。他に HP-UX もない。
      Solaris には /proc はあるが /proc/uptime は無い様な雰囲気である (確認できおいない)。

      たた /proc/uptime を呌び出す overhead が劂䜕皋の物かずいう問題もある。
      →0.05ms であった。本圓に蚈枬できおいるのだろうか??
        関数に入れお芋たが蚈枬できおいる様だ。ずいう蚳で overhead はない物ずしお良い。

  * [自然解消] 2016-06-19 complete 補完候補䞀芧衚瀺: [#D0836]
    やはり珟圚たでに入力した郚分ず、
    未だ入力されおいない補間文字列の郚分を色分けしお衚瀺した方が良い。
    特に入力文字列が長い堎合に芋にくい。

  * [自然解消] 2016-06-19 complete 補完候補䞀芧衚瀺: [#D0835]
    たた、候補が長い堎合や入力が面倒な堎合 (䟋えば日本語の堎合) があるので、
    矢印キヌなどで遞択できる様にした方が良い。

  * [自然解消] 2016-06-19 timer/非同期実行機胜: [#D0834]
    history 怜玢やゲヌム的機胜 (demo 甹) の実装のためには、
    やはり timer の様なむベントを発生させる仕組みを敎えた方が良い様な気がする。

    →しかし無駄に耇雑にしたり需芁に合わない様な圢に実装しおも仕方がないので、
    取り敢えずは history の怜玢に斌いお非同期に凊理を行う方法を実装しお、
    その埌でその実装を参考にしお仕組みを敎える方が賢明である様に思われる。
    あるいは、history を非同期に怜玢できる様にしたずしおも
    途䞭で面倒になっお統䞀的な実装にしたくなるかも知れないが、
    そうだずしおも history を目的ずしお最小限の統䞀的実装にするずいう方向でよい。

    非同期の実行の仕組みずしおは、

    1. 先ず凊理を䞭断できる様な方法で実装するずいう事、
    2. それからナヌザからの入力があった堎合にそれを怜知できるずいう事。

    これらだけあれば基本的に十分である。
    ナヌザからの入力は bash-4.0 以降であれば read -t 0 で確認できる。
    なので、基本的には凊理の方を现切れにできれば䜕も問題は生じない筈である。
    䞀応ナヌザからの入力を受ける時に bash が勝手に色々操䜜をするので、
    それの察策ずしお色々出力を繋ぎ倉えたり衚瀺を曎新した理などの凊理はあるが、
    それらは別に倧したこずはない。context switching か䜕かの䞀郚だず思えば良い。

  * [自然解消] 2016-04-06 補完候補衚瀺で既に入力が完了しおいるディレクトリ郚分に぀いおはそれを衚瀺しない様にする [#D0833]
    衚瀺されおいる候補がファむル名ずは限らないが、補間されおいる候補の皮類に䟝らず省略しお良いず思う。
    そちらの方が自然である。もしファむル名でないずしおも䌌たような入れ子構造に察応しおいる可胜性が高いので。

    →でも、前に䜕か察応したような気がするが 、ず思っお改めお確かめおみたら、
      ちゃんず ../../ の様な面倒な物は省略されお衚瀺されおいる様な気がする。
      では䜕故先皋は ../../ の様な文字列が倧量に衚瀺されおいたのだろうか 。

    →いや、cd コマンドの候補 (プログラム補間候補) がそうはなっおいない様である。
      前に同様の事を議論したような気がするのでログを持っおみる事にする。

    2018-09-23 これは基本的にプログラム補完 (bash-completion) が悪い。
    䜙り黄にしおも仕方がないので取り敢えず保留ずいう事にする。

  * [自然解消] 2015-11-21 同じ堎所で complete (TAB) を連続で呌び出した時にカりントを行うべき [#D0832]
    + peco や sentaku など (?) の倖郚コマンドを起動する時の基準に䜿甚できる。

    2018-09-23 これは結局 core-complete.sh 自身で絞り蟌みを提䟛するので䜙り必芁なくなった。
    たた既に同じ堎所で連続で呌び出したかどうかは LASTWIDGET 経由で刀定できる様になっおいる。
    回数たではカりントしおいないが、widget の偎で数える様にする事は容易である。

  * [自然解消] 2015-11-21 vi bind (これは bind -p で調べれば倧䞈倫の筈?) [#D0831]

    →bind -p しお芋たがどうも vi には vi の完党に異なるコマンド䜓系がある様である。
      単玔な移動コマンドぐらいならば察応できるが、それ以倖の物に぀いおはどの様な操䜜なのか
      よく理解しおいないので憶枬で実装するのは難しい。

    2018-09-23 これは既に support-vi-mode で実装枈みである。

  * [自然解消] 2015-11-18 PROMPT_COMMAND を䞀番倖偎の環境で実行する様に倉曎する [#D0830]

    珟圚は .ble-line-prompt/update の䞭で盎接実行しおいる。

    たた、stty 等を正しく蚭定しお呌び出すようにする?

      参考の為: 珟圚 ble-bind -cf による登録では、
      function .ble-edit.bind.command を通しお .ble-edit.accept-line.add
      でコマンドを登録し䞀番最埌に倖偎でコマンドを実行する。
      このコマンドによる出力はプロンプトの次の行に衚瀺される。
      たたコマンド終了埌には改めおプロンプトが衚瀺される。

      䞀方で ble-bind -xf proc に関しおはそもそも未実装の状態になっおいた。
      このコマンドではプロンプトの次の行に行ったり、プロンプトを消したり、
      或いはプロンプトを再描画したりなどず蚀った事は䞍芁である。
      (勝手な出力をしないずいう前提・衚瀺が乱れた堎合 proc の方が悪いずいう事にする)

    2018-09-23 これは既にその様な実装になっおいる。
    stty の蚭定は行っおいないが、䞊蚘の議論の通り、
    倉な衚瀺になったりしおも前提を厩す様な凊理を行う方が悪いのだずいう事にする。
    ぀たり、珟状の通り stty などによる調敎は行わないで良い。

  * [自然解消] 2015-02-27 complete: 文脈刀定を匷化する。他にも色々な箇所で補完を実行する [#D0829]

    2018-09-23 これは曖昧な項目であるが少なくずも圓時よりは倧幅に増匷された。

  * [自然解消] 2013-06-01 以前 compgen, history コマンドを関数内から自由に利甚する事が出来るか [#D0828]
    → できる (2018-09-23)

2018-09-23

  * auto-complete: 構文゚ラヌが自動補完により解決される時 <kbd>RET</kbd> でコマンド実行が抑止されない [#D0827]

  * isearch: C-d で珟圚の遞択範囲を削陀する様に倉曎。たた C-m (RET) で確定した時は遞択範囲を解陀 [#D0826]

  * complete (suggestion by cmplstofB): vi_imap に斌いお C-] から sabbrev-expand に束瞛 [#D0825]
    https://github.com/akinomyoga/ble.sh/issues/5

  * 2015-03-04 枛色 (88colors の時の palette に぀いお) [#D0824]
    16-79 4x4x4 0,58*v+81
    80-87 gray 46+25*v

  * term: term.sh の local j=$((k-i1+j1)) の k は i の誀りである [#D0823]
    序でに端末が256色察応しおいない堎合の枛色凊理に぀いおも远加する。

  * edit: 怜玢䞭や auto_complete にお C-RET ですぐに実行ずいう意味にしたい [#D0822]

    序でに isearch/accept → isearch/accept-and-execute にしようず思ったが、
    怜玢を終了しお実行しない物は既に isearch/exit ずいう名前が䞎えられおいる様なので、
    isearch/accept のたたにする事にした。そうするず、今床は auto_complete/accept-and-execute
    の方を auto_complete/accept にしお、auto_complete/accept を別の単語にしたくなる。
    accept の代わりに "確定する" ずいう様な意味の単語があれば良いが、
    怜玢しおみるず determine, decide などが出おくる。これらは意味が違う。
    他に settle や fix 等があるが前者は䜙りニュアンスが分からない。
    埌者は色々意味がありすぎお auto_complete/fix などずしおも䌝わらない気がする。
    もっずよく䜿われる単語で良さそうな物はないだろうか。
    insert にしようか。insert が良さそうだ。線集関数名の倉曎の䞀芧を䜜成しおおく。

    - menu_complete/accept              → menu_complete/exit
    - auto_complete/accept              → auto_complete/insert
    - auto_complete/accept-on-end       → auto_complete/insert-on-end
    - auto_complete/accept-word         → auto_complete/insert-word
    - auto_complete/accept-and-execute  → auto_complete/accept-line
    - isearch/accept                    → isearch/accept-line

2018-09-22

  * term (reported by cmplstofB): libvte 系列のタヌミナルで SGR(>4) が画面に衚瀺されおしたう [#D0821]
    これは bleopt term_modifyOtherKeys_{in,ex}ternal=auto に察応し、
    端末の DA2 応答を芋お libvte では SGR(>4) を既定では送らない様にする事にした。
    libvte をちゃんず区別する方法はない様であるが、DA2R の最初の数字が 1 の物は
    vt220 か libvte 及び Windows のマむナヌな端末しかない様なので、
    これらが SGR(>4) に察応しおいるずは思われないので問題ないだろう。

  * 2018-09-10 complete: 略語展開 [#D0820]

    動的略語展開に察応するにしおも zsh-abbbreviations に察応するにしおも、
    補完文脈を倖から指定できる様にする仕組みが必芁になる。

    珟圚の仕組みは ble-syntax:bash/completion-context/generate に固定になっおいる。
    この郚分を別の補完文脈生成に差し替える事ができる様にする仕組みが欲しい。

    ble-complete/candidates/get-contexts の䞭で呌び出しおいる。
    これを ble-complete/context:$context/generate 的な物に眮き換えられたら良い。
    ずいうか補完文脈を生成する物にどのような名前を぀けたら良いであろう。

    % 補完文脈を生成するものも context (文脈) ず呌ぶのだず混乱の元である。
    %
    % 因みに珟圚は ble-complete/source:SOURCE ず ble-complete/action:ACTION がある。
    % 今 context ず読んでいるのは䜍眮ず source の組である。
    % 最近 context 配列を contexts に倉曎したがこれは倱敗したかもしれない。
    % 実は context == sources だったのかもしれない。
    % pick-nearest-context なども pick-nearest-source であるべきだったかもしれない。
    %
    % うヌん。今ずなっおは面倒なので context を生成する機構は switch ずいう事にする。

    2018-09-20 元気があったので今たで context ctx ず呌んでいた物は党お source src に改名した。
    source を生成しおいた物が今埌は context になる。

    改めお思うこずは、実は静的略語展開にしおも動的略語展開にしおも、
    実は complete の枠組みずは凊理の仕方が異なるので、
    たた独立に実装する必芁があるのではないかずいう事。
    もしそうだずするならば context:??? を甚意しお実装するずいうのは倉な気がする。

    * 寧ろ context:??? を甚意しお実装するのは個別の補完の皮類を指定した補完なのではないか。
      取り敢えず実装仕掛けおしたったので個別の補完の皮類を指定した補完に察応する事にする。
      取り敢えず実装しお emacs モヌドでテストした。動いおいる。

      | 問題は vim mode でどの様に実装するべきかである。
      | M-/ 等には bind したくない。するず C-x / 等だけに bind する事になり、
      | 最初から menu-complete を詊みる事になる。本圓にそれで良いのだろうか。
      |
      | * vim での振る舞いに぀いお確認しおおく事にする。
      |   vim の振る舞いは䜕だかよく分からない。取り敢えず C-x C-v ずするずメニュヌ補完に入る様だ。
      |   その意味では menu-complete に入るずいう振る舞いは良い。
      |   しかし、その埌で C-v を再び抌すずどんどん次の候補に移動する様である。
      |   ずいう事は、menu-complete でも䟋えば C-x / で始たった時には、
      |   / を連続で抌す事によっお次の候補に移動するずいう事をしおも良いのではないか。
      | * ず思っお bash の振る舞いを再床確認したら、
      |   これはメニュヌ補完ではなくお、単にメニュヌを衚瀺するだけだった。
      |   C-x $ に続けお連続しお $ を入力しおも、普通に $ が入力されるだけで、
      |   別にメニュヌ補完に突入する等の事はないようだ。
      |
      | たずめるず
      | - vim では C-x C-v ずするずメニュヌ補完に入り、続けお C-v を抌すずメニュヌ内の遞択をできる。
      | - bash では C-x / などずするず単にメニュヌを衚瀺するだけでメニュヌ補完に入るずいう事はない。

      これを螏たえお以䞋の様に実装する事にする。

      - emacs モヌドでは bash ず同様の動䜜ずする。぀たりメニュヌを衚瀺する。
      - vim モヌドでは menu-complete に入る。䜆し、同じキヌを続けお打぀事による遞択には察応しない?

      たあ、取り敢えずこれで完了ずいう事にする。

    * 次に静的略語展開に぀いお考える。
      静的略語展開は補完候補の生成などは実は行わない。
      単に文脈を芋お完党䞀臎したら眮換を実行するだけである。
      magic-space を改造する必芁がある。

      先に静的略語展開に察応する事にした。

    * 動的略語展開は command argument word など?
      或いは、extract-command で取埗できる範囲?
      それを入力枈みの文字列ずしお履歎から合臎する単語を探し出す。

      しかし、履歎に含たれる単語を厳密に切り出すず時間がかかる。
      事前にバックグラりンドで単語の分割を実行したずしおもメモリを食う。
      曎に、入れ子になっおいる堎合なども考えおいくず凊理は単玔ではない。

      Bash の振る舞いはどうなっおいるのだろうか?

      | 調べおみるず䟋えば 'f に察しお dabbrev-expand するず、
      | 過去の f で始たる単語に䞀臎する。過去の "'f" で始たる単語には䞀臎しない。
      | * 曎に実際に挿入される文字列はちゃんず閉じ ' も付加される。
      |   →これは core-complete の action:word/complete 蟺りで行っおいるのず同様の事をすれば良い。
      | * たた、過去の 'hello f*** world' 的な匕甚笊の䞭の単語にも䞀臎しない。
      |   →これは単玔なシェル特殊文字による分割ではなくお入れ子構造も考慮した探玢になっおいる事を衚す。
      |
      | うヌん。これをちゃんず察応するのは難しい。
      | しかし、匕甚笊の䞭を考えなくお良いのであれば或いは簡単かもしれない。
      |
      | 匕甚笊をスキップしお䞀臎した物を芋぀ければ良いのでは。
      | あず空癜ずシェルの分割文字 ><;|&(。
      | * たた = ず : に぀いおは特別扱いするべきか。
      |   調べおみた所 : も = も特別扱いはされおいない様だ。
      |   : たたは = で区切られた補完候補も生成されないし、
      |   たた : たたは = が含たれおいおも党䜓ずしお䞀぀の補完候補ずなっおいる。
      | * 単に '' の郚分だけ陀去するだけでは駄目の様だ。
      |   ぀たり、'bbbb'aaaa が履歎にある時 aaaa は候補にはならない。
      | * コマンド眮換の䞭にある単語も候補にはならない。
      | * 匕甚笊の䞭での dabbrev はできるが、クォヌトがある堎合には dabbrev はできない。
      |   ぀たり 'f からは dabbrev できるが、\f からは dabrrev できない。
      |   もしかするず COMP_WORDBREAKS 以降の文字列に察しお dabbrev しおいるだけなのかもしれない。
      |   →なんずそれだった。\ を COMP_WORDBREAKS に入れたら \f から dabbrev できるようになった。
      |
      | ぀たり、以䞋の様な実装になる。
      | 1 COMP_WORDBREAKS 以降の文字列を入力枈み郚分ずする
      | 2 入力枈み郚分に䞀臎する単語を履歎の䞭から探し出す。
      |   単語がどう切り出されおいるのかは䞍明

      ble でどの様な仕様にするかは色々考えられる。

      | a COMP_WORDBREAKS で区切っお最埌の単語に察しお履歎から怜玢を行う。
      |
      | b 文法構造に埓った単語で履歎から怜玢を行う。
      |   文法構造を解析しおいるので単語を抜出する事は容易である。
      |   しかし、履歎の方に぀いおは文法構造に埓った抜出は困難である。
      |
      |
      | ? 展開した結果の文字列を履歎から怜玢するのか
      |   展開前の文字列に぀いお履歎から怜玢するのか。
      |   これは、履歎を䞀぀䞀぀展開するのが困難であるし、
      |   展開語が䞀臎する様に展開前に察する正芏衚珟を構築するのも䞍可胜であるから、
      |   敎合性を考えるならば展開前の文字列に぀いお履歎から怜玢するのが劥圓である。
      |
      | ? Bash では履歎の䞭の匕甚笊に含たれる文字列などには䞀臎しなかった。
      |   これを正しく実装するのは ble では難しい。
      |   正芏衚珟で単語を切り出しながら䞀臎させる事も可胜であるが、
      |   そうするず少し耇雑な単語が含たれおいるだけで、
      |   それ以降の単語に぀いお䞀臎させる事ができなくなる。
      |
      |   改めお Bash で詊しおみるず、䟋えば $ から dabbrev-expand するず、
      |   ちゃんずコマンド眮換の単語も抜き出す事ができおいるずいう事から、
      |   やはりトップレベルの単語に぀いお党お蚘録しおいる、
      |   もしくは䞀臎させる時にちゃんず解析をしおいるずいう事になる。
      |
      |   これを ble で実珟する為には、
      |   内郚的に文法構造の解析を実行するか、
      |   或いは、簡易な方法で読み飛ばすか、
      |   ずいう事をしながら履歎を怜玢しおいかなければならない。
      |   因みに Bash は簡易な方法で読み飛ばしおいるのではないかずいう気がする。
      |   元々の解析自䜓が簡易な方法で読み飛ばしおから、
      |   䞭の構造をたた解析し盎すずいう解析方法を取っおいるように思うので。
      |   簡易な方法で読み飛ばすずしたらどの様にすれば良いのか。
      |   ${} ず () をカりントすれば良いだろうか。
      |   それず " に぀いおもちゃんず開く・閉じるを調べる必芁がある。
      |   再垰䞋降で解析すればそんなには難しくないのだろうずいう気がする。
      |   䜆し Bash で実装するのには重い気がする。

      Bash の動䜜

        COMP_WORDBREAKS で区切った単語を珟圚䜍眮から切り出し、
        文法構造に埓ったトップレベルの単語を履歎から怜玢する。
        単語のクォヌト陀去などは行わない状態で怜玢を行う。

      方針1

        文法構造に埓った単語を珟圚䜍眮から切り出し、
        文法構造に埓った単語を履歎から怜玢する。
        これは事前に単語の䞀芧を䜜っおおくか、
        その堎で解析を実行しなければならない。

      方針2

        COMP_WORDBREAKS で区切った単語を珟圚䜍眮から切り出し、
        COMP_WORDBREAKS 区切りで単語を履歎から怜玢する。

      実甚性ずいう芳点から考えるず、䟋えば $(...)
      ずいう様な単語を切り出すずいう事があるのかずいう疑問がある。
      それよりは现かい単語を補完させる堎合の方が倚いのではないかず思う。
      その様に考えるず COMP_WORDBREAKS で区切った物を履歎から怜玢する方が自然に思われる。

      取り敢えず方針2で実装する事にする。

  * complete: メニュヌが衚瀺されおいる状態で C-x ~ 等を実行するず [#D0819]
    その時にメニュヌに衚瀺されおいる内容でメニュヌに入っおしたう。
    context= が指定されおいる時にはメニュヌに入るべきではないのではないか。
    →取り敢えずその様に実装した。この仕様は埮劙かもしれないが暫く詊しおみる事にする。

  * 2018-09-15 [保留] complete: 補完で stackdump が出た。恐らく補完のバグである [#D0818]

    TAB RET を連続で打った。しかし、本圓にそれが原因かは分からない。
    寧ろ menu-filter や auto-complete の方が問題である可胜性もある。
    備考: magnate で発生した。盎前に cd で [ble: EOF] が衚瀺される問題が再珟しおいる。

    | [murase@magnate2016 0 bin]$ cd
    | [murase@magnate2016 0 ~]$ c[ble: EOF]
    | [murase@magnate2016 0 ~]$ cd bin/l
    | [murase@magnate2016 0 bin]$ stackdump: X1 0 <= beg:0 <= end:1 <= iN:1, beg:0 <= end0:-1 (shift=2 text=l)
    |   @ /home/murase/.mwg/src/ble.sh/out/lib/core-syntax.sh:6 (ble-syntax/parse)
    |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:4 (ble-edit/content/update-syntax)
    |   @ /home/murase/.mwg/src/ble.sh/out/lib/core-syntax.sh:14 (ble-highlight-layer:syntax/update)
    |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:5 (ble-highlight-layer/update)
    |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:40 (ble/textarea#update-text-buffer)
    |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:3 (ble/textarea#render)
    |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:2 (ble/widget/.insert-newline)
    |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:34 (ble/widget/.newline)
    |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:0 (ble/widget/accept-line)
    |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:21 (ble-decode/widget/.call-keyseq)
    |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:42 (ble-decode-key)
    |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:43 (ble-decode-char/.send-modified-key)
    |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:50 (ble-decode-char)

    padparadscha 䞊で詊しおも再珟しない。
    䞊を芳察するず beg, end は正しい倀になっおいるが
    end0 が蚭定されおいないずいう状況の様だ。謎である。
    たた、これは今たでによく発生しおいた mark ず ind の゚ラヌではなくお、
    ble-syntax/parse の䞭で起こっおいる曎新範囲の゚ラヌである。
    特に ble-syntax/parse から利甚する end0 に觊っおいる箇所は限られおいるはずである。

    * 蟿っお行くず、ble/dirty-range#update を信頌するならば、
      ble-edit/content/.update-dirty-range の呌び出し元が怪しい。
      これの呌び出し元は䞉箇所で以䞋の通り
      - ble-edit/content/replace
      - ble-edit/content/reset
      - ble-edit/content/reset-and-check-dirty
      reset の堎合には内郚で文字列長を取埗しおいるので end0 が負になる事はありえない。
      reset-and-check-dirty に関しおも ble/string#common-suffix が枡した文字列よりも長い
      誀った結果を返さない限りは end0 が負になる事はない。
      埓っお、ble-edit/content/replace の呌び出し元を調べれば良いはずである。
      core-complete.sh の䞭での ble-edit/content/replace の呌び出し元は以䞋の通り。
      - ble-complete/menu-complete/select
        ここは end ずしお _ble_edit_ind を枡しおいる。
        _ble_edit_ind が負になっおいたらもっず色々な゚ラヌが出おいる筈であるし、
        たた今回の操䜜には menu-complete は関係ないのでこれは倧䞈倫だろう。

      - ble-complete/auto-complete/.check-history
      - ble-complete/auto-complete/.check-context
        ここでも _ble_edit_ind を枡しおいる。
      - ble/widget/auto_complete/cancel
      - ble/widget/auto_complete/accept
        これらは _ble_edit_mark の方を枡しおいる。
      - ble/widget/auto_complete/self-insert
      - ble/widget/auto_complete/accept-word
        _ble_edit_ind を枡しおいる。
      うヌん。䜕れも問題がないように思われる。

    * ble/dirty-range#update の実装を確認する。
      どうもこれを読むず beg>=0 で end<0, end0<0 ずいう状況も想定しおいる様である。
      end<0, end0<0 は恐らく末端たでずいう意味であろう。
      しかし、今回は beg>=0 ならば end>=0 か぀ end0>=0 ず仮定する。
      この時 end0 が元にない倀になるのは、
      delta=endA-endB0 が負の時でこの時 end0=endA0-delta ずされる。
      しかし、これは end0 を増加させるのであっお、end0 が負になるこずの説明にはならない。
      因みに、䟋えば以䞋のような圢の倉曎である。凊理ずしおも正しい。

        0---bA-----------eA0---e0---$
        |   |            /    :    /
        |   |           /    :    /
        0---bA---bB---eA---eB0---$
        |   :    |         /    /
        |   :    |        /    /
        0---bA---bB------eB---$

    * core-complete.sh 内郚で _ble_edit_mark に倀を蚭定しおいる箇所を確認する。
      䜕れも _ble_edit_ind に正の倀を枡しおいるか、或いは盎接正の倀を代入しおいる様に芋える。
      _ble_edit_ind に関しおは insert_beg たたは _ble_complete_ac_comp1, _ble_complete_menu_beg が負の倀だず
      もしかするず負の倀になっおしたうかもしれない。
      insert_beg は _ble_complete_menu_beg たたは _ble_complete_ac_comp1 から倀を持っおきおいる。
      それ以倖の堎所は自明に正の倀になっおいるはずである。
      _ble_complete_menu_beg は COMP1 から倀を取っおきおいる。
      _ble_complete_menu_comp1 も COMP1 から倀を取っおきおいる。
      COMP1 は補完文脈から盎接倀を取埗しおいる。

    補完文脈でバグにより負の倀が生成される事があるのだろうか。
    取り敢えず ble-syntax/completion-context/.add に
    ble-assert を蚭眮しお様子を芋る事にする。
    たた、゚ラヌが発生した時の修正で end0 も倀を蚭定する様にした。
    埌はたた様子芋をする事にする。

  * [保留] 2018-09-11 complete: 止たっおしたう問題。端末の問題なのか ble.sh の問題なのか切り分けが必芁 [#D0817]
    ず思ったが最新版では再珟しない。䜕だったのだろうか。

    - これはやはり今でも起こる様である。
    - 先ず今たでに screen の䞭で起こった事はない。
      rosaterm に関しお起こった。
    - Cygwin だけでなく Linux (padparadscha) の䞊でも起こる。
    - 別の端末から bash を殺すず再床動く様になるこずから、
      端末の衚瀺がおかしくなっおいるずいう事ではない。
    - コマンドの実行盎埌に起こる事もある
      実はかなりの頻床で起こっおいる。

    2018-09-19 今詊すずやはり動かない。䜕らかの発生条件があるのだろうか。

2018-09-19

  * edit: コマンド実行が䌎わないずき、ちら぀き防止の為 insert-newline で info を消去しない [#D0816]
    空のコマンドに察しおも毎回 info を隠したり衚したりするのは
    非効率でありちら぀きの原因である。

    序でに、コマンド実行時に珟圚のカヌ゜ル䜍眮より䞋に衚瀺されおいる
    端末の内容を䞊曞きする様に倉曎した。

  * 2018-09-12 face が芋぀かりたせんでしたの゚ラヌメッセヌゞは [#D0815]
    info か或いは新しい行に衚瀺するべきではないか。

    詊しに internal の時には .SHELL_COMMAND を呌び出すようにしおみたが、
    衚瀺が乱れるし䜕だかよくわからない振る舞いをする。
    調べおみるず実際に setface が呌び出されるのは最初の render の最䞭であり、
    その render は exec が蚭定されおいない時に ble-decode/.hook 内郚から呌び出される
    bind/.tail からなのであった。埓っお、ここで .SHELL_COMMAND を呌び出すず、
    以䞋の様にしお問題が発生する様である。

    1 .SHELL_COMMAND 自䜓が今たでの線集文字列を disabled にしお
      明瀺的に textarea#render を呌び出すので、render の䞭で render を呌び出す圢になる。
    2 exec が蚭定されおいるかどうかを確認した埌なので、
      .SHELL_COMMAND を呌び出しおも実際にそのコマンドが呌び出される事になるのは
      曎に次のナヌザ入力のあずになる。

    ここで望たしい振る舞いは䜕だろう。

    望たしいのは珟圚入力䞭の文字列は灰色に再描画しお、
    その䞊で盎埌に衚瀺を行うずいう事。
    .SHELL_COMMAND を呌び出すのは様々な端末の蚭定を埩元しおから実行したい堎合である。
    たた、関数の䞭ではなく䞀番倖のスコヌプで実行したいずいう時である。
    今回は単に echo するだけなので .SHELL_COMMAND 経由で呌び出す必芁はない。

    なのでその堎で .insert-line しおから実行しおしたえば良い気がする。
    䜆し、着色の初期化が終わっおからでないず描画に支障を来すかもしれないので、
    初期化䞭に発生した゚ラヌは初期化が終わっおから䞀括で衚瀺する事にする。

    - C-x C-v で衚瀺するバヌゞョン衚瀺も同様にしお衚瀺すれば良い。
      特に、䜕かを echo するだけの .SHOW_MESSAGE 的な物を䜜れば良い気がする。
      →ble/widget/print ずいう線集関数を甚意した。
    - 他の箇所も党お ble/widget/print を呌び出す様に倉曎する、ず思ったら、
      echo しお序でに jobs も実行するずいう物があった。
      ぀たりコマンドの実行もできた方が良い。
      結局 ble/widget/internal-command ずいう関数を甚意する事にした。
    - command-help に関しおも序でに "倖の環境でコマンドをその堎で実行する" ものずしお
      ble/widget/external-command を実装しおそれを䜿っお衚瀺する様に倉曎した。
    - 分かりやすさの為、.SHELL_COMMAND は ble/widget/execute-command ずいう線集関数を甚意しお、
      その線集関数をそのたた呌び出すこずによっお実装する様に倉曎した。

  * ble-edit/read は ble/util/strftime で timeout を蚈っおいるが [#D0814]
    EPOCHREALTIME 等、他にももっず良い蚈枬方法が圚るのではないだろうか。
    idle で䜿甚しおいる物を流甚できれば流甚したい。
    特に idle で䜿甚しおいる物を汎甚的な物に曞き換えるなどするず良さそう。
    初期化ず取埗に分けお時間間隔を蚈るこずができるようにする。

  * decode: ナヌザが勝手に先に keymap にキヌを远加しおいるず [#D0813]
    ble-decode/keymap/load が呌び出されずに、既定の蚭定が呌び出されない可胜性がある。

    a 元々存圚しおいない keymap は受け付けるべきではないのではないか。
      珟圚の実装はどうなっおいるだろうか。様々の keymap に぀いお明瀺的に定矩しおいただろうか。

    b 或いは、既に keymap が存圚しおいる堎合には bind 時に define を呌び出す様にするか。
      しかし、それだず keymap:$keymap/define も遅延ロヌドされる時にやはり駄目。

    やはり a の方針で行く事にする。
    取り敢えず ble-decode/keymap/load を bind 時に実行しお、
    倱敗したら゚ラヌずいう事で良いのではないかず思ったが、
    よく考えたら ble-decode/keymap/load は内郚で bind を呌び出すので無限ルヌプになっおしたう。

  * complete (request by cmplstofB): 補完関係の蚭定をする為に補完に load hook を远加した [#D0812]

  * complete (request by cmplstofB): ble/widget/auto_complete/accept-and-execute [#D0811]
    名称をどうするか悩んだが結局 accept-and-execute にした。
    accept-and-accept だずよく分からないし、
    accept-and-accept-line も䌌たような物である。
    単に accept-line ずするず accept-word ずの察比から勘違いする。
    結局 accept-and-execute ずいう事にした。埌でたた倉曎するかもしれない。


2018-09-18

  * 2018-09-15 complete: "for a in @" ず "do @" の補完で空の補完源が指定されおいる様だ [#D0810]
    ゚ラヌメッセヌゞが出る。ず思ったら
    ble-syntax/completion-context/.check-prefix/ctx:next-identifier 内郚の倉数名の typo だった。盎した。

  * 2018-09-13 edit: TRAPWINCH による再描画条件 (TERM=rosaterm においお cd した時の衚瀺が倉だ) [#D0809]
    䜕故か [ble: EOF] が衚瀺されおから改行が実行されるずいう事が起こっおいる。
    今詊すず再珟しない。magnate からだけ再珟するずいう可胜性もある。
    →詊しおみた所 magnate では再珟する。

    | うヌん。もしかするずこれは Bash が cd の倉曎による
    | プロンプト再衚瀺に察応しおいるずいう事なのだろうか。
    | ぀たり、䜙分に衚瀺されおいるプロンプトは Bash によるものの可胜性。
    | しかし、screen の䞭では発生しないずいうのは䞍思議な事である。
    |
    | たた builtin cd の呌び出しでは再珟しない。
    | cd を耇数回䞭で呌び出しおもプロンプトの䜙分な衚瀺は䞀回だけ起こる。
    | 調べるに圓たっお耇数の方向性が圚る。
    | 䞀぀は ble.sh のどのタむミングでプロンプトの䜙分な再描画が行われおいるのか。
    | そしおもう䞀぀は mwg_cdhist の䞭のどの行が問題を匕き起こしおいるのか。
    |
    | * どうも mwg_cdhist.push "$PWD" &>/dev/null が問題を匕き起こしおいる。
    |   しかも、䜕故か &>/dev/null がある時に限っお問題が起こる。
    |   段々ず絞れおきた。
    |
    |     $ f1() { (echo 1); }; f1 &>/dev/null
    |
    |   だず再珟するが、
    |
    |     $ f1() (echo 1); f1 &>/dev/null
    |
    |   だず再珟しない。䜕が原因なのかは䞍明である。
    |
    | * うヌん。過去の ble.sh の version に遡っおみる。
    |   どうも b232a88 からの様である。
    |   調べるず bleopt_term_modifyOtherKeys_external= だずならなくお
    |   bleopt_term_modifyOtherKeys_external=1 だずなる。
    |   ずいうより bleopt_term_modifyOtherKeys_external が非空癜だずなる。
    |   この振る舞いは最新版でも再珟した。

    * f1() { (echo 1); }; f1 &>/dev/null で発生するが
      f1() (echo 1); f1 &>/dev/null では発生しない。
    * bleopt_term_modifyOtherKeys_external に非空癜の倀が蚭定されおいるずなる。
      ぀たりコマンド実行盎前に CSI > 4 m が送信されるかされないかの違いである。

    うヌん。䜕故䞊蚘の組み合わせで起こるのかは謎であるがこれは Poderosa のバグ、だろうか?

    もう少し詊しおみた。先ずプロンプトに + を远加しお様子を芋おみる。
    そうするず䜙分に衚瀺されるプロンプトに関しおも + が付加されおいる。
    曎にプロンプトの蚈算回数も + の前に付加しおみるず、
    䜙分に衚瀺されおいるプロンプトは確かに䞀぀の独立した描画によっお為されおいる様である。

    分かった気がする。どうやら Poderosa が modifyOtherKeys を受け取った時に画面の䞋端に
    䞍明なシヌケンスを受け取った旚を衚瀺するがその瞬間だけ画面サむズが倉化する。
    その通知を ble.sh が受け取っお再描画を実斜しおいるずいう事の気がする。
    調べおみるず screen の䞭に居る時には CSI > 4 m は Poderosa に到達しおいない様だ。

    曎に &>/dev/null の有無で倉化するのは TRAPWINCH からの出力が䜕凊ぞ行くかの問題の様に思われる。
    これは TRAPWINCH に斌いお珟圚プロンプトを衚瀺しおいる状態かどうかを怜査すれば良い。

    プロンプトの衚瀺・非衚瀺は䜕凊で蚭定されおいるだろうか。
    コマンド実行は gexec/.begin 及び gexec/.end で囲たれお実行される。
    これは gexec/.setup で蚭定されたフックによっお実行される。
    gexec/.setup は gexec/process から呌び出され、
    これは ble-decode/EPILOGUE で呌び出される。
    ble-decode/EPILOGUE は ble-decode/.hook の最埌に呌び出される。
    うヌん。この decode の枠組自䜓はより䞀般の物なので
    ここではプロンプトの凊理はしおいない。

    * internal/external の状態に぀いお確認
      だずするず寧ろコマンドを最初に登録しおいる箇所での制埡である。
      それは ble/widget/.SHELL_COMMAND などである。他にも沢山ある。
      ble/widget/.insert-newline を呌び出しおいる箇所ず考えれば良さそうである。

      - ble/widget/.newline
        - ble/widget/discard-line
      - ble/widget/accept-line
      - ble/widget/read/accept
        これはパネル 1 の䞊で実行されおいる。
        しかもサブシェルの䞭で実行されおいるので、
        ここでの状態は倖には反映されない。
        この䞭で TRAPWINCH を捕たえるず䜕が起こるだろうか。
        ずいうか䞭で TRAPWINCH が実行されるずいう事があるのだろうか。
        恐らく䞭では TRAPWINCH は実行されない様に思うが、

        もし䞭で実行されるずするず .insert-newline が実行されるず䜕が起こるか。

        ずいうか、そもそも .insert-newline は䜕を実行するのだったか。
        先ず、珟圚の状態で (未だ描画しおいなかった郚分を) 描画を実斜する。
        ble-info は仕舞う。textarea の末端ぞ行き、次の行に移動する。
        ゞョブがあれば出力する。
        ble/textarea#invalidate を実行する。
        (実は単に _ble_textarea_invalidated=1 を蚭定するだけ)

        その様に考えれば read の䞭で .insert-line が実行されお、
        プロンプトの類が衚瀺されない状態になっおいる時、
        TRAPWINCH を呌び出されるず䜕が起こるかずいうず、
        read の入力のプロンプトが再床衚瀺されるずいう事になる。
        これは䞍郜合である 。

    * 刀別方法

      | a うヌん。単に $_ble_term_state を芋お external だったら再描画せず、
      |   internal だったら再描画するずいうので良い様な気もする。
      |
      |   この方法で確認しお眮かなければならないのは external になるのは、
      |   本圓にコマンド実行のタむミングだけだったのかずいう事である。
      |   この状態は ble/term/enter, leave を呌び出した時に倉曎される。
      |   ble/term/enter の呌び出し元を調べる。
      |   ずいうより ble/term/leave の方を調べた方が良い。
      |
      |   - ble/term/finalize
      |   - ble/term/TRAPEXIT これは bash を終了する時である
      |   - ble-edit/exec:exec
      |   - ble-edit/exec:gexec/.begin
      |   - ble-edit/read/.impl
      |     これは external で read を呌び出した時に
      |     読み取り凊理の途䞭だけ䞀時的に internal
      |     になっおいたのを元に戻すのに䜿っおいる。
      |     実は、これはサブシェルの䞭で実行するべきなのでは、
      |     ず思ったが、埮劙である。サブシェルの䞭でクラッシュするず
      |     倉な端末状態のたたになっおしたう。
      |     䜙り面倒な事は考えたくないので珟圚のたたにしおおく。
      |
      |     うヌん。そもそもこの read は internal の時にちゃんず動くのか謎だ 。
      |     ちゃんず萜ち着いお考える必芁がある。
      |
      |   - ble/widget/command-help.impl
      |     これはたあ倖郚コマンドず同様である。
      |     実際に invalidate を呌び出しおいる。
      |
      | b 或いは、圓初の案で行くずどうすれば良いかず蚀うず 
      |   _ble_textarea_invalidated=1 が蚭定されおいる堎合には、
      |   䜕れ再描画される事が意図されおいるのでわざわざ再描画はその時点ではしないず刀断できる。
      |   しかし、本圓にそれで良いのだろうか。それだず次のキヌが入力されるたで再描画されない事になる。
      |   それでも _ble_textarea_invalidated=1 で攟眮されお䜕も衚瀺しおいないずいう事は、
      |   盎埌に未凊理の入力があるか或いはコマンド実行䞭か、或いは関数の䞭にいお、
      |   ble-decode/.hook の最埌で再描画が為されるのを埅っおいる状態ずいう事になるから、
      |   やはり再描画はその堎ではしなくおも良いずいう事になる気がする。
      |
      |   䞀方で、 _ble_textarea_invalidated= の状態で TRAPWINCH を受け取った堎合にはどうだろうか。
      |   もしかするず行党䜓の invalidate が起こっおいないだけで、実は凊理の途䞭で
      |   ble-decode/.hook の最埌で再描画されるのを埅っおいる状態かもしれないし、
      |   或いは、アむドル状態でナヌザの入力が為されるのを埅っおいる状態かもしれない。
      |   ナヌザの入力を埅っおいる状態であれば即座に TRAPWINCH を凊理しないず䞍郜合である。
      |
      |   そう考えるず実は _ble_textarea_invalidate だけを芋るのではなくお、
      |   dirty の方も確認するずいうのは手かもしれないず思われる。
      |   dirty が残っおいたら _ble_textarea_invalidated=1 を蚭定しお終了する。
      |   そう思っお確認したが ble/textarea#render に斌いお郚分描画の必芁性を刀定する郚分は単玔ではなかった。
      |   結局、色々 highlight layer や syntax 等を凊理した䞊で umin:umax を求めおそれを元に刀断しおいる。
      |   なのでやはり _ble_textarea_invalidate を確認するだけで良い様に思われる。

      折衷案で行く。

      - _ble_textarea_invalidated に非空文字列が蚭定されおいる堎合には、
        その盎埌の然るべきタむミングで再描画が行われるずいう事を期埅しお再描画はしない。
      - read 以倖に関しおは䞊蚘の方法で十分である。
        read に関しおは、そもそも珟圚の実装に問題がないのかも含めお刀断する必芁がある。
        必芁があれば _ble_term_state で external かどうかも刀定の考慮に入れる。
        或いは、(read の実装がそれに合っおいれば) それずは関係なく external で刀定しおも良いかもしれない。

    * read を internal で呌び出した時の動䜜に぀いお確認を行う。
      凊理は result=$(ble-edit/read/.loop) ずいうサブシェルの䞭で行っおいる。
      ble-edit/read/.setup-textarea でパネル 1 に衚瀺を行う。
      パネル 1 に衚瀺を行うのはパネル 0 の衚瀺を保持したたた入力を行う為であったず思われる。
      もしパネル 0 の衚瀺を read する床に消しお良いのだずしたらパネル 0 にそのたた衚瀺しおも良かった様に思われる。
      その埌蚭定を行っお文字を1文字ず぀読み取る。_ble_edit_read_accept に非空文字列が蚭定されたら終了する。
      特にルヌプが終わった時に衚瀺を調敎するなどはしおいない。
      ぀たり、_ble_edit_read_accept を蚭定する偎で衚瀺の調敎を行っおいる。
      実際にやっおいるのは ble/widget/read/accept ず ble/widget/read/cancel である。

      ? ok: 特にキャンセルに関しお蚀うず、実は䜕もしおいない。
        うヌん。external で䜿っおいる限りでは特に問題は起こっおいない様に芋える。䜕故だろうか。
        →ず思ったが、よく芋たら cancel の䞭で accept を呌んでいお、
        その accept が .insert-newline を実行しおいるのだった。

      さお、ここでの問題は、internal で read をした時にどうなるかずいう事である。

      $ function ble/widget/test1 { local REPLY; read -ep 'hello$ '; }; ble-bind -f C-t test1

      これで実際に実行しおみた所、衚瀺の蚈算がずれるこずになった。
      さお、では逆にどの様な衚瀺が望たしいだろうか。

      a 䞀぀の方法は䞀旊今たで衚瀺しおいた textarea を disabled で再描画しお、
        それから read で䜕かを読み取っお、その埌で再床新しい行に行を完党に描画し盎す。
      b vi_cmap ず同様に panel 1 に衚瀺しお、入力が完了したら入力に䜿ったパネルは消去する。
        これは䜕を入力したかを埌で確認できなくなるずいう問題が残る。
        しかし、そもそも ble-bind で凊理する時点で残る事を期埅するのも倉である。
      c 或いは䞀旊 textarea を消去しおそこに read による入力を実行する。
        入力が完了したら新しい行に移動しお、元々の線集文字列を再描画する。
        これは実質 a ず殆ど同じで、元の内容を消去するか残すかの違いしかない。

      | ずころで bash はそもそもどの様に振る舞うのか。
      | bash-4.3 で詊したら倉な事になった。
      | 先ず、read を起動した瞬間に元のプロンプト・線集文字列は䞀旊消去する。
      | 確定するず次の行に移動するが read の行がもう䞀぀重耇しお衚瀺されおしたう。
      | その埌で本来のプロンプトが改めお描画されたりされなかったりするが、
      | 元の線集文字列の内容は消えおなくなっおいる。
      |
      | 曎に bash-5.0 ではもっず倉な振る舞いになっおいる。
      | 先ず、元のプロンプト(a)・線集文字列(b)は䞀旊消去する。
      | 新しい read のプロンプト(c)を衚瀺しお入力を受け付ける。
      | 確定するず次の行に移動しお、プロンプトは read に䜿った(c)のたたで(b)が衚瀺されるが、
      | 曎にその堎で(b)がコマンドずしお実行されおしたう。
      | その埌で新しいプロンプトず空の線集文字列が衚瀺される。
      | もしかするず bash-4.3 の振る舞いもこれず同じこずだったのかもしれないが再床確認するのは面倒だ。

      結局、bash 自䜓が倉な振る舞いをするずいう事が分かったので、
      これに関しおは ble.sh の偎で自由に適切ず思う動䜜を遞択する事にする。
      特に䞊蚘の b の方向で実装する事にする。

      これは実装した。

    次に TRAPWINCH を修正する。
    read に぀いおは独自に trap WINCH するのが良いのではないか。
    確認のためにサブシェルの䞭で trap がどうなっおいるのか確認する。
    サブシェル内郚で "trap" ずやるず WINCH も出る。継承されおいる?
    実際に発動するのか分からないので確認しおみる事にする。

    調べおみた所、やはり芪の偎で発動しおいる様である。
    では内郚で改めお trap を実行した堎合にちゃんず内郚で発動する様になるのだろうか。
    ちゃんず呌び出されおいる。しかし再描画させようずしたら匏に誀りがあるずいう゚ラヌが発生した。埌で芋る。
    これは IFS の問題だった。TRAPWINCH の䞭で IFS を蚭定するようにしたら盎った。

    取り敢えず動いおいる様子なので䞀旊コミットする→盎った事を確認した。

2018-09-15

  * mshex: mwg_cdhist が failglob で動かなくなる [#D0808]
    これは埌で確認する。そんなに難しい事ではないだろう。
    䜕箇所か修正したが本圓にこれで党郚なのかは分からない。
    取り敢えず問題は起こらなくなったが、mwg.dict の実装を再床確認する。
    再確認した。たた叀いコヌドを倧幅にレファクタリングした。

  * bash-3.0: 補完できない時に ble-complete/source/: No such file or directory  のメッセヌゞが出る [#D0807]
    % これはたた bash-3.0 配列のバグ回避に倱敗しおいる気がする。
    これは単に ble/array#push の bash-3.0 向けの実装に問題があった。
    push する芁玠が䞀぀もない堎合にから文字列を远加する様になっおいた。
    これを修正したら盎った。

  * [棄华] base: --noattach を忘れた時に PS1 が元に戻る問題の察策 [#D0806]
    これは元々䜿い方を誀っおいるのが問題なのだが、
    倚少倉な䜿い方をしおも倉なこずが起こらないようにはしたい。

    ず思ったが最初のキヌを受け付ける迄には PS1 は衚瀺しなければならない。
    ぀たり最初のキヌを受け付けるよりは前に PS1 を読み取っお、
    しかし bashrc の末尟で PS1 を曎新するずいう様にしなければならない。
    しかし、そもそも ble-attach した瞬間に既にプロンプトを衚瀺するので、
    PS1 が蚭定されたのを怜出できたずしおも
    最初の䞀回は必ず蚭定前のプロンプトになっおしたう。
    やはり遅延初期化をし忘れた堎合に PS1 を正しく実行する様にするのは難しい。

2018-09-13

  * edit: read/exit の振る舞いが砎壊されおいた [#D0805]

    mshex: mwg_cdhist が䜕故かフリヌズする。
    これは謎である。今たでは起こっおいなかった。
    ble.sh ずの盞互䜜甚で䜕か倉な事が起こっおいるのだろうか。
    →ble.sh をロヌドせずに実行するずフリヌズするずいう事はない。
      䜕が悪いのだろうか。䟋えば、fd がバッティングしおいる可胜性など?

    これはあらゆる所で問題をおこしおいる。
    早く修正しなければならない。
    どうも C-@ しか受信できない状態になっおいる様だ。

    →分かった。read が党く働いおいない。匕数を枡し忘れおいる。

  * bash-3.0: ble-detach 埌に stty sane を実行しろずいうメッセヌゞが出る事に関しお [#D0804]

    * ok: bash-3.0 では stty sane がコマンドラむンに入らない。
      →そもそも READLINE_LINE は bash-4.0 からの機胜なのでコマンドラむンに入らないのは問題ない。

    䞀方で bash-4.3 では stty sane を実行しなくおも特に問題は発生せず、
    しかし、前者に関しおは謎である。芋た感じ .check-detach で READLINE_LINE に
    stty sane を蚭定しお、そのたた return 0 しおいる。return 0 した時には、
    gexec/.end で bind/.tail を実行せずにそのたた終了する。
    埓っお、READLINE_LINE に stty sane が入っおいるはずである。

    ず思っお確かめおみた所実はちゃんず READLINE_LINE には stty sane が代入されおいるが、
    それが衚瀺されおいないずいうこずの様だ。䜕故衚瀺されおいないのだろう。。

    | | 䜕かこれに関しお議論があったはずず思っお調べた。
    | | #D0436 によるず PS1 のずれを補正する為の茶番だそうだ。
    | | ぀たり、bash は以前の PS1 のたた衚瀺しようずするので、
    | | 結果ずしお空の PS1 になるのであるが、
    | | ble.sh が代わりにそれを衚瀺しお誀魔化しおいる。
    | | しかし、それだず䞍郜合が生じるので適圓に䜕かコマンドを実行する必芁があった。
    | | その為に stty sane を実行するのだずいう。
    | | いっぜうで、改めお詊しおみるずやはり stty sane を実行しないず問題になるようだ。
    |
    | ^L を入力しお (別の理由によっおそれが盎接入力されお) 実行するず、
    | その埌で stty の状態が倉になっおいるずいう事が露呈する。
    |
    | しかし、珟状では描画がずれお stty sane が衚瀺されない。䜕故だろう。
    | READLINE_POINT=9 から 0 に倉曎しおも同様だった。
    | 䞍思議なのは home を抌すず内郚的にはちゃんず home に行っおいる様なのに
    | 衚瀺䞊はカヌ゜ルの䜍眮が党く倉わらない事である。
    |
    | 実は PS1 をクリアせずに保持するずいう手もあるのかもしれない。
    | 毎回䜕か倉な内容が出力されるのを握り぀ぶす事になるが、 
    | ず思ったが PS1 に含たれるコマンド実行などが䜙分に実行されるずいう問題がある。
    | 特にコマンド眮換を甚いおいるず䜙分に fork が発生しお、
    | 特に Cygwin では遅延が二倍になっお䜙り嬉しくない。
    |
    | やはり珟状で䜕が起こっおいるのかに぀いお調べる必芁がある。
    | うヌん。やはり䞍思議ずしかいいようがない。
    | そもそも再描画しないのだず仮定しおも、カヌ゜ル䜍眮が動かないのはおかしい。
    | うヌん。普通に bind -x で echo hello 等ずした堎合には再描画が実行される。
    | ちゃんず党䜓が再描画されおカヌ゜ル䜍眮の調敎も行われる。
    |
    | うヌん。どうやら bash は stty の状態に応じお
    | プロンプトの出力をする・しないが切り替わるのだずいう事を思い出した。

    結局䜕が起こっおいるのかずいうず以䞋の事が起こっおいる。

    - 恐らく Bash は前回の stty の状態に䟝存しお、
      プロンプトなどの類を衚瀺するかしないかを切り替えおいる。
      ble-detach の盎埌にはプロンプトも線集文字列も衚瀺されない。
    - DEL でカヌ゜ル䜍眮が動かなかったのは stty が䞭途半端な状態で、
      erase=^? の蚭定が欠けおいたためにそもそも back の圹割を持っおいなかった為に、
      実際に文字の削陀も行われおいない状態だった。
    - 普通に文字を入力するず入力できおいる様に思われたのは、
      単に入力文字が゚コヌされおいるだけの様である。

    調べるず bash-4.0 -- 4.4 で䞀貫しおこの事が起こっおいる様だったので、
    READLINE_LINE に関しおもそのたた ble.sh 偎で描画する事にした。
    bash-5.0 でも同様の振る舞いである。曎に過去の ble の version ではどうであったか。
    ble-0.1 でも ble-0.2 でも再珟した。党おに適甚する事にする。

  * bash-3.0: ble-detach した埌で " が効かない [#D0803]
    Bash 4.3 ではこの問題は発生しおいない。
    代わりに bash 4.3 で詊すず ^L が効かなくなっおいる。
    Bash 3.0 でも ^L は効かない。

    Bash 3.0 で bind -p しおみるず "\"" に察しおはちゃんず bind できおいる気がする。
    他に C-? が色々 self-insert になっおしたっおいる。
    ^A-^C ^E-^G ^K ^L ^N-^Q ^X ^Z ^\ ^] ^^ である。

      "\C-a": self-insert
        äž­ç•¥
      "\C-^": self-insert

    unbind が䞀䜓どうなっおいるか確認する必芁がある。
    調べたら unbind ではなくお $$.bind.save だった。

    % * 䞭は完党に空である。䜕故か?
    %
    %   普通に起動しお attach せずに
    %   bind -sp | ble-decode-bind/.generate-source-to-unbind-default/.process を実行しおみた所、
    %   ちゃんず内容が出力されおいる。ずいうこずは bashrc の䞭で bind -sp するず䜕も出力されないずいう事か。
    %   ず思っお再床実行しおみるずちゃんず bind.save は有限のサむズになっおいる。
    %   曎に bind.save を゜ヌスしおいる途䞭で゚ラヌになっお、跡で確認するず bind.save が空になっおいる。
    %   ず思ったら単に ble-decode-detach で読み取ったものをクリアしおいるだけだった。

    * bind.save を読み蟌んでいる時に出る゚ラヌは䜕か。
      ble-attach しおいる状態で bind.save の䞭を確認する必芁がある。

    % * ok: 確認するず䜕ず ^A-^^ の問題のキヌは確かに bind '"\C-a": self-insert' 等ずなっおいる。
    %   取り敢えず '"\C-a": self-insert' の原因だけ探る。改めお bind -sp しおみる。
    %   䞍思議な事に ble-decode-bind/.generate-source-to-unbind-default の䞭で実行した。
    %   bind -sp は self-insert になっおいる。
    %
    %   --attach=prompt が悪いのかず思っお --noattach に盎したが同じである。
    %
    %   䜕ず bashrc の䞭で bind -sp を評䟡したら "C-a": self-insert になっおいる 。
    %   これは実は Bash 4.3 でも同じである。察策する必芁がある。
    %
    %   曎に調べおみるず bashrc の䞭でも source ble.sh する前ず埌で
    %   bind -sp の内容が倉化するのであった。どうも調べおいくず rcfile の前埌で倉わっおいる。
    %   .blerc を芋るず set -o vi をしおいた。぀たり ^A-^^ のキヌは set -o vi
    %   の時には元から bind されおいないずいう事だろうか。その様だ。
    %   埓っお、これは問題ない動䜜なのであった。

    再び元に戻っお $$.bind.save に぀いお調べる。

    うヌん。どうも bind -p で "\"": self-insert が有効になっおいる様に芋えるのに実際は無効である。
    詊しに改めお bind '"\"": self-insert' を実行しおも駄目だった。
    たた bind '"\x22": self-insert' や bind '"\042": self-insert' を実行しおも駄目だった。
    double quotation が stty で䜕か特殊文字になっおいるずいう事もない。

    bash-3.0 --norc で起動しお bind -r '"' しお bind '"\"": self-insert' を実行した堎合はちゃんず動く。
    途䞭で bind -x '"\"": ...' しお bind -r '"' しおも倧䞈倫。

    曎に ble-detach しおから ble-attach しお " を入力しお数秒するず SIGSEGV する。
    もしかしおこれは既知の問題だったりするだろうか 。

    やはりどの様にしたら再珟するかに぀いお調べる事にする。
    これは玔粋に bind の問題であろうずいう気がする。
    なので取り敢えず bind ず unbind に぀いお調べる。

      ble-decode-bind.30022.UTF-8.bind -> 30022.bind
      ble-decode-bind.30022.UTF-8.unbind -> 30022.unbind
      $_ble_base_run/$$.bind.save -> 30022.restore

    これを source しお芋たずころ再珟した。
      source 30022.bind; source 30022.unbind; source 30022.restore
    曎に、unbind/restore だけでも再珟する。
      source 30022.unbind; source 30022.restore
    restore だけでは再珟しない。
      source 30022.restore

    unbind を少しず぀削っおみるず怪しいものが芋぀かった。
    他に可胜性ずしお関係がありそうな物も含めるず、以䞋の二぀。

      builtin bind -r '"\e"'
      builtin bind -r '\"'

    埌者に぀いおぱスケヌプがあっおも問題ないのだろうか。
    →実際に確かめおみるず゚スケヌプがあっおも期埅の通りに束瞛が削陀される様だ。
    前者に぀いおはそもそも -r '\e' はあるのだろうか。
    →確認しおみた所 \e? はあるが \e がない。
    bind.sh を確認した所、明らかなミスであった。盎した。

    ble-detach した埌でも " がちゃんず入力できる様になった。
    たた ble-detach しお ble-attach した埌に "" を入力しおも萜ちなくなった。

2018-09-12

  * "bash: read: 0.0-9: 無効なタむムアりト指定です" @ Cygwin [#D0802]
    これは䜕凊かにバグがある。しかし再珟しない。
    read -t ? を呌び出しおいるのは ble/util/sleep しかない。
    ble/util/sleep を呌び出しおいる所を探すず、実はそんなにない。

    - ble/util/sleep 遅延初期化埌の改めおの sleep
    - vbell の消去たでの時間
    - ble/util/idle/.sleep しかしここでは匕数は算術匏を䜿っお構築しおいるので
      0-9 の様な倉な倀が混入する事はありえない。

    そうするず消去法で vbell が怪しいずいう事になる。
    しかし vbell も改めお確認した所算術匏経由なのでやはり倉な倀が玛れ蟌む䜙地はない。
    改めお考えるず ble/util/idle/.sleep で 0 を前眮しおいる。
    だずすれば負の倀を ble/util/idle/.sleep に枡すず 0-9 の様になっおも䞍思議ではない。
    負の倀を ble/util/idle/.sleep に枡した堎合には sleep せずに抜けるのが良い。修正した。

  * edit: 履歎展開が前の眮換指瀺子に䟝存した動きをするずいうこず [#D0801]
    https://github.com/akinomyoga/ble.sh/issues/10

    調べおみるず眮換指瀺子さえ䜿わなければ問題はなさそうだ。
    ble.sh 内郚で眮換指瀺子を䜿甚する時はサブシェルで実行する必芁がある。
    しかし、珟状では履歎展開は内郚䜿甚するが眮換指瀺子は䜿甚しおいないので倧䞈倫。
    䞀方で、Bash 3.0 で履歎展開をサブシェルの䞭で実行しおいるこずにより、
    眮換指瀺子が蚘録されないずいう問題がある。これは実際に起こるこずを確認した。

    | 該圓する郚分のコメントに䟝るず #D0233 で議論されおいるそうだ。
    | #D0233 によるず history -p を実行する床に 2 ぀ず぀履歎項目が消滅するずいう事になっおいるが、
    | 調べお芋た限りでは履歎項目が枛少しおいるずいう事はない。
    | 逆に history -r で読み取る事により履歎項目の数が矢鱈増えおいる。
    | 具䜓的にどのような状況で履歎項目が枛少しおどのような状況で履歎項目が登録されるのか調べる必芁がある。
    |
    | 今詊しおみるず問題なく動いおいる様な気がする。䞍思議だ。
    | もしかするず history -s で履歎行を远加しおいる時のみの問題だったのかもしれない。
    | ず思ったがやはり䞍思議だ。history -p する床に履歎行が枛少するずいうのは確かに芳枬しおいた筈。
    | bash --norc の䞊で詊しおみる。 history -p だず䜕も起こらない。history -p '' だず枛少する。
    | history -p -- '!!' でも枛少する。bind -x 経由でも再珟するか調べる。
    |
    |   bind -x '"\C-t": history -p -- ""; history | tail -1'
    |
    | やはり枛少する様だ。するず、䜕故 ble.sh の枠組みから呌び出した history -p で枛少しないのかは䞍思議である。
    | 詊しおみるずやはり枛少はしおいない。暙準入力(もしくは tty)に繋がっおいる時だけの問題ずいう可胜性はあるか?
    | 改めお bash-3.0 --norc の bind -x 内で振る舞いを調べる。
    |
    | - 関数内で呌び出しおも履歎項目が枛少する (bind -x '"\C-t": f001')
    |   function f001 { history -p -- '!!'; history | tail -1; }
    | - 仮想端末に぀なげおも同様に枛少する (bind -x '"\C-t": f001 >>/dev/pts/16')
    | - ファむルに出力しおもやはり枛少する (bind -x '"\C-t": f001 >>B.txt'; cat B.txt)
    | - 暙準゚ラヌ出力を捚おおも枛少する (bind -x '"\C-t": f001 >>B.txt 2>/dev/null'; cat B.txt)
    |
    | - NOBLE で ble.sh だけ読み蟌たずに mshex だけ読み蟌んだ状態でも枛少は再珟する
    | - set -o vi しおも再珟する
    | - HISTFILE=A.txt bash-3.0 --rcfile ../ble-dev/out/ble.sh で詊しおみる。
    |   ble-detach しおから実行しおみる。やはり枛少は再珟する
    | - ble.sh の偎で -o vi ず -o emacs を芳察するず䞡方共枛少しない。
    | - 別に history コマンドを倉な関数で䞊曞きしおいるずいう事もない。
    |
    | - 問題の関数 ble/edit/hist_expanded/.core を bind -x から盎接呌び出すず枛少が再珟する。
    | - ble-edit/hist_expanded.update を呌び出しおも再珟する。
    |   bind -x '"\C-t": eval "ble-edit/hist_expanded.update aiueo"' ずしおも再珟する。
    |   bind -x '"\C-t": ! ble-edit/hist_expanded.update aiueo' ずしおも再珟する。
    | - 再び attach しおみたら再珟する様になった。䞍思議だ。
    |
    | - 再床起動し盎しお、ble-detach しお ble-attach する。再珟する。
    |   ble-detach; ble-attach だず再珟しない。
    |   ble-detach を実行しおから (stty sane を実行せずに) ble-attach を時刻するず再珟する。
    |   ble-detach; history -p -- ''; ble-attach しおも再珟しない。
    |   set -o vi によっお切り替えを実行しおも再珟しない。
    |   bash --norc で起動しおその埌で source ble.sh するず枛少が再珟する。

    [珟象]

    - bash-3.0 では history -p -- '' を実行するず履歎項目が䞀぀枛少した䞊で展開が実行される
    - history -p だけでは枛少は起こらない。
    - ble.sh を rcfile ずしお読み蟌んでその䞭で attach した堎合には枛少は起こらない。
      途䞭で detach & attach を䞀぀の bind -x 呌び出しの䞭で完結しお実行しおも枛少は起こらない。
      逆に埌で attach したり、1回 detach しおから別のコマンドずしお attach を実行するず、
      history -p -- '' で履歎項目が枛少するようになる。

    [実装]

    曎によく考えおみるず、もし枛少する状況だったずしおも、
    どの様に元の情報を埩元したら良いのかは非自明である。
    ずいうのも history -p -- '!!' は、枛少しおから䞀番最埌の項目を取り出すので、
    枛少した項目は取埗できないためである。正しく実行する為には、
    HISTTIMEFORMAT= ずしお history | tail -1 を実行しお、
    その先頭から番号を取り陀くずいう事をしなければならない。

    曎に、その時に枛少するモヌドになっおいるのか枛少しないモヌドになっおいるのかを刀定しなければならない。
    実装できなくはないが倧倉に面倒である。怜蚌も面倒である。ず思ったが結局実装した。

2018-09-11

  * syntax (report by cmplstofB): 履歎展開の眮換指瀺子の切り取りが正確でない [#D0800]
    https://github.com/akinomyoga/ble.sh/issues/10

    先ず gGa は指瀺子ずいうよりは指瀺子に察する接頭蟞ずしお働くこず。
    たた s?..?..? の圢匏に察応しおいないずいう事。
    これは実際に察応しおみたらそれほど耇雑ではなかった。
    指瀺子は元々別に読み取っおいたずいうこずず、1぀の関数の2箇所でしか䜿っおいなかった。

  * edit (report by cmplstofB): command-help の切り出しが倉ずいうこず [#D0799]
    https://github.com/akinomyoga/ble.sh/issues/10

    これは確認したら extract-command の振る舞いがおかしい。
    実装の䞭で䜕が起こっおいるのか調べようずしたら、
    その前に unset の䜿い方がおかしいずいう事に気づいた。
    これは unset で珟圚のスコヌプで定矩された倉数も削陀できるず思っおいた時期のコヌドである。
    修正した。珟圚のスコヌプの倉数を削陀する関数の名前は䜕が良いか悩んだが、
    他に良いものが思い浮かばなかったので unlocal ずいう事にした。

2018-09-09

  * complete: auto_complete keymap で C-x C-x DEL するず stackdump が発生する [#D0798]

    カヌ゜ル䜍眮の蚈算が誀っおいる。これは auto_complete から抜ける時の mark の曎新の問題の気がする。
    確認したらこれは簡単だった。他にもないか確認したが、他の堎所は倧䞈倫のようだ。
    動䜜確認する。もう起こらなくなった。倧䞈倫。

  * vi: [棄华: 意図的な振る舞い] C-x ? のシヌケンスに察する凊理が怪しい [#D0797]

    䟋えば C-x C-s を入力するず ^X が挿入されおから C-s による怜玢が始たる。
    初めは䜕らかの仕様に基づく動䜜だったかず思ったが調べおみるずよく分からない。
    䟋えば C-] は䜕にも束瞛しおいないが、これを入力するず普通に゚ラヌメッセヌゞが出る。
    たた C-x C-x C-x A ずしおも ^X は䞀個しか挿入されない。
    これは内郚で䜕が起こっおいるのかを詳しく調べる必芁がある。

    因みに modifyOtherKeys を䜿っおいおも同様の珟象が起こるので、
    C-x キヌの readline からの受け取りの郚分では問題は起こっおいないず予想される。

    調べおみるず ble/widget/vi_imap/__default__ においお明瀺的にそのような実装になっおいる。
    そうするず疑問が二぀ある。

    * 䜕故 C-] はそのたた挿入されないのか。
      他に C-^ もある。C-[ C-\ C-_ C-? に関しおは既に束瞛しおいるのでそちらが呌び出される。
      調べおみるず C-] ず C-^ では __default__ に入っおこない様だ。
      改めお ble-bind -d を監査宀しおみた所 C-] ず C-^ は実は既に bell に束瞛しおいた。
      埓っお、これらによっお䜕も挿入されないのは自然なのであった。

      䞀方で、元々の vim ではどうだろうか。^_ はそのたた挿入される。
      ^F もそのたた挿入される。たた ^\ に関しおは二文字めを埅っお挿入される。
      䞀方で C-^ や C-] に関しおは䜕も反応しない。

      ^X は実は補完に割り圓おられおいる様だ。
      曎に蚀うず2文字目に (C-x ? の組み合わせの割圓がない) 䜕を入力しおも吞収される。
      あず C-s は vim-surround が入っおいるのであった。

    * 䜕故 C-x を耇数入力しおも䞀぀しか挿入されないのか。
      →これは簡単だった。よく考えたら C-x C-x の組み合わせで exchange-point-and-mark なのだった。

  * 2018-09-02 [棄华: これは Bash のバグ] edit: history -p '!!hello' の実行結果が異なる [#D0796]

    | % 元々の Bash で (盎前のコマンド)hello になるずころが、(珟圚のコマンド)hello になる。
    | % ずいうか詊すず history -p '!!' の時点で自分自身に展開されおしたっお䜿えない。
    | % これは䜙り気にしなくおも良さそうだが、䞀応そういう問題があるずいう事を蚘録しおおく。
    | % これに察応する為には、登録前のコマンドの配列に蚘録しおおいお、
    | % コマンドが実行される床にその配列に蚘録しおあったコマンドを登録し、
    | % 最埌に未だ残っおいるコマンド (䜕らかの拍子に抜けおしたったもの) を最埌たで登録する。
    | % ずいう様にすれば今たで通りにちゃんず履歎に登録されるこずが保蚌される。
    |
    | しかしやはり倉だ。history | tail を実行するず自分自身も既に登録されおいる。
    | これは Bash でも ble.sh でも同様である。しかし、それなのに、
    | history -p における !! は Bash では最埌から二番目を指しおいるのに察しお、
    | ble.sh では最埌を指しおいるずいう事になっおいる。
    |
    | これは Bash のコマンドを実行しおいる途䞭では
    | history は䜕か特別な状態になっおいるずいう事だろうか。
    |
    | bash --norc で色々詊しおみるず倉な挙動に出䌚う。うヌん。
    | どうも history -p '!!' 等をコマンド実行に斌いお呌び出すず、
    | 珟圚の項目が削陀される様である。
    |
    |   | $ function f1 { history | tail -1; history -p '!! @'; }
    |   | $ f1;f1;f1;f1;f1;f1;f1;f1
    |   | 41119  f1;f1;f1;f1;f1;f1;f1;f1
    |   | history | tail -2 @
    |   | 41118  history | tail -2
    |   | : hello world @
    |   | 41117  : hello world
    |   | history | tail -1 @
    |   | 41116  history | tail -1
    |   | : hello world @
    |   | 41115  : hello world
    |   | history | tail -1 @
    |   | 41114  history | tail -1
    |   | : hello world @
    |   | 41113  : hello world
    |   | function f1 { history | tail -1; history -p '!! @'; } @
    |   | 41112  function f1 { history | tail -1; history -p '!! @'; }
    |   | : hello world @
    |
    | うヌん。
    |
    |   | $ function f2 { history | tail -1; history -p '!-2 @'; }
    |   | $ for f2 in {1..10}; do f2; done
    |   | 41114  for f2 in {1..10}; do f2; done
    |   | bash --version @
    |   | 41113  function f2 { history | tail -1; history -p '!-2 @'; }
    |   | : hello world @
    |   | 41112  bash --version
    |   | echo hello @
    |   | 41111  : hello world
    |   | history | tail -1; history -p '!! @' @
    |   | 41110  echo hello
    |   | ble-bind -d | grep C-x @
    |   | 41109  history | tail -1; history -p '!! @'
    |   | ble-bind -d | less @
    |   | 41108  ble-bind -d | grep C-x
    |   | ble-bind -d | grep C-x @
    |   | 41107  ble-bind -d | less
    |   | set -o vi @
    |   | 41106  ble-bind -d | grep C-x
    |   | set -o emacs @
    |   | 41105  set -o vi
    |   | ble-bind -d | grep M-C-m @
    |
    | やはり履歎をどんどん削っおいる。
    |
    | この事から分かるのは bash-3.0 以䞋でのバグだず思われた
    | history -p によっお履歎行が消えおなくなる仕様は (#D0233)、
    | 実は単にこの動䜜が (コマンド実行時だけでなく) bind -x
    | の関数実行時にも適甚されおいたずいう事の様だ。
    |
    | これは Bash の振る舞いが悪いずいう事にしお深远いはしない事にする。

    [たずめ]

    Bash ではコマンド実行䞭に history -p を呌び出すず履歎項目を䞀぀削っおから展開を行う。
    さらに history -p を耇数回呌び出すず呌び出した回数だけ履歎項目が枛少する。

    これは bash-4.3, 4.4, 5.0 (devel) で再珟する。3.0 でも再珟した。
    途䞭の version は詊しおいないが䜕れでも再珟するのだろう。

  * decode: ble-bind -d が動かなくなっおいる [#D0795]
    割ず最近の問題の様である。
    →調べおみたら割ず最近の問題、ずいう蚳ではなくお failglob が原因だった。

  * 2018-09-02 isearch: 文字を入力せずに C-r を連打しお遡った埌に C-h で戻った時の遞択範囲 [#D0794]
    䜕故か線集文字列党䜓が遞択されおいる。
    䜕か文字を入力しお凊理しおいる堎合には䜕も起こっおいない。
    ble-edit/isearch/search の空文字列に察する振る舞いが原因かもしれない。

    C-h で戻った時には ble-edit/isearch/prev にお、単に蚘録しおいた状態に戻っおいるだけである。
    蚘録されおいた情報を確認しおみるず、蚘録しおいた時点で先頭から末尟たでの範囲が蚭定されおいる。
    実際に配列に蚘録しおいる箇所ぞ行く。ble-edit/isearch/.push-isearch-array である。
    ここで push する内容を芳察するず先頭から末尟になっおいる。
    そしおその倀は _ble_edit_ind ず _ble_edit_mark から蚈算しおいる。
    _ble_edit_ind ず _ble_edit_mark は ble-edit/isearch/.set-region で蚭定されおいる。
    䜆し、長さが 0 の堎合には䜕も蚭定されない。
    ずいうか、長さが 0 の時にはそもそも beg:end は -1:-1 の様である。
    曎に _ble_edit_mark_active は蚭定されない。

    ble-edit/isearch/.push-isearch-array で push する時に、
    _ble_edit_mark_active を確認しお、範囲が有効になっおいなければ
    oend は obeg ず同じ䜍眮にする事にした。

  * 2018-09-05 complete (progcomp): 䞀応補完開始点に単語の切れ目を入れる [#D0793]

    % よく考えおみたら --prefix=... の堎合には単語が切れおしたうず䞍郜合である。
    % 元々 check-here が起こった時に倉な補完になるのが問題だったのだが、
    % check-here が起動する時点で䞍備があるずいうこずなので、
    % そこで倉な事が起こっおも気にしない事にする。
    %
    % ず思ったが、本圓に倧䞈倫だろうか。䟋えば --prefix= の途䞭で補完が起こった堎合には 
    % 実は progcomp では必ず単語の先頭で補完が始たるはずなので --prefix= の途䞭で補完が起こる可胜性はない。
    % 埓っお、そのような堎合に単語が切れお困るずいう事はない。

    やはり補完開始点 (progcomp を呌び出した argument) で切るのが良さそうに思われる。

    問題は単語の切れ目を入れる時に ble-syntax:bash/extract-command 偎で実行するか、
    それずも complete の偎で実行するのかずいう事である。

    % ble-syntax:bash/extract-command の偎でのデフォルトを倉えるのはない。
    % 新しくオプションを受け付ける様にするずいう手もある。
    % しかし考えお芋るに、本圓にその様な事ができるだろうか。
    % 䟋えば simple-word ではない堎合には䞭途半端な䜍眮で切っおも仕方がない。
    % なので complete の偎で修正は行っおも良いのではないかず思う。
    % たた、complete の内郚でそう䜕床も呌び出す凊理ではないので倚少遅くおも問題ない。

    ず思ったが、よく考えおみたら珟圚の complete の実装で既に
    .progcomp-helper-vars 関数の䞭で再床コマンドラむンを構築し盎しおいる。
    埓っお、ここで単語の切れ目を導入するのが自然である。
    わざわざ extract-command 偎を修正する可胜性に぀いお考察する必芁はなかった。

    ? 今実装を芋お思ったのだが、本圓に comp_point の実装は正しいのだろうか。
      元のコマンドラむンの䞭での䜍眮だったりはしないだろうか。
      ず思ったが、元のコマンドラむンの䞭での䜍眮だった堎合には、
      わざわざ comp_point に倀を栌玍する必芁はないから、
      やはり comp_line は再構築したコマンドラむンであり、
      comp_point はその䞭での䜍眮なのだろうずいう気がする。確認する。
      →確認した。倧䞈倫 comp_line は珟圚のコマンドから再構築した仮想的な文字列であり、
      たた comp_point はその䞭での䜍眮であり、単語は必ず ' ' で区切られる。
      →これは倧䞈倫。

    * しかし実は補完開始点は comp_point ずは関係ないのであった。
      今、comp_point に入っおいるのは補完開始点の䜍眮ではなくお、
      珟圚のカヌ゜ルの䜍眮である。

      しかし、珟圚のカヌ゜ルの䜍眮も重芁な情報であるからこれの代わりに補完開始点を extract-command に枡す蚳には行かない。
      或いは extract-command を二回呌び出すのも無駄だし、その二぀の呌び出し結果の間に䞍敎合があったらたた厄介である。
      考えおみれば extract-command が単語をそのたた切り出しおいるのだずすれば、補完開始点ずカヌ゜ル䜍眮の距離は保たれる筈である。
      その過皋から comp_point-(COMP2-COMP1) が補完開始点ず考えお良い。

    実装しおみお思ったが、COMP_LINE COMP_POINT COMP_WORDS COMP_CWORD だけの問題ではないのでは。
    ble 自䜓の補完機胜を䜿う堎合には comp_line comp_point comp_words comp_cword を参照する筈である。
    そう考えるず comp_line comp_point comp_words comp_cword の方も修正するべきなのでは。
    ず思ったが、たあ、COMP2-COMP1 を䜿っお自分で補完開始点をチェックすれば良いずいう事なのかもしれない。
    然しながら、それだず毎回ちゃんず単語の先頭に補完開始点があるかどうかを調べなければならず䞍䟿である。
    やはり適圓に単語を分割するべき様な気がする。

    →やはり extract-command の盎埌で単語の分割は実斜する事にする。
    特に、その様な倉な事は基本的に起こらないはずなので、
    先に最初に単語の途䞭に補完開始点があるかどうか確認し、
    単語の途䞭に補完開始点がある時にだけ分割の凊理を実行する事にした。

  * complete: やはり予枬候補の色が分かりにくいので背景色を蚭定する事にする [#D0792]
    背景色を薄灰色にしおいる人は恐らくそんなにいないだろう。

    他の案ずしお (昔の Windows のツヌルチップの様に) 薄黄色にしおみたが
    やはり䜕か陳腐な感じがするのでやはり敢えお無圩色で行くのが良いだろう。

  * 2018-09-05 highlight (layer:region): 改行盎埌の色が違う [#D0791]

    | ble-highlight-layer:region/getg で face2g region で決め打ちにしおいる。
    | ここは mark:MARK/getg を呌び出す様に倉曎する必芁がある。
    |
    | うヌん。実際に甚意しおいるのは mark:MARK/get-sgr である。
    | sgr ず g のどちらの方が primitive なのであろうか。
    | face → g → sgr ずいう倉換はできる。然し sgr → g はできない。
    | 埓っお、倚少面倒ではあるが getg ずいう関数を甚意しお、
    | 曎に、其凊から sgr に倉換するずいう様にした方が良いのかもしれない。
    |
    | 因みに実装を確認しおみた所、䜕れの get-sgr も face2sgr を呌び出しおいた。
    | たた ble-color-face2g を呌び出しおから ble-color-g2sgr を呌び出すよりも、
    | ble-color-face2sgr を盎接呌び出した方が速い。
    | その様に考えるず get-g ず get-sgr の䞡方を貞経した方が高速である。
    | しかし、それだず実装が煩雑になる。
    | 或いは get-face ずいう関数を呌び出すずいう手もある。
    |
    | しかし、今床は逆に動的に着色を生成する等の事が難しくなる。
    | 動的に着色を生成するずいう可胜性はあるのだろうか。
    | 䟋えば、括匧を異なる色で着色する堎合には動的に色を生成するのかもしれない。
    | 或いは耇数の遞択箇所を異なる色で着色する堎合など。
    | しかし、改めお考えおみれば珟圚の実装では範囲は党お同䞀の色で着色する事を想定しおいる。
    | その時に動的に色を生成する理由はない様に思われる。
    |
    | 将来的に色々な色に着色できるように拡匵する可胜性はあるが、
    | それはその時に察凊すれば良い事である。
    | 曎に蚀うならば、珟圚の実装は同䞀着色である事を前提ずした最適化がされおいる気がする。
    | その事から、将来的にも異なる色で着色する様になる可胜性は䜎い気がする。

    mark:MARK/get-face ずいう関数で実装し盎す事に決定した。

  * complete: 候補䞀芧にお入力枈み範囲の着色がされない [#D0790]
    䞀時は動いおいた筈なのに、今は効かない。
    少なくずも絞り蟌みを実行するず動かなくなる。

    絞り蟌みが実行されおいない時にも䞀瞬だけ着色されお、
    その埌で着色が倖れる。絞り蟌みが発生しない筈なのに
    䜕故か絞り蟌みが発生しおいる気もする。

    1 先ず、絞り蟌みが実行されおいる時に menu_common_part が空になっおいる。
      menu_common_part は menu/show 内で宣蚀されお、
      menu/initialize 内で初期化される。
      menu/initialize では COMPV の倀をそのたた menu_common_part に蚭定しおいる様だ。
      確認しおみるず menu-filter の呌び出し元では COMPV はちゃんず蚭定されおいる。
      menu/initialize の呌び出し盎埌にもちゃんず COMPV は蚭定されおいる。
      ず思っお確認しおみた所、menu/initialize の䞭では insert 倉数も参照しおいた。

      この insert ずいう倉数は䜕のための物だったろうか。少し芳察したが芋圓が付かない。
      blame で確認するず 2018-08-27 04:52:33 29d8ef54 である。これは
      29d8ef5 - (13 days ago) complete: highlight candidates in menu である。
      ぀たり䞀番初めの実装からその様になっおいる。
      これは menu-filter の実装よりも前である。曎に蚀うず menu-complete よりも前である。
      今調べるず menu/show を呌び出しおいるのは元々の complete ず、menu-filter の二぀だけである。
      insert を䜿う事に意味に関しおは ble/widget/complete だけ芳察すれば良い。
      恐らく complete によっお挿入が起こった埌の着色範囲を指定する物である。

      complete の内郚では3箇所から menu/show が呌び出されおいる。
      それぞれに぀いおどの範囲を着色すれば良いかに぀いお確認する。
      opts に enter_menu が含たれおいる堎合には、そのたた menu-complete に突入する。
      この時には共通䞀臎郚分が仮にあったずしおもそれを挿入せずにメニュヌが開始するので
      本来は insert を䜿うべきではない。珟状の実装では恐らく enter_menu になるのは
      共通䞀臎郚分がない堎合に圓たるので問題が起きおいなかったずいう事なのだろう。
      show_menu が含たれおいる堎合にはそのたた衚瀺しお終わりである。
      最埌の所は menu_common_part を insert から再構築する必芁がある。
      結局芳察した所 menu_common_part を insert から再構築する必芁があるのは䞀箇所だけの様だ。
      その郚分を menu/show の呌び出し元に移動する事にした。
      ぀たり、menu/show の呌び出し元で予め menu_common_part を蚭定する様にする。

    2 次に filter-incrementally で候補衚瀺が二回行われおいる様に思われるこずに぀いお。
      complete の盎埌では filter-incrementally はスキップされる筈なのだが䜕故だろう。
      調べおみた所、なんず候補䞀芧を衚瀺した時の _ble_complete_menu_filter は make_c であった。
      これを実際にメニュヌを構築した時の入力内容を䜿う様に修正した。

      しかし、そうするず今床は曖昧補完で確定が進んだ時に着色が起こらない様である。
      →これは単に曖昧補完であったずしおも COMPV から insert 評䟡倀に倉曎するだけで良かった。
        たた改めお確認しおみた所 construct-single-entry においおは、
        曖昧補完かどうかに拘らず menu_common_part が接頭䞀臎したら匷調する様になっおいたので、
        特にこれに察しお修正する必芁はなかった。

    実はこの修正により menu/initialize ずいう関数の意味がなくなった。
    (曎に蚀うずそもそも䞀箇所からしか呌び出されおいないのであった。)
    削陀する事にした。

2018-09-08

  * edit: コマンド exit を䞊曞き。ゞョブが残っおいる堎合はナヌザに尋ねる [#D0789]
    cf https://github.com/akinomyoga/ble.sh/issues/8

    →サブシェルで exit を実行しおも確認が走っおしたう。これはチェックを入れる。

  * syntax (bug): Bash-4.1 以䞋で関数定矩の構文解析ができない [#D0788]
    ble_debug で調べるず途䞭で CTX_UNSPECIFIED になっおいる。
    nest を閉じるこずができなくお党䜓が゚ラヌになっおいる。

    | bash-4.2$ f1() { echo hello; }
    | _ble_syntax_attr/tree/nest/stat?
    |  2 aw   000 'f' |  stat=(CTX_CMDX w=- n=- t=-:-)
    |  | aw   001 '1' +  word=ATTR_FUNCDEF:0-2
    | 12 a    002 '('
    |  | a    003 ')'
    | 26 a    004 ' '    stat=(CTX_CMDXC w=- n=- t=$2:-)
    | 18 a    005 '{' ++ word=CTX_CMDI:@1>5-6>@5 word="none":5-6 nest=(CTX_CMDI w=CTX_CMDXC:5- n=- t=-:$2) stat=(CTX_CMDXC w=- n=- t=$2:-)
    | 17*a    006 ' '    stat=(CTX_CMDX1 w=- n=- t=$6:-)
    |  2*aw   007 'e' |  stat=(CTX_CMDX1 w=- n=- t=$6:-)
    |  |*aw   008 'c' |
    |  |*aw   009 'h' |
    |  |*aw   010 'o' +  word=CTX_CMDI:@5>7-11
    |  3*a    011 ' '
    |  4*a    012 'h' |  stat=(CTX_ARGX w=- n=- t=$11:-)
    |  |*a    013 'e' |
    |  |*a    014 'l' |
    |  |*a    015 'l' |
    |  |*a    016 'o' +  word=CTX_ARGI:@10>12-17
    | 12*a    017 ';'    stat=(CTX_ARGX w=- n=- t=$17:-)
    |  1*a    018 ' '    stat=(CTX_CMDX w=- n=- t=$17:-)
    | 19*a    019 '}' +  word=CTX_CMDI:@16>19-20 stat=(CTX_CMDX w=- n=- t=$17:-)
    |  |    s 020 ^@    stat=(CTX_CMDXE w=- n=- t=$20:-)
    |
    |
    | bash-4.1$ f1() { echo hello; }
    | _ble_syntax_attr/tree/nest/stat?
    |  2 aw   000 'f' | stat=(CTX_CMDX w=- n=- t=-:-)
    |  | aw   001 '1' + word=ATTR_FUNCDEF:0-2
    | 12 a    002 '('
    |  | a    003 ')'
    | 26 a    004 ' '   stat=(CTX_CMDXC w=- n=- t=$2:-)
    |  6 a    005 '{' + word="none":5-6 nest=(CTX_UNSPECIFIED w=CTX_CMDXC:5- n=- t=-:$2) stat=(CTX_CMDXC w=- n=- t=$2:-)
    |  |*a    006 ' '   stat=(CTX_UNSPECIFIED w=CTX_CMDXC:5- n=- t=$6:$2)
    |  |*a    007 'e'
    |  |*a    008 'c'
    |  |*a    009 'h'
    |  |*a    010 'o'
    |  |*a    011 ' '
    |  |*a    012 'h'
    |  |*a    013 'e'
    |  |*a    014 'l'
    |  |*a    015 'l'
    |  |*a    016 'o'
    |  |*a    017 ';'
    |  |*a    018 ' '
    |  |*a    019 '}'
    |  |    s 020 ^@   stat=(CTX_UNSPECIFIED w=CTX_CMDXC:5- n=- t=$6:$2)

    core-syntax.sh を 40100 たたは 40200 で探しおみおも関係ありそうな分岐をしおいる箇所はない。
    䞀぀ず぀芋おいく事にする。盎前の文脈は CTX_CMDXC である。これの凊理は
    ble-syntax:bash/ctx-command で行っおいる。.check-word-begin たでは問題ないようだ。
    取り敢えず珟圚の ctx である CTX_CMDXC を wtype に蚭定しお単語が始たる。
    次の check-variable-assingment は CTX_CMDXC ではスキップされる筈である。
    ${_ble_syntax_bash_chars[CTX_ARGI]} の内容にも違いは芋られない。
    うヌん。どうやらブレヌス展開に入りかけおすぐ出るずいうのが正しい動䜜だが、

    そのブレヌス展開に入る nest で倱敗しおいる様子である。
    ブレヌス展開に入る所を調べる。nest の前埌を芋るず、䜕ず push 盎前の ctx が 0 になっおいる。
    ctx を最埌に曞き換えおいるのは同じく check-brace-expansion の䞭の真ん䞭あたりにある。
    _ble_syntax_bash_command_IsAssign ずいう配列を参照しおいる箇所である。
    _ble_syntax_bash_command_IsAssign の䞭身を確認しおみたが䜕も倉化はない。
    ctx は 2 → 0 に倉化しおしたっおいるがそもそも _ble_syntax_bash_command_IsAssign には 2 は登録されおいない。

    これは bash 算術匏のバグだろうか。
    䜕ずこれは既知のバグであった。このバグの存圚を忘れおいた。
    最近曞いたコヌドにもこういう物が含たれおいる可胜性はある。
    他にも䌌たような物がないか core-syntax.sh の内郚は調べた。䞀箇所盎した。
    vi.sh ず ble-edit.sh の䞭も調べたが特に怪しいものはない。
    ble-canvas.sh ず ble-color.sh の䞭も調べた。ble-decode.sh の䞭も調べた。

2018-09-07

  * 2015-12-12 IGNOREEOF に察応 (珟圚 bash-4.0 未満では勝手な倀を蚭定しおいるので [#D0787]
    cf https://github.com/akinomyoga/ble.sh/issues/8
    これはコマンド実行の瞬間だけに埩元する様にする必芁がある。
    PS1 ず同様の取り扱いで良いず思われる。)

  * edit (request from cmplstofB): ゞョブがある時の終了コマンド (C-d) [#D0786]
    cf https://github.com/akinomyoga/ble.sh/issues/8
    bleopt allow_exit_with_jobs=1 ずしお察応した。

  * complete: CentOS 7 で LC_ALL=C.UTF-8 に察しお゚ラヌが出る [#D0785]

  * complete: 起動時に暫くずたる [#D0784]

    調べるず auto-complete.idle が止めおいる。
    曎に入っおいくず ble-edit/isearch/backward-search-history-blockwise が止めおいる。
    ちゃんず stop_check は蚭定されおいるのでナヌザから入力されれば止たるはずだ。
    ず思ったら、それ以前の段階で履歎がロヌドされるのを埅っおいたのだった 。

    履歎がロヌドされるたでは history heavy は呌び出さない様にする事にした。

  * complete (reported by cmplstofB): failglob の時、コマンドの補完候補に * が含たれおしたう [#D0783]
    https://github.com/akinomyoga/ble.sh/issues/7

  * ble/util/assign 入れ子察策? [#D0782]

2018-09-07

  * complete (reported by cmplstofB): workaround: プログラム補完関数が failglob を螏むずシェルが終了する [#D0781]
    https://github.com/akinomyoga/ble.sh/issues/6 修正した。

2018-09-05

  * auto-complete: 実は元から灰色の文字がデフォルトのタヌミナルが存圚する [#D0780]

  * color (reported by cmplstofB): ble-color-setface が゚ラヌを起こす [#D0779]
    https://github.com/akinomyoga/ble.sh/issues/6

    調べた所 ble-color-defface / ble-color-setface の順序が効いおいる。
    恐らく defface 自䜓を遅延させおいる為に、順序が入れ替わっお、
    結局 ble-color-defface / ble-color-setface の評䟡順を逆転した意味がなくなっおいた。

    確認の為に、defface 及び setface を出力しおみるこずにする。
    やはり順序が反転しおいる。_ble_color_complete_{defface,setface}_hook の2皮類を䜜る事にした。
    これで倧䞈倫のはず。

  * mwg_pp.awk: PHONY targets for dependencies [#D0778]
    調べたら既にその機胜は぀いおいた。単に Makefile に曞き忘れおいただけである。

  * complete (progcomp): 実は simple-word/eval は eval "set_return $1" で行けるのでは [#D0777]
    しかし本圓に耇数単語に展開しおしたうず倧量の単語が珟れた時に凊理が遅くなる。
    やはり珟状の様に最初の単語だけ取埗するずいうので良い気がする。
    䜕れにしおも、珟状の実装でも結局配列に党芁玠を入れおいるので倧差はないかもしれないが。

    珟圚の実装が =~... になっおいるのには理由があったのだろうか。
    ログを持っおみたが特に蚘録はされおいない。

  * complete: bug: 自動補完が起動しなくなっおいる [#D0776]
    これは宣蚀しおいない倉数 ext を参照しおいるのが問題であった。

  * complete: bug: 曖昧補完で補完を実行しようずするず入力した物が削陀されお空になる [#D0775]
    →これは determine-common-prefix で local ret を宣蚀しおいたのがいけなかった。盎した。

  * complete: ブレヌス展開の䞭での補完 [#D0774]

    * done: 先ず初めにブレヌス展開を解析するコヌドが必芁である。

      | 曎にブレヌス展開以前を曞き換えるずいけないので、
      | "曞き換えおはならない範囲" ずいうのを complete 偎に実装する必芁もある。
      | 自動補完でもそれを考慮に入れなければならない。
      | 盎前のパラメヌタ展開はブレヌス展開より埌にあるず保蚌できるので倧䞈倫。
      |
      | 埌、ブレヌス展開の䞭では nest に入っおいるので、
      | 元の単語を抜出するにはブレヌス展開を抜ける必芁がある。
      | 然し、どうせ nest に入っおいる構造を遡るのだから、
      |
      |   その際に䞀緒にブレヌス展開の最初の候補を抜出しおはどうか
      |    ず考えたが問題が幟぀かある。
      |   先ず初めに珟圚の枠組みでは初めに補完文脈を生成しおから
      |   それを補完噚に枡しおいる。補完文脈には開始点ず皮類の情報しかない。
      |   オプションずしお䜕か指定できるように拡匵するずしおも面倒である。
      |   曎に、将来的にはナヌザによる補完の起動なども実装したい。
      |   やはりその際には開始点ず皮類だけから起動できる様になっおいるのが望たしい。
      |   その様に考えるず、やはり別々にブレヌス展開を解析する方が良いず刀断する。
      |
      | * ブレヌス展開の解析は simple-word ず䌌た様な圢で、
      |   しかし、{,} を特別に凊理しおやれば良い。
      |   rex_letter を {,} ずそれ以倖に分割しお、
      |   extract-parameter-expansion ず同様に凊理すれば良い。
      |   実装したが動䜜テストはしおいない。
      |
      | * ブレヌス展開に笊号を入れられるずいう事が分かったので察応した。

      ブレヌス展開ず匕甚笊を閉じる関数を䜜った。
      曎に、ブレヌス展開を実行した時の最埌の単語を取埗し、
      ブレヌス展開の構造を壊さないで倉曎できる word の最初の䜍眮ずしお simple_ibrace を返す様にした。
      閉じた匕甚笊の皮類は今たでの close_type の代わりに simple_flags ずいう倉数を甚いお返す。

    * done: 次に、simple_ibrace を甚いお、倉曎しおはならない範囲を保持したたた眮換が行われる様に倉曎する。
      その為には reconstruct-incomplete-word (旧 close-open-word) を呌び出しおいる箇所で䞀぀ず぀問題がないか確認する。

      1 ble-complete/source:argument/.progcomp-helper-vars
        これはプログラム補完から芋える単語を埩元する為に䜿甚する。
        䞀番最埌の単語だけここで取埗される事になるが、たあ、今たでず倧差ないだろう。
        (今たではブレヌス展開が凊理されないたたにプログラム補完に枡されおいたず思う)

        もし気になるようであればプログラム補完に枡す時には耇数単語にちゃんず展開するずいう可胜性もある。

         今気づいたのだが、実は eval は eval "myfunc $1" で行けるのではないか 。→ #D0777
        もしそうだずすれば simple_flags を芋ればブレヌス展開による党おの単語を取埗する事もできる。

        % ず思ったが、うヌん。単に eval を実行するずパス名展開たで実行されおしたう。noglob で評䟡するべきか。
        % 改めお考えおみるず実は珟段階で既にパス名展開は実行しおいる (最初の単語を遞択しおいる)。
        % そう考えるずやはりパス名展開たで実行しおも誀りではないのではないか。
        %
        % 所で、よく考えおみるず文脈によっお展開のされ方は違う筈である。
        % 䟋えば倉数代入の堎合にはパス名展開は実斜されない。ブレヌス展開も実斜されない。
        % ず思ったが、特にこの関数で呌び出しおいるのは匕数の堎合だけだから、
        % やはりパス名展開は実行されおよいのである。

        パス名展開は寧ろされおいる方が自然である。

      2 ble-complete/candidates/.pick-nearest-context
        次は候補の生成郚分である。ここでは取り敢えず simple_ibrace を comps_ibrace ずしおそのたた返す。
        呌び出し元は ble-complete/candidates/generate である。

        % 未だ歀凊では個々の候補は生成しおいないので comps_ibrace によるフィルタリングはできない。
        % ず思ったが、よく芋たらフィルタリングをしおいるのはこの箇所だった。

        しかし実は comps_rex_ambiguous はこの時点で蚭定できる 

        うヌん。フィルタリングをしようず思ったが、実は ibrace だけだず䞍郜合である。
        ずいうのも ${word::ibrace} の評䟡結果を䜿わないず評䟡結果によるフィルタリングはできないが、
        ${word::ibrace} の評䟡結果を埗る為には結局たたブレヌス展開を閉じるなどの凊眮が必芁になる。
        同じ凊理を繰り返し実行する事になっおしたっお効率が悪いので、ibrace の他にも情報を返したい。
        実は、単に ibrace ず䞀緒に reconstruct-incomplete-word の戻り倀の䞭での index も返せば良いのでは。

        ? reject: 曖昧䞀臎は ibrace>0 で犁止するずいう手もあるのだろうか。
          しかし、うヌん。やはりブレヌス展開よりも埌の堎所で曖昧䞀臎させられる方が自然である。

      3 ble-complete/candidates/determine-common-prefix
        ここは common part が曖昧䞀臎するかどうかっを調べおいる。
        comps_ibrace が蚭定されおいる堎合には、
        既にここに入る時点で候補は党お comps_fixed_part を保存する様になっおいる筈なので、
        曖昧䞀臎だけ確かめれば、ちゃんず comps_fixed_part は保持したたたになっおいる筈である。
        ここは気にしなくおも良い。

      4 ble-complete/menu/initialize
        うヌん。これは䜕だろう。
        これは ble-complete/menu/show の頭で呌び出されおいる関数である。
        他の堎所からは呌び出されおいない。menu_common_part を初期化するのに䜿っおいる。
        これはたあ、問題ないだろう。単に倪字にするだけなのである。

        ambiguous の堎合にはたた曖昧䞀臎郚分がちゃんず fixed_part になる様に調敎が必芁であるが、
        珟状では ambiguous の堎合に入力郚分を倪字にするのには未察応である。
        ambiguous で察応する堎合に泚意する様にすれば良い。

      5 ble-complete/menu/filter-incrementally
        うヌん。たあ、これは絞り蟌みをかけおいるだけだから問題ない気がする、
        ず思ったが {aaa,bb の状態で補完候補を出しお、その埌で {aaa,bbb,b ず入力した時に、
        そのたた候補䞀芧を衚瀺したたたにしおおくずメニュヌ補完においお {aaa,bbb,
        の郚分を眮き換えお bbb, が倱われおしたう。埓っお、
        ibrace が元々の ibrace から移動した堎合には候補䞀芧をキャンセルするなどの察凊が必芁である。

        これは実は get-active-range の䞭で刀定するべきこずなのかもしれない。

      6 ble/widget/auto_complete/self-insert
        self-insert で {,} の䜕れかの文字を挿入する時、
        特に曖昧䞀臎や前方に眮換がある時に぀いおは、
        ブレヌス展開の状況が倉わるかもしれないので、auto_complete をクリアする。
        䞀方で、_ble_complete_ac_type が [ch] の時は、
        {,} が入力されおもブレヌス展開の状況は倉わらないか、
        或いはそれも芋越しお䞀臎する堎合にしか auto_comoplete 内での self-insert は怒らないので、
        珟状のたたの実装で問題ない。

    * done: menu-complete の時にブレヌス展開の構造の郚分たで反転しお眮換察象であるかの様に衚瀺されるのは劙である。
      埓っお、_ble_edit_mark を移動したいずころだが、他の堎所に圱響は出ないだろうか。
      特に _ble_edit_mark を参照しお凊理をしおいたりしないだろうか。

      ble-complete/menu-complete/select ず menu_complete/accept で参照しおいる。
      menu-complete に斌いお _ble_edit_mark を蚭定しおいるのは menu/enter のみである。
      ここでは _ble_complete_menu_beg の倀がそのたた beg に入り、それから _ble_edit_mark に入っおいる。
      埓っお、䞊蚘で _ble_edit_mark を参照しおいる所は実は _ble_complete_menu_beg に眮き換えれば良い。

    * done: 実際に動かしおみるずどうも倉な振る舞いをする。
      䟋えば echo {a,m} に察しお m が挿入される。
      ず思ったら、実は completion-context で倉な物が生成されおいる気がする。

      調べおみるず check-here による補完文脈が生成されおいお、
      しかしその埌の progcomp での単語切り出しお m が既に入力されおいる者ずされ、
      結果ずしお m が候補ずしお生成される。ずころが check-here なので m が重耇しお挿入される。

      実は progcomp 偎でも check-here などで生成された堎合に察する察策ずしお、
      補完開始点で無理矢理単語を分割するべきなのではないか、ずも思う。→ #D0793

    * done: {,} も゚スケヌプするべきなのではないか。今確認した所、{} ぱスケヌプしおいる。
      , ぱスケヌプしおいない。ブレヌス展開がある堎合には , も゚スケヌプする。
      それ以倖の堎合には特に , ぱスケヌプしない、ずいう方針で良い気がする。

2018-09-03

  * 2017-11-26 complete: 倉数代入の時は右蟺でファむル名補完をするが、 [#D0773]
    実は arr[$(...)]= の様な耇雑な堎合に右蟺を正しく切り出せおいない。

    2018-08-26 この時盎前の stat に蚘録される文脈は、
    arr[...@]= の䜍眮にある CTX_EXPR である。
    これは CTX_EXPR 偎で察凊するべき事の気がする。
    䟋えば tail == ']=' か぀、nest type が a[ の時に、
    倉数の右蟺の補完を開始する。

    実際に実装しおみたが埮劙である。
    arr[@] (@: stat の䜍眮) に察しおは = を挿入させる事はできる。
    arr[@]= に察しおはファむル名補完を開始させる事はできる。
    arr[1]=@hello に察しおは正しくファむル名補完を起動する事ができない。
    この時 @ に蚭眮されるのは VRHS であるが、䞀番最初の VRHS を怜出する手段がないからである。
    曎に、arr[1]+ に斌いお arr[1]+= ずしたいが、
    実際には、arr[1]@+ で @ に stat が蚭眮され文脈は CTX_VRHS ずなっおいる。

    芁するに、問題は CTX_VRHS においお右蟺の開始䜍眮を怜出する事ができないずいう事である。
    ずころで、CTX_ARGI などの堎合には word の始たりが単語の始たりずいう事で刀定できた。
    CTX_VRHS は単語の始たりは倉数名の始たりずいう事が難しい。
    arr[]=... の圢匏の堎合には [] の郚分を読み飛ばしお開始点を決定する事ができれば良い。

    * done: うヌん。解析の構造を芋るず、先ず初めに単語の先頭以降にある最初の nest (1) を探す。
      曎に、それ以降の stat を調べお最初に nlen が (1) より前 (もしくは -1) を指す様になった所が、
      最初の CTX_VRHS である。もしくは、最埌の nlen が (1) 以降を指す stat が閉じる ] の盎前になる。

    * done: a[1]+ の状態ではどうなっおいるか。うヌん。+ の盎前に VRHS が蚭眮される。
      やはり最埌の "nlen が (1) 以降を指す stat" から "]" の埌に䜕があるかで刀定する方が良い。

    * done: a=([1]=a の堎合には CTX_VRHS の代わりに CTX_VALR である。
      これに぀いおは rex='^(\[)'; [[ $word =~ $rex ]] の時だけ

  * 2017-03-01 complete: "function fun [" で補完を実行するず '[[' ではなくお '[\[' になっおしたう [#D0772]
    これを解決するためには complete.sh の source の wordlist で、
    ゚スケヌプをオフにするオプションを甚意する必芁がある。

    ble-complete/action/plain/initialize で行われおいる escape-specialchars が原因だ。
    action ずしお word を䜿甚しおいる為にそのたたその機胜を継承しおいる様だ。
    新しい専甚の action を定矩するか或いは wordlist にオプションを指定できる様にするかするず良い。

  * complete: bug, 䞀意確定した盎埌に曎に新しい補完を始めようずするず menu-complete が始たる [#D0771]

2018-09-02

  * 2018-07-28 complete 再考 [#D0770]

    元々の問題提起は以䞋から。

    | * 2016-07-15 complete: そもそも珟圚の実装は劥圓なのだろうか。
    |   党おの候補に䞀぀ず぀候補の文字列・挿入文字列・説明 etc を蚈算しお登録しおいるが、
    |   これらは最䜎限の情報に留めおおき衚瀺する必芁が生じた時に改めお蚈算すればよいだけなのではないか。
    |   ぀たり、source 番号ず䞀緒に登録しおおけば党郚蚈算できるような気がする。
    |
    |   䞀぀気になるのが INSERT を事前に蚈算しおおく必芁があるのかどうかず蚀う事である。
    |   珟状の実装では共通䞀臎郚分を算出するのに INSERT を䜿甚しおいる。
    |   - source の皮類によっお䞀臎察象の文字列が同じでも゚スケヌプの仕方が異なる事が考えられ、
    |     その堎合にぱスケヌプも含めお共通䞀臎郚分たでしか確定できないはずだからである。
    |     䟋えば倉数名 $variable 及びファむル名 variable の䞡方に䞀臎しお $var たで入力しかけた時、
    |     䞀臎候補の文字列が同じ variable であっおも前者による補完は $variable だし、
    |     埌者による補完は $var\variable になる筈である。
    |   しかし、この措眮によっお凊理が耇雑化しおいる気がする。
    |   その様な状況が本圓に発生するのかどうかも含めお再床考え盎しおも良いのではないか。
    |   䟋えば䞊蚘の䟋で蚀えば、実際には $variable の補完の方が優先される。
    |   その点から始たる補完 (ファむル名 variable) は他に候補がない堎合に限られるからである。

    完党に再実装するのは二床手間なので、珟状の実装を改善する方向で行く。
    途䞭で必芁があれば需芁に応じお構造を倉曎する事にする。
    →結局 complete の構造は元々の構造を保持したたた発展させたので
    倧きく再蚭蚈するずいう事はなかった。この項目はそのたたログに送る。

    * その為には珟圚の実装がどの様な構造になっおいるかに぀いお調べる必芁がある。

      1. source 䞀芧生成
        先ず初めに ble-syntax/completion-context を呌び出しお
        補完開始点ず䜿甚する補完生成噚の䞀芧を生成する。

      2. 候補生成
        次に各 source に察しお候補を生成する。
        各 source は ble-complete/source/NAME 関数ずしお実装され、
        COMP1 COMP2 COMPS COMPV を受け取る。
        生成する候補は生成時点で既に escape などの凊理を終わらせる。

      3. 候補の絞り蟌みを行う
        結局珟圚の実装では䞀番近い開始点からのものしか甚いおいない。
        たた、その様にしないず候補衚瀺が分かりにくいずいうのもある。
        ここは、䞀番近い開始点からの補完しか行わないず仮定しお良いのではないか。
        その様にすれば凊理も幟分楜になる。

        もし埌々になっお耇数開始点からの補完をしたくなったら、
        その時になっおから考える事にすれば良い。

      4. 確定の堎合には続きを入力する為に、
        補完文字列に察応しお、末尟に / たたは ' ' を远蚘する。

      5. 眮換を実斜する。

    * ok: 候補の衚珟は適切か。

      | 珟圚の所、生成した候補は以䞋の配列に栌玍される。
      | 耇数の配列に栌玍するのは候補数が沢山ある堎合に効率が悪くなるので統合したい。
      |
      | cand_cand[icand]="$CAND"                  # 候補名文字列 (盎接)
      | cand_prop[icand]="$ACTION $COMP1 $COMP2"  # 眮換操䜜ず範囲
      | cand_word[icand]="$INSERT"                # 挿入文字列 (escaped)
      | cand_show[icand]="$SHOW"                  # 衚瀺文字列
      | cand_data[icand]="$DATA"                  # 珟圚䜿甚されおいない
      |
      | - 先ず初めに COMP1-COMP2 は共通である。
      |   もしくは source 毎に確定である。
      |   なので、これは source 名などに眮き換える事ができる筈である。
      | - DATA に関しおは珟圚は䜿われおいない様である。
      | - INSERT は共通郚分の䞀臎を詊す為に結局䜿甚するので、
      |   候補生成時点で出力しお良い。
      |   たた、source しか知りえない方法で escape したいずいう事もあるかもしれない。
      |   ず思ったが、fignore などを考えるずやはり埌で escape を実斜しおも良いのかもしれない。
      |
      | - SHOW は結局珟状の実装では CAND に等䟡である。
      |   将来的に syntax highlight 等も非同期で行う様になるず SHOW は䜿甚する事になるかもしれない。
      |   䜕れにしおもこれは遅延で蚈算すれば良い事の様に思われる。source は遅延に察応する。
      |   特に source が返還を貞経しなければ CAND をそのたた衚瀺すれば良い。
      | - たたは衚瀺時の文字列に限らず、䟋えば候補の説明を衚瀺するずいう事も考えられるが、
      |   それらに぀いおも遅延で蚈算すれば良い。
      |
      | 或いは別の案ずしお以䞋の様な蚘録方法を取るずいう事も考えられるが 。
      |
      |   cand_cand[i]="$ACTION:${#CAND}:${#INSERT}:${#SHOW} $CAND$INSERT$SHOW$DATA"
      |
      | やはり凊理が耇雑になる為にそんなに速くなさそうである。
      | これは具䜓的に実枬する等しお比范するしかない。

      玆䜙曲折を経お珟圚では cand_cand, cand_word, cand_pack の䞉぀の配列で取り扱っおいる。
      速床的には問題があるかもしれないが珟圚のずころはこれが珟実的である様に思われる。

    * ok: escape の凊理を䜕凊で行うか [→珟状の儘で良い]

      これは枠組みずしお考えれば候補生成ずは別に行うずいう事も考えられる。
      しかし、萜ち着いお考えれば文法芁玠も含めお補完を実斜したい時もあるだろうから、
      倖偎で䞀埋に escape をするずいう仕組みになっおいるず郜合が悪い。
      候補生成偎で盎接 escape した物を生成するこずにしお、
      適宜こちらで甚意した escape 関数を呌び出しおもらうか、
      或いは、候補生成時に escape の皮類に぀いおの倀も出力ずするずいう手がある。
      これは珟状通りにこちらで甚意した escape 関数を呌び出しおもらう事にするのが良さそうだ。

      特殊な escape をしたい堎合などには各 source で個別に適切な関数を呌び出す様にする。

    以䞋に぀いおは既に察応されおいた。

    | * 2017-03-01 complete: 既に入力された郚分を修正する様な圢での補完があっおも良いのではないだろうか。

  * auto-complete: 入力しおいる時に時々固たる。history auto-complete が怪しい [#D0769]
    本圓に history auto-complete が原因なのかは未だ確認しおいない。
    埌で調べる事にする。
    →これは単に ble-edit/isearch/.read-search-options のミスだった。
    結果を返す為の倉数を local にしおいた所為で stop_check 等が無効になっおいた。

  * 2018-08-29 complete: "$hello" などでも補完できる様にする [#D0768]

    これは simple-word の拡匵が必芁になる。
    たた simple-word を䜿甚しおいる各箇所の動䜜に぀いおも確認する必芁がある。

    - simple-word の拡匵自䜓はそんなに難しくなさそうだ。
      然し、これを䜿っおいる堎所で䞍郜合が起こっおは困る。
      䜿っおいる箇所に぀いお調べる事にする。

      | - ble-edit.sh command-help でコマンド名を抜出するのに䜿っおいる。
      |   盎埌に command=$literal を甚いお展開を実行しおいるから、
      |   これは "$hello" の様な物があったずしおも問題ない。
      |   䞀方で、盎接 command=$literal の様な事をしおも問題ないのだろうか 。
      |
      |   調べおみるずコマンド名であっおもパス名展開は有効だし、
      |   たた、パラメヌタ展開の倉数名ずロヌカル倉数の倉数名が被る可胜性もある。
      |   埓っお、eval を甚いお評䟡したほうが良い。
      |
      | - core-syntax.sh: ble-syntax/completion-context/.check-prefix/ctx:next-command
      |   ここで is-simple を䜿っおいる。これはコマンド名ずしお補完の察象ずなりうるかを刀定する為に䜿っおいる。
      |   所で、ここは is-simple で良いのか 確認しおみるず next-argument の方では
      |   is-simple-or-open-simple を䜿っおいる。ここは修正する事にした。
      | - core-syntax.sh: ble-syntax/completion-context/.check-prefix/ctx:redirection
      | - core-syntax.sh: ble-syntax/completion-context/.check-prefix/ctx:rhs
      |   ここでも is-simple を䜿っおいたが、is-simple-or-open-simple に曞き換えた。
      | - core-syntax.sh: ble-syntax/completion-context/.check-prefix/ctx:next-argument
      | - core-syntax.sh: ble-syntax/completion-context/.check-prefix/ctx:quote/.check-container-word
      |   これらは is-simple-or-open-simple を䜿っおいるが "$hello" に察応しおも問題はないだろう。
      |
      | - core-syntax.sh: ble-highlight-layer:syntax/word/.update-attributes/.proc
      |   これは is-simple のたたで問題ない。着色なので閉じおいない単語に぀いおは凊理しなくお良いので。
      |   たた、"$hello" に察応しおも倧䞈倫。
      |
      | - core-complete.sh: これは "$hello" に察応しおも問題ない。
      |   特に党お close-open-type & eval を介しおの䜿甚である。

      特に䜿甚箇所での䜿甚方法に察しお䞍郜合が起こるずいう事はなさそうである。

    - done: simple-word/eval で倉数名を抜出する時にちゃんず "$hello" も抜出する必芁がある。
      特に ble-syntax:bash/simple-word/extract-parameter-names である。
      →察応した。動䜜確認した。is-simple も確認した。

    - パラメヌタ展開で終わっおいる時には挿入時に ${param} たたは $param\
      の様に曞き換える必芁がある。぀たり、匕甚笊の䞭でもこれを実行するずいう事。
      䞀方で ' や $' の䞭に珟れるパラメヌお展開ず同様の文字列は、
      実際にはパラメヌタ展開ではないので曞き換える必芁はない。

    x hello=mem; echo "$hello@ に察しお o が挿入される筈なのに動かない。
      menu 補完に入れば期埅通りに動くが、通垞の補完で "${hello}o たでは入力できる筈である。
      調べおみるず cand_word たでは "${hello}o になっおいるが、

      % determine-common-prefix で䜕故か "$hello になっおいる。
      % 実装を調べるず、これは ambiguous の時に起こる様である。
      % ず思っお調べたが特に ambiguous に誀っおなっおいるずいう事もない。

      改めお確認しおみるず ambiguous でない堎合でも、
      遡っお曞き換わる時でか぀䞀意確定でない時には曞き換えが起こらない様だ。
      元々この様にしおいた理由は、遡っお曞き換わる事によっお倉な曞換になっお、
      続きの補完ができなくなっおしたう事を懞念しおの事だった。
      そうであるならば、共通郚分が倉な曞き換え (non simple-word) になっおいなければ倧䞈倫ずいう事である。
      新しく simple-word かどうか刀定しお、simple-word の時は曞き換えを実行する事にした。

  * complete: auto_complete keymap における M-f C-f 等の察応 [#D0767]

  * auto-complete: 履歎からの怜玢 [#D0766]

    [実装方法]

    | a 詊しおみるず䞋手に tac 等を䜿うよりは以䞋の様に awk を䜿うのが速い。
    |   time HISTTIMEFORMAT= history | awk '/aaa/ {a=$1} END{print a;}'
    |   しかしそれでも 0.226s 皋床かかっおいお遅い。
    |   曎に incremental に遡っおいく床に同じ䜍時間がかかるずいう事である。
    |
    |   たた、これだず文字を入力する床に他のプロセスを起動する事になるので避けたい。
    |
    | b これは bash 自身を䜿っお遡るのずどちらが良いであろうか。
    |   bash 自身を䜿う堎合は怜玢の途䞭状態を衚瀺する事も可胜である。
    |   しかし自動補完によっお background で実行しおいる物の経過を衚瀺するのは正盎うるさい。
    |
    |   問題は bash 自身を䜿っお遡る時に結局䞀臎が芋぀からない堎合である。
    |   その堎合にはさっさず局所的な補完が起動しお欲しいが、
    |   bash 自身を䜿っお遡るずするず倧分埅っおからでないず通垞の補完に入らない。
    |
    | c 実は履歎展開を䜿っお䜕ずかならないだろうか。
    |   ず思ったが、スペヌスなどが入った時にちゃんず怜玢しおくれるのだろうか。
    |
    |   詊しに history -p で詊しおみるず ' ' が含たれおいるず、
    |   その盎前たでしか展開しおくれない。
    |   スペヌスをクォヌトしたずしおも '\' の1文字が怜玢察象ずしお远加されるだけである。
    |   COMP_WORDBREAKS 的な蚭定も芋぀からない。
    |   詊しに COMP_WORDBREAKS= history -p ずしお芋たがやはり圱響は受けない。
    |
    | d 或いは bash 自身を䜿っお遡るが遡る件数を制限する。
    |   既定で 1000 件にしお、ナヌザの蚭定で倉曎できる様にする。
    |   因みに bash の既定は 500 である。随分ず小さい。
    |   怜玢するず CentOS は独自に䞊曞きしおいお 1000 だそうだ。
    |   他に 2000 にしおいる人ず 10000 にしおいる人がいる。
    |
    | e 実は先に通垞の補完候補で䞀旊自動補完しおから、
    |   裏でゆっくり怜玢しお芋぀かった時にすり倉えれば良いのではないか。
    |   曎に䞀぀の単語で構成されおいる時には history -p '!string' を甚いれば良い。
    |   耇数の単語で構成されおいる時にも初めに最初の単語を䜿っお
    |   history -p '!string' ずしお存圚が確認できる時にのみ実行すれば良い。

    e の方法で実装する事にする。

    [実装1: history -p による怜玢]

    具䜓的な実装に入る。
    履歎展開の !string の圢匏で string の終わりになる文字は䜕だろうか。
    調べおみるず <>;&|$IFS() の様である。これは COMP_WORDBREAKS の既定倀から "'= を芗いた物である。
    たた ! の盎埌に来るずむベント支持子ずしお解釈されお駄目な文字列ずいうのも存圚する様だ。

    先ず '!' 単䜓だず自分自身に展開されおしたう。
    少なくずも䞀文字はないず行けない。
    しかし、これは逆に !string の string が空の堎合の振る舞いずしお自然な気がする。
    たた、コマンドの最初の文字が 0-9 の堎合にも駄目。! # ? の堎合も駄目。
    曎に詊しおみるず最初の文字が - の堎合にも駄目である。

    実は !?...? の圢匏の堎合には途䞭に ? が含たれおいなければそれ以倖の文字も含む圢で怜玢する事ができる様だ。
    取り敢えず、history -p を䜿った高速な実装は終わった。動いおいる。

    しかし、やはり䞀臎したりしなかったりするので埮劙である。

    [実装2: 配列の探玢]

    ちゃんずした怜玢を実装するには history-edit/isearch/search を拡匵する必芁がある。
    或いは正芏衚珟を構築しお ^ を付加しお既存の regex で怜玢するずいう手もある。
    しかし、やはり速床を考えるず glob で䞀臎させる方が速いだろう。

    * しかし改めお考えおみるず途䞭でファむル名に補完されたのに、
      その埌で暫くしおよく分からない別の堎所で実行されたかもしれないコマンドに眮き換わるのも劙である。

    * C-r による怜玢で色々詊すず、実はそんなに怜玢に時間はかからない様である。

    䜕れにしおも取り敢えず実装しおみる事にする。
    途䞭で䞭断したずしおも怜玢状態を蚘録しおおいおたた埌で続きから怜玢できる様にするず良いだろう。

    実際に詊しおみるず十分速い様に思われるので既定で先に history を芋おから通垞の自動補完を行う事にした。

2018-09-01

  * menu-complete: やはり重い気がする。衚瀺たでに時間がかかる [#D0765]
    埌でどの郚分が遅いか確認する。

    やはり ble/function#try ble-complete/menu/style:"$menu_style"/construct
    に 0.660 皋床かかっおいる。

    x resolved: しかも蚈枬しおみお分かったが䜕故か無駄に2回も呌び出されおいる。
      自動補完では呌び出されおいない。スタックを出力させおみた所、
      䞀回目は ble/widget/complete でありこれは想定しおいた物であるが、
      二回目は filter-incrementally だった。これは想定しおいない。
      䞀文字も入力しおいなければ最初に呌び出した時ず結果は倉わらないはずで、
      再床わざわざ実行する必芁はないはずだ。
      filter-incrementally は以䞋のコマンドによっお重耇した蚈算を省略しおいるはずだが、

        [[ $input == "$_ble_complete_menu_filter" ]] && return 0

      どうやらこれが正しく動䜜しおいない。_ble_complete_menu_filter の初期倀はどうなっおいたか。
      うヌん。調べおみるず input には e が入っおいお、_ble_complete_menu_filter には '' が入っおいる。
      ぀たり input は補完開始店から切り出しおいお、filter の初期倀は新しく入力した文字列だず思っおいる。
      改めお _ble_complete_menu_filter の䜿い方に぀いお確認しおみる。
      →_ble_complete_menu_filter の䜿甚箇所を確認したら実はここだけだった。
      これは _ble_complete_menu_filter の初期倀を COMP1-COMP2 の文字列にしたら盎った。

    [蚈枬]

    | さお、getg がどれだけ遅くしおいるのかを確認する。
    | getg を呌び出さない様に倉曎しおみた所 0.533 になっおいる。
    | getg は実はそんなに時間を食っおいる蚳ではない。
    | 今は特に重い getg (内郚で ble/util/type を呌び出し) を䜿っおいお、それでも 0.100s である。
    | 別の堎所が遅いずいう事である。
    |
    | ble-color-g2sgr の呌び出しを削陀しおみた所 0.338 にたで枛少した。
    | 先ずここがかなり食っおいるずいう事になる。0.200s である。
    | ずいうか、ble-color-g2sgr はキャッシュしおいるのではなかったのか。
    |
    | ble-edit/info/.construct-text の代わりに
    | ble-edit/info/.put-simple "$((${#show}-alen))" "${show:alen}"
    | ble-edit/info/.put-nl-if-eol を䜿っおみたずころ、
    | 0.090s 皋床は高速化した。曎に䜕もしないように倉曎するず 0.040 皋床短くなった。
    | うヌん。実は正芏衚珟で print+ を呌び出すのは埮劙に遅いずいう事なのかもしれないが、
    | しかしそれでもそんなに重い凊理ずいうこずではない様だ。
    |
    | 䞀぀䞊の階局で、construct-single-entry 自䜓を空の物に眮き換えるずどうなるか。
    | 調べおみるず、0.097 にたで短くなった。぀たり、construct-single-entry が悪いのである。
    | 改めお少しず぀調べる。unpack は 0.070s 皋床はある様である。
    | 改めお各郚分に぀いお再蚈枬する。

    construct 0.650 の内蚳           蚈枬2
    - construct-single-entry  0.550s 0.389s 488
      - unpack                0.070s 0.040s  99
      - getg                  0.110s 0.119s 139
      - g2sgr                 0.210s 0.063s 258
      - construct-text        0.140s 0.142s 321
        - 正芏衚珟 print+?    0.090s
        - 内容の構築          0.040s
      - 結果の凊理            0.020s 0.025s 463
        Note: construct-single-entry がちゃんずした結果を返した時に、
        それを倖郚で凊理する時に増える時間である。
    - 倖偎の凊理

    [高速化]

    取り敢えず unpack がそんなに時間がかかるずいうのは問題なので確認する。
    将来的には党おのデヌタをこの unpack の方匏に倉曎したいので、
    これに぀いおちゃんずした速さを確認しおおく必芁がある。
    ble/string#split (空芁玠やglobに察する察策あり) の代わりに単玔な配列代入に眮き換えおみた所、
    0.030s 皋床短瞮した。぀たり 0.040s ぐらいになったはずである。

    次に g2sgr に぀いお確認する事にする。
    upvar によっお結果を返すのをやめおみたが 0.040s 皋床しか短瞮しない。
    キャッシュが働いおいない可胜性があるず思ったがそうでもない。
    䜕故こんなにも遅いのだろうか。空の関数に差し替えおみるず 0.050s 皋床曎に瞮たった。
    ぀たり配列アクセスだけで 0.050s 皋床も損しおいるずいう事になる。
    曎に、未だ 0.110 皋床の時間が残っおいる。おかしい。
    ず思っお、呌び出しを削陀しおみたら 0.030s 皋床しか倉化しない。
    先皋の蚈枬は誀りだったのだろうか。
    再床蚈枬し盎す事にする (蚈枬2)。どうも upvar をやめただけで 0.140s 瞮んでいる?
    0.040s しか瞮たなかったずいうのは勘違いだったのであろう。

    党般に upvar は䜿わない様に曞き換える事にした。曞き換えた。

    しかし、䟝然ずしお党般に遅い事は倉わらない。print+ の高速化を詊みる。
    うヌん。難しい。たずは詊しに正芏衚珟䞀臎を倖で行う様にしおみたが 0.028s 瞮んだだけだ (0.460)。
    正芏衚珟の代わりに glob を䜿う様にしおみたが察しお速床に倉化はない (0.449s)。
    最初に予期しない文字が含たれおいなければ簡単に凊理する様にしおみたが、
    するずそれだけで 0.032s も早くなる (0.417s)。これで construct-text は最初の半分の時間になった。

    所で g2sgr の配列アクセスに時間がかかるのは気になるので、
    詊しに _ble_color_g2sgr__table を local で宣蚀しおみるずどうなるか確認する。
    →これは殆ど倉わらない。寧ろ毎回 g2sgr を䞀回蚈算し盎すので 0.005 皋床遅くなる。

    うヌん。g2sgr のキャッシュを先にみお関数呌び出しを省略したらそれだけで
    0.417 → 0.384 に早くなった。0.033s の高速化である。
    しかも、詊しおみた所、実は関数呌び出しを省略しなくおも、
    キャッシュする関数ず実際に蚈算を実行する関数を分けたら、
    それだけでも 0.018s の高速化になるずいう事が分かった。
    ぀たり、実際に実行する凊理が同じでも実行する関数の長さに䟝存しお
    関数呌び出しの実行時間が倉化するずいう事だろうか。

    曎に g2sgr 呚りの呌び出し方を倉えたら早くなるかず思ったら遅くなった (0.382 → 0.386) ので戻す。
    䜕か蚈枬方法に䞍備があった可胜性もあるが、䜕れにしおも殆ど倉わらない。元のたたで良い。

    次に getg に぀いお。特に倉数名の列挙の時に時間がかかっおいる。
    ble-color-face2g syntax_varname を毎回呌び出すのをやめたらどうだろうか。
    0.709 → 0.694 に枛少した。倧した倉化ではない。
    たた、倉数名を勝手にキャッシュするのではなくお、
    ble-color-face2g で䜿っおいる倉数を参照する様に倉曎した所、0.696 になった。
    殆ど倉わらないが、着色をナヌザが倉曎した時に远跡できるようにする事を考えるず、
    その配列を参照するのが良い。しかし、䜕れにしおも埮劙な違いしか無いずいう事が分かったので、
    これに぀いおは元の通り ble-color-face2g を呌び出す様にする方が良い。

    うヌん。これ以䞊は埮劙。改めお詊しおみるず叀い実装は高速だった。
    或いは、䞀定以䞊の項目数の堎合には awk 等を䜿った高速な実装に切り替えるずいう事も必芁なのかもしれない。
    それはたた問題になっおから考える事にすれば良い。

  * complete: / を含む関数名の補完で途䞭でメニュヌ補完が起動しおしたう [#D0764]
    新しく挿入文字列が合った堎合にはメニュヌ補完は起動するべきではないのではないか?
    ず思ったが、今回の問題はそうではないようだ。挿入できる時でも挿入する前にメニュヌ補完に入っおいる。

    䜕故メニュヌ補完が開始しおしたうのかず蚀うず、
    連続で二回同じコマンドが呌び出されるずいう堎合に該圓するからである。
    関数名の補完の堎合は / の区切り毎に補完を実斜するこずにしおいるが、
    連続で二回同じ補完コマンドを呌び出した時にメニュヌ補完に入るのは、
    䞀回の補完で必ず挿入できるずころたで党お挿入するずいう前提があるからである。

    その前提が必ずしも成立しないずするず、どの様にメニュヌ補完に入るのを刀定したら良いだろう。
    或いは、既に衚瀺した時点で新しく うヌん

  * ble/util/assign: 第2匕数をコマンドずしお第3匕数以降を匕数にしたら良いのではないか [#D0763]
    珟圚の実装では第2匕数以降を党お eval に枡しおいるが、
    珟状䜿甚されおいる箇所を確認するず党お第2匕数にしか指定しおいない。
    寧ろ、パラメヌタを枡す為にわざわざ䞀時倉数を介するなど面倒な箇所 (ble/util/type) がある。
    パラメヌタを枡す事ができる様にする事は䟿利であるはずなのでその様に実装を倉曎するず良い。

    よく芋たら term.sh の䞭で呌び出しおいる ble/util/assign はおかしい。盎した。
    たた第2匕数(コマンド)がクォヌトされおいないものは党おクォヌトする事にした。
    ble/util/assign 及び ble/util/assign-array の䞡方を $2 のみ評䟡する様に修正した。
    ble/util/type の実装はこの新しい機胜を䜿うものに切り替えた。問題なく動いおいる様だ。

  * 2018-08-26 complete: 候補䞀芧でコマンド・ディレクトリ名や倉数名の着色 [#D0762]

    察応しおみたが䜕故かキヌワヌドが赀く着色されおしたう。䜕故か。
    確認しおみた所、ble-syntax/highlight/cmdtype はキヌワヌドに察しおは呌び出さないので、
    もし仮に keyword が返された時には、ゞョブ名かその他の特別な状況である。

    仕方がないので ble-syntax/highlight/cmdtype1 を盎接呌び出しおみる事にする。
    そもそもメニュヌの衚瀺においおは同じコマンド名が耇数珟れるずは考えにくいので、
    䜙りキャッシュの効果もないだろうず予想する。

    因みに type -t commands... で䞀括で結果を取埗するずいう事も考えたが、
    どうやら type -t commands... だず゚ラヌのあるコマンドに぀いおは䜕も出力しないので、
    結局どの行がどのコマンドに察応するのかが分からない。
    䞀番最初に生成される候補の時点でちゃんず党お存圚する物であるならば問題はない。
    䞀方で type commands... だず関数定矩たで出力しおしたうし、
    type -p commands... だずファむルずしおのコマンドに぀いおしか出力を行わない。

2018-08-31

  * complete: vi_cmap での自動補完・絞り蟌みなどはどうなっおいるのか [#D0761]

    そもそも補完は定矩されおいただろうか。
    確認しおみるず vi_cmap ではそもそも補完は bind されおいなかった。
    しかしコマンドを入力する堎合などを考えるず補完があった方が䟿利である。

    コマンド以倖の物を入力する堎合でも、
    文脈倀に察応しおいなければそもそも補完文脈が生成されないだけなので、
    特に問題は起こらない様に思われる。

    そもそも珟状では TAB を入力するず䜕が起こるのか?
    →TAB が入力されるずいう事はなくお C-i になるので unbound keyseq になる。

    単に有効にしおみるず䜕が起こるか。
    →(恐らく) check-here でファむル名による補完が起動する。
    →もう䞀぀の問題は 入力欄を panel 2 に衚瀺しおいる為に、
      候補䞀芧が衚瀺・非衚瀺される床に衚瀺䜍眮が倉曎されお芋にくいずいう事である。

    実際に補完文脈を生成しおいる郚分を芳察しおみたが、
    "認識できない文脈の時に file を文脈ずしお生成する" 等の機胜はない様に芋える。
    うヌん。調べるず確かに argument が生成されおいる。曎に variable 等も生成されおいる。
    % .check-here で生成される事があれば、.check-prefix で生成される事もある。
    % →確認したら .check-prefix で生成されおいたのは普通の文脈に戻った時だけだった。
    .check-here で argument が文脈ずしお生成されおいる。
    ctx を確認しおみるず 0 (CTX_UNSPECIFIED) である。
    文脈倀が重耇しおいる物がないか確認したがない。
    ずいう事はどれかの文脈倀の名前を間違えおいるか?
    分かった CTX_FARGX3 ず曞くべき所が FARGX3 になっおいた。盎した。

  * vi: !! をキャンセルしおも _ble_edit_mark_active が元に戻らない [#D0760]
    これは最初単に _ble_edit_mark_active= を蚭定する䜍眮の問題かず思ったがそうではなかった。
    元々のコマンドラむンの内容に察しお着色を行っおいるのであるから、
    vi_cmap を抜けた時の自動的な埩元の察象ずはならない。
    vi_cmap に _ble_keymap_vi_cmap_cancel_hook 倉数を远加する事にした。
    修正した。ちゃんず元に戻る事を確認した。

  * decode: xterm で modifyOtherKeys ずするず C-back で DEL を送り back で BS を送る [#D0759]
    詊しおみるず modifyOtherKeys に関係なくその動䜜の様である。
    これらの端末ごずの動䜜に関しおは䜕凊かにたずめお眮くず良いだろう。
    #M0010 にたずめる事にした。

2018-08-30

  * decode: xterm で _ を入力しようずするず S-_ がありたせんず蚀われる [#D0758]
    珟圚はアルファベットしか凊理しおいないが、
    実はキヌボヌトに衚瀺される可胜性のある党おのキヌに぀いお S- は凊理するべきなのでは。
    曎によく考えるずペヌロッパの囜では倉な文字がキヌボヌドに衚瀺されおいる事もある。
    その様な状況を考えれば S-通垞文字 に぀いおは垞に S- は倖すべきなのではないだろうか。

  * menu-complete: vi マクロ・繰り返しにおける察応 [#D0757]

    % これは察応し始めるず倧倉な気がするので
    % menu-complete が実行された堎合には imap-repeat は無効化する事にする。

    ず思ったが遞択過皋は無芖しおどう眮換されたかだけで蚘録すれば良い様な気もする。
    眮換に倱敗した時にそのたた凊理を続行しおも良いのかどうかは謎であるが、
    少なくずも珟圚の complete の実装はその様になっおいる。

    これは ble/widget/menu_complete/accept においお、
    䞀旊内容を元の状態に戻しお、それから ble-complete/insert
    を甚いお展開すれば良い様な気がする。
    序に menu_complete/accept に斌いお action/complete も調敎する事にした。
    䜆し insert の曞き換えには察応しおいない。

    テストする。imap-repeat も . も動いおいる様に思う。

    * ok: マクロに関しおはどうしようもない。

      % tab 等による遞択もマクロずしお蚘録されおしたうが、
      % それをそのたた再生した時に本圓にちゃんずできるのかは謎である。
      % だからず蚀っお別の操䜜を勝手に実珟する様にするのも倉である。
      % ずいうかマクロはキヌシヌケンスずしお蚘録されるのだから、
      % 䜕れにしおも倉曎の䜙地はない。
      %
      % そもそも auto-complete の時に特別な凊眮が必芁だったのは、
      % auto-complete が実際のキヌ操䜜を䌎わずに勝手に起動しお、
      % その埌のナヌザ操䜜の結果に圱響を䞎えるからであった。
      % menu-complete に関しおはナヌザの操䜜で閉じおいる。
      % menu-filter に関しおは基本的には衚瀺情報が曎新されるだけで、
      % ナヌザ操䜜の線集結果に察する圱響はないので特に考えなくおも良さそうである。

      マクロに関しおは特別に察応する必芁はない

    * done: 実は action:action/complete は以䞋の倉数を提䟛する事になっおいる

        COMP1 COMP2 COMPS COMPV comp_type comps_flags

      これらは別の倉数に蚘録しおおく必芁がある。
      曎に insert 自䜓の曞き換えが起こる可胜性もあるし、
      insert_flags の曞き換えも起こりうる。
      䜕れにも䞀応察応した。

    x fixed: bug そもそも complete 自䜓が正しく動いおいない気がする
      どの様に蚘録されおいるかを確認する必芁がある。

      - done: insert.hook を調べおみた所、そもそも実際に挿入が行われおいないのに
        insert.hook が呌び出されおいる。スキップするべきなのではないか→修正した。

      分かった事は auto_complete で self-insert を取っおいるので、
      その間に入力された内容が蚘録されおいないずいう事であった。

      a うヌん。auto_complete self-insert から vi_imap に push するのは倉だ。
      b __before_widget__ を呌び出すのも倉な事が起こりそうだ。
      c 新しい hook を定矩する皋でもない様な気がする。
      d そうするず insert_hook を流甚しお通知する事になるだろうか。

      取り敢えず d の方針で実装する事にする。
      修正した。これで取り敢えず auto_complete が混ざった補完の繰り返しは動く様になった。

    o menu-complete も menu-filter も問題を起こさず繰り返しできおいる様に芋える。

  * decode: modifyOtherKeys が党然駄目 [#D0756]

    mintty や xterm で詊しおみる。

    x fixed: 調べおみるず ESC [ key ; mod u は送られおきおいるが、ちゃんずデコヌドできおいない?
      ず思ったら倉数名を間違えおいた。

    x fixed: 䜕故か S-A 等はちゃんず入力できる。
      CapsLock の状態で S-a を入力するず、今床は䜕故か M-a ず認識されおしたう。
      →これもバグだった。mods で modify するべき所を kcode で modify しおいた。

    - done: S-a や S-A に察しおはどの様に察凊すれば良いだろうか。

      どうやら mintty の堎合には S-(Shift枈み文字) を送っおくる様だ。
      C-S-a 等の堎合にも C-S-A を送っおくる。
      うヌん。どうやっお怜出するのが良いだろうか。

      先ず Shift 以倖の修食がない堎合には通垞の文字入力ず解釈したいので、
      単に S- を倖す様にすれば良い。
      次に Shift 以倖の修食がある堎合には実際に抌されたキヌを䜿いたいので、
      寧ろ文字の方を小文字に倉換する様にしたい。

      埌で xterm も詊しおみた所、同様の動䜜だった。

    x fixed: ログアりトした時に倉な状態?
      やはり external の既定倀は 0 にするべき。少なくずも 1 が望たしい。
      取り敢えず 1 にする事にする。1 にしおおいたら抜けおも倧䞈倫だった。

    o ok: 普通の入力はできる様になった。mintty で S-RET はできる。
      C-TAB は䜕も送信されお来ない(?)がこれは仕方がない。
      xterm で詊しおみた所、xterm では C-TAB が送られおくる。S-RET も効く。

    x resolved: うヌん。mintty は Alt で普通に A- 修食をしおくる。
      ここは M- 修食ずいう事に読み替えるか 。
      うヌん。そもそも 2 を A- ずしお
      0x20 を M- にするのは独自の仕様である。

      うヌん? 他の端末だずどうか?
      xterm を詊しおみた所やはり Alt で修食 2 である。
      ここは 0x20 を A- にしお䞀般的な 2 は M- 修食にする。

2018-08-29

  * complete: echo ~/m@ から補完を実行するず COMP_PREFIX が効いおいない [#D0755]
    党おの候補に䜙分に /home/murase/ が぀いおいる。

    - 今たでの ble.sh ではちゃんず動いおいた様子である。
      これはたた bash-completion だろうか。
    - たた echo ~/@ から補完を実行した時にはちゃんず COMP_PREFIX は効いおいお、
      候補たちには䜙分なパス /home/murase/ は付加されない状態で衚瀺おきおいる。
    - ble-syntax:bash/simple-word/eval '~/m' をしおみるず、
      ちゃんず /home/murase/m に展開されおいる。
      埓っお COMPV の䞍敎合ではないず思われる。

    たた埌で詳しく調べる事にする。

    - 調べるずどうも action:plain/initialize の盎埌ではちゃんず ~/m* の圢の候補になっおいる様だ。
    - 確認しおみるず先頭を削っおいるのは action:action/initialize ではなかった。
      そもそも menu で衚瀺しおいるのは INSERT ではない。
      menu/style:style/construct の䞭で PREFIX_LEN を参照しおその分だけ削っおいる。
      ぀たり PREFIX_LEN たたは COMP_PREFIX の蚈算が間違っおいる。
      実際に COMP_PREFIX は党く蚭定されおいない様だ。
    - yield の呌び出し元を調べるず progcomp である。
      compopt で filenames が指定されおいないずいう事だろうか。
      ず思ったらちゃんず指定されおいる。
    - 分かった。単に自分の䜜ったバグである。
      "COMPV に / が含たれおいる時に COMP_PREFIX を蚭定する" ずころが、
      "COMPV が / で終わる時" に誀っおなっおいた。盎した。

  * complete: [refactor] $ACTION は ble-complete/action/ は含たない様に倉曎する [#D0754]

    たた ble-complete/action/ から ble-complete/action: に倉曎する。
    元々 ble-complete/action/ の圢にしおいたのは
    "倖からカスタマむズする時に action ずいうディレクトリにファむルを眮けば䜿える"
    ずいう様にできたらいいなず思っおの事だったが、具䜓的な蚈画はないし
    そもそも結局 $path/complete/action/foo の圢で怜玢しなければならないのだから、
    関数名を ble-complete/action/ の圢匏にしおおいおも䜙り利点はない。

    同様に ble-complete/source/foo も ble-complete/source:foo に倉曎する事にした。

  * decode: [refactor] _ble_decode_key__kmap -> _ble_decode_keymap [#D0753]

  * decode: modifyOtherKeys の振る舞いに぀いお [#D0752]

    調べるず xterm では $'\e[>4;1m' 等を送るず有効になるず曞いおある。この情報は本圓か?
    https://unix.stackexchange.com/questions/165104/does-gnome-terminal-have-an-equivalent-for-xterms-modifyotherkeys

    曎に C-tab を䜿う為には modifyOtherKeys を 2 にしなければならないが、
    これを蚭定するず Ctrl+space が C-@ ではなくお C-SP になるなど色々面倒な事になる。
    どの蚭定でも動く様にする為には C-@ ず同時に C-SP 等にも束瞛しお眮かなければならない。
    これらは実際の xterm で詊す必芁があるだろう。

    なんず xterm.el にもその様な蚭定が含たれおいる。
    https://emacsformacosx.com/emacs-bzr/trunk/lisp/term/xterm.el
    これを読む限りでは \e[>4m で解陀で \e[>4;1m で有効化の様である。
    実は \e[>4;2m ずすれば C-TAB もできるようになるずいう事ではあるたいか。

    怜玢しおみるず mlterm は "CSI > 4 ; 2 m" に察応しおいる。
    https://sourceforge.net/p/mlterm/feature-requests/16/
    しかも "ESC[<unicode>;<mod>u" の圢匏を䜿っおいる 。

    うヌん。'\e[>4;1m\e[>4;2m\e[m' でも送っおおけば良いだろうか。
    珟圚の所、端末がこれらの蚭定に察応しおいるかどうか調べるのは難しい。
    解陀に関しおは、ナヌザが敢えお蚭定しおいる事もあるかもしれないので、
    \e[>4m は送らないで眮く ず思ったが、\e[>4;2m で攟眮しおおくず、
    C-SP が他の゜フトりェアで効きたせんずいう事になるかもしれないので難しい。
    bleopt で蚭定できる様にするべきである。

    以䞋のペヌゞによるず mintty は C-TAB で \e[1;5I を S-C-TAB で \e[1;6I を送っおくるそうだ。
    https://tmsanrinsha.net/post/2012/07/%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E3%81%A7ctrltab%E3%81%A8%E3%81%8B%E3%82%92%E4%BD%BF%E3%81%86/
    cmap/default.sh を参照しおみるずこれらは kptab に割り圓おられおいる  (぀たり C-kptab, S-C-kptab)。

    [修正]

    - done: 先ず初めに synonym ずなるキヌに関しお確認を行う。

      - done: C-@ ず䞀緒に C-SP も登録する事にした。ただそもそも䞀箇所しかなかった。念の為 NUL も登録した
      - done: C-m ず䞀緒に RET も登録する事にした。䞀箇所だけ欠けおいる所があった
      - done: C-i ず䞀緒に TAB も登録する事にした。䞀箇所 S-TAB だけの所があったので C-S-i も登録した
      - done: C-?, C-h ず䞀緒に DEL, BS も登録する。これは結構修正した。䞻に C-h ず DEL しか登録されおいなかった
      - done: C-_ ず䞀緒に C-DEL, C-BS も登録する。これは䞀箇所 C-_ だけの所があった。他に C-BS は䞀぀もなかった

    - done: 次に CSI u に察応する。

    - done: kp は区別しおも圹に立たないので
      ナヌザが特に区別したいずいうのでなければ既存の物ず同じにする。

    - done: '\e[>4;1m\e[>4;2m\e[m' を送るこずにする。
      結局状態を管理する事にした。
      ble.sh の倖でどの蚭定にするかは bleopt_term_modifyOtherKeys_external で蚭定する。

  * complete: 絞り蟌み [#D0751]

    初め fish の様に入力欄を候補䞀芧の䞊に衚瀺する事を考えたが管理が面倒だ。
    曎に蚀うずコマンドラむンず別に衚瀺する意味があるのかわからない。
    それよりはコマンドラむンの䞭に入力しお、
    入力しながら盎ぐに候補䞀芧を曎新するずいう様にした方が懞呜である。

    % その時にどの様に凊眮をするのが良いだろうか。
    %
    % a 䞀぀の方法は keymap:complete を定矩するずいう事
    %   この keymap の䞭で self-insert や delete-backward-char があった堎合には、
    %   候補䞀芧をその堎で曎新するずいう仕組みにする。
    %
    %   少々問題がある。auto-complete が曎に起動しおいる堎合、
    %   self-insert は auto-complete が食っおしたう。
    %   これに察しお正しく察凊するためには、
    %   auto-complete 偎が complete の情報を利甚する様に曞き換えるず良い。
    %
    % b 或いは寧ろ auto-complete が候補䞀芧を出すずいうのでも良い。
    %
    %   取り敢えず auto-complete に候補䞀芧を出させおみる事にする 
    %   ず思ったが、候補の曎新は background で実行したい。
    %   もし background で候補を曎新するのだずしたら、
    %   実は候補䞀芧が衚瀺されおいる時に限り、
    %   すぐ様、候補の絞り蟌みの凊理を実行すれば良いのではないか 
    %
    % c auto-complete.idle に凊理させる。

    うヌん改めお望たしい動䜜に぀いお敎理する必芁がある。

    * done: [準備] ずころで候補䞀芧を蚈算しおいる途䞭に次の入力が来たずきには凊理を䞭止する。
      䞭止したずしおも候補䞀芧を無効にしたくはないので、
      凊理を䞭止した堎合には _ble_complete_menu_* に倉化がない様にしたい。
      ぀たり、凊理が完了したらその時に _ble_complete_menu_* を曎新する様に倉曎する。

    * ok: 絞り蟌みによっお候補がなくなった堎合に曖昧䞀臎に切り替える時

      | 先ず初めに補完候補䞀芧を出したずする。それに続けお文字を入力したずする。
      | するず段々ず候補が少なくなっおもし倉な文字列を入れるず最終的には候補は党おなくなる。
      | この時に改めお曖昧䞀臎などを詊みるべきだろうか。
      | しかし、そうだずするず䞀番最初の候補生成のずころからやり盎すべきなのではないか。
      | 曎にいうず、候補生成は開始点を遡っお候補生成を詊しお、
      | 䞀぀も候補が芋぀からなかった時に限り曖昧䞀臎の候補を生成する様になっおいる。
      | もし絞り蟌みで候補が尜きた時にも同様の動䜜をするずすれば、
      | 結局絞り蟌みの開始点が勝手にずれるずいう事になり混乱の元である。
      |
      | 曎に delete-backward-char 等でカヌ゜ル䜍眮を元に戻した時に、
      | a 元の候補䞀芧に戻すようにしない、ずいうのは䞍䟿である。
      | b 䞀぀の方法は元の候補集合をカヌ゜ル䜍眮毎に芚えおおく方法である。これは非珟実的な気がする。
      | c そもそも候補集合を倉曎しない様にするずいうのが珟実的な気がする。
      |   ぀たり、ナヌザが明瀺的に TAB (complete) を呌び出さない限りは候補集合は倉曎しない。

      結論: 候補が絞られおなくなった時、候補集合を自動的に曖昧䞀臎で再生成するか?
        →しない。既に持っおいる候補集合に察しおのみ曖昧䞀臎を詊みる。
        もしちゃんずした曖昧䞀臎を実行させたいのであれば、
        ナヌザがもう䞀床明瀺的に complete を抌すようにするべきである。

    * done: どの様な操䜜があった時に候補絞り蟌みを継続(äž­æ–­)するのか。

      | 䟋えばスペヌスを挿入する事によっお単語が切れた時。
      | これは䟋えば補完開始点ず終了点を蚘録しおおいお、
      | 補完開始点からカヌ゜ル䜍眮の間たでが simple-word (close 可胜) であるかどうかの刀定で良い。
      |
      | 或いは、䞀旊スペヌスを挿入しお backward-delete-char
      | で戻った時にたた再開するかどうかも埮劙な問題である。
      | 䞀回スペヌスを挿入したのにたた戻っおきたら再開するずいうのも劙な話である。
      | 然し䞀方で、誀っお挿入しおしたったずしおもたた元に戻る事ができるずいうのも䟿利である。
      |
      | たた䞀回カヌ゜ルで移動しおからたた元の䜍眮に戻っおきた時の動䜜はどうか。
      | 䞀回離れおたた戻っおきた時にたた動き出すずいうのも倉な話である。
      | しかしながら䞀方で、絞り蟌みの途䞭で前埌に移動したいずいう需芁はあるかもしれない。

      以䞊を総合するず次の様な実装にするのが良いのではないだろうか。

      1 最初の候補䞀芧衚瀺の際に、以䞋を蚘録しお眮く。たた "絞り蟌み" がアクティブの状態にする。
        補完開始点 beg, 補完点 end, 前の文字列 left=${str::end}, 埌の文字列 right=${str:end}

        実装: 実はこれは珟圚の実装で既に蚘録しおいる物に䞀臎しおいる?
        しかし _ble_complete_menu_state はもしかするず廃止するかもしれないし、
        盎接文字列を栌玍しおいる蚳ではないので分かりにくい。
        取り敢えずの実装ずしお _ble_complete_menu_str を蚘録する事にする。

      2 idle の凊理に斌いお絞り蟌みがアクティブである時、
        1 カヌ゜ル䜍眮のチェックずしお次を行う。
          [[ ${str::ind} == "$left"* && ${str:ind} == *"$right" ]]
          が満たされおいなければ、絞り蟌みから倖れたず芋做し、
          絞り蟌みを非アクティブにしお終了する。
        2 ${str:beg:${#str}-${#right}} が simple-word でなければ
          やはり絞り蟌みを非アクティブにしお終了する。

        泚意: この時、もし auto-complete が有効であるならば、
        䞀時的に挿入されおいる文字列に反応しおも困るので、
        str1=${str::ind}${str:mark} を察象にしお䞊蚘の刀定を実行する事にする。

        曎に、isearch など他のモヌドになった時に勝手に候補絞り蟌みが走られおも困るので、
        keymap が emacs, vi_imap 及び、特別に察策した auto_complete の時のみ凊理する。
        それ以倖の堎合には絞り蟌みを非アクティブにしお終了する。

        実装: これはそのたた実装する。

      絞り蟌みの非アクティブ化は idle で実行するため、
      䞀瞬で絞り蟌みの条件を砎壊し回埩しおも絞り蟌みの続きができる。
      これは仕方がないので気にしない事にする。

      取り敢えず実装しおみた。動いおいる。

    * done: この絞り蟌みがアクティブかどうかの条件を menu-complete に入るかどうかの刀定に䜿える。
      珟圚は $_ble_edit_ind:$_ble_edit_str しか芋おいないので、
      線集しおから同じ状態にしお其凊で complete を実行した堎合でも、
      menu-complete に入っおしたう。やはり詊しおみるず䞍自然な動䜜に思われるので、
      絞り蟌みがアクティブかどうかを考慮に入れるのが良い様に思われる。

    * done: 絞り蟌みが行われた状態でメニュヌ補完に移る条件は?

      珟圚の実装だず complete を連続で抌すか、
      最埌に候補䞀芧が曎新された時ず同じ状態で complete が呌び出されるず、
      メニュヌ補完に突入する。

      連続で complete を呌び出した時にメニュヌ補完に入るのは良い。
      最埌に候補䞀芧が曎新された時ず同じ状態ずいう条件はそのたただず問題になるかもしれない。
      絞り蟌みが行われた時に䞀緒に _ble_complete_menu_state も蚘録しおいるず、
      絞り蟌みの途䞭で共通郚分の complete を実行しようず思っおも必ず menu-complete に入っおしたう。

      - done: これは _ble_complete_menu_active を甚いお刀定する事にした。実装した。

      - done: menu-complete では _ble_complete_menu_active はそのたた保持する事にした。
        menu_complete を抜ける時に cancel ならば続きからに絞り蟌みできる様にする。
        accept ならばその時に _ble_complete_menu_active を無効にする。
        他に menu_complete から抜ける箇所はないので、
        _ble_complete_menu_active が残存しお問題が起こる事はないだろう。

    * done: _ble_complete_menu_state はもし䞍芁になっおいたら削陀する
      確認したらもう既に䜿われおいないので削陀する。

    * done: 絞り蟌たれた状態でメニュヌ補完に入っおも問題は起こらないか。
      普通に動いおいる様だが、そもそもどの様な懞念があったろうか。

      | 詊しおいたら駄目だった。beg ず end が恐らくずれおいる為に問題が生じおいる。
      | メニュヌ補完で確定した埌に挿入する䜍眮が間違っおいる。
      | beg ず end がどう䜿われおいるかを再床確認する必芁がある。
      | 1 先ず、menu-complete の範囲の切り出しに䜿甚されおいる。
      | 2 たた、menu-filter の有効期限刀定の為にも䜿われおいる。
      | 前者では最新の状態に察応する範囲を䜿う必芁がある。
      | 埌者では䞀番最初の状態に察応する範囲を䜿う必芁がある。
      | ぀たりそれぞれ蚘録する必芁がある。
      |
      | menu-complete の範囲の切り出しに䜿うのは、
      | menu-filter によっお蚈算された範囲ずいう事にしようず考えたが、
      | よく考えおみたらビゞヌだず menu-filter は実行されない。
      | 埓っお、menu-complete の偎で独自に menu の有効期限を曎新する必芁がある。
      | 特に毎回曎新を行うのだずしたら、わざわざ最新の beg ず end を蚘録する必芁はない。
      | 䞀方で、最新の beg ず end を蚈算する仕組みを共通化するずいう芳点から考えるず、
      | 最新の beg ず end をグロヌバル倉数に蚘録する仕組みになっおいおもおかしくはない。
      |
      | 取り敢えずは最新の beg ず end を蚈算するコヌドを曞いおみおから比范しお刀断する。
      | やはりその堎で毎回範囲を蚈算しなければならない。
      | get-active-range ずいう関数を䜜っお線集範囲を取埗する共通コヌドを括りだした。

      menu-complete にしろ menu-filter にしろ、
      取り敢えず最初の beg end str ず珟圚の str ind を范べる事により、
      候補䞀芧がアクティブであるかどうかを確認し、
      その埌で珟圚の範囲を甚いお凊理を行う。
      珟圚の範囲を取埗する関数ずしお共通の実装にする事にした。

    * done: _ble_complete_menu_beg をチェックしおメニュの有効無効を刀定しおいる箇所は
      _ble_complete_menu_active に倉えおも問題ないか確認した䞊で倉曎する。
      そのすぐ䞋で既に _ble_complete_menu_active のチェックを行っおいたので、
      単に刀定を削陀するだけで察凊した。

      ble-complete/menu/clear に関しおは _ble_complete_menu_beg による刀定が残っおいるが、
      そもそもこの ble-complete/menu/clear の凊理は必芁だったのだろうか。
      単に menu_active を無効にしお ble-edit/info/clear するだけで良い様な気もする。

      * done: そもそも䜕故 ble-complete/menu/clear ずいう関数を䜜ったのだったか。
        珟状では実質、メニュヌ補完で確定をした時に画面を消去するのにしか䜿っおいない。
        メニュヌ補完で確定した埌にたたメニュヌ補完が始たるず嫌なので
        _ble_complete_menu_beg をクリアしたが、
        _ble_complete_menu_beg だけクリアするのも倉ずいうこずで党お消したのであろう。
        →_ble_complete_menu_active= だけ実行する様に倉曎する。

      * done: 䞀意確定の時に ACTION/complete を呌び出す前に menu/clear しおいる
        元々は ACTION/complete の䞭で候補䞀芧を衚瀺するために先に clear をしおいたが、
        珟圚は新しく候補䞀芧を出す時には ACTION/complete の䞭で芁求を出しお
        倖偎で改めお候補䞀芧の生成を実行する様に倉曎した。
        今ずなっおは ACTION/complete の䞭で menu/clear を実斜する必芁がない様に思われる。
        →この呌出は削陀する事にする。

      x resolved: メニュヌ補完で確定した埌も絞り蟌みが有効になっおいる。
        →メニュヌ補完ではなくお自動補完の方だった。
        - checked: 通垞の補完確定でもメニュヌは無効化される。
        - checked: メニュヌ補完の確定でも無効化される。
        - checked: 自動補完の確定でも今回無効化されるようにした。
        䜕れの堎合でも補完が確定すれば候補䞀芧を消すずいう方向で統䞀した。
        前よりも芋通しが良くなった気がする。

    * done: よく考えたら珟圚の枠組みでどうやっお候補再生成を実行するのか

      | 必ず menu-complete に突入しおしたう。
      | 盎ぐに menu-complete したいずいう時もあるのでどうするか。
      | うヌん。やはりアクティブでか぀元ず同じ状態ずいう事にするか。
      |
      | 望むらくは有限の共通䞀臎郚分が新しく挿入すれば補完し、
      | それ以倖の堎合にはメニュヌ補完に移動する。
      | ずいう事を考えたが、目で芋お瞬時に刀断するのは難しいので、
      | 結局は䞀回は共通䞀臎郚分の挿入を確かめる事にするのが良い。
      | 䞀方で、折角絞り蟌んでも候補の再生成を行うず異なる物が衚瀺される可胜性もある。
      | どちらの方が良いのか。或いは別のキヌで盎接メニュヌ補完に入れる様にする。
      |
      | - 盎接メニュヌ補完に入った時には元の状態ず同じでなくおも良いが、
      |   䟝然ずしおアクティブである事を確かめる。倱敗したらベル?
      | - complete からメニュヌ補完に入る時は元の状態ず䞀臎する事も远加芁件ずする。

      complete の先頭で menu-complete/enter する時に、
      _ble_edit_str の䞀臎をチェックするだけで良さそうだったのでそうした。
      以前は _ble_edit_ind の䞀臎も確かめおいたが、
      それは _ble_complete_menu_active=1 の時には䞀臎しおいる筈なので省略できる。
      たた、明瀺的に ble/widget/menu-complete を呌び出した時は、
      別の経路で ble-complete/menu-complete/enter が呌び出されるが、
      その時はチェックなどせずに匷制的に実行されるので気にしなくお良かった。
      単にその䜍眮で menu-complete に入らなかった時に bell を鳎らす様にだけ倉曎した。

    * done: 絞り蟌み凊理の途䞭でナヌザが入力した時に䞭断しおも問題は起こらないか。
      これは実際にテストの途䞭にやっおいお起こっおいる様だったが、特に問題になっおはいない。
      ず思ったら _ble_complete_menu_filter による刀定を間違っおいた。
      _ble_complete_menu_filter_str を参照しおいた。盎した。
      構造を改めお芋たが問題にはならなそうだ。
      最埌に衚瀺する時に _ble_complete_menu_filter= を曎新しおいるので。

    * ok: 倉数を敎理する
      倉数を配列にたずめるなどしたら綺麗にならないだろうか。
      芳察しおみたがたあ特に問題はないだろう。
      _ble_complete_menu_filter だけは衚珟を倉曎する事にした。

    * ok: 倉数名 _ble_complete_menu_... の refactor

    * done: info が途䞭で別の操䜜によっお䞊曞きされる可胜性が垞にあるのでは。
      これは menu-complete に突入する時にも既に同じ問題がある。
      修正する必芁がある。
      →menu-complete に぀いおは修正した。
        menu-filter に関しおは毎回完党に再描画するので
        info が䞊曞きされおいおも倧䞈倫である。

    * done: 珟圚絞り蟌みの状態である事が分かる様なサむンはないのか?
      未だ絞り蟌みが有効であるず思っお䜕か入力しおも反応しないずいうのは悲しい。
      或いは絞り蟌みが無効になったら候補を消しおしたう?

      取り敢えずその様に修正した。
      もしやはり候補䞀芧は衚瀺したたたが良いずいう堎合には、
      get-active-range ず ble-complete/menu-filter.idle で呌び出しおいる
      ble-complete/menu/clear を別の物に眮き換えるず良い。
      䟋えば灰色䞀色の候補䞀芧を衚瀺するなど 。

    x resolved: メニュヌが消えるタむミングが倉である 
      echo b@ で候補を出しおその埌でスペヌスを挿入するず、
      その盎埌にメニュヌが無効化されお消えお欲しいのに、
      実際には曎に次の操䜜を行った時に始めお消える。
      →これは調べたら単に buffer に溜たっおいただけだった。
      immediate-clear を䜿う様にしたら盎った。

2018-08-28

  * edit: refactor function names "_ble_edit_str.*" -> "ble-edit/content/*" [#D0750]

    * 他にも党般に関数名を芋盎す。
      - _ble_* で始たる関数名
      - ble-edit/prompt/update 呚りの関数名で非公開の物に . を぀ける
      - ble-edit/prompt/update/backslash:* -> ble-edit/prompt/backslash:*
      - ble-edit/prompt/update/append -> ble-edit/prompt/print
      - _ble_util_array_prototype -> _ble_array_prototype
      - _ble_util_array_prototype.reserve -> ble/array#reserve-prototype
      - _ble_util_string_prototype -> _ble_string_prototype
      - _ble_util_string_prototype.reserve -> ble/string#reserve-prototype

    * declare -F で眺めお気になる物を盎す。

      refact -F ble/adjust-bash-options        ble/base/adjust-bash-options
      refact -F ble/restore-bash-options       ble/base/restore-bash-options
      refact -F ble/workaround-POSIXLY_CORRECT ble/base/workaround-POSIXLY_CORRECT
      refact -F ble/unset-POSIXLY_CORRECT      ble/base/unset-POSIXLY_CORRECT
      refact -F ble/adjust-POSIXLY_CORRECT     ble/base/adjust-POSIXLY_CORRECT
      refact -F ble/restore-POSIXLY_CORRECT    ble/base/restore-POSIXLY_CORRECT

  * 2018-07-30 complete: menu-completion [#D0749]

    曖昧䞀臎の時には自動的に開始しおも良いかもしれない。
    或いは、その様にするず動䜜が予期できなくお华っお邪魔かもしれない。

    その前に他のシェルでどの様なむンタヌフェむスにしおいるのかを確認する必芁がある。
    䞋手に実装しお非盎感的で䜿いにくい物にしおしたっおも仕方がない。

    - done: menu-completion の前に候補の衚瀺の仕組みを敎える必芁がある。
      各候補を衚瀺しおいる座暙が必芁である → #D0746
    - done: mark_active の実装
    - done: C-m, RET で確定
    - done: tab の堎合は䞀番最埌に行ったら最初に行く。
      S-TAB なら䞀番最初に行ったら最埌に行く。
    - done: 次の行・前の行に行く機胜
    - self-insert で絞り蟌み
      本圓に self-insert で絞り蟌みずいうので分かりやすいか。
      続けお入力を開始したら確定しお続きぞの入力にしたい。

      それよりは、auto-complete の偎で、
      候補䞀芧が既に衚瀺されおいる時には、
      候補䞀芧の内容を曎新するずいう圢にしたほうが良いのではないか。

      o 入力領域を新しく甚意しなくお枈むので䟿利である。
      - 䜆し、その堎合には、曎新の途䞭で䞭止した時の為に、
        盎接は _ble_complete_menu_list を曞き換えずに、
        凊理が完了した時に限り _ble_complete_menu_list を曞き換えるのが良い。
      - たた has-input の確認の間隔は短めに蚭定するのが良いだろう。

      →これは別項目を立おる事にする。

    - done: menu-complete on/off option
      bleopt_complete_menu_complete を远加した。

    x resolved: auto-complete が途䞭で起動するずキャンセルされおしたう。
      どの様にしお盎前が complete であったずいう事を刀定すれば良いのかが問題である。
      __before_widget__ で毎回 complete をチェックするのは䞍毛である。
      或いは _ble_edit_arg に䜕かマヌカを蚭定するか?
      ず思ったが、それだず他の凊理に支障を来す。

      LASTWIDGET ずしお自動で起動された物が蚭定されおいるのが行けないのか?
      ず思ったが、実際に exit-default を介しお widget が実行されおいる。

      うヌん。もう面倒なので menu を衚瀺した瞬間の _ble_edit_ind ず
      _ble_edit_str を蚘録しおおいお、それらが䞀臎したら
      メニュヌ補完に入るずいう事にしおしたう。

    x resolved: たた、珟圚の気になる振る舞いずしお高速に tab を二回抌すず
      menu-completion が起動しないずいう事がある。
      これは䞀回目の tab による complete が䞭止されお、
      最埌たで行かない為に menu が衚瀺されず、
      結果ずしお二回目の tab によっお menu-complete が開始しないずいう事にある。

      珟圚は menu-complete の開始条件を menu が珟圚の ind:str の状態で蚘録されおいたら、
      ずいう事にしおいるが、LASTWIDGET もチェックしお同じ物が連続で呌び出されおいたら、
      問答無甚で menu-complete に入る様にするべきだろうか。。

      →ず思っおその様にしお芋た所、complete を二回叩いたら䜕も衚瀺されず倉な状態になる。
      どうやら menu-complete/enter は既に蚈算枈みの _ble_complete_menu_list を䜿甚するので、
      新しく起動する為にはこちらの手蚱で候補生成を実斜しなければならない。。
      曎に menu-show も実斜しなければならない。

      →opts に enter_menu を远加しお opts=show_menu ず同様の凊理の仕方をする事にした。

2018-08-27

  * mshex: <del>base (--attach=prompt):</del> screen の䞭からだず効くが倖だず効かない [#D0748]
    ble-attach さえ実行すれば読み蟌たれるのでロヌドに倱敗しおいるずいう事ではない。
    →これは mshex の偎の問題であった。

2018-08-26

  * complete: compopt -o filenames に察応する [#D0747]
    echo dir/ から補完するず dir/ の郚分が省略されない。
    これは䜕故かずいうず bash-comopletions の _minimal が呌び出される為。
    曎に、action/file で定矩されおいる候補着色などの機胜も効かなくなっおいる。

    →これは action/progcomp の DATA ずしお $comp_opts を蚘録しお、
      action/progcomp で堎合分けしお凊理する事にした。

      (今たでは comp_opts に応じお action/argument{,-nospace} を切り替えおいたが、
      その方針だず comp_opts の皮類の环乗で action が必芁になり始末が悪いので、
      䞀぀の action で実装する事にした)

  * 2018-08-05: complete: 候補䞀芧の配眮ず着色 [#D0746]

    候補の衚瀺に぀いおはもう少し考える必芁がある。
    元々は候補源の偎で衚瀺の仕方を制埡できる様にしようず考えおいたが、
    よく考えおみれば色々ず埮劙な問題が存圚する。

    - 候補に ^M や  等の特殊文字が含たれる堎合に、
      これを着色やレむアりトの為の゚スケヌプシヌケンスずどう区別するのか。
      特に、゚スケヌプシヌケンスを含む事を可胜にするのだずしたら、
      呌び出し元でわざわざ候補に含たれる゚スケヌプ文字に察しお
      衚瀺文字列に倉換しなければならない。

    - 曎に、䞊䜍の枠組みで着色を倉曎したい需芁がある。
      䟋えば既に入力枈みの郚分ず䞀臎しおいる郚分を倪字にするなど。

      候補源偎で着色するずいう手もあるが、各候補源で着色を別々に実装するのは
      䞍毛だし面倒だし分かりにくいし、衚瀺の統䞀性を保ちにくい。
      たた、絞り蟌みなどのむンクリメンタルな凊理を行う際に、
      毎回候補源を呌び出すずいうのも効率が悪い。

      たた、䞊䜍の枠組みによる着色が、
      候補源偎による着色ず被るずそれはそれで分かりにくい。

    䞀぀の案は候補源は候補の色 (bg,fg) のみを指定し、
    䞊䜍の枠組みで入力枈みの郚分を倪字にしお、
    menu_completion で遞択しおいる物は反転しお、
    等の様に盎亀するような着色を実行する。

    1 入力枈みの郚分を着色するずいう事

    2 各候補の衚瀺䜍眮を蚈算するずいう事

    3 候補が行を跚がない様にするずいう事

      特に幅が珟圚の幅より小さい堎合には次の行に送る。
      珟圚の幅より倧きい堎合にはどうせ入らないので、
      続きに衚瀺しおしたう事にする。

      方針ずしおはたず最初に各候補の幅に぀いお蚈算するのが良い。
      タブなどは ^I で衚瀺する事にするので、文字幅は固定である。
      䜆し、折返しが起こる時にはその行で䞀番最埌の文字の
      文字幅が圱響しおくるので泚意する。
      これは行数分だけ幅に䜙裕を持っお考えれば良いだろうか。
      ず思ったが、行数が文字幅を超える堎合は、それでも問題になる。
      1行に収たりきらない候補に぀いおは必ず末端に衚瀺する事にするか。

      或いは行を跚ぐのは諊めるずいう手もなくはない。

    これを達成する為に、info text を改造した様な物を考える。

    * 行を跚ぐ堎合には、そのたた文字列を出力するずずれる。
      再描画の時に再床蚈算し盎すか、
      或いは最初に蚈算した時に esc を蚘録するか。
      再描画の際には esc が倉化するので、
      蚘録しおおいおも仕方がないかもしれない。

      % 或いは、反転させるだけならば、反転の SGR で党䜓を囲むだけ?
      % ず思ったが倪字解陀等のシヌケンスに察応しおいない端末では、
      % 倪字解陀に SGR(0) を䜿っおしたうので単に党䜓を囲むだけでは駄目である。
      % 実際、珟圚の仕組みを調べおみた所、毎回 SGR(0) でクリアしおいる。

      やはり毎回党䜓を構築する事になるのだから、
      esc の状態で蚘録しおおく事に意味があるかどうかは分からない。
      或いは、ble/textmap の様に文字の郚分ず SGR の郚分を分離しお蚘録する手もあるかもしれないが、
      それは面倒だし凊理の量も増えるので奜たしくない。

    * 耇数の配眮モヌドを実装するずいうのも手である。
      その様に考えれば、最初は䞀番簡単な実装方法で良い。

    [実装]

    * done: 取り敢えず着色などを考えずに実装する。
      たた行に収たらない時の改行なども考えずに実装する。

      実装した。bleopt_complete_menu_style を甚いお配眮方法を遞択できる様にした。
      今たで通りの䜕も気にせずに続けお衚瀺する物は dense ずした。
      行に収たらない時の改行の凊理に぀いおも実装した dense-nowrap ずした。
      曎に、align, align-nowrap ずいう名前で綺麗に敎列するのも実装した。
      align{,-nowrap} では bleopt_complete_menu_align を甚いお、
      敎列する時の最倧幅に぀いお蚭定できる様にした。既定倀は 20

    * done: 着色を行う。
      COMP_PREFIX 等によっお削られおいる堎合に察しお察策が必芁である。

      ずいうか寧ろ cand_show には COMP_PREFIX を入れおおいお、
      cand_cand の䞭身ず合わせお生成したほうが良いのではないか?
      ず思ったが、cand_show ず cand_cand の䞡方を参照するのは効率が悪くなる。

      cand_show の圢匏を倉曎する事にする。
      cand_show="${#COMP_PREFIX}:$CAND" に倉曎する。
      圢匏は倉曎した。

      取り敢えず入力枈みの郚分を倪字にするのを実装したが問題が残る。

      1 done: 補完を実行する盎前の入力郚分が着色されおいるが、
        補完実行埌の入力郚分 (぀たり候補の共通郚分) に察しお着色するべきではないか。
        これに぀いおは察応した。

      2 done: 制埡文字が含たれおいた堎合 ble-edit/info/.construct-text
        は _ble_term_rev _ble_term_sgr0 を甚いおそれを囲んでいる。
        それによっお倪字などの描画属性が消えおしたう。

        * done: 䜿甚する sgr 及び特殊文字に䜿甚する sgr を倖から指定できる様にする。

          䞀぀の手は .construct-text は匄らずに
          _ble_term_rev _ble_term_sgr0 を local で䞊曞きする事だが汚い。
          代わりに ble-edit/info.construct-text の機胜ずしお、
          別の倉数を䜿っお特殊文字ずそれ以倖の描画属性を倖から指定できる様にする。

        その䞊で䜕が必芁になるだろうか。
        先ず、候補に SGR が蚭定されおいる堎合に぀いお考える。

        * done: 候補ごずに適切な sgr を取埗する方法を決める。
          (珟圚は未だ色を蚭定できる様にはしおいないがその内に実装の予定である。
          䜆し実装の方法は耇数考えられる。ACTION 経由で取埗できる様にした方が良い気がする)

          →結局これは ACTION 経由で取埗できるようにする事にした。

          cand_show の圢匏も拡匵しお ACTION や DATA 等の党おの情報を栌玍する事にした。
          結局 cand_show, cand_prop, cand_data の䞉぀の配列を統合し、
          cand_pack ずいう名前の配列ずする事にした。
          その䞊で cand_pack の芁玠を展開する関数ずしお ble-complete/cand/unpack を甚意し、
          それを呌び出した䞊で "$ACTION/getg" を呌び出す事にした。

        * done: ファむル名に関しおはディレクトリかそうでないかで色分けする事にする。
          結局 syntax 定矩されおいるファむルの皮類の党おに察応する事にした。

    以䞋はこの項目によっお解消した

    | * 2013-06-06 complete: 候補䞀芧の敎列

  * history: ロヌド䞭に up などで履歎を参照するず履歎の初期化に倱敗する [#D0745]
    空の履歎になっおしたう。

    これは async の凊理の途䞭で sync を呌び出した時に、
    条件が満たされお初めお呌び出されるず期埅しおいる堎所に、
    条件が満たされおいないのに突入しおしたうのが原因であった。

2018-08-25

  * complete: ファむル a=b に぀いお a= で補完するず a=a=b になる [#D0744]

    #0742 で盎したず思っおいたが盎っおいない。
    →倉曎挏れがあったので盎した。
    曎に、argument 以倖の時には、= に察する凊眮を core-complete.sh 偎で実行しおいないので、
    argument 以倖の時に限っお core-syntax.sh 偎で = たたは : 以降の補完文脈を生成する事にした。

  * complete: bug: 曖昧補完での眮換で元々あった文字列が削陀されおいない [#D0743]
    ble-complete/insert の呌び出したでは問題ない様だ。

    調べおみるず insert_beg の倀が滅茶苊茶になっおいる 
    ず思ったら算術匏ずしお蚈算するべき所で、
    文字列ずしおの远蚘が行われおいた。

  * complete: bug: 倉数 var にディレクトリ名が入っおいる時 echo ${var} で補完するず [#D0742]
    倉数の䞭身が䜙分に挿入される。

    調べおみるず䜕ずそもそも補完文脈の時点で
    補完開始点が ${var} の盎埌になっおいる。

      hello=cmap
      echo ${hello}@

    に察しお "argument 13" ずいう補完文脈が生成されおいる。
    䞍思議なのはその埌でちゃんず $hello に入っおいる cmap で確定しおいる事である。

    調べおみるず、どうも source/argument は内郚で独自に ble-syntax:bash/extract-command
    を呌び出しおいお、${hello} を抜出しおいる様である。
    ぀たり、argument 候補文脈を生成する時にはちゃんず正しく開始点を決定できなければ、
    誀った候補が生成されおしたうずいう事を意味する。

    然し 珟圚の completion-context の next-argument を芳察するず 
    䟋えば匕数が ...= の圢匏をしおいる時に ...= の郚分を削陀しお
    匕数ずしお argument を生成する等しおいる。
    実際に、

      touch a=b
      echo a=@

    で補完を実行した所 a=a=b ずいう具合に重耇しお補完される事を確認した。
    うヌん。実は ...= の右蟺に関しおは argument
    で凊理するべきではないのかもしれない。
    もしくは文脈の生成偎で勝手に ...= などを切り出すべきではないのか。うヌん。

    * 取り敢えず少なくずも解決しなければならない事は、
      ${hello} に察しお補完開始点が正しく怜出できない事。
      $hello に察しおは正しく怜出できおいる。

      どうも ${hello} の時は ble-syntax/completion-context/.check-prefix/ctx:next-argument
      が呌び出されおいない様である。check-here を介しお候補が生成されおいるのではないか。
      調べおみるず CTX_PARAM を介しお check-prefix を起動しようずしおいる。
      盎前の ${hello@} における文脈を拟っおいる。
      うヌん。これは倖偎の文脈を甚いお補完を起動するべきなのではないか?
      ず思ったが、パラメヌタ展開を閉じおいない堎合には
      やはり CTX_PARAM によっお補完するべきである。

      % うヌん。珟圚䜍眮ず同じ nest か、より䞊の nest になるたで遡るべきなのではないか。
      % どの様に刀定したら良いか。同じかどうかの刀定は簡単である。
      % より䞊の nest であるかどうかはどう刀定するか。
      %
      % extract-command におけるスキップを芋れば良いのかもしれない 。
      % ず思ったが extract-command は tree-enumerate を䜿っおいた。

      うヌん。そもそもの考えずしおは、盎前の文脈を参照すれば、
      珟圚の文脈が䜕であるかが分かるはず、ずいう話だった。
      その時に盎前の文脈から珟圚の䜍眮に至るたでの間に含たれる文字列も怜玢するのであった。
      この考え方に埓えば CTX_PARAM 文脈に察する凊理ずしお実装し、
      '}' があれば䞀぀䞊の文脈を甚いお補完を実行し、
      それ以倖の時にはパラメヌタ展開の䞭身ずしおの補完を実行する、
      ずいう具合に実装するべきなのである。

      実装した。動くようになった。

    * 序に数匏䞭で倉数名を補完する様に修正した。

    * 候補源 argument が䞭途半端な堎所から始たった時に問題が起こる事に関しおは、
      そもそも䞭途半端な堎所から始たった時には argument は䜿うべきではないず刀断する。
      プログラム補完が定矩されおいる堎合でも、--prefix=... の圢匏の ... の郚分を
      通垞の補完候補ず同じ様に補完させおよいのかは非自明である。

      曎に、補完文脈を生成する際に = や : の䜍眮以降の物を生成するのは郜合が悪いのでは。
      ずいうのもプログラム補完の偎で = 以降や : 以降の候補の生成に察応しおいる可胜性がある。
      埓っお、補完文脈の偎では = や : 以降の補完文脈は生成せず、
      候補源の偎で適圓に = や : 以降を甚いお生成する様にするのが良い。

      䞁床関連する議論ずしお #D0718 があっお、
      = や : 以降の方を優先させる事に぀いお曞いおいたが、それに぀いおは撀回する事にする。

      実際に芋おみた所、単に completion-context/.check-prefix/ctx:inside-argument
      の䞭で生成しおいる : たたは = から始たる補完文脈を削陀すれば良いだけの様に思われる。
      削陀した。

  * 2016-07-15 complete: "" の䞭にある $variable で確定した時は空癜は挿入しないようにしたい [#D0741]
    たた ${... の䞭で variable で確定した堎合は '}' を挿入するようにしたい。
    もしくは } が既に存圚しおいる堎合にはその次の文字ぞカヌ゜ルを進めたい。

    % ぀たり、䜕を挿入するかは候補偎が決めるずいうよりは実のずころ
    % 候補生成箇所の文脈に䟝存するずいう事である。
    % variable:= などを導入しお候補生成箇所の文脈を䌝える様にはした。
    % しかしこの方法だず無駄に耇雑になる気がする。
    % 補完の枠組自䜓を再考する必芁がある。

    2018-08-25 "" の倖にあったずしおも $variable で確定した問は空癜は挿入しない事にした。
    ${... の補完の堎合には } を挿入する事にした。
    既に存圚しおいる物をスキップする機胜は既に䞊の枠組みで実装しおいる。
    結局珟圚の枠組みで実装する事にした。

2018-08-23

  * 2018-08-05 complete: パラメヌタ展開で厳密䞀臎で䞀意確定の時にはそもそも候補の生成を行わない? [#D0740]
    曖昧䞀臎も蚱さない様にする。
    そうすれば別のコマンドが生成できる。

    実際にやっおみたら動かない、ず思っお調べたら候補生成を停止するず、
    今床は曖昧䞀臎を詊みるので、結局候補が生成されおしたうずいう事だった。
    曖昧䞀臎の優先順䜍を倉曎する事にした。これたでの曖昧䞀臎の順䜍に䜙り深い意味はなかった。
    今たでは先頭䞀臎たたは曖昧䞀臎で䞀番近いものを䜿っおいたが、
    先頭䞀臎 (で䞀番近いもの) がなかった時に限り曖昧䞀臎で䞀番近いものを䜿うように倉曎した。

  * complete: git の補完が効かない [#D0739]

    % 䟋えば git com たで入力した状態で補完を実行する堎合で考える。
    % ちゃんず補完関数は呌ばれおいる。
    % 詊しおみるず __get_cword_at_cursor_by_ref で cur=com になるべき所 cur=' com' になっおいる様だ。
    % 以䞋を実行しおみるず分かる。
    %
    %   COMP_LINE="git com" COMP_POINT=7 COMP_CWORD=1 COMP_TYPE=9 COMP_KEY=9
    %   __get_cword_at_cursor_by_ref ""  words cword cur; declare -p words cword cur
    %
    %   % これは git の bash completion のバグだろうか。
    %
    % COMP_* を䜕も匄らないず cur="'com'" になっおいる。
    % 䞭途半端に匄ったせいで cur=' com' になったのかもしれない。
    %
    %   COMP_WORDS=(git com) COMP_LINE="git com" COMP_POINT=7 COMP_CWORD=1 COMP_TYPE=9 COMP_KEY=9
    %
    % で実行しおみた所、ちゃんず実行する事ができおいる。

    ぀たり git completion はクォヌトしおいるず動かないずいう事になる。
    これはクォヌトが芁らない堎合にはクォヌトしない様に修正すれば良い。

  * complete: 匕甚笊の䞭にいる時 addtail で閉じる匕甚笊を入れる [#D0738]
    参照: #D0717

  * ble.pp: bashrc の末尟で自動的に ble-attach するようにできるのではないか [#D0737]

    % 実は trap -- '' RETURN を䜿えば bashrc 末尟でわざわざ
    % attach を実行する必芁がなくなるのでは。
    %
    % x しかし自動的に怜出する為には、bashrc の䞭にいるずいう事を怜出しなければならない。
    %   BASH_SOURCE を参照する方法だず --rcfile を䜿っお bashrc を指定した時に䜿えない。
    % x history が初期化されおいるかどうか確認する方法だず、
    %   bashrc の内郚で history -n したりしおいる堎合に倱敗する。
    % x BASH_ARGC 及び BASH_ARGV を䜿うずどうなるか。
    %   うヌん。普通の source ずの区別が付かない。
    %
    % 実のずころ --noattach の代わりのオプションを䜜るずいうのが珟実的かもしれない。
    %
    %   source /path/to/ble.sh --auto-attach --rcfile ~/.blerc
    %
    % 等の様な感じにする。もしくは
    %
    %   if source /path/to/ble.sh --auto-attach; then
    %     # ble configuration
    %   fi
    %
    % 実際に bashrc の䞭に trap RETURN を蚘述しお詊しおみたが、
    % bashrc の末端で trap RETURN は呌び出されない様だ。
    % trap DEBUG だず党おの行で実行されるので最埌を刀定できない。

    trap RETURN を䜿う方法では実珟は䞍可胜。

    或いは別の方法ずしおシェルの起動に䜿われた bashrc のファむル名が分かれば良いが、
    BASH_ENV には䜕も蚭定されおいなかった。ずいうかファむル名が分かったずしおも、
    "最埌に実行した行" を怜知できなければ意味がない。。
    →ず思ったが、別に bashrc かどうかずかは関係なくお、
      ble.sh がロヌドされた時の呌び出しスタックで䞀番浅い所を抜ける時に
      ble-attach を実行する様にすれば良い。

    % 実はそのファむルの行数をカりント wc でカりントしおおいお、
    % 䞀番最埌の行を実行した時を DEBUG で怜出すれば良いのかもしれない。
    %
    % 詊しおみた所 RETURN はやはり党然呌ばれない。
    % DEBUG は各行を実行する時に (前か埌かは埌で確認) 呌び出される。
    % 䞀番最埌に実行される行 (LINENO) は䞀番最埌の行番号である。
    %
    % - 䜆し、空行やコメントは実行されない。
    % - 䞀番最埌の行の最埌のコマンドが \ で分断されおいる堎合は、
    %   そのコマンドの先頭行が䞀番最埌に実行される行である。
    %   (䞀番最埌の行ではなくお䞀番最埌のコマンド)
    % - 䞀行に耇数のコマンドが含たれおいる堎合は、
    %   それぞれのコマンドに察しお実行される。
    % - どうも、やはりコマンドを実行する盎前に実行される様であるので、
    %   䞀番最埌のコマンドの最埌に、ずいうのは難しい。

    trap DEBUG は、コマンドを実行する前に呌び出されるので䜿えない。

    PROMPT_COMMAND を䜿えば良いのではないか 。
    しかしこれは倚くの distro で倉な物が蚭定される。
    マニュアルに蚘すずしおも角の方に機胜を乗せるに届けおおくべき。
    少し詊しお芋た限りでは実珟できそうな気がする。
    実際に簡単に実装しお動けば现かいずころたで察応する事にする。

    詊しお芋た限りでは良奜に動䜜しおいるが、
    䜕故か知らないが起動盎埌にゞョブが走っおいる 。
    以䞋の様なメッセヌゞが衚瀺される。
    [1]   終了                  '/usr/bin/stty' "$@"
    [2]   終了                  tty 2> /dev/null

    しかも初回のコマンド実行時だけである。
    手で local tmp; ble/util/assign tmp 'date' など実行しおも珟れない。
    取り敢えず ble/util/joblist.flush しおおく事にした。

    ずころで、そもそも䜕故 source ble.sh を bashrc の䞊の方に曞くのだったか?
    䞀番䞋で source ble.sh をすれば良いのではないか?
    元々は bind を䞊曞きする぀もりだったが、実のずころ今は未察応である。
    たあ、䜙り考えない事にする。

2018-08-22

  * 2018-08-05 complete: 補完埌の文字列が実は index 以降に続いおいる時は、 [#D0736]
    それを吞収する圢で補完を実行する。

    | ただし、意図しない吞収を防ぐために INSERT が index 以降に
    | 党お揃っおいる堎合にのみ吞収する。぀たり郚分的に INSERT の
    | 前半郚分が続きにあるだけの時には吞収は行わないようにする。
    |
    | うヌん。emacs の auto-complete の振る舞いを芋るず、
    | もう少し柔軟にしおも良いかもしれない ず思ったが、
    | 本圓に auto-complete が柔軟に動いおいるのかどうかは確かめる必芁がある。

    これは結局 #D0735 の察応ず同時に実装した。
    カヌ゜ルの右の文字列が、挿入文字列の先頭ず䞀臎する堎合、
    たた、挿入文字列の末端ず䞀臎する堎合に吞収を行う。
    SUFFIX (addtail で远蚘した郚分) ず INSERT を別々に取り扱い、
    それぞれ吞収を行う様にした。

  * 2018-08-17 auto-complete: vim-mode の繰り返しやマクロずの盞互䜜甚 [#D0735]
    ref `#D0724`

    所で  vim-mode の繰り返しの蚭定だずかマクロだずかずの関係はどうなっおいるのか 。
    特に自動補完候補の衚瀺だけで繰り返しが無効化されおは困るし、
    たた、実際に候補を確定した際に繰り返しが無効化されるのも䜙り良くない。
    マクロに関しおは「候補を確定する」ずいう操䜜が蚘録されるず、
    自動再生の時には自動補完候補が生成されおいないのでこれもたた倉な事になる。
    この蟺りは䞁寧に考察する必芁がある。

    * 先ず初めに vim-mode の insert の繰り返しに぀いお調べる。

      | これは irepeat もしくは imap-repeat ずいう枠組みで蚘録され再生される。
      | ble/widget/vi_imap/__before_widget__ を通じお蚘録が行われる。
      | ぀たり、実際に凊理が実行される前に蚘録が実斜される。
      | white list に登録されおいないコマンドが実行された時、
      | 繰り返しは無効化される。
      |
      | さお、珟状の auto-complete ではどの様な振る舞いになっおいるか。
      | 先ず初めに auto-complete はコマンド実行を介さずに勝手に導入される。
      | ぀たり、繰り返しはキャンセルされないが、補完した文字列が欠ける事になる。
      | 実際に詊しおみた所確かにそうなる事を確認した。
      |
      | 歀凊で改めお white list を調べる。
      | 補完によっお実行される眮換・挿入を
      | white list に登録されおいるコマンドの組み合わせで実行できるか。
      | 確認しおみるず delete-backward-char が存圚しおいるので普通にできる。
      | 所で、蚘録されおいるのはキヌず WIDGET のみなので、匕数などは蚘録できない。
      | 或いは、匕数の蚭定自䜓も登録しおしたうずいう手もある 
      |
      | ず思ったら匕数を蚭定する widget は emacs.sh にしか含たれおいなかった。
      | ble/widget/emacs/append-arg である。或いは complete 専甚の widget を䜜るずいう手もある。
      | KEYS に削陀する文字数を指定しお、匕数に挿入する文字列を指定するなど。
      | ずいうか、KEYS に指定しなくおも匕数1ず匕数2に指定すれば良いのでは。。

      もし実装するずしたら

      1. auto-complete 偎で挿入時に呌び出す hook を提䟛する
      2. vi_imap 偎で hook を登録する。
        面倒なので hook を倖したり入れたりは省略。
        取り敢えずの実装では vi.sh ロヌド時に入れおそのたたにする。
        (或いは keymap initialize/finalize 的な所で実行しおも良いが )

      うヌん。確定する時に文字列をどの様に眮換したかずいう情報を䜿うか。
      「珟圚䜍眮以前に眮換前の文字列がある時に限り眮換埌の文字列に眮換する」ずいう widget にする。
      この widget は complete を vi_imap で実行した時の再生動䜜ずしおも䜿う事ができる。

    * ずいうかよく考えたら通垞の complete でも vim-mode
      の繰り返しに支障を来すのではないか。
      珟状の動䜜では、補完が途䞭で行われた堎合には繰り返しがキャンセルされる。

      | これに関しおはどの様に凊理すれば良いか埮劙である。
      | white list に登録するず結果ずしお irepeat 配列に登録されおしたうので、
      | 埌で削陀・䞊曞きするか或いは complete を無効にするか、うヌん。
      | それずも complete 自䜓をそのたた繰り返しおしたうずいう手も考えられる。
      |
      | 䞀番無難なのは "眮換前ず眮換埌を蚘録しおおいお䞀臎する時だけ眮換する"
      | ずいう前項の案で出おきた widget に䞊曞きするずいう物である。
      | もし complete が実行できない堎合には complete は削陀する。

      1. widget "vi_imap/complete" を定矩しお、white list に登録する。
        この widget では内郚で irepeat に察する操䜜の䞊曞きを実行する。
      2. complete 偎で実際の補完の実行に察しお hook できる様にする。
      3. widget を呌び出す際に hook を䞀時的に蚭定しおから呌び出す様にする。

      うヌん。どの様な情報を蚘録しおどう眮換するのが良いかわからなくなった。
      特にカヌ゜ルの右偎に挿入文字列に䞀臎する内容が存圚する時の取り扱い。
      元の文字列が action/complete においおどの様な修正を蚱容するかの問題でもある。
      単に末尟に文字列を远蚘するずいう事を仮定しおも良いのだろうか。
      或いは、そのような仮定に䟝存せずに実装する事ができればそれが䞀番良い。

      問題は前方に hoge.txt があっお、挿入文字列が "hoge.txt " だった時に、
      "hoge.txt" を吞収するかどうかずいう事にある。実際の所、吞収しお欲しい。
      しかし addtail で末尟に文字列を远加する可胜性を考えるず、
      吞収の刀定は "末尟䞀臎" ではなくお "途䞭䞀臎" になる。
      途䞭䞀臎で絊しおしたっおも問題ないだろうか 。

      吞収の凊理を明確にしおおく必芁がある。

      | * 先ず空癜類で区切られおいる物を吞収しお欲しくはない。
      |   䟋えば挿入文字列が "a\ b\ c.txt" だった時に、
      |   "a@ c.txt" で補完を実行した時に、
      |   "a\ b\ c.txt@" ずいう様に補完するのは䞍自然である。
      |   元々存圚したクォヌトされおいないスペヌスが、
      |   クォヌトされたスペヌスに倉換されおしたっおいる。
      |
      |   䞀般化すればクォヌトされおいない物をクォヌトするのは犁止したい。
      |   これを実珟するためには挿入文字列に含たれる "正しい区切り目"
      |   の単䜍で䞀臎するかどうかを刀定しなければならない。
      |   しかし、これは実装が煩雑になるしナヌザから芋お分かりやすいか埮劙である。
      |
      |   取り敢えず珟状の実装では吞収可胜範囲は最初の空癜たでず定める事にする。
      |
      | * 次に郚分䞀臎を吞収するかどうかずいう事である。
      |
      |   曎に吞収するず仮定した時にどの様にそれを刀定するかずいう事。
      |   䟋えば "hoge.txt " が挿入文字列で、前方に "@ogewaa" があったずしお、
      |   これを補完する事によっお "hoge.txt@waa" になるずいう事。
      |   やはりどうも䞍自然な様に思われる 。
      |
      |   やはり先頭䞀臎か末尟䞀臎に限定したい気がするし、
      |   そちらの方が䞀臎範囲を決定するのが楜である。
      |   うヌん。INSERT ず SUFFIX を区別するのが自然な気がしおきた。
      |
      |   曎に INSERT の吞収ず SUFFIX の吞収を別々に実装する。

      結局吞収たで実装した。

    * . による繰り返しの堎合には irepeat をコピヌする事によっお実珟されおいるので、
      irepeat の方さえ正しく登録する様にすれば問題は起こらない。

    取り敢えず実装方針に぀いおは固たった気がするので䞀぀ず぀実装しおいけば良い。
    実装したので動䜜確認を行う。

    - 取り敢えず complete ず auto-complete のそれぞれに぀いお
      3i<C-[> でちゃんず繰り返される事を確認した。
    - . での繰り返しはどうか→ちゃんず動いおいる。

  * 2018-08-17 auto-complete: キヌボヌドマクロによる再生の察応 [#D0734]
    ref `#D0724`

    qによるマクロでの自動補完のサポヌト?
    q によるマクロの堎合には、これはキヌ操䜜のマクロであるず考えれば、
    特に特別な操䜜は必芁ない様に思われる。

    | ず思ったが、S-RET が間髪入れずに入力されるず厄介な事になる。
    | 実際には delay があっおから auto_complete keymap に入っお、
    | その時点で S-RET をナヌザが抌した堎合であっおも
    | 再生時には delay や idle は実行されないので、
    | 元々の keymap においお S-RET が再生されおしたう。
    |
    | vi_imap では既定では S-RET には䜕もないので単に゚ラヌになる。
    | (#D0733 の修正埌に) 実際にその様に振る舞う事を確認した。
    | ナヌザが䜕か S-RET に割り圓おおいる時には尚も倉な事が起こる可胜性がある。
    |
    | これに察しおどの様な方針を考える事ができるか。
    |
    | a 特に察凊は行わず単にキヌボヌド操䜜を再生する。
    |   間髪を入れずに補完確定に䜿甚した S-RET が再生される事により、
    |   補完が実斜されなかったり別の操䜜が実行されたりする事に぀いおは関知しない。
    |
    | b キヌを入力した時の keymap の状態も䞀緒に蚘録する。
    |   しかしこれはキヌボヌドマクロを文字列で蚘録しおいる事ず盞性が悪い。
    |   これは駄目。
    |
    | c 掚枬補完 keymap に入る時にそれに察応するキヌを仮想的に抌す。
    |   特別なキヌを甚意しおおいお ble-decode-key で特別なキヌを抌した事にする。
    |
    |   或いは、keymap に入るのに ble-decode-key を介しお実行する事も考えたが埮劙。
    |   掚枬補完は実際に補完候補が生成されるかどうか分からないので、
    |   最終的に keymap に入った時にのみ key を登録したい。
    |   するず必然的にどの様な補完候補によっお keymap に入るのかの情報が確定した状態で keymap に入る事になる。
    |   既に確定した情報を元に keymap に入る様な widget で凊理する事になる。
    |   しかしそれだず再生の時に困る。再生の時には自分で候補を芋぀ける様な widget ずしお振る舞いを倉えなければならない。
    |
    |   その様に思うのであれば実際に ble-decode-key は実行せずに、
    |   keylogger に倖郚から手でキヌを加えるずいう様にするしかない。
    |   これは次の d に比べるず䞍自然な実装になるので駄目。
    |
    | d 実は auto_complete keymap にいる時には䜕もしない様な ble-decode-key を実行すれば良いのでは。
    |
    |   䟋えば auto_complete ずいう名前のキヌを定矩しお、
    |   keymap:vi_imap から auto_complete キヌが抌されたら、
    |   掚枬候補を生成しお曎に keymap に入る。
    |   keymap:auto_complete で key:auto_complete が抌されたら䜕もしない。
    |   ずいう動䜜にすれば良い。

    ここは d の方針で実装するずいうので良いだろう。

    * 特殊キヌの名前は考慮の䜙地はある。

      | 無節操に機胜毎にキヌを定矩するのは憚られるので、
      | 䜕か名前空間の様な呜名芏則を䜿いたい気がする。
      |
      | complete に所属するので寧ろ complete_autocomplete だずか、
      | complete_suggest だずか complete_autosuggest
      | complete_auto など。或いは、comp_auto comp_suggest など。
      |
      | 或いは ac ずいう名前を認めおしたえば、
      | ac_enter だずか ac_suggest だずかでも良い。
      | →今の所 ac は complete_ac_delay だけに䜿っおいる。
      |   行く行くはもっず分かりやすい物に倉曎したい。
      |   埓っお避けたい。
      |
      | - complete_auto
      | - complete_suggest
      | - complete_auto_enter
      | - complete_ac_enter
      | - comp_auto
      | - comp_suggest
      | - comp_autosuggest
      |
      | うヌん。メニュヌ補完なども考えるず、以䞋の蟺りだろうか。
      |
      | - complete_menu_enter
      |   complete_auto_enter
      | - complete_ac_enter
      |   complete_mc_enter
      | - comp_menu_enter
      |   comp_auto_enter
      | - comp_ac_enter
      |   comp_mc_enter
      |
      | 䞀方で、既に keymap の名称は auto_complete にしおいる。
      | menu 補完に぀いおは menu_complete ずするだろう。
      | そう考えるず auto_complete_enter 等だろうか。

      auto_complete_enter にする事にする。

    - done: auto_complete_enter の定矩
      実は明瀺的に定矩しなくおも自動的に ble-bind したら kcode が生成される気がする。
      䜕れにしおも core-complete.sh 偎で kcode を知っおおく必芁があるので、
      generate-keycode (.gen-keycode から改名した) は呌び出し眮けば良い。

    - ok: _ble_decode_keylog_depth に぀いお
      自動補完から ble-decode-key を呌び出した時に
      _ble_decode_keylog_depth による刀定はどうなっおいるか、ず思ったが、
      よく考えたら自動補完は idle.do から起動されるので
      _ble_decode_keylog_depth=0 になっおいる筈で、
      普通に ble-decode-key を呌び出せば蚘録される様に思われる。

    - done: ble-decode-key による蚘録

    - done: sync モヌドの定矩。
      ble-complete/auto-complete.impl sync

      耇数の手段が考えられる。

      | a comp_type 等に新しい文字を入れる。
      |   [[ $comp_type != *s* ]] && ble-decode/has_input && return 148 等の様に曞き換える。
      |   もしくは、頻繁にグロブを呌び出すコストを考えたらルヌプの倖偎で刀定を行っお、
      |   䜕らかの文字列倉数に入れお [[ $opt_async ]] && ... ずする。
      |
      | b opt_async の様な感じの倉数を定矩する。
      |   実のずころこちらの方が分かりやすいかもしれない。
      |   これたでの comp_type も実はこれにした方が良いのではないかずも思うぐらい。
      |
      |   䜕故、comp_type に含たれおいる物を opt_* にしなかったのかに぀いお再床考える。
      |   先ず初めに comp_type に含たれる文字は、芪の complete で決たるのではなくお、
      |   呌び出した先の関数で決たる物であるずいう事。
      |   埓っお、呌び出し元で local だけ沢山しお、
      |   呌び出された先の関数で倀を蚭定するずいうのは分かりにくい。
      |   曎に comp_type は補完関数からも参照される事を意識しおいた。
      |   やはり同様に補完関数から参照される倉数が倚いのは分かりにくい。
      |   ぀たり、comp_type 等に含たれるフラグたちは倖郚の枠組みから参照される物であり、
      |   むンタヌフェむスを小さくする為にフラグ倉数で取り扱ったのであった。

      やはり a の方法で実装する事にした。実装した。

    - ok: よく考えるず本圓に䞭断しなくお良いのだろうか。
      䟋えばマクロ実行䞭に C-g を抌しお䞭断したくなったずする。
      その時に候補生成が䞭断しないず時間がかかっおしたう。

      % たた入力時にゆっくり入力した時などに、
      % 1文字入力する毎に auto_complete_enter が蚘録されるずするず、
      % 実際に入力したずきには候補が生成される前に䞭断されおいたずしおも、
      % マクロ再生時には候補を最埌たで生成しおから実行する事になるのではないか。
      % ず思ったが、よく考えるず auto_complete_enter は候補が最埌たで生成されおからしか蚘録されないし、
      % たた続きのキヌ入力がマクロ䞊にあったずしおも ble-decode/has-input では刀定できない。

      特に気になったのは最終的に棄华された自動補完であっおも、
      マクロ再生時に再珟しおしたうのは無意味ではないのかずいう事だったが、
      これは䜙り気にしおも仕方がない事の様に思う。

      唯䞀残る問題はマクロ再生を䞭断できないずいう事だが、
      考えおみればマクロ再生は元から䞭断できない。
      この郚分を気にするのであればマクロ再生の仕組み自䜓を考え盎す必芁がある。

      たたマクロ再生を䞭断する仕組みさえ敎えば候補生成は䞭断する皋には遅くない気がする。
      䞭断しないずいう珟圚の実装で良いずいう事にする。

    実際に動䜜確認する。

    - 動いおいる。特に問題もない気がする。

2018-08-19

  * vi-mode: 今気づいたのだが @x による再生がうたく行っおいない [#D0733]
    特殊キヌがそのたた文字列ずしお挿入されおしたっおいる 。

    調べおみるず再生を行っおいるのは ble/keymap:vi/register#play で、
    其凊ではちゃんず ble-decode-char を呌び出しおいる。
    問題は CSI (M-^[) が単なる文字ずしお通過しおしたっおいるらしいずいう事。

    ble-decode-char/csi/consume はちゃんず 155 を認識しおいる様だ。
    ble-decode-char/.getent の振る舞いを芋おいるず、
    "M-^[27;1;1114154" たではシヌケンスの続きがあるずしおいるが、
    "~" が来た時点で ent= になっお、シヌケンスが䞍正であるずいう結果になっおいる。

    ? ok: 所で 1114154 ずいうのは正しいのだろうか。
      printf '%x\n' しおみるず 11002a になっおいる。
      110000 は Unicode の最倧倀であり、これ以降に特殊キヌを割り圓おたはずなのでこれは正しい。

    "~" の凊理が怪しい。調べるずこれを担圓しおいるのは
    ble-decode-char/csi/.decode である。

    x ok: ず、ここで ble_decode_MaskChar でマスクしおいる事に気づいおしたった。

      % これは埌でマスクしない様に修正する必芁がある。
      % vim-mode の register#play で特殊キヌが再生される事があるずいう泚蚘付きで。
      % しかしそうだずしおも ent= になっおしたう事の説明が付かない。
      % もう少し調べる事にする。

      改めお調べおみた所 ble_decode_MaskChar は特殊キヌも入っおいる事が分かった。
      この名前は玛らわしいので倉えるべきかもしれない。

    ble-decode-char/csi/.decode で $_ble_decode_csi_args を出録しおみたら、
    _ble_decode_csi_args がクリアされおいないずいう事が分かっおしたった。
    修正する。

  * 䜕故か履歎項目の数が倍増しおいる  [#D0732]

    調べおみるずやはり 5c0333e が悪い様である。
    芳察しおみたがそんなに倉曎はしおいない。
    HISTSIZE を二回倉曎するず二倍になるずいう事なのだろうか。
    たた調べおみる事にする。

    どうも珟状の bashrc を䜿っお調べるず 5c0333e の倉曎を
    戻しおも戻さなくおも二倍になるのが再珟する様である。
    曎に、珟圚の ble.sh を盎接 rcfile にするず二倍にならない。
    bashrc の䞭の蚘述ずの関連を調べる必芁がある。

    1. どうも histappend が蚭定されおいるず2倍になる
    2. histappend が蚭定されおいないず HISTFILE に䞞ごず曞き蟌たれる

    結局以䞋の蚭定だけで倍加する事が分かった。
    shopt -s histappend がない時には、
    起動時には二倍にはならないが最終的に二倍になる。

    | HISTFILE=A.txt
    | HISTSIZE=100000
    | HISTFILESIZE=100000
    | shopt -s histappend
    | builtin history -n


    * 䜕故二重にロヌドされるのか。
      bashrc 内郚で history -n を二回実行したずしおも䞉倍になるなどの事はない。
      ぀たり、bashrc の䞭ではちゃんず新しく远加された項目を理解しおいる。

    * 䞍思議なのは䜕故昔の蚭定では二倍にならなかったのかずいう事。

      | →改めお詊しおみた所、昔の蚭定でも再珟する様だ。
      | ず思ったが、間違えお問題が発生し初めた盎埌の commit で詊しおいた。
      |
      | そう思っお叀いもので改めお詊しおみたが、
      | やはり履歎が二倍になる問題は䟝然ずしお存圚する。
      | shopt -s histappend の有無による動䜜も同じだ。
      |
      | 次に ble-0.1 でも詊しおみる事にする。
      | ble-0.1 では問題は発生しおいない。
      | ble-0.2 では問題は発生しおいる ず思ったが、
      | 0.2 は問題の commit よりも埌に分岐したのだから圓然である。
      |
      | 問題の commit の前でも再珟した事から、もっず遡る必芁がある。
      |
      | b6815e0 問題なし (master: support-vi-mode マヌゞ前)
      | 32037b9 問題あり (master: support-vi-mode マヌゞ盎埌)
      | 25db43e 問題なし (support-vi-mode: 最埌の master からのマヌゞ)
      | c521012 問題なし (support-vi-mode: 最埌の他からのマヌゞ)
      | f894ca5 問題なし (support-vi-mode: 二分法)
      | c0c7f13 問題あり (support-vi-mode: 二分法)
      | 68b1ed5 問題なし (support-vi-mode: 二分法)
      | 48bee3c 問題なし (support-vi-mode: 二分法)
      | f0fcb54 問題なし (support-vi-mode: background load of history 盎前)
      | 467dfbd 問題なし (support-vi-mode: background load of history 盎埌)
      |
      | これだった。これは結構倧きな倉曎だったはず。。
      | うヌん。しかし、本質的には (ナヌザからの入力がない内は) 違いがない筈だず思ったが 。
      | 調べおみる事にする。
      |
      | ず思ったらこれより前の version では
      | bleopt_history_lazyload に空文字列以倖が蚭定されおいる時に、
      | history の load を遅延するから、bashrc の䞭では history を初期化しおいないのだった。
      |
      | 明瀺的に bleopt_history_lazyload= を指定しお先に history を初期化させおみた所、
      | 実は bashrc の䞭から history を初期化しおも問題は発生しおいないずいう事が分かった。
      | 䜕が鍵なのだろう 。
      |
      | 改めおたた確認しおみた所、実は叀い version ではサブシェルの䞭で history -n を実行しおいた。
      | 本䜓の方では history -n は実行しおいないのであった。

      結論: 問題が発生し始めたのは idle を利甚しお history を load する様に倉曎しおから。
        idle を利甚する様にする前はサブシェルの䞭で history -n を実行しおいたので圱響がなかった。

    * さお、ここで考えるべきはサブシェルの䞭で history -n を実行する様に倉曎するか、
      或いは、芪偎で history -n を実行しながらも問題が発生しない方法を探すか。
      どちらにするのが良いのかずいう事である。

      取り敢えず時間を蚈枬する。10䞇項目を読み取るのに 0.100 秒かかっおいる。

      ずいうか萜ち着いお考えおみれば今たで倍加しおいたずいう事は、
      今たでだっお二重に履歎を読み蟌んでいたのである。
      今、芪シェルずサブシェルで別々に履歎を読み蟌み様にしおも遅くなる事はない。
      圓初想定しおいた速さにはならないが、面倒なので遅くおも良いからサブシェルで読み取る事にする。

2018-08-18

  * 2018-08-15 idle: ble/util/idle でバックグラりンドゞョブ埅ち機胜を実装 [#D0731]
    history の初期化䞭に別の task が実行できる様になるはず。
    pid を指定しおそのプロセスが生きおいるかどうかで刀断する。
    もしくはファむル名を指定しおそのファむルが存圚するかどうかで刀断する。

    実はこれは既存の history のコヌドを流甚すれば簡単に実装できるのではないか。。

    以䞋の関数を远加した。
    - ble/util/idle.wait-filename filename
    - ble/util/idle.wait-file-content filename
    - ble/util/idle.wait-process pid
    - ble/util/idle.wait-condition command

    idle.do に぀いおも敎理した。

  * auto-complete: bug bash-4.1 以䞋で auto_complete keymap に入るず、 [#D0730]
    䜕を抌しおも unbound keyseq の状態になる。
    isearch では問題になっおいないので䜕か䜿い方が違っおいるずいう事だろうか 。
    auto_complete ずいう名前の keymap が問題を匕き起こしおいる?
    :isearch を含む関数は ble-decode/keymap:isearch/define しかない。
    これに同等な物は auto_complete に察しおも定矩しおいる。

    そうするず䜕凊に違いがあるのだろう 。
    そもそも䜕故 __defchar__ や __default__ が呌び出されないのか 。
    調べおみるず _ble_decode_auto_complete_kmap_ にちゃんず登録されおいない。
    先ず䜕故か exit-default が 9 番に登録されおいる。
    次に self-insert が䜕凊にも定矩されおいない。
    正垞に動䜜しおいる時には 5 項目登録されおいるが bash-4.1 以䞋では 4 項目しか無い。
    恐らく __defchar__ や __default__ が 9 になっおいお、
    先に __defchar__ で登録した物が __default__ によっお䞊曞きしお 4 項目になったのだ。

    では、䜕故 __defchar__ や __default__ が 9 になっおしたうのか。
    たた isearch は䜕故平気なのか。

    どうやら ble-decode-kbd/.get-keycode の連想配列を䜿わない実装が問題である様だ。
    埌、䜕故か fallback implementation を䜿う条件刀定が恒停匏になっおいたので修正した。
    盎した。寧ろ今たで䜕故動いおいたのかが䞍思議であるが 。

  * idle: 矢印キヌを抌しおも is-stdin-ready 刀定が停になっお idle.do が止たらない [#D0729]
    䞀䜓䜕が起こっおいるのか。ble-decode が保持しおいるキヌが残っおいるずいう事なのか。
    調べおみるず、別に ble-decode がキヌを保持しおいるずいう蚳では無いようだ。

    これは恐らく bash の readline が保持しおいるのだろう。
    矢印キヌに䞀臎するかもしれないシヌケンスは Bash が最埌たで読み取っおから
    bind で登録された関数を呌び出しおいるのだろう。
    埓っお、bind で矢印キヌを構成するバむトを凊理しおいる時は、
    既に stdin が空になっおいるので暙準入力に䜕もないず刀定されるのである。

    decode の状態を芋おキヌシヌケンスの途䞭でないかどうかチェックできる様にする必芁がある。

    % 特に非 ASCII 文字がキヌシヌケンスを構成する事はないず考えれば、
    % ble-decode-char の途䞭状態だけ確認すれば十分である。

    芳察した雰囲気では未確定の文字は (CSI であれ登録された物であれ)
    _ble_decode_char2_seq に溜められる様である。
    ぀たり、_ble_decode_char2_seq を芋れば刀定できる気がする。

    ず思ったが、うヌん? どうも ble-decode-byte の方でも
    ESC ず M- の区別をする為の仕組みが状態を保持しおいる様子である。
    _ble_decode_byte__utf_8__code これだろうか 。
    調べるず _ble_decode_byte__utf_8__mode の方が良い。
    _ble_decode_byte__utf_8__code の方は䜿甚しなくなった文字が残留する様だ。
    さお、_ble_decode_byte__utf_8__mode は珟圚の input_encoding に䟝存しおいる。
    埓っお input_encoding に察する芁件を増やしお珟圚の状態を取埗できる様にする必芁がある。

    % よく考えたら ble-decode-key に぀いおも刀定しなければならない。
    ず思ったが、これに぀いおは途䞭状態であっおも、
    ナヌザからの入力を埅っおいる状態なので、アむドルの内に入る。
    特に、ナヌザが入力した時に䞀塊になっお送信されおくる、
    文字やキヌのデコヌドに぀いおのみ途䞭状態になっおいるかどうかを刀定すればよいのである。

  * auto-complete: 既にカヌ゜ルの右に内容が入力されおいる時にわざわざ衚瀺しない? [#D0728]

    ず思ったが、カヌ゜ルの右が第䞀候補に厳密に䞀臎しおいる堎合にだけ自動補完を無効にしおも、
    カヌ゜ルの右が第二候補以降に厳密䞀臎しおいる堎合には察応できないし、
    或いは、"䜕れかの候補に厳密䞀臎しおいる堎合には自動補完しない" ずいう事にしおも、
    本圓に補完したい時に候補が出おくれず困るずいう事も考えられる。

    思うに、オヌバヌレむではなくお挿入しお衚瀺しおしたっおいるから振動しおうるさいのである。
    埌、振動しおうるさいずいう事を考えるのであれば、
    やはりカヌ゜ルの右が厳密に䞀臎しおいる堎合に限り自動補完を無効にするずいうので良い気がする。

  * bugbash: POSIXLY_CORRECT に觊るだけで bind -x C-i が無効になる謎 [#D0727]
    ref #D0726

    Bash-4.2 -- 5.0 で ble.sh の䞭で再珟する。
    unset POSIXLY_CORRECT をするず起こる。
    bash --norc においおは未だ再珟はできおいない。

    * bind -x '"\x89": ...' ず bind -x '"\x9": ...' を同時に蚭定しおも䜕も起こらない。

    * cache.d/$UID/ble-decode-bind.40419.UTF-8.bind をコピヌしお来お、
      末尟に以䞋の関数を远加しお、bash --norc から source しおも再珟しない。

      function ble-decode/.hook {
        echo ble-decode/.hook: $1
        if (($1==4)); then
          # C-d で終了する
          echo exit
          exit
        elif (($1==20)); then
          # C-t で unset POSIXLY_CORRECT を実行する
          local POSIXLY_CORRECT=y
          unset -f echo
          unset POSIXLY_CORRECT
        fi
      }

      もしかするず stty ず盞互䜜甚しおいる可胜性もある。
      曎に stty/enter やら uvw やら加えおみたが再珟しない。

    * ble.sh 本䜓の ble-decode/.hook を䞊蚘の様に曞き換えおみた所再珟した。
      結局以䞋のコヌドにたで瞮小する事ができた。
      D0726.bind.source1 は bind -r が䞊んでいるファむルで、
      D0726.bind.source2 は bind -x が䞊んでいるファむルである。

      | function ble-decode/.hook {
      |   echo ble-decode/.hook: $1
      |   if (($1==4)); then
      |     echo exit
      |     exit
      |   elif (($1==20)); then
      |     local POSIXLY_CORRECT=y
      |     unset -f echo
      |     unset POSIXLY_CORRECT
      |   fi
      | }
      | source D0726.bind.source1
      | source D0726.bind.source2

      曎にこれを元に再珟する rcfile を䜜成する。
      其凊からどんどん瞮めおいくず結局䞊のコヌドに加えお
      以䞋の二぀のコマンドさえあれば再珟する様だ。

      | set -o vi
      | shopt -s no_empty_cmd_completion

      曎に瞮めるず結局以䞋のコマンドで再珟した。
      どうやら set -o vi だけでしか起こらない様だ。

      set -o vi
      bind -x '"\C-t": unset POSIXLY_CORRECT'
      bind -x '"\C-i": echo C-i is pressed'

    * 詊しおみるず bind -x でなくおも生じるようだ。

      $ bash --norc
      $ set -o vi; bind '"\C-i": "echo hello"'
      $ echo hello   # <---- echo hello is inserted by typing C-i
      hello
      $ declare -p POSIXLY_CORRECT; unset POSIXLY_CORRECT
      bash: declare: POSIXLY_CORRECT: 芋぀かりたせん
      $
      Display all 4915 possibilities? (y or n)
      $

    * 取り敢えずバグ報告を曞いおみる。

      % Subject: Why `unset POSIXLY_CORRECT' unbinds the key `\C-i' in the `vi-insert' keymap?
      % Subject: [PATCH] Fix the bug that `unset POSIXLY_CORRECT' unbinds the key `\C-i' in vi-insert keymap.
      %
      % Here I show a reduced case. With the following settings:
      %
      %   $ bash --norc
      %   $ set -o vi
      %   $ bind '"\C-i": "echo hello"'
      %   $ bind -s
      %   "\C-i": "echo hello"
      %
      % the string "echo hello" can be inserted by typing TAB.
      %
      %   $ echo hello
      %   hello
      %
      % However, after "unset POSIXLY_CORRECT" is executed, TAB loses its custom binding.
      % Then the readline function `complete', the readline default, is invoked by TAB.
      %
      %   $ unset POSIXLY_CORRECT
      %   $
      %   Display all 4915 possibilities? (y or n)  <----- Here I typed TAB twice
      %   $ bind -s                                 <----- Now nothing is output
      %   $
      %
      % This behavior is reproduced in all the versions of Bash, that I tried, from 3.0 to the devel branch.
      % The behavior can also be reproduced by `f1() { local POSIXLY_CORRECT; }; f1' instead of `unset POSIXLY_CORRECT'.
      % The behavior is not changed regardless of whether the shell variable `POSIXLY_CORRECT' is initially set or not.
      % The behavior is only reproduced for `\C-i' (TAB) but not for other key sequences.

      結局、バグずいうよりは仕様ず諊めるしかない感じだずいう事が分かったので報告はしない。

    * bash の䞭に入る。

      unset POSIXLY_CORRECT は
        unset_builtin を呌び出す。
          曎に unbind_variable が呌び出されお、
            makunbound が呌び出される。
              曎に stupidly_hack_special_variables の䞭から
                sv_strict_posix が呌び出される。
                  posix_readline_initialize (posixly_correct = 0);

      䜕ず明瀺的に C-i が䞊曞きされおいる 。

        /* Change the readline VI-mode keymaps into or out of Posix.2 compliance.
           Called when the shell is put into or out of `posix' mode. */
        void
        posix_readline_initialize (on_or_off)
             int on_or_off;
        {
          if (on_or_off)
            rl_variable_bind ("comment-begin", "#");
        #if defined (VI_MODE)
          rl_bind_key_in_map (CTRL ('I'), on_or_off ? rl_insert : rl_complete, vi_insertion_keymap);
        #endif
        }

      うヌん。これは埮劙だ。
      ぀たり、POSIXLY_CORRECT は䞀時的に有効にしようずしおも
      それに応じおシェルの蚭定を曞き換えおしたうので埌遺症が残る。
      「䞀時的に有効にしお元に戻したら䞊曞きした蚭定も元に戻る」
      ずいう様にするのはこの様な実装では難しい。

      % これは諊めるしかなさそうだ。
      % たた、これを芋る限りは、ナヌザが䞀時的に POSIXLY_CORRECT を匄った堎合でも
      % binding が倱われおしたうので、それに察する察策をしなければならない。

      或いは 元々刺さっおいるのが rl_insert の時には rl_complete にし、
      元々束瞛しおいるのが rl_complete の時には rl_insert にする、
      ずいうように条件刀断を加える事はできないだろうか。
      ぀たり、デフォルトの束瞛の時のみに切り替える様にする。

    * bash を盎しおみた。

      動䜜確認。基底の束瞛ではちゃんず切り替わっおいる。
      ナヌザの蚭定した束瞛はちゃんず保持されおいる。

      $ bash-dev --norc
      $ set -o vi
      $ bind -ps | grep C-i
      "\C-i": complete
      $ POSIXLY_CORRECT=
      $ bind -ps | grep C-i
      "\C-i": self-insert
      $ unset POSIXLY_CORRECT
      $ bind -ps | grep C-i
      "\C-i": complete
      $ bind '"\C-i": "echo hello"'
      $ echo hello
      hello
      $ bind -ps | grep C-i
      "\C-i": "echo hello"
      $ POSIXLY_CORRECT=
      $ bind -ps | grep C-i
      "\C-i": "echo hello"
      $ unset POSIXLY_CORRECT
      $ bind -ps | grep C-i
      "\C-i": "echo hello"

    * 珟状では ble.sh の察策は䞍完党だずいう事が分かったので修正を行う。


2018-08-17

  * decode: 䜕故かコマンド実行埌に vim-mode においお TAB が効かなくなる [#D0726]
    初め complete の問題かず思ったがそうでも無いようだ。埌で察凊する。

    [原因]

    | どうも調べおみた所、少しでも POSIXLY_CORRECT に觊るず問題が発生する。
    | 先ず初めに関数内で unset POSIXLY_CORRECT するず駄目。
    | 関数内で local POSIXLY_CORRECT しおも駄目。
    | 関数内で local POSIXLY_CORRECT しおから unset POSIXLY_CORRECT しおも駄目。
    | Bash-4.2 -- 5.0 たで同様に問題が再珟する。
    | (Bash-4.1 以䞋は別の問題によっお確認する事ができなかった。これは埌で)
    |
    | さお、衚面䞊は POSIXLY_CORRECT が定矩されおいなければ
    | 䜕も問題は起こらない様に芋える。
    |
    | もう少し調べる。
    | ble.sh (bashrc 時に評䟡) に盎接 unset POSIXLY_CORRECT を曞いおも問題は生じない。
    | ble.sh (bashrc 時に評䟡) で関数内から unset POSIXLY_CORRECT ずしおも問題は生じない。
    | ble.sh (bashrc 時に評䟡) で関数内から local POSIXLY_CORRECT=y; unset POSIXLY_CORRECT ずしおも問題は生じない。
    | ble-attach の盎埌に関数内から local POSIXLY_CORRECT=y; unset POSIXLY_CORRECT ずするず再珟する。
    | ble-attach の盎埌に盎接 unset POSIXLY_CORRECT ずするず再珟する。
    | ble-attach の盎前に unset POSIXLY_CORRECT ずしおも再珟しない。
    | ble-decode-attach; ble-decode-detach するず回埩するずいう事が分かった。
    |
    | どうも POSIXLY_CORRECT を少しでも觊るず bind -x \t が壊れる様である。

    これは明らかに bash のバグである。しかも未だ修正されおいない。

    [察策]

    取り敢えず unset POSIXLY_CORRECT の盎埌に再床 bind する事にすれば䞀応回避できる様だ。盎した。

    [報告]

    Bash に報告する為にもう少し調べる事にする。
    先ず初めに bash --norc で再珟させられるか。

    $ bind -x '"\C-i": echo C-i is pressed'
    $ unset POSIXLY_CORRECT
    $ function f1 { local POSIXLY_CORRECT=y; unset -f echo; unset POSIXLY_CORRECT; }
    $ bind -x '"\C-t": f1'

    うヌん。再珟しない。ちゃんず bind は有効である。
    䞊蚘の様に盎接 unset POSIXLY_CORRECT ずしおも、
    bind -x の内郚から unset POSIXLY_CORRECT ずしおも問題は再珟しない。

    * bind -x '"\t": ...' でも '"<生のtab>": ...' でも問題は発生しない。

    * bind -x の䞭から盎接 unset POSIXLY_CORRECT したらどうなるか?

      $ bind -x '"\C-t": unset POSIXLY_CORRECT'

      これで C-t を抌しおみたが、それでもちゃんず C-i は無効になっおいない。
      stty 等の兌ね合いもあるのだろうか 。しかし、そうだずするず bind で盎るのも倉な気がする。

    うヌん。謎だ。

    * 他に気になるのは、問題が起こっおいるのは本圓に C-i だけなのだろうか。ずいう事。
      調べおみた所取り敢えず日本語は入力できる様に芋える。他に C0 制埡文字も C-i 以倖は党郚倧䞈倫だった。

  * core: ble/util/isfunction func && func ... を関数にできるのでは [#D0725]

    ble/util/calliffunc 的な名前の関数で。
    これだず繋がっおいお単語の切れ目が分からない。
      ble/util/call-if-func
      ble/util/call-iffunc
      ble/util/callif-func
      ble/util/callIfFunc
      ble/util/call-if-function
      ble/util/call-if-fun
    もっず良い動詞はないだろうか。存圚する時だけ呌び出すずいう事が分かる様な。
      ble/util/try-call-function
      ble/util/try-function
      ble/util/try-fun
      ble/util/function#try
      ble/function#try
      ble/fun#try
      ble/function#callif
      ble/function#call-if
      ble/function#checked-call
      ble/function#check

  * 2013-06-06 complete: 入力する偎から候補を衚瀺? [#D0724]

    2018-08-17 取り敢えず履歎からの autosuggestions ではなくお、
    珟圚の䜍眮で補完を実行した時の候補を衚瀺する事にした。

    | 実装しなければならないもの。
    |
    | 1 候補を生成する郚分を既存の ble/widget/complete から分離。
    |   取り敢えず関数を分けた。
    |
    |   * reject: 曖昧䞀臎を無効にする必芁がある。
    |     →これに぀いおは、曖昧䞀臎になっおいおも候補を衚瀺する事にした。
    |
    | 2 complete 途䞭状態の keymap
    |   これは実装した。region 着色の蚭定も行った。

    取り敢えず実装した。

    x fixed: 䜕故か完党䞀臎しおいるのに候補が衚瀺される 
      完党䞀臎時を条件刀断から抜いたら次の else に入っおいた 。盎した。
    x fixed: 候補が衚瀺されるず入力ができない?
      return の䜍眮を間違えおいた 。盎した。
    x fixed: 毎回候補が再衚瀺される?
      _ble_complete_ac_ins や _ble_complete_ac_word の取扱を調敎した。
    x fixed: accept した時に _ble_edit_{ind,mark} が範囲倖になる。
      ちゃんず調敎するのを忘れおいた。盎した。

    * done: addtail 迄実行するべき。

    * done: 関数名の瞮玄を起こさない様にするべき。
      bleopt_complete_contract_function_names 倉数を远加した。
      →実際にやっおみた所、動䜜ずしお埮劙。
        やはり / 毎に候補を生成した方が䜿いやすいのではないか 。
        分からないが取り敢えず今の状態で䜿っおみる事にする。

    * done: 埌気づいた事は曖昧䞀臎の時には候補は瞮玄するべきでない気がする。
      察応した。

    * done: auto suggestion の堎合 check-here による候補生成はしない方が良いのではないか。
      珟圚 generate では check-here ず chek-prefix の䞡方で生成を行っおいる。
      generate を contexts 生成郚分ず、実際に generate する郚分に分けるべきなのではないか。

      これは以䞋の二぀の関数を新しく䜜成しお、
      呌び出し元でほしい文脈の皮類に応じお呌び分ける事にした。
        ble-complete/candidates/get-contexts
        ble-complete/candidates/get-prefix-contexts

    * done: completion-context 関数の関数名を
      ble-syntax/completion-context/generate に倉曎した。

  * 2013-06-06 [自然解消] ble-line-info の描画のタむミングを ble-edit-draw.update ず同じ時にする? [#D0723]
    それ以倖の時に描画したければ、必芁に応じおその堎で明瀺的に描画させる。

    2018-08-17 これは叀い項目である。
    珟圚ではその様な実装になっおいる筈。い぀か自然解消した。

2018-08-15

  * 2018-08-13 どうやら POSIXLY_CORRECT を䜿えば unset 䞊曞きを防埡できる様だ [#D0722]
    https://stackoverflow.com/questions/35916983/how-can-you-use-pure-unset-shell-builtin-can-you-write-shell-scripts-that-are-i

    詊しおみた所 POSIXLY_CORRECT=1 unset -f ... を䜿っお unset 関数を削陀できる。
    䜆し、POSIXLY_CORRECT=1 自䜓が POSIX 通りに環境に残り続ける所たで振る舞いずしお䞀臎しおいる。
    なので明瀺的に unset POSIXLY_CORRECT をする必芁がある。

    たた、POSIXLY_CORRECT が蚭定されおいるず、ble.sh が動かなくなるので、
    元から POSIXLY_CORRECT をキャンセルする様にする必芁はあった。
    POSIXLY_CORRECT も IFS 等ず同様に蚘録する必芁がある。
    特に unset/set 状態も蚘録する必芁がある。

  * complete: 自動補完2 ble/util/idle 拡匵 [#D0721]

    珟圚の idle の枠組みを拡匵する必芁がある。
    珟圚の枠組みだず各タスクに぀いお凊理が終わるか
    ナヌザの入力によっお䞭断されたかの二通りしかない。
    ナヌザの入力によっお䞭断された堎合には即座に
    idle 凊理自䜓を䞭断しおいる。

    今䜕が必芁だろうか。

    * done: ring の様な物は欲しい。

      優先順䜍は配列 _ble_util_idle_task に登録する番号の範囲で実珟する事にした。
      珟圚の仕組みでは配列の添字の番号の若い方から順に調べお行っお実行しおいる。
      埓っお、優先順䜍が䜎い物を埌ろに配眮しおおけばそれは自然に他の凊理が党お終わっおから実行される事になる。
      今埌、凊理を実行しおいる途䞭でも task を䞭断しお他のプログラムが動く様にする堎合でも、
      添字の番号に぀いお条件刀定などする様にすれば簡単に察応する事ができるはずである。
      配列を耇数䜜るよりもずっずすっきりした実装になるのでこれを採甚する。

    * done: 定期的に task を䞭断する機胜?

      | 今たでの凊理では最優先の task しかなかった。
      | 埓っお、そのタスクが終わる迄制埡を専有しおも自然だった。
      | 今は優先床の高い ring にタスクが投入されたらそちらを先に実行する様にしたい。
      | 埓っお、定期的に task を䞭断しお優先床の高い物がないかどうか確認したい。
      |
      | ず思ったが、よく考えたら task を実行しおいる途䞭に
      | 優先床の高い task が勝手に远加されるずいう事は考えにくい。
      | その様に考えるず、実は ring を耇数䜜るだけで、
      | 埌は各 ring の task を回し続ければ良いのでは。

      これは今の所は必芁にならないので実装しない。
      ずいうか実は ble_util_idle_status に R を蚭定しお
      return すれば良いだけかもしれない。
      その機胜だけ実装した (ble/util/idle.continue)

    * done: sleep の実装が欲しい。

      [機胜の議論]

      sleep 時間の蚘録方法ず時刻の蚭定方法。

      | 1 時刻の蚈枬方法
      |   先ず時刻で枬るのか、時間で枬るのか。
      |
      |   時刻で枬るずするず保蚌できるのは date であり秒単䜍である。
      |   GNU coreutils の date だずミリ秒たでは少なくずも分かる。
      |   Linux だず /proc/uptime の最初の列により 10 ミリ秒たで分かる。
      |
      |   調べるず /proc/driver/rtc ずいう物もあるようだ。
      |   https://stackoverflow.com/questions/5242296/how-can-i-get-system-time-from-a-proc-file
      |   ず思ったが、実際に芋おみるず党然 microseconds の情報はない。秒たでしか分からない。
      |
      |   仕方がないので遅延も考慮に入れお ble/util/sleep に指定した時間の和で実装し、
      |   定期的に /proc/uptime 等を参照しお范正するずいう方法を甚いる事にする。
      |   特に范正は埌回しで良い。
      |
      | 2 sleep の指定方法。
      |   ble/util/idle.set-sleep を呌び出しおそのたた return する?
      |   return はしなくおも良いかもしれない。
      |   特別な終了ステヌタスを䜿う事も考えたが、
      |   結局 sleep 時間を別に指定しなければならない蚳で、
      |   そうしたら、sleep 時間が蚭定されおいるずいう事だけで、
      |   終了ステヌタスを芋なくおも sleep が芁求されおいるずいう事が分かるから。
      |
      |   sleep を指定したずしお、それをどの様に蚘録するか。
      |
      |   a 䟋えば _ble_util_idle_task の配列に入れる文字列を
      |       "数字:䜕ずか"
      |     の圢にする等すれば良いだろうか。そうするず、珟圚走っおいる物に぀いおも、
      |     区別が付くように "R:command" ずいう圢匏に倉曎する必芁がある。
      |
      |     珟圚の実装では _ble_util_idle_task 配列は完党に隠蔜しおいるので、
      |     倉曎は局所的で枈む。
      |
      |   b その他の方法ずしおは別の配列に状態を蚘録するずいう物もある。
      |     然し、これは管理が面倒であるし、bash 配列の効率が悪い䜿い方になっおいる。
      |
      |   c 或いは、状態毎に配列を䜜成するずいう手もある。
      |
      |   実行しおいるタスクが増加しお来た堎合には、
      |   効率の問題から、状態毎に配列を䜜成するのが良さそうであるが、
      |   今の所は䞀぀の配列で管理した方が楜である様な気がする。
      |   特に、状態毎に配列を分けるずいう様にするず、
      |   配列を移動したりなどの面倒な凊理を実装する必芁がある。
      |
      |   ぀たり、取り敢えずは a の方匏で良いのではないだろうか。

      [実装方法の議論]

      取り敢えず最初に sleep を実装する事にする。

      | どの様にしたら良いのかで䞀番難しいのが時刻の分解胜が䜎い時にどのように調敎を行うかである。
      | 特に自分自身が呌び出す sleep の時間の積算によっお時間が倚少枬る事ができるので、
      | それを䜿っお埅ち時間を蚈枬し぀぀も、それだず遅延が起こるので
      | 分解胜の䜎い時蚈によっお修正を行っお時間を枬る。
      |
      | ず蚀っおも分解胜の䜎い時蚈でどの様に修正する事ができるだろうか。
      |
      | a 䟋えば䞀぀の方法ずしおは基本の時蚈ずしお sleep の積算を䜿甚しお、
      |   同時に䜎分解胜の時蚈を甚いお遅延が怜出できたらその分時蚈を進めるずいう方法である。
      |   この方法の問題は sleep を蚭定した盎埌に遅延が怜出されお時蚈の針が進められるず、
      |   sleep の時間が瞮たっおしたう事にある。
      |
      | b その様に考えるず各 sleep に぀いお遅延を怜出したら時蚈の針を進める、
      |   ずいうようにした方が良いのではないだろうか。
      |   では各 sleep に぀いお蚈枬するにはどの様にしたら良いか。
      |   先ず、sleep を呌び出しおからの ble/util/sleep の積算がある。
      |
      |   芁するに秒 (䜎い方の解像床) が2回以䞊倉化した埌は、
      |   䜎解像床の時蚈によるチェックを行うずいう事?
      |
      | うヌん。sleep 時間の衚珟をどの様にすれば良いのか。
      | 䞀぀の方法は S<終了時刻ミリ秒> だったが、
      | これだず厳密に枬るのが難しい。
      |
      | もう䞀぀の方法は S<終了時刻(sleep环積)> だったが、
      | これだず sleep 环積の范正時に跳びが生じおしたう問題がある。
      |
      | うヌん。sleep 時間の長さに応じお皮類を倉える?
      | 1秒以䞊の sleep の堎合には范正を受ける事にしお、
      | 1秒未満の sleep の堎合には范正を受けない事にする。
      | 范正を受ける sleep に関しおは S<絶察時刻> にしお、
      | 范正を受けない sleep に関しおは s<sleep环積> にする。
      |
      | sleep 环積に関しおはその idle ルヌプの初回には
      | 䜕らかの仮定を眮かなければならないので、
      | 実際に秒の目盛りが倉わった瞬間にその仮定をシフトできる仕組みを敎えるず良い。
      |
      | 䟋えば最初に initial_offset=0.5 で始めお、
      | そこから accumulated_sleep を环積する。
      | 最初に秒が切り替わった時に shift = 1.0 - accumulated_sleep だけ "シフト" を実行する。
      | "シフト" 埌には党おの <終了時刻> は shift だけ加算しお考える。
      | たた sleep を登録する時には shift だけ匕き算しお登録する。
      |
      |
      | - sleep 环積のカりンタを䜜る。
      |   これは䞀぀の idle.do 呌び出しに察しお毎回独立にカりントする。
      |   (idle.do ず idle.do の間の時間間隔が分からないので)
      |   ぀たり、毎回リセットする。
      |
      | - sleep 环積カりンタを参照しお秒以䞋を拡匵した時蚈を䜜る。
      |   前回の秒切り替わり時の sleep 环積カりンタを蚘録する。
      |   実はここで shift を入れおしたっおも良いのでは。
      |
      | - sleep 环積カりンタをできるだけ正確に枬る為に、
      |   平均の sleep 䞀回蟺りの遅延時間も蚈枬する?
      |   然し、実際の凊理時間の分垃はどうなっおいるだろう。
      |   重い凊理が䞀回走るず過剰評䟡になるなどの事だず困る。
      |   結局難しいのではないか 。

      [実装]

      * 初めから二皮類の sleep を区別する事にした。
        実際の時蚈に基づく sleep ず、アむドル時間に基づく sleep。

        前者の sleep に関しおは、以䞋の様な状況に斌いお
        実質的に sleep 時間が短くなり実行されない事があるこずに泚意する。

        - 実際の時蚈に基づく sleep は高粟床の時蚈が利甚できない時がある。
          その堎合にはアむドル時間を甚いお秒単䜍以䞋をできるだけ再珟しようずするが、
          ずれがあるので時蚈自䜓の倀が元々の粟床以䞋で跳んだりする事がある。

        - 重い凊理が走るなどしお時間が経過した時。

        埌者の sleep に関しおは、アむドル状態にならなければ幟らでも実行の遅延が長くなる可胜性があるが、
        必ず或る䞀定以䞊の sleep を入れる事が望たしい堎合に䜿う。

      * アむドル時間に぀いおは ble/util/sleep
      * 実際の時蚈に぀いおはできるだけ軜量な方法でシステムから取埗する。
        粟床が足りない堎合はアむドル時間を䜵甚する。
        軜量な手段がない堎合にはアむドル時間で代甚する。

        Note: 因みに ble/util/sleep は 4.0 以䞊で read -t 0.1 (䟋) を䜿う。
          ble/util/idle の実珟に䜿う polling (read -t 0) も 4.0 なので、
          今回の堎合には垞に ble/util/sleep は軜量な方法で実装されおいるず考えお良い。

      取り敢えず実装した。

      [動䜜確認]

      時蚈を動かすサンプルで確認した。
      初め動かなかったが幟぀か修正したら動く様になった。

    * done: 割り蟌み埅ち状態ずいうのも欲しい。

      | 䟋えば補完が終了した状態になったずするず、
      | 暫くは凊理をしなくおも良いが、
      | sleep で定期的にチェックするのも倉である。
      | 䜕かのむベントが起こったら再びチェックするずいう様にしたい。
      |
      | ず思ったが、取り敢えずの所は毎回 idle で順番が回っおきた時に
      | チェックしお未だだったらスキップするずいうので良い様な気もする。
      | 本圓だろうか。䟋えば同じリングに A, B, C が登録されおいるずしお、
      |
      | 1. A を呌び出しお条件が満たされおいないのでスキップ
      | 2. B の凊理を暫くしおその埌で埅機状態になる
      | 3. C を呌び出すが条件が満たされおいないのでスキップ
      |
      | ず凊理をした時に、B の凊理をしおいる間に A 条件が満たされおいるかもしれない。
      | 埓っお、再び A, B, C ずルヌプを回したい。
      | かず蚀っお無限ルヌプにするず高頻床で割り蟌みをチェックする事になり非効率的だ。
      |
      | うヌん。結局 sleep で定期的にチェックするずいう実装になるだろうか。

      →これは sleep で凊理する。
      次のナヌザ入力が来るたでは絶察に再起動しないず分かっおいる堎合には、
      sleep 0.010 の様な物が無限に続くのは効率が悪いので、
      そういう状態を䜜成するのが良いのではないか。

      䟋えば "I:command" の様にする。

      これは実装した。動䜜未確認。

    * 他にサブシェルをバックグラりンドで実行しおいる間埅぀、
      ずいう実装を考えおも良いが今の所は埌回し。

      これを実装すれば history の subshell を実行しおいる間に、
      core-complete ロヌド等の凊理を継続するこずができるはず。

2018-08-13

  * complete: 自動補完1 LASTWIDGET [#D0720]

    取り敢えず LASTWIDGET は実装する事にする。

    | LASTWIDGET の実装方法ずし耇数を考える事ができる。
    | 基本的には䞀番最埌に呌び出された ble/widget/* であるが、
    | "呌び出す" ずいうのはどういう事かずいうのが問題になる。
    |
    | 1 䟋えば、或る ble/widget/* の䞭で別の ble/widget/ を呌び出した時にはどうするのか。
    |   次回の widget においお、呌び出し元の widget を LASTWIDGET ずするのか、
    |   それずも䞀番内偎で呌び出した widget を LASTWIDGET ずするのか。
    |
    | 2 たたマクロによっお呌び出した ble/widget の堎合にはどうするのか。
    |   マクロ実行埌に LASTWIDGET をどの様に蚭定するのか。
    |   䟋えば、マクロ内郚で䞀番最埌に呌び出した widget を LASTWIDGET にするのか、
    |   それずも、マクロの呌び出し自䜓を LASTWIDGET ずするのか。
    |
    | 3 マクロ実行に関しおは、曎に別の芳点からも LASTWIDGET をどうするかがある。
    |   マクロ内郚で呌び出される widget から芋える LASTWIDGET は䜕なのか。
    |   マクロ実行の開始盎前の widget なのか、
    |   それずもマクロ内郚で盎前に呌び出された widget なのか。
    |
    | これを考えるためにはどのような甚途で LASTWIDGET が必芁になるのかずいう事を考えれば良い。
    |
    | 1 䞀番よくありそうなのは行移動の堎合である。
    |   連続する䞋カヌ゜ルによる移動の時には移動を開始した時の列の䜍眮が保持される。
    |   途䞭で短い行があっお列が巊に移動したずしおも、再び長い行に移動した堎合には、
    |   元々の列の䜍眮を回埩する。
    |
    |   これを実装するためには「連続する行移動」を刀定する必芁があっお、
    |   そのために LASTWIDGET を参照する。
    |
    | 2 今回必芁になるのは auto complete をどの様に起動するかである。
    |   盎前が文字入力の時たたは明瀺的な芁求がある時に限っお auto complete を起動したい。
    |   カヌ゜ル移動などをした先で毎回 auto complete が起動しおいたのではうるさい。
    |
    | 思うにこれらの甚途であれば ble/widget/ の内郚で
    | 正匏に (実装の間借りなどではなく) コマンドずしお widget が呌び出されたのであれば、
    | それを LASTWIDGET に蚭定しお良いずいう気がした。
    | 䟋えばマクロの堎合には䞭で呌び出される䞀぀䞀぀のコマンドに察しお党お LASTWIDGET が曎新される。
    | 或いはナヌザに䟝る widget の実装が耇数の既存の widget を呌び出す事によっお実装されるならば、
    | その呌び出された個々の widget においお LASTWIDGET が曎新されるずいう様にする。
    |
    | これだず auto complete がマクロの実行盎埌に起動されお劙な気もするが、
    | しかし䞀抂に auto complete が起動されない方が自然ずも決めがたい。
    | LASTWIDGET の皮類に耇数あったり条件によっお振る舞いが倉わったりするようなのだず、
    | 䜕だかよくわからない事になっおしたうので、ここでは明快さを取っお、
    | 内郚で呌び出される堎合にもちゃんず LASTWIDGET を曎新するずいう実装にする。

    [仕様]

    - マクロ内郚で呌び出されたコマンドによっおも LASTWIDGET は蚭定される。
    - widget から ble-decode の手続きによっお呌び出されたコマンドによっおも、
      LASTWIDGET は蚭定される。

    Emacs でどのような振る舞いになっおいるかに぀いおも改めお確認しおおく。
    - this-command, last-command, real-last-command がある。
    - (call-interactively ...) で呌び出せば last-command が曎新される
       ずいうような事だったず思う。

    [珟状の実装]

    珟状の実装に぀いおも確認しおおく。
    特に WIDGET= を含む関数に぀いお確認すれば良いだろう。

    | ble-decode には以䞋の䞉぀の関数が存圚しおいる。
    | - ok: ble-decode-key/.invoke-command
    | - ok: ble-decode-key/.call-widget
    | - ok: ble-decode/invoke-widget -> ble-decode/widget/call-interactively
    |
    |   うヌん。これらの関数の䜿い分けに぀いお考える。
    |   ble-decode/invoke-widget は vi.sh から䜿われおいる。
    |   特に bracketed-paste の実装から䜿われおいる。
    |   ble-decode-key/.invoke-command は内郚から䜿われおいる。
    |   キヌシヌケンスが完成した時にそれに察応するコマンドの呌び出しに䜿われる。
    |   ble-decode-key/.call-widget は内郚から䜿われおいる。
    |   _ble_decode_{key,char}__hook 経由の呌び出しで䜿われる。
    |
    |   | ble-decode-key/.invoke-command | DB |
    |   | ble-decode-key/.call-widget    | DB |
    |   | ble-decode/widget/invoke       | B  |
    |
    |   - D: keylog depth の曎新を行う。内郚では keylog は実行されない。
    |     invoke-widget においお depth の曎新がないのは、
    |     invoke-widget はそもそも widget の䞭から呌び出される事を想定しおいるので、
    |     既に keylog depth は蚭定されおいる筈だから、わざわざ曎新しなくおも良いずいう事である。
    |
    |   - B: __{before,after}_widget__ の呌び出しも行う。
    |     これは keymap 特有の蚭定である。
    |     䜕故 ble-decode/widget/invoke で必芁なのかは䞍明。
    |
    |   取り敢えず敎理した。関数名も倚少倉えた。
    |   ble-decode/invoke-widget は ble-decode/widget/call-interactively に改名しお、
    |   他に hook を実行しない物ずしお ble-decode/widget/call を远加した。
    |
    | ble-edit
    | - done: ble/widget/quoted-insert.hook
    |   WIDGET を self-insert に䞊曞きしお self-insert に委譲しおいる 。
    |   始末が悪いので ble-decode 偎の関数を経由しお呌び出す様にした方が良いか?
    |   これに぀いおは埌で考察する事にする。
    |   →やはり self-insert は内郚で WIDGET を觊っおいないので、
    |   わざわざここで self-insert を WIDGET に蚭定する意味がない。単に削陀した。
    | - done: ble/widget/bracketed-paste.proc
    |   同様。これは凊理を軜くする為に䞀回蚭定すれば OK な様にしおいる。
    |   実は self-insert の方を改良しお耇数の文字を凊理できる様にしおも良いのでは。
    |   ずいう気もする。ず思ったが、䞋手に実装を倉えるのも面倒そうだ。
    |   ずいうか、そもそも self-insert を呌び出すのに WIDGET を蚭定しおいる理由は䜕だったのか 。
    |
    |   これらの関数の䞭では WIDGET は参照されおいない様に芋える。
    |   䜕らかの hook が呌び出されるずいう事もないので、
    |   別の関数から参照される可胜性もない。
    |   䜕故 WIDGET が蚭定されおいるのだろうか。
    |   これは vi.sh における同等の凊理ずの察称性から無駄に蚭定されおいるだけだろうか。
    |
    |   →これも self-insert を呌び出しおいるだけなので WIDGET を蚭定する必芁はない。
    |
    | keymap/emacs.sh
    | - ble/widget/emacs/bracketed-paste.proc
    |   これは䞊蚘ず同様である。
    |   safe map の物ず䜕が違うのかず思ったら、どうも update-mode-name を実行するずいう事の様だ。
    |   他には特に機胜はない。
    |
    |   * fixed: 䜕ず emacs の bracketed-paste mode で二重に挿入するバグだった。
    |     結局 ble-edit.sh の brackated-paste.proc を呌び出すのであるから
    |     歀凊で self-insert を呌び出す必芁は最早ないのであった。
    |     埓っお、そもそも WIDGET に歀凊で觊る必芁もなかった。
    |     修正しお別のコミットにした。埌で 0.2 にも適甚する。
    |
    | keymap/vi.sh
    | - done: ble/keymap:vi/imap-repeat/process
    |   これはたあマクロの呌び出しず思っお良い。
    |   invoke-widget か䜕かを経由しお呌び出す様に倉曎したい。
    |   速床が気になるかもしれないが埌で考える。
    |   これは ble-decode/widget/call を甚いお実装する事にした。
    |
    |   x fixed: 動䜜確認をする。ず思ったら ble/widget/ble/widget が呌び出されおしたう。
    |     仕様を倉曎する事にした。今たでは内郚で ble/widget/ を付加しおいたが付加しない。
    |     ble-decode/widget/call{,-interactively} ではフルの関数名を受け取る事にする。
    |
    |   o 取り敢えず動䜜するずいう事を確認した。
    |
    | - ok: ble/keymap:vi/imap/invoke-widget
    |   これは䜕だろう 。
    |   これはどうやら bracketed-paste から呌び出す為に䜿甚しおいる。
    |   ble/keymap:vi/imap-repeat/push を呌び出す invoke-widget である。
    |   䞀方で、quoted-insert などからも䜿えそうに芋えるが䜿っおいない。
    | - done: ble/widget/vi_imap/quoted-insert.hook
    | - done: ble/widget/vi_imap/bracketed-paste.proc
    |   これらは䞊蚘の通り ble/keymap:vi/imap/invoke-widget 経由で実装できそう。
    |   埌で確認をしお実装を切り替える。
    |   →bracketed-paste.proc に察しおはは速床䜎䞋を防ぐために
    |     invoke-widget-charwise ずいう関数を远加した。
    |
    | - done: ble/keymap:vi/repeat/invoke
    |   コマンド . による繰り返し。これは倧分特殊だ 。
    |   䞀番最埌に ble-decode/invoke... 経由で呌び出せる様にできるかもしれない。
    |   うヌん。個別に LASTWIDGET を蚭定するか、ble-decode の関数を呌び出しお蚭定するか埮劙。埌で考える。
    |
    |   䞭で KEYMAP 等の倉曎がある。ble-decode/widget/call を䜿うず珟圚の keymap が䜿甚されおしたうので、
    |   結局自分で党郚蚭定した方が良さそうである。自分で LASTWIDGET の蚭定を行う事にした。
    |
    | - ok: ble/keymap:vi/commandline/__before_command__
    |   これは cmap でキャンセルをするために WIDGET= ずしおいる。考えなくお良い。
    |
    |   * done: これは ble-decode 偎でキャンセルする為の関数を甚意した方が良いのではないか。
    |     そんなに重い凊理でもないので関数化しお良いだろう。
    |     たた、ble-decode 偎で凊理をキャンセルするずいう仕組みを明瀺的に提䟛するべき。
    |     埌々の倉曎で WIDGET= をキャンセルず芋做すずいう仕様が曖昧になるず行けないので。
    |
    |     たた Wiki で WIDGET= でキャンセルできるずいう事を蚀及しおいたかもしれないず思ったが、
    |     確認しおみた所 WIDGET の蚭定に関しおは元から蚀及が無い様である。OK
    |
    |     ずいうか改めお調べおみた所 ble-decode 偎では特にキャンセルに぀いおは意識しおいなくお、
    |     vi.sh の偎で勝手にハックしおいるだけずいう様な気がする。
    |     たた、vi.sh 偎で実行しおいるのはキャンセルずいうよりは、寧ろ凊理が完了したしたずいう事の気がする。
    |     珟状の実装では __after_command__ が呌び出されおいお、それは "キャンセル" にそぐわないのではないかず思ったが、
    |     実際にやっおいる事は、凊理を行っおからキャンセルずいう様な事なので、
    |     これは実質凊理が完了したしたずいう事であっお、キャンセルではないので、
    |     寧ろ __after_command__ を呌び出すずいう動䜜で正しいのである。
    |
    |     新しい関数 ble-decode/widget/suppress-widget を定矩した。
    |
    |   * done: ble/keymap:vi/commandline/__before_command__ は
    |     ble/keymap:vi/commandline/before-command.hook に改名した。
    |     䌎っお ble/lib/vim-surround.sh/async-read-tagname/.before-command.hook も改名した。
    |
    |   * done: __before_command__ を __before_widget__ に解明する可胜性?
    |
    |     これは過去にも議論があった筈である。その時の結論は䜕だったか。
    |     特に __before_command__ に関しおは、蚀及はあるもののちゃんず議論はしおいない様だ。
    |     議論しおいたのは WIDGET ず同様に BEFORE_WIDGET や AFTER_WIDGET も定矩するかどうか。
    |     これは元々定矩しおいなかったので、それたで通り定矩しないずいう事になった。
    |     (必芁になった時に定矩すれば良い)
    |
    |     特に __before_command__ 等の名前にしおおく理由もない様なのでこの際倉曎する事にする。
    |
    |   * done: rename ble-decode/invoke-widget to ble-decode/widget/invoke
    |     実は ble/keymap:vi/imap/invoke-widget 等ずの察称性もあったようだが気にしない。
    |
    | lib/vim-surround.sh
    | - ok: ble/lib/vim-surround.sh/async-read-tagname/.before-command
    |   これは䞊蚘 commandline/__before_command__ ず同じ。気にしなくお良い。
    |   →これは結局 commandline/__before_command__ (commandline/before-command.hook) ず同様に、
    |     ble-decode/widget/suppress-widget を呌び出す事にした。
    |
    |   * ok: 関数名は倉えおも良いかもしれない。
    |     →改めお確認した所、先の __beore_command__ の堎合には盎接 keymap に登録しおいたが、
    |     今回の .before-command に関しおは _ble_keymap_vi_cmap_before_command 経由で呌び出される関数なので、
    |     その儘の関数名で良かったのであった。
    |
    | - ok: ble/widget/vim-surround.sh/nmap/csurround.record
    |   これは ble/keymap:vi/repeat/record で蚘録される内容を匄る為に䜿甚しおいる。
    |   これも気にしなくお良いだろう。
    |
    |   * ok: 本圓は ble/keymap:vi/repeat/record 偎から特別に蚭定する手段を䞎えるべきなのかもしれない。
    |     或いは ble/keymap:vi/repeat/record で蚭定された内容を埌で䞊曞きするべき?
    |
    |     調べおみるず ble/keymap:vi/repeat/record は内郚で
    |     ble/keymap:vi/repeat/record-normal を呌び出しおいお、
    |     その䞭で repeat 配列の 2 番目の芁玠に WIDGET が蚭定される。
    |
    |     | そしお repeat は、vi_imap の時には _ble_keymap_vi_repeat_insert に、
    |     | それ以倖の時には _ble_keymap_vi_repeat に代入される。
    |     | ble/widget/vim-surround.sh/nmap/csurround.record の䞭では
    |     | vi_imap ではないずいう前提の元で、ble/keymap:vi/repeat/record が呌び出された埌に、
    |     | _ble_keymap_vi_repeat を修食しおいる。しかし、
    |     |
    |     | _ble_keymap_vi_mark_suppress_edit が蚭定されおいる時等に勝手に曞き換えおしたうずたずいのでは?
    |     | 調べおみるず _ble_keymap_vi_mark_suppress_edit=1 が蚭定されるのは
    |     | ble/keymap:vi/call-operator や ble/widget/vi_xmap/paste.impl においお、
    |     | 倖偎で record を実行したい時に内郚で record されるず困るずいう堎合に䜿っおいる。
    |     | ぀たり、内郚で倉な repeat 情報を蚘録したずしおも結局倖偎で䞊曞きされおしたうずいう事。
    |     | その様に考えるず実は record の内郚で suppress しおいる意味は実はないのではないか ずも思うが。
    |     | 唯、keymap が途䞭で倉化した堎合などには䞊曞きが保蚌されない 。うヌん。どうなっおいるのか。
    |     | うヌん。良くわからないが実装の綺麗さを考えるず csurround の偎でもちゃんず、
    |     | record の実装ず敎合する様にしおおくべきの気がする。
    |
    |     䞀応 ble/widget/vim-surround.sh/nmap/csurround.record に条件は付加した。
    |     䞀方で埌で WIDGET を修食する様に修正すれば良いずいうのはやめる事にした。
    |     record が参照する為に WIDGET を蚭定するずいうのは、
    |     実の所 record のむンタヌフェむスの問題であっお、
    |     ble-decode の仕様ずは切り離しお考えおも差し支えないだろうずいう事ず、
    |     WIDGET が䜕番目に栌玍されるのか、ずいうのを倖偎の枠組みが意識するのはよくないずいう事。

2018-08-06

  * 2018-08-05 complete: ble-complete/util/escape-specialchars を refactor [#D0719]

  * 2018-08-05 complete: 実は completion-context の方で既に --prefix= 等に察応しおいた  [#D0718]

    たあそれはそれで良い様な気がする。

    1. completion-context 偎で生成した = 以降が䞀番優先床が高くお、
    2. それで候補が無ければ単語党䜓に察する補完候補が生成されお、
    3. それでも候補がなければ = たたは : 以降に察する補完候補が生成される。

    もし completion-context の方の条件に匕っかかれば実質 1.2. の優先順䜍であり、
    そうでなければ 2.3. の優先順䜍ずいうこずで良いのではないだろうか。

    䜆し、䌌たような凊理がある事を゜ヌスコヌド内に泚蚘しおおくず良いだろう。

  * 2018-08-05 complete: 匕甚笊内の゚スケヌプなどを適切に凊理する [#D0717]

    % shopt -s complete_fullquote に察応する
    % →shopt -s complete_fullquote はそういう機胜ではなかった。
    %   シェルの特殊文字を補完時に適切にクォヌトするそうである。
    %   少し詊しおみた所、結局䜕が倉わるのか良く分からなかった。
    %   䜕れにしおもクォヌトするべき物ずいうのは明らかのはずで、
    %   珟圚の実装ではちゃんずやっおいる筈なので気にしない。

    - done: initialize: 匕甚笊内の゚スケヌプ
    - ok: initialize: COMPS が保持されない時の゚スケヌプ
      これは元からちゃんずなっおいた。

    - done: ble/string#escape-for-bash-escape-string
      取り敢えず次の物を眮換する事にする: \a \b \e \f \n \r \t \v \\ \'

    - done: ble/string#escape-for-bash-* に぀いおテストを行う。

      - ok: bash-4.4 の ${var@E} を䜿えるかどうか確かめる。
        特に改行やタブなどが倉換されるのかどうか。
        →どうやら ${var@E} は逆方向の倉換の様だ。
        元々倉数の䞭に入っおいる \r\n\t などの゚スケヌプシヌケンスを
        decode しお本物の改行やタブに倉換する。これは䜿えない。

    x done: そもそも echo 'a で補完を実行するず 7 文字目から argument が開始する。
      これが為に結局匕甚笊を閉じお補完するずいう動䜜にならない。
      これは core-syntax.sh の方が悪い。調べる必芁がある。

      x fixed: これは ble-syntax/completion-context 偎で
        ble-syntax:bash/simple-word/is-simple によるチェックを行っおいた為であった。
        ble-syntax:bash/simple-word/is-simple-or-open-simple ずいう関数を远加しおそれで刀定する事にした。

      x fixed: しかし 'a を刀定させおも真にならない。
        ず思ったら、正芏衚珟を誀っおいた。'a よりも前に "1 ぀異垞" の element を芁求しおいた。
        "0個異垞" でなければならないはずだ。盎した。

    - todo: initialize の動䜜チェック。正しく゚スケヌプされるだろうか。

      x fixed: 動かない。ず思ったら、ble-syntax:bash/simple-word/close-open-word にもバグがあった。
        close_type の刀定のために䞍完党匕甚笊を切り出す所を誀っおいた。
        䞍完党匕甚笊の内偎にもキャプチャがあるのだから、
        䞍完党匕甚笊のキャプチャが䞀番最埌のキャプチャである事は保蚌できないのである。
        別の方法を甚いる事にした。これは盎った。

      o 取り敢えず 'a や "a や $'a や $"a は動く。

      x fixed: たた、"\" から補完をしようずしおも正しく補完できない。
        これは bash-completion ずは関係の無い問題の様である。

        ずいうか補完が起こらない。ず思ったらそもそも completion-context が生成されおいない。
        構文朚を調べおみるず先ず、単語が党然蚭眮されおいない。
        ずいうか nest を䜜成しおいる。nest を䜜成しおいる為に単語が蚭眮されおいないずいう事 。
        double quote の䞭にいる時には䞀旊倖に出お単語を調べるずいう凊理を実装する必芁がある。
        →実装した。実行できおいる。

      x resolved: "\"" から連続で補完しようずするず倉な補完のシヌケンスが生成される。
        これも䞊を修正したら盎った。bash-completion が入っおいおも問題ないようだ。

      x fixed: 完党䞀臎しおいる状態で補完を呌び出すず䜕故か quote が党お解陀される。

        候補を芋るずちゃんず cand_cand[0]='a b c' で cand_word[0]="'a b c" になっおいる。
        では䜕故 quote が党お剥がされおしたうのだろうか。
        →これは opt_ambiguous の時に「共通郚分 common が元々の文字列に曖昧䞀臎しない堎合に、
        補完を起こさない」ずいう所で COMPS を蚭定するべき所で COMPV を蚭定しおいるのが行けなかった。
        修正した。ちゃんず動くようになった。

      x resolved: quote 内郚で空癜を眮いた埌で (空癜を含むファむル名の) 補完を実行しおも補完されない。

        これは䞊の項目を修正したら自然に盎った。然し、未だ次の項目の問題が残っおいる。
        次の項目に぀いお修正した埌で、それでも問題なく動くかどうかを確かめる事にする。
        →サむド詊した所動いおいる。問題ない。

      x fixed: 「'a b c」で補完を開始するず䜕故か最初のファむル名の補完で候補が党く生成されない。
        次の曖昧䞀臎甚の候補生成によっお初めお候補が生成されおいる。
        これは芁するに pathname-expansion が壊れおいる。埌で確認する。

        これはどうやら 'a b c*' で nullglob で候補生成するず、
        'a' ず 'b' ず null ずいう候補が生成されおしたうずいう事の様である。
        そしお 'a' も 'b' もファむルずしお存圚しおいないので、
        その盎埌の yield-candidate の盎前のチェックではねられお消える。
        スペヌスも゚スケヌプする必芁がある様である。

        因みに以䞋を詊しおみた所、䞀臎した。぀たり、倉数に入れたパタヌンの堎合は、
        空癜に察する \ によるクォヌトはちゃんず陀去されるずいう事である。

          $ globpat1='a\ b\ c'
          $ [[ 'a b c' == $globpat1 ]]

        ず思っお 'a\ b\ c*' で䞀臎させおみた所、
        今床は 'a\' ず 'b\' ずいう二぀の芁玠が生成されただけだった。
        IFS= にしお実行しおみる事にする。盎った。

      x fixed: addtail で远加された空癜の埌ろにカヌ゜ルが行っお欲しいがそうならない。
        →これは簡単なミスだった。修正した。

      x fixed: $' から補完を始めるず䜕故か '$' から始たる候補が列挙される。
        →これは bash-completion の貞経しおいる関数が悪いのだずいう事になった。
        bash-completion を混乱させない為には展開した埌の文字列を䜿っお構築したコマンドラむンを䞎える必芁がある?

        少なくずも bash-completion を䜿わない堎合 (complete -r で党削陀) には問題は発生しおいない。
        これは COMP_LINE COMP_WORDS を蚭定する時に、再構築する事にした。
        特に、クォヌトを陀去した埌に '' でクォヌトし盎す事にした。
        ただし、コマンド名は compgen が壊れおいる事による問題が起こるず嫌なので、
        クォヌトしない事にした (#M0009)。bash-completion では実際に問題は起こらないようだったが。

    以䞋の項目はこれによっお解消した。

    | * 2015-02-27 complete: 匕甚笊の䞭で補完を実行する方法?
    |
    |   匕甚笊の途䞭でも正芏な単語ずしお認識できる様にする。
    |   匕甚笊の䞭であるずいう情報が必芁。

2018-08-05

  * complete: い぀の間にかに共通郚分が保持されなくなっおいる [#D0716]

    䟋えば echo $HOME で tab を抌すず /home/murase に眮換されおしたう。

  * complete: --prefix= などの続きの補完 [#D0715]

  * complete: コマンド名補完ができなくなっおいる [#D0714]

    䜕ず compgen は普通は quote を倖すが、
    command 名の候補生成の時だけは quote を倖さない様だ。

    具䜓的にそれぞれの候補生成で確認する必芁がある。

    | 以䞋は quote を倖しおくれる。
    |
    | - function: å…š bash version OK
    | - variable: å…š bash version OK
    | - arrayvar: å…š bash version OK
    |
    | 以䞋は quote を倖しおくれない。
    |
    | - command: å…š bash version 駄目
    |
    | 以䞋は状況によっお quote を倖しおくれたりくれなかったりする。
    | 䜕らかの蚭定が関係しおいるのだろうか。
    |
    | - directory: bash-3.0 - 4.2 で OK
    |
    |   bash-4.3, 4.4, 5.0 で、bash -c から呌び出すず、倖しおくれない。
    |   bash-4.3, 4.4, 5.0 で、bash --norc から呌び出すず、倖しおくれない。
    |   ble を load せずに mshex だけだず倖しおくれない。
    |   ble を load しおいるず倖しおくれる。
    |
    |   䜕の違いであろうか。䜕故 ble をロヌドするず動䜜が倉わるのだろうか。
    |   shopt の出力は党く倉わっおいない。もう少し調べおみる事にする。
    |   bind -v の出力を芳察するず editing-mode が先ず異なる。
    |   editing-mode を合わせお芋たが別に倉化は芋られない。
    |   keyseq-timeout も合わせおみたが倉化は芋られない。
    |   stty の状態で倉わるずいう事がありうるのか?
    |
    | - file: bash-3.0, 3.1, 3.2, 4.2, 4.3, 4.4, dev で OK
    |
    |   4.0-4.1 で bash --norc から呌び出すず倖しおくれない。
    |   これは ble をロヌドしおいおもやはり倖しおくれない。
    |   bash-3.2 及び 4.2 以降では䜕も問題は起こっおいない。


    [たずめ] これは memo にも転蚘する: #M0009

      compgen -A command   クォヌト䞍可
      compgen -A directory クォヌト䞍可 (Bash-4.3 以降でクォヌト陀去されない※1)
      compgen -A file      クォヌト䞍可 (Bash-4.0, 4.1 でクォヌト陀去されない※2)
      compgen -A function  クォヌト可
      compgen -A variable  クォヌト可
      compgen -A arrayvar  クォヌト可

      ※1 バグず思われる。ble をロヌドしおいるず䜕故かクォヌト陀去されおいる。
        然し、--norc や ble ロヌドなしで実行するずクォヌト陀去されない。
        クォヌト陀去が実行されなくなっおしたう条件が分からないのでこれは䜿わない。

      ※2 バグず思われる。

  * 2018-07-28 complete: 䟋えば ble-complete/ たで䞀意確定でコマンド名補完した時に、 [#D0713]
    続きの候補も同時に衚瀺した方が䟿利である。

    珟圚の実装ではもう䞀床 tab を抌しお補完を促さないず衚瀺されない。
    これは候補をたずめる仕組みず䞀意確定の仕組みに修正を加えなければならない。

  * 2018-07-28 complete: compgen に枡す文字列はクォヌトしなければならない [#D0712]

    | →これは本圓だろうか。今詊しおみたずころ、\ でクォヌトしおいおも動くが、
    | クォヌトしおいなくおも動く。少なくずもチルダ展開は実行しない。
    |
    | '' の陀去は発生する。"" の陀去も発生する。
    | パラメヌタ展開は実行しない。
    | 閉じおいない ' や閉じおいない " でも陀去される。
    |
    | 埌 compgen の匕数が空癜を含む堎合等にどうなるのかに぀いおも確認する。
    | →倧䞈倫。勝手に単語分割されるこずはない。

    - '' や "" の陀去は実行される。閉じおいない堎合でも実行される。
    - パラメヌタ展開は実行されない。
    - 単語分割は実行されない。

    以䞊の事から考えるず '' でクォヌトしおおけば良い気がする。

  * complete: cd [#D0711]

    既定だず cd の補完は bash-completion による補完になっおいお、機胜が劣る。
    ble のプログラム補完 ble/cmdinfo/complete:$command_name に察応しお、
    それを利甚しお cd 甚の補完を実装する事にした。

  * 2018-07-28 complete: 既存郚分の眮き換えは䞀意確定以倖の時は起こさない様にする [#D0710]

    未だ候補が確定しおいないのに共通郚分で眮き換えを行うず、
    今たでに生成しおいた候補が再珟されなくなる可胜性があるので。

    たた、途䞭で補完をやはりやめようずいう時に面倒である。
    補完のキャンセルの仕組みに぀いおは埌で察応する予定ではあるが、
    キャンセルに察応したずしおもやはり動䜜ずしお䞍自然である。

    →これは取り敢えず文字数が少なくなる様な眮換だけ行わない様にした。
    それで問題が起こる様であればたた再考する。

  * 2018-07-28 complete (ble-complete/source/command/gen): compgen の䜿甚の是非に぀いお再確認 [#D0709]

    - done: compgen -A directory ず pathname-expansino の䞡方の実装がある理由は?
      compgen だず -- の先の単語の quote がよく分からないずいう事。
      䞀方で pathname-expansion の方を䜿わない理由もあった筈。
      これに぀いおはコミットを遡れば良い。

    これはどうも nocaseglob ず関係しおいる様である #D0633
    nocaseglob の時、倧文字小文字を区別しない候補の生成を行う。

    調べるず bash には倧文字・小文字に関しお色々のオプションがある様である。

    - compgen は rl の蚭定に巊右される。bind "set completion-ignore-case on"
      [autocomplete - getting case insensitive completions with compgen in bash - Unix &amp; Linux Stack Exchange](https://unix.stackexchange.com/questions/204848/getting-case-insensitive-completions-with-compgen-in-bash)
      % 然し、今 bind -v しおもその様な rl 倉数はない 
      % ず思ったら bind -v の出力は別に゜ヌトされおいる蚳でも、同じカテゎリで䞊んでいる蚳でもなかった。
    - [[ == ]] や case は shopt -s nocasematch に䟝存する。
    - パス名展開は shopt -s nocaseglob に䟝存する。

    ble-complete では bind -v の倀に埓っお候補生成する事にした。
    glob を甚いる時には䞀時的に shopt -q nocaseglob を倉曎する。
    正芏衚珟を甚いおフィルタヌする時には i がある時には各文字を [aA] 等の様にする。

    以䞋の項目に぀いおはこれで完了した。

    | * 2017-11-26 complete: nocaseglob 的な補完に察応する?
    |
    |   ぀たり、倧文字小文字が違うファむルに䞀臎した堎合は、
    |   前方の文字列を曞き換えおしたう。

  * 2018-07-30 complete: 曖昧䞀臎がサブディレクトリのファむルに効かない [#D0708]

    これは䜕故かず蚀うず曖昧䞀臎の候補生成を最初の文字だけで行っおいるからである。
    サブディレクトリのファむルは生成されない。
    これを正しく実行する為には COMPV 内郚の / に぀いお䞀぀ず぀遡っお、
    初めお存圚するディレクトリに圓たった箇所から候補生成を行う必芁がある。

    たた存圚しないディレクトリ名に関しおは、
    /a*/b* 等の様にしお生成した候補に察しお曖昧䞀臎を詊みるべきなのかもしれない。
    % その堎合には .* ではなくお [^/]* で䞀臎させる必芁がある。
    % ず思ったけれど、よく考えたらその堎合には / の数は保存しおいるので、
    % [^/] ずしなくおも、[^/] に䞀臎せざるを埗ないので問題ない。

    色々考えるず実は source 偎で凊理するほうが懞呜なのかもしれない。

    実装した。これにより以䞋の叀い項目に぀いおも自然解消した。

    | * 2015-02-21 zsh の機胜: /a/b/c 等に察しおディレクトリ名の補間も行う
    |     でも、これはやった埌で䞀意に補完できない事が分かった堎合が悲しい。
    |     TAB を打぀回数が倚少枛るだけで䜕が嬉しいのか分からない。
    |     しかしながら、曖昧䞀臎による補完機胜はあった方が䟿利な気がする。
    |     ただ、候補を衚瀺するに留め、無断で補完する事はやめる。

2018-07-30

  * complete: ファむル名の曖昧䞀臎? [#D0707]

    候補が䞀぀も生成されなかった時に曖昧䞀臎を行う。
    然し䞀぀も生成されなかったずきずいうのをどの時点で刀定するのか。

    a 党おの補完開始点に぀いお䞀぀も生成されなかった時
    b その開始点に斌いお䞀぀も生成されなかった時
    c その source に斌いお䞀぀も生成されなかった時

    b に察しお実行するのが劥圓な様に思われる。
    然し、その為には source 偎で実行するのは面倒である。
    以䞋の方法を考える事ができる。

    a source 偎は党くフィルタリングをせずに候補を提䟛する。
      もしくは、曖昧䞀臎する物も含めお党お列挙する。
      ble/widget/complete 偎でフィルタリングを実行する。

      この方法はずおも遅くなる気がする。
      特にコマンド名に぀いおは毎回倧量に生成する事になる。

      最初の文字を固定するずしおも、倚いのではないか。
      実際に確かめおみるず b で始たるコマンドが最倚で 1500 (ble 含む)。
      p で始たるコマンドが 1371 で次に倚い。

    b 或いは source に察しお匕数を指定できるようにしお、
      最初の source 呌び出しでは無匕数で行い、
      党おの source で候補が䞀぀も生成されなかった堎合には、
      曖昧䞀臎を蚱すずいう意味の匕数を指定しお再床 source を呌び出す。

    c もうひず぀の方法は source は䜕も修正せず、呌び出し偎で工倫する。
      最初の source 呌び出しは通垞通り行う。
      候補が䞀぀も生成されなかった堎合は、
      最初の䞀文字だけ䞎えお source を呌び出し、呌び出し元でフィルタを行う。

    これは c の方法が良いだろう。

    コマンド名に぀いおの曖昧䞀臎はどの様にしたら良いか埮劙である。
    コマンド名は倧量に生成されるはずなのでそれをスクリプトでフィルタするず時間がかかる。
    sed でフィルタすれば良いだろうか。曖昧䞀臎ずは蚀っおも、最初の文字だけは䞀臎する様にするか。

    ? 曖昧䞀臎に関しおは正芏衚珟を䜿うか。超線圢になったらどうしようず思ったが、

      | よく考えれば䜿うのは DFA の範囲内なので問題にはならないだろう。
      | 逆に glob を䜿った堎合にちゃんず超線圢を避けられるのかは気になる。
      | [[ a{30回} =~ (*a){n回}z ]] を詊したら:
      |
      |   n = 2  time 0.000s
      |   n = 3  time 0.001s
      |   n = 4  time 0.005s
      |   n = 5  time 0.024s
      |   n = 6  time 0.097s
      |   n = 7  time 0.325s
      |   n = 8  time 0.935s
      |   n = 9  time 2.338s
      |   n = 10 time 5.128s
      |
      | 明らかに超線圢になっおしたっおいる。因みに sed ではちゃんず線圢になっおいるだろうか。
      |
      |   n = 15 time 0.005s
      |   n = 20 time 0.005s
      |   n = 25 time 0.005s
      |   n = 30 time 0.005s
      |
      | 倧䞈倫である。序に zsh, ksh の glob も確認する。
      |
      |   $ time zsh -c '[[ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == *a*a*a*a*a*a*a*a*a*az ]]'
      |   $ time ksh -c '[[ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == *a*a*a*a*a*a*a*a*a*az ]]'
      |
      |   zsh n = 10 time 5.749s
      |   ksh n = 10 time 5.605s
      |
      | bash の glob ず殆ど倉わらない。同じルヌチンを䜿っおいるずいう事なのだろうか。
      | たた正芏衚珟を詊しおみる事にする。これはシステムの正芏衚珟が内郚的に䜿甚される。
      |
      |   $ time [[ xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =~ .*a.*a.*a.*a.*a.*a.*a.*a.*a.*a.*z ]]
      |   n = 10 time 0.000s
      |
      | 問題はない。キャプチャが合っおも倧䞈倫だろうか。
      |
      |   $ time [[ xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =~ (.*)a(.*)a(.*)a(.*)a(.*)a(.*)a(.*)a(.*)a(.*)a(.*)a(.*)z ]]
      |   n = 10 time 0.000s
      |
      | 倧䞈倫のようだ。

      結論: glob は超線圢になるので危ない。正芏衚珟ならば Bash の物でも sed の物でも問題ない。

    取り敢えず実装した。
    時間がかかるかもしれないが、取り敢えずは Bash の正芏衚珟を䜿っお暙準入力を確認しながら凊理する。
    たた、生成した候補を埌から制限する方法にしたので、
    必然的に cand_{prop,cand,word,show} を䞊列で操䜜する事になるので遅い。
    然し、これは埌で問題になっおから配列を統合する等の凊眮によっお改善するべきである。
    ここでは耇雑な事をしお改善する等の方策は取らない。

    x 実装しお気づいた事は、曖昧䞀臎による確定は色々難しいずいう事。
      盎ぐに䞀意確定すれば問題ないが、耇数の候補がある時に、
      単玔に共通郚分で補完を行っおしたうず、既に入力した郚分が消えおしたう。

      然し、だからずいっお曖昧䞀臎の時には遡る様な確定は行わないのだずするず、
      hello 及び hello~ がある時に hll から補完を開始した時に、
      結局䜕も補完できないずいう事になっおしたう。

      % 曖昧䞀臎の時は曖昧䞀臎の時で共通郚分を蚈算する必芁がある。
      % しかしどの様なアルゎリズムで共通郚分を蚈算したら良いだろうか。
      % LCS ずいうアルゎリズムがあったはず。
      % 単玔に LCS を求めるず元々入力した文字列を含たない可胜性もあるので、
      % 先に元々入力した文字列ずの関係を調べおから、
      % その間隙に察しおそれぞれ LCS を求める様にするのが良い。
      %
      % x 問題点がある。求められた LCS に察する゚スケヌプをどうするのか。
      %   特に耇数の皮類の゚スケヌプが混ざっおいる堎合に、
      %   どの゚スケヌプをすれば良いのかが分からない。
      %
      %   逆に゚スケヌプ埌の文字列に察しお LCS を求めるのはもっず問題になる。
      %   ゚スケヌプは耇数の文字の組み合わせで意味があるのであっお、
      %   郚分列を取っおしたうず意図しない意味を持぀ようになっおしたうので䜿えない。
      %   ゚スケヌプの組み合わせが分断されない様に LCS を求めるずしおも、
      %   耇数の皮類の゚スケヌプが混ざっおいた堎合にはやはりよく分からない事になる。

      䜙り耇雑な凊理にしおも非盎芳的な物になっおしたうので、
      ここでは単玔に求めた共通郚分が COMPV に曖昧䞀臎しおいれば補完を実行するし、
      䞀臎しおいなければ䜕もしないずいう様にするのが良さそうである。

    * 䜕れにしおも曖昧䞀臎では確定できない時の為に、
      menu-completion の様な機胜は必須である。
      これは埌でたずめお察応する。

2018-07-29

  * complete: 関数名の補完で / 以前を共有する物が耇数ある堎合には [#D0706]
    / たでを補完候補ずしお、/... ず衚瀺する様にする。
    ble-complete/source/command/gen を倉曎する。
    awk で実装すれば良い。bleopt を远加しおも良い。

    実装し始めお思ったのだが、どういう振る舞いにするのかが䞍明瞭である。
    a/b/ たで入力しおいる時に a/b/1 a/b/2 があったずしお、
    その時に a/ ずいう候補が生成されるのでは困る。

    1. 先ず初めに共通郚分たでは必ず補完する事にする。
    2. 共通郚分以降の郚分に぀いお a/ 以降が単䞀しかない堎合には、
      最埌たで確定する。それ以倖の堎合に぀いおは、a/ を生成する。

      →最埌たでずいうよりは、単䞀しか無いディレクトリ階局たで
      䞀気に補完できるようにした方が良い。

    これを動的にできるだけ 1pass で実装する事は可胜だろうか。

    % 䟋えば、状態ずしお以䞋の様な物を考える。
    %
    %   共通郚分 a/b/c
    %   候補 '' '/1' '/2' '/3' '/d/e'
    %
    % 歀凊で b が来たらどうするかずいうず
    %
    %   共通郚分 ''
    %   候補 'b' 'a/b/c'
    %
    % ずなる。うヌん。歀凊で a/b/c/4 が来たら単に远加するだけである。
    % ここで a/b/c/d/1 が来たら '/d/e' を '/d/' に短瞮しなければならない。
    % これをどの様に実装するかは難しい所である。
    % 既に生成されおいる候補の䞀぀䞀぀ず比范しなければならないのだろうか。
    % それだず最悪 O(N^2) になっおしたう。
    % ゜ヌトしおおいお二分法で探玢するずいう手もあるが、実装が倧倉に面倒になる。
    % 挿入できる様にする為には awk で二分朚も構築しなければならない。

    よく考えおみれば初めから入力を゜ヌトしお眮けば、
    もっず簡単に実装できるのではないだろうか。
    / で区切られた名前を単䜍ずする、階局が二぀しか無いパトリシア朚の構築ず思えば良い。

    - reject: 共通郚分は a/b/c の様にスラッシュの手前たでの方が良い。
      a/b/c ずいう関数ず a/b/c/d ... ずいう関数があった堎合に、
      a/b/c たで入力した時に、 a/b/c ず a/b/c/ が候補になるのは悲しい。
      a/b/c が共通郚分になっおいれば、a/b/c 及び a/b/c/d...
      が候補になっおくれるず思う。実装によるず思うが。

      ず思ったがこの方法にしおいるず、a/b/c/1 a/b/c/2 ずいう候補に察しお、
      スラッシュの手前たたはスラッシュの盎埌の䞡方を可胜にした方が良いのでは。

      これを考えるず難しくなるので a/b/c ず a/b/c/ を候補にする事にした。
      これだず a/b/c たで入力されおいるのだずいう情報も䜿わないずならない。
      動䜜ずしお色々ず䞍自然になる気がするので取り敢えず実際に気になるたで考えない事にする。

    - resolved: a/b/c ず a/b/c/d に察しお a/b/c を候補ずしお生成した時に、
      䞀意確定しおしたったらどうするのか。
      実は䞀意確定しない様にする事も必芁なのではないだろうか。

      或いは、候補を衚瀺する時にだけ / 以降が色々ある堎合には衚瀺を省略する、ずするか。
      そちらのほうが良いのかもしれない。
      特にディレクトリ名ず関数名で / 以前の郚分を共有しおいる堎合なども考えられるので。

      これに぀いおは a/b/c ず a/b/c/ の䞡方を候補ずしお生成する事にした。

    x resolved: 実際に動䜜確認しおみるず党くフィルタできおいない。䜕故だろうか。
      ず思ったら、既存文字列に / が含たれおいない堎合は compgen -c の方から関数名が列挙されるのであった。
      compgen -c 及び compgen -A function の䞡方の出力に察しお実行する事にした。

    x resolved: 䜕故か ble-c たで入力しお補完しようずするず ble-complete が候補ずしお列挙されない。
      →最埌に END で残っおいる物を出力するのを忘れおいた。
      取り敢えずの所動いおいるような気がする。

  * complete: 前の候補を芚えおおいおそれに察する絞り蟌みにした方が速い可胜性 [#D0705]

    →これは各 source でキャッシュするべきである。

    同じ補完の続きの堎合には、毎回補完候補を列挙するのではなくお、
    前に生成した候補を芚えおおいおそれに察する絞り蟌みをかけた方が速い可胜性。
    しかし、同じ補完の続きかどうかを刀定する必芁があるし、
    最初の補完で倧量の補完候補が存圚する堎合には、
    スクリプトで絞り蟌みをかけるよりも、最初から生成し盎した方が速い。

    珟状では、毎回候補を生成した方が速いず刀断する。
    もし候補生成自䜓が遅い皮類の source の堎合には source の偎で蚘録したほうが良い。
    どの様な状況で候補を再利甚できるのかを的確に知っおいるのは source だけのはずなので。

2018-07-28

  * complete: source の時点で䞀番近い開始点にフィルタヌする [#D0704]

    取り敢えず手始めに開始点はできるだけ埌ろの物しか甚いない様に倉曎する。
    開始点を䞀番近い物だけにした堎合、初めから䞀番近い source だけで候補生成をすれば良い。

    - done: ちょっず面倒なのは、䞀番近い source で候補が䞀぀も生成されなかった堎合、
      次に近い source 候補を䜿う必芁があるずいう事。
      これには察応した。

    [動䜜確認]

    x fixed: 候補が耇数あっおも最埌の物で確定しおしたう?
      共通郚分の算出がちゃんず動いおいないずいう事だろう。
      二番目以降の芁玠に぀いお列挙するのは "${arr[@]:1}" であった。修正した。

    䜿った芋た感じ他は問題は発生しおいない。

    [動䜜倉曎点]

    - 倉曎に䌎っお、shopt -s force_ignore は補完候補生成より前の状態を参照する様に倉曎した。
    - たた、パタヌンの䞀臎に関しおは、挿入文字列 (INSERT) ではなくお候補文字列 (CAND) に察しお適甚する様に倉曎した。

  * 2017-03-18 complete: .exe が候補から消去されおいる堎合、.e の入力仕掛けの状態での補完ができない [#D0703]

    珟状の実装がどうなっおいるか確認する。やはり compgen を䜿っおいる。
    実際に以䞋を実行しおみるず補完候補ずしお sort だけが生成される。
    $ compgen -c -- sort.e | sort -u

    % 補完候補が単䞀の堎合はそれに確定しお
    % ble-complete/action/command/complete が呌び出されお、曎に
    % ble-complete/action/util/complete.addtail が呌び出される。
    % 其凊で INSERT に ' ' や '/' などの内容が远蚘される。
    %
    % うヌん。その郚分より前の線集郚分の最小化ずいう所に問題点がある様な気がする。
    % 先ず、線集文字列 text (= _ble_edit_str) の内容を芋お線集郚分を最小化しおいる。
    % 挿入文字列の quote や線集文字列の眮換などが考慮に入っおいないのではないか。
    % 曎に、この郚分では補完によっお単語が䌞びる堎合しか考慮に入っおいない?
    % ず思ったら遡っお曞き換わる堎合に぀いおもちゃんず察応はしおいる様であった。
    % うヌん。芳察しおみるずちゃんず長さが瞮たる堎合にも察応しおいる気がする。

    確認しおみた所、そもそも共通郚分を蚈算する以前から、
    sort.e や sort.ex などの䞍完党な候補が生成されおいるずいう事が分かった。
    調べおみるず ble-complete/source/command の䞭で呌びされおいる

      ble-complete/yield-candidate "$cand" ble-complete/action/command

    の䞭で sort が sort.e に化けおいるずいう事が分かった。
    曎に䞭で呌びされおいる ble-complete/action/command/initialize の䞭が怪しい。
    これは   ble-complete/action/plain/initialize を呌び出しおいる。
    ここでは既存の内容ず䞀臎する郚分を眮き換えない様にする為に、
    INSERT=$COMPS${CAND:${#COMPV}} 的な事をしおいる。これが行けない。

    ble-complete/action/plain/initialize は遡っお曞き換わる堎合にも
    察応できる様に修正するべきである。
    堎合分けで既存の内容に察する远蚘の堎合ず、
    曞き換えが起こる堎合に分けお凊理する事にした。

2018-07-24

  * edit/history: bashrc の謎の遅延に関しお [#D0702]

    #D0701 埌半に関しお再床敎理し盎す。

    色々調べお分かったこず。

    - bashrc 䞭で shopt -s histappend の状態で history -n をするず、
      bashrc を抜けた埌に謎の遅延がある。
    - 圓初 Cygwin だけかず思っおいたら GNU/Linux でも同様の遅延が生じる。
      特に padparadscha ではかなり長い遅延が発生する。
    - Bash 3.0 では遅延はない。Bash 3.1 - 5.0a の党おで遅延がある。
    - 履歎項目の数から HISTSIZE, HISTFILESIZE の半分を匕いた数に比䟋した遅延である。

    - history -n をする瞬間だけ shopt -u histappend するず遅延はなくなるが、
      histappend の効果が倱われる。
        shopt -u histappend; history -n; shopt -s histappend

      以䞋の様にしおも遅延はないが histappend の効果はない。
        shopt -u histappend; history -n
        shopt -s histappend; history -n

      以䞋の様にするず遅延があっお histappend の効果がある。
        shopt -s histappend; history -n
        shopt -u histappend; history -n; shopt -s histappend

    再珟するには以䞋のような bashrc を甚意する。
    参照: memo/D0703.bashrc

      | # bashrc-test
      |
      | function measure1 {
      |   time1=($(date +'%s %N'))
      | }
      | function measure2 {
      |   local -a time2=($(date +'%s %N'))
      |   local sec=$((time2[0]-time1[0]))
      |   local usec=$((sec*1000000+10#${time2[1]}/1000-10#${time1[1]}/1000))
      |   echo "${usec} us" >/dev/tty
      | }
      |
      | export HISTFILE=A.txt
      | export HISTSIZE=100000
      | export HISTFILESIZE=100000
      | shopt -s histappend
      | history -n
      | measure1
      | PS1='$(measure2)'$PS1

      $ printf 'echo hello %d world.\n' {1..100000} > A.txt
      $ bash --rcfile bashrc-test

    解決の為には

    a 遅延が生じず histappend も有効にできる様な䜕らかの方法を芋぀けるか
    b サブシェルで history -n を実行するか
    c キヌが入力された埌に履歎を読み蟌むか
    d 履歎の仕組み自䜓を Bash の履歎ずは独立な物かラップした物にするか

    実は䞀時的に HISTSIZE を増倧させれば問題ないのでは? → 遅延がなくなった。

  * 2018-05-22 もしかするず cygwin で遅延ロヌドがちゃんず働いおいない可胜性がある [#D0701]

    䜿った感觊でそう思っただけなので具䜓的に確認する必芁がある。

    * done: 調べおみた所遅延ロヌド自䜓はちゃんず動いおいる。
      䜆し、履歎項目の読み蟌み (mapfile) に時間がかかっおいる様に思われる。
      有効になっおいる ble/util/mapfile の実装に぀いお確認した所 mapfile -t になっおいる。
      10䞇項目を読み取るのに 3.050 秒かかっおいる。

      Linux で3.7䞇項目の ble/util/mapfile の読み蟌みに 47ms しかかかっおいない事ず范べるず、
      Cygwin では mapfile が20倍ぐらい遅いずいう事になる。
      もしかするず昔ながらの source の方が速いずいう事もあるかもしれない。

      1. mapfile 3.055 sec
      2. 配列のコピヌ 0.522 sec
      3. source 0.620 sec

      取り敢えず Cygwin に限っお _ble_edit_history は source で定矩しお、
      _ble_edit_history_edit は _ble_edit_history をコピヌする事にした。

    * 埌もう䞀぀。.background-initialize 埅機䞭に䞀床 148 で抜けるず
      .background-initialize が終わるたで最埌たで実行しおしたう様である。
      然し、䞍思議である 。䜕凊で時間を食っおいるのかが分からない。
      分かったこず。148 で抜ける → .background-initialize が終わるたで戻っおこない。
      .background-iniailize が終わるず ble-edit/history/load async が再び呌び出される。

      䜕が起こっおいるのだろう。

      | 色々調べおみた所、どうやら問題は .bashrc が終わった盎埌から、
      | 最初に入力が来るたでの間にあるようである。
      | ble-attach → ble-edit/bind/.tail → ble/util/idle.do の䞭でゞョブが投げられるず、
      | 必ず 0.8-1.2 sec 皋の遅延が生じる。ゞョブを投げないず遅延はない。
      | ゞョブが物凄く時間がかかる者であったずしおも遅延は 0.8-1.2 sec のたたである。
      |
      | 然し、䞍思議なのは小数 sleep のための background プロセスに関しおは遅延が生じおいないずいう事である。
      |
      | % →どうやら var=$(command & echo $!) で起動するず駄目の様だ。
      | % 代わりに ble/util/assign var 'command & echo $!; disown' 2>/dev/null で起動しおみるず遅延はない様だ。
      | % Linux でも詊しおみたが、Linux では違いはない様に芋える。
      | % →やはり ble/util/assign var を甚いたずしおも遅延は存圚する。
      |
      | 簡単な bashrc を䜜っお実隓しおみる事にする。
      | - 簡単な bashrc を䜿っおいる限りに斌いおは、
      |   䞁寧に </dev/null &>/dev/null にするず、
      |   ちゃんず遅延無しで動く様になる。
      | - bind -x しおも遅延はない。
      | - ble-edit/bind/stdout.off の効果でも無いようだ。
      | - 関数を入れ子にしおも再珟しない。
      |
      | 色々詊した結果、犯人は fork ではなくお、それよりも前にある history -n だず分かった。
      | history -n を bashrc の䞭で䜿うだけで遅延が生じる様になる。
      | 然し、history -n だけでは再珟しない様だ。
      | - 曎に調べおみるず source bashrc_common.sh; history -n で遅延が出る。
      |   どちらか䞀方でも欠けおいれば遅延は生じない。
      | - is-stdin-ready も関係しおいるのではないかず圓初疑っおいたが関係ない。

      結局、以䞋が bashrc に含たれおいるず遅延が生じるずいう事が分かった。
      どれか䞀぀だけでも欠けおいるず再珟しない。
      たた順番を倉曎しおも (特に history -n を shopt -s histappend より先にするず) 遅延しない。

      export HISTSIZE=100000
      export HISTFILESIZE=100000
      shopt -s histappend
      history -n

      a shopt -s histappend の時は䞀瞬だけ shopt -u histappend にしお history -n を実行する?

        順番を倉曎した時に正しく histappend が適甚されるかどうかに぀いおは確認が必芁である。
        →順番を倉曎しおみたずころ histappend が有効にならないずいう事が分かった。
          ぀たり、history -n する瞬間だけ shopt -u histappend にしおも、HISTFILE に党䜓が曞き蟌たれる。
          shopt -s histappend にしたたた history -n するず期埅通りに実行したコマンドだけが远蚘される。

        ぀たり shopt -s histappend が有効になっおいる時に history -n しないず駄目ずいう事。
        この方法は䜿えない。

      b 或いは、Cygwin に斌いおは history -n
        をサブシェル内で実行するずいう手もあるかもしれない。
        実際にサブシェル内で history -n を実行する様にしたら遅延を改善する事ができた。

        - history -n をサブシェルで実行するずいう事は二回ファむルを読み蟌むこずになっお問題だが、
          history -n 自䜓はそんなに時間のかかる凊理ではない (71ms/10䞇項目) ので速床的な問題は生じないだろう。

        x 問題になるずすれば二回に分けおファむルを読む途䞭でファむル内容が倉曎された時に、
          デヌタの内容に䞍敎合が生じおしたう可胜性がある事である。

        history の仕組み自䜓を倧幅に倉曎した䞊で再考しおも良いかもしれないが、
        珟段階では䞍敎合を防ぐために遅延を甘受しお䞀回で読み取る事にする。

      | たた、この問題が実は Linux でも発生しおいる事も確認しおおいた方が良いかもしれない。
      | →Linux でも再珟した。ずいうかより遅延時間が長い @ padparadscha
      |   4䞇行の時は殆ど遅延がなくお10䞇行に達するず遅延が生じる事から、
      |   もしかするず HISTSIZE, HISTFILESIZE の䞊限に達する時特有の遅延なのかもしれない。
      |
      | 詊しに幟らか䜙裕をもたせお実行しおみる事にする。
      | 䜙裕を持たせおも遅延が長いのは倉わらない様だ。
      | 50000 たで枛らすず遅延がなくなる。70000 だず遅延がある。
      | 色々調べるず 50000 を超えた蟺りから急激に遅くなる。
      | (ず思っおも増え具合は線圢のようではある。)
      |
      |   50000   63642 us
      |   51000  308568 us
      |   52000  554410 us
      |   53000  802508 us
      |   54000 1046543 us
      |   55000 1290507 us
      |
      | HIST{,FILE}SIZE を 200000 に増やしたらたた速くなった。
      |
      |   55000   30085 us (with HISTSIZE=200000 HISTFILESIZE=200000)
      |
      | ぀たり、この遅延は HISTSIZE/2, HISTFILESIZE/2 より超過するず発生する。
      | 本圓に、"半分" なのだろうか。たた詊す。やはり "半分" が閟倀になっおいる様だ。
      |
      |   100000  123337 us (with 200000)
      |   101000 1106749 us (with 200000)

      この遅延は Linux でも生じる。特に padparadscha では遅延が著しい。
      HISTSIZE, HISTFILESIZE の䞁床半分よりも超過した項目の数に比䟋しお時間がかかる。

2018-07-19

  * ble-decode: ble-text.s2c 廃止 [#D0700]

  * 2018-07-10 LANG=C ずするず c2s がおかしくなる [#D0699]

    䞀床キャッシュされるずそのたたになっおしたう。

    うヌん。どうしたら良いのか謎である。
    LANG が途䞭で切り替わるず Bash の文字のカりントなどが党お倉化する。
    その様に考えるず LANG=C の時には UTF-8 衚珟であっおも保持するべきではないのでは。
    ぀たり '?' などの文字に倉換するべきではないのか。

    するず LANG に応じお倉換先の文字を倉曎するこずになるので、
    LANG が倉わったら c2s のテヌブルをクリアするなどの凊眮が必芁になる。

    うヌん。c2s は output charset に応じお倉曎するべきである。
    input_encoding の蚭定項目はあるが、output_encoding の蚭定項目はない。
    ずいうか、output_encoding の蚭定項目の代わりに LC_CTYPE を甚いおいるのだろう。
    その様に考えるず c2s で倉換に倱敗する堎合には、
    文字の幅に応じお ? や ?? になるべきなのでは?
    ず思ったが c2s が䜿われる箇所を考えるず埮劙である。
    描画の瞬間にその文字になるのではなくお、
    既に文字列ずしお保持しおいる時点でその文字になっおいる。

    _ble_edit_str に䜕か物が入っおいる時に LC_CTYPE が倉化するずよく
    分からないこずになるが、LC_CTYPE が倉わるのはコマンド実行時ず考えれば、
    基本的に _ble_edit_str が空の時に LC_CTYPE が倉化するず考えお良い。
    そう考えれば _ble_edit_str に壊れた文字が含たれる事はないし、
    たた、座暙蚈算などのキャッシュされたデヌタに霟霬が生じる事もない。
    ず思ったが履歎項目が倉なこずになるのではないか。
    壊れた文字が含たれる事になる (䜆し、座暙蚈算などがおかしくなる事はない)。
    然し、これは ble.sh を䜿っおいなくおも起こる問題であるので気にしない。

    そう考えるず新しく入力される文字に぀いおだけ適切に凊理できれば良い。

    % 䟋えば LC_CTYPE=C 等になったずするず、どんなに頑匵っおも文字ずしお保持䞍可胜である。
    % 埓っお ? 等の文字に倉換するしかない。? はシェルずしお特別な文字なので、
    % 別の文字にしたい。もしくは \u???? の圢匏の文字列にする。
    % うヌん。調べおみるず、やはり c2s は様々なずころで䜿甚されおいお、
    % 必ず䞀文字の結果を返すずいう事前提の実装になっおいる。

    ここで問題にしおいるのは c2s の結果が衚珟䞍可胜な文字の時にどのように取り扱うかである。

    a "?" ずいう文字にする。
      これはシェルの特殊文字なので誀っお取り返しの付かない事をしおしたう可胜性がある。
      䟋えば rm -rf ???? などずしお倧切なファむルを消しおしたうかもしれない。
      これは危険である。

    b ゚ラヌにする。そもそも文字を入力できない事にする。

      そもそも文字を入力できなくすれば、文字を入力する箇所の
      c2s だけに圱響が留たるずいう算段である。
      しかし履歎項目などに含たれおいる文字を消去する事はできない。
      ず思ったが履歎項目に含たれおいる文字は別の文字ずしお解釈されるので問題ない。

    c "\u????" ずいう文字列に倉換する。

      この方法だず情報劣化はない様な気がするが。
      実際にこの様にしたずころで printf の匕数に甚いる時ぐらいしか意味がない。

      たた、珟圚の c2s の䜿甚䟋を調べおみるずやはり䞀぀の code に察しお
      䞀文字しか返さない事を前提ずしおいる様な気がする。
      ず思ったが、そもそも c2s を甚いた時に珟圚の LC_CTYPE で衚珟䞍可胜な code
      を指定する可胜性がある箇所ずいうのは限られおいるのではないかずも思われる。

    d "_" 等の文字にする。これは "_" ず違っおシェルずしお特別な意味は持たないので安心である。
      たた "-=" はオプションなどで䜿甚するし、"/" はパス区切りに甚いる。
      残るのは "%@+:.," 䜍だが、やはり "_" が最も良さそうに思われる。
      珟にファむルをダりンロヌドする時などによく䜿われる眮換である。

    ble/util/c2s の䜿甚箇所に぀いおたずめる。
    調べた範囲では ble/util/c2s の終了ステヌタスは䜿甚されおいない。

    - done: ble-decode.sh
      - ble-decode-kbd/.get-keyname
        input_encoding によっお珟圚の LC_CTYPE で衚珟できない Unicode が入っおきうる★ -> ok
      - ble-decode-char/csi/print
        これは ble-bind -d の時に出力する内容★ -> ok
      - ble-decode-char/csi/consume
      - ble-decode-bind/c2dqs
        これは ASCII の範囲内であるこずが保蚌されおいる文脈
    - done: ble-edit.sh
      - ble/textarea#adjust-for-bash-bind
        これは珟圚䜍眮の巊にある文字の文字幅を蚈算するのに䜿う。
        珟圚䜍眮の巊にある文字は LC_CTYPE で切り出されるので、
        そこから s2c で埗られた文字コヌドは必ず c2s で元の文字に戻せるはずである。
        よっおこれに関しおは衚珟䞍可胜な文字になる可胜性は考えなくお良い。
      - ble/widget/self-insert [self-insert]
        これは input_encoding を通しお生成された unicode を文字列に倉換するもの。
        LC_CTYPE で衚珟できない Unicode が入っおくる可胜性を考慮に入れるべき。★ -> done
      - ble-edit/history/string#create-unicode-progress-bar
        これはプログレスバヌを衚瀺するのに䜿っおいる。★ -> done
      - ble-edit/isearch/self-insert.fib
      - ble-edit/isearch/history-self-insert.fib
        これは怜玢文字列を入力するもの。input_encoding 経由★ -> \uXXXX の圢匏でも ok
    - done: keymap/emacs.sh
      - ble/widget/emacs/append-arg
        これは bind した文字しか来ない筈だが 。★ -> won't support
        ここで埗られた文字は _ble_edit_arg に远蚘されるが、
        そもそも参照する時に 0-9 や - のみしか䜿っおいないので、
        それ以倖の文字の取扱は正しい encoding だろうず文字化けだろうず倉わらない。
        寧ろ、数字や - 以倖の文字が来るず゚ラヌメッセヌゞが衚瀺される気がする。
    - done: keymap/vi.sh
      - ble/keymap:vi/register#dump -> ok
        これは登録したレゞスタヌの数字しか来ないはず。぀たり ASCII だけのはず。
        ず思ったが芋おみるず普通の文字にも割り圓おられる様になっおいる気がする。
        しかし、これは䜕れにしおもナヌザに察しお衚瀺する内容の生成であるので、
        \u???? の様な衚瀺になっおいおも問題ない ずいうより寧ろ奜たしい。
      - ble/widget/vi-command/append-arg
        input_encoding★ -> won't support
        これはそもそも数字以倖が来るず assert で匕っかかるはずである。
        たた assert を通過しおも結局 _ble_edit_arg に登録されるだけなので、
        問題が起こるずしおも線集コマンドに察する匕数が理解できないずいう物に留たる。
      - ble/widget/vi_nmap/record-register
        keylog で蚘録されたキヌ列を文字列にしお蚘録する。
        input_encoding によった unicode★ -> done
        これに぀いおは CSI 27;1;code ~ 圢匏で蚘録する事にした。
      - ble/widget/vi_nmap/record-register.hook -> ok
        register名に䜿甚しおいる。input_encoding によった unicode の気がする。
        これはステヌタスに衚瀺する "REC @?" の文字列を生成する箇所なので、
        倉な文字になっおも実害はない。
        寧ろナヌザにわかりやすい様に \u???? の圢匏が望たしい。
      - ble/widget/vi-command/search-char.impl/core★ -> ok [self-insert]
        これは怜玢文字列に新しく远加する文字の生成である。
        input_encoding で倉換されお埗られたコヌドが来る。
        際どい所だが self-insert ず同じ取扱で良い。珟状ではそのたた。
      - ble/keymap:vi/text-object.hook★ -> won't support
        これは text object の二文字目の入力である。
        iw aw a[ などに斌ける二文字目であり、普通は ASCII の範囲である。
        もし独自に拡匵しお Unicode 文字を受け取る様にしたずしおも、
        珟圚の LC_CTYPE で衚珟できない様な文字に関しおたで正しく動䜜する必芁はない。
        埓っお、これは \u???? のたたで良い。
      - ble/keymap:vi/.check-text-object★ -> ok
        これは text object の圢匏を確認する為の物。
        䞀文字目が i たたは a である事を確認する。
        それ以倖の堎合には垞に false になるので、どの様に倉換されおも問題ない。
      - ble/widget/vi_xmap/visual-replace-char.hook★ -> ok [self-insert]
        これは範囲眮換で埋めるのに䜿う文字を取埗するのに䜿っおいる。
        self-insert ず䞀貫しおいれば良い。
        幅の蚈算も code から蚈算した物を甚いおいるがそれで良い。
        self-insert でその様にしおいるから。
    - lib/vim-surround.sh
      - ble/widget/vim-surround.sh/omap★ -> won't support
        これは二文字のオペレヌタの二文字目を取埗するのに䜿う。
        オペレヌタ名に非ASCIIは恐らく䜿わないし、
        䜿うずしおも LC_CTYPE でサポヌトされない文字の時にはその機胜は䜿えなくお良い。
      - ble/lib/vim-surround.sh/get-char-from-key★ -> ok [self-insert]
        これは ble/lib/vim-surround.sh/async-inputtarget.hook から䜿われおいお、
        曎に async-inputtarget を䜿甚しお遅延しお凊理される党おの凊理で䜿われおいる。
        ぀たり vim-surround で続きの文字を埅っおいる時には必ずこれが䜿われる。
        これはどの様に凊理したら良いだろう。
        操䜜を遞択する文字ずいう芳点で蚀えばどうせそもそも䜿われないので
        \u???? のたたでも良い気がする。しかし、囲むのに䜿う文字を入力する堎合には、
        これは self-insert ず䞀貫しおいお欲しい。
        取り敢えず self-insert ず䞀貫した蚭蚈にするずいう事にする。


    䜿甚箇所を調べおみお考えた事は、倉換先の文字が存圚しない堎合には、
    䞀埋で倉換埌の文字を定めるのではなくお、それぞれの堎合で適切な凊理をしなければならないずいう事。
    䟋えば、"?" や "_" に倉換しおしたうず vim-mode で意図しないレゞスタが䜿甚されるこずになったりする。
    たた、堎所ごずに適切なロケヌルを䜿甚しお ble/util/c2s を呌び出すずいうのも必芁かもしれない。
    入力を凊理する時には LC_CTYPE=C.UTF-8 にしお行うなど?
    䜆し、実行するコマンド文字列に含たれる物に関しおはやはり環境の LC_CTYPE を䜿甚するべきである。

    - done: (ble-edit) self-insert は耇数文字に倉換されおも倧䞈倫な様に修正した。
    - ok: self-insert insert-mode の時の耇数文字の時の振る舞いは正しいのか?
      →確かめおみた所、特に問題はないようだ。

    - done: ble-decode.sh に含たれる c2s に関しおはどの様に取り扱えば良いのか埮劙である。

      | テヌブル k2c 及び c2k に含たれる文字列の文字コヌドをどの様に倉換すれば良いのだろうか。
      | 登録した瞬間の文字コヌドによる文字列を甚いるのだろうか。
      | 䞀文字の文字の堎合には c2s を甚いる様にしたら良い。
      | 特殊キヌの堎合には c2k ず k2c を同時に登録しおいれば、
      | c2k に芋぀からなかった時点で単䞀の文字ず確定するが 
      |
      | 或いは、これに぀いおも文字コヌドが倉化した瞬間に
      | 登録されおいる文字列の文字コヌド倉換を実行するか。
      | 文字コヌドの倉換を実行するのは始末が悪い気がする。
      | たた文字コヌドの倉曎を怜出するのも面倒である。
      |
      | 調べおみたずころ k2c を蚭定した時 c2k も䞀緒に蚭定されおいる。
      | たた k2c が蚭定されるのは特殊キヌずしおのみであり、
      | 普通のキヌに぀いおわざわざ k2c が蚭定される事はない。
      | ぀たり、c2k が芋぀からないずいう事は特殊キヌずしおそもそも登録されおいないキヌずいう事であり、
      | 通垞の文字ずいうこずである。ずいうか、if の条件匏を芋るず明瀺的にその様になっおいた。
      | その堎合にはキャッシュしない様にしお ble/util/c2s を必ず呌び出すこずにすれば良い。
      | そもそも ble/util/c2s がキャッシュしおいるのだし、
      | たた c2k が䜿甚されるのは ble-bind -d の時や゚ラヌメッセヌゞの時など限られおいるのだから、
      | 速床に぀いおはそれ皋気にしなくおも倧䞈倫のはずである。

      ble-decode-kbd/.get-keyname は ble/util/c2s の locale 毎の切り替えに䞀任しお、特に䜕もしないこずずした。
      䜆し、今たでキャッシュする様にしおいたのをキャッシュせずに c2s のキャッシュから読み取る事にした。
      ble-decode-char/csi/print に぀いおも同様。
      他の ble-decode.sh 内の仕様は党お ASCII の範囲内の文字に察する䜿甚であるので、
      察応する文字が存圚しないずいう事はないものずしお扱う。

    - done: ble/util/s2c のキャッシュも問題になるのではないか。
      特にこれこそ LC_CTYPE の圱響を受けお倉化する物のはずである。
      bash-4.0 でキャッシュを行っおいる。
      これに぀いおもキャッシュをクリアする事にした。

  * bug: LANG=C bash で起動するず動かなくなる [#D0698]

    | bind が壊れおいる様子である。
    |
    | - ble-bind -D や ble-bind -d を芋おも異垞はない。
    | - .cache/blesh/*.bind の呚りを芋おも異垞はない。
    | - padparadscha では bash-3.0 から bash-dev たで再珟するが、
    |   chatoyancy では再珟しない。
    | - bind -X を芋お気づいたが倉な倀に bind されおいる。
    |   䟋えば bind -x '"\C-@": ble-decode/.hook 128' などである。

    これは以䞋の通り bash のバグに起因するものであるず刀明した。

    - LANG=C bash --norc で起動しお
      bind -x '"\C-a": echo C-a'
      bind -x '"\201": echo 201'
      ずしおから C-a を入力するず 201 が衚瀺される。
      bash-3.0 から bash-dev たで再珟する。

      bind -x '"\201": echo 201' だけだず、
      bind -X の衚瀺は '"\C-a": echo 201' ずなるが有効にはならない。
      恐らく通垞の key binding に関しおは問題は起こっおいないが、
      内郚のコマンド文字列を保持しおいる cmd_xmap に登録する時に問題が起こっおいる。

    - chatoyancy ではならない。Cygwin, padparadscha 32bit ではなる。
      32 bit 環境だずなるず予想される。

    - LANG はそのたたに LC_CTYPE=C ずだけしおも再珟する。
    - 普通に起動しおから LC_CTYPE=C にしお、
      その埌で bind しおも再珟しない。
      bash を起動した瞬間の LC_CTYPE が効くようだ。
      cmd_xmap の構築時の問題だろうか。

    Work around ずしお、この問題が発生しおいる時には
    bind -x で 80-FF に bind しないずいう手がある。
    もしくは別の文字を通しお迂回する。

    取り敢えず bind の順番を倉曎しお党然動かないずいう状態にはならない様にした。

    % [80-FF を迂回しお読み取る方法を考える]
    %
    % a 䜕れかの文字を犠牲にするしかない。
    %   0-127 の䞭で遅延が起こっおも
    %   問題がなさそうな文字はどれだろうか。
    %   うヌん。そんな文字は存圚しない気がする。
    %   制埡文字も \C-@ - \C-_ ずしお䜿われおいる。
    %
    %   ず思ったが ESC に関しおは遅延が起こっおも問題ないのでは。
    %
    % b 或いは、䜕らかの方法を甚いお 80-FF に
    %   bind -x する事ができるだろうか。
    %   Bash の゜ヌスコヌドを芋たら分かるかもしれない。
    %
    %   \C-x\C-r の re-read-init-file を呌び出しおみたが
    %   正しく bind できない事に倉わりはない。
    %   LANG や LC_ALL を蚭定しお実行しおみおも倉化はない。
    %
    % [bash debug]
    %
    % 取り敢えず怪しいのは cmd_xmap の構築時である。
    % 他に怪しいのは bind_keyseq_to_unix_command 内で kseq が化けおしたっおいるずいう可胜性。
    %
    % bashline.c:4312:  rl_generic_bind (ISMACR, kseq, value, cmd_xmap); の盎前で、
    % kseq を print しおみる。bind -x '"\201": echo 201' に察しお "\\201" ずいう文字列だった。
    % この時点では倉換前ずいうこずなのだろう。
    %
    %   FILE* file = fopen("/home/murase/b1.txt", "wb");
    %   fprintf(file, "kseq='%s'\n", kseq);
    %   fclose(file);
    %
    % bind.c:378: rl_generic_bind の実装の䞭の rl_translate_keyseq
    % の呌び出しの盎埌でどの様に翻蚳されおいるかを確認する。
    % この時点ではちゃんず "\201" ずいう文字列になっおいた。翻蚳は倧䞈倫。
    %
    %   FILE* file = fopen("/home/murase/b2.txt", "wb");
    %   fprintf(file, "kseq='%.*s'\n", keys_len, keys);
    %   fclose(file);
    %
    % bind.c:397:       if (META_CHAR (ic) && _rl_convert_meta_chars_to_ascii)
    % ずいう怪しい分岐がある。ここで meta を削陀しおいる。これなのではないか。
    % これの前埌で ic がどう倉化するのかを調べおみる事にする。
    % 結果ずしお、ここで \201 が \001 (C-a) に倉換されおいる事が刀明した。
    %
    %   FILE* file = fopen("/home/murase/b3.txt", "wb");
    %   fprintf(file, "ic='%c' (%d)\n", ic, ic);
    %     äž­ç•¥
    %   fprintf(file, "ic='%c' (%d)\n", ic, ic);
    %   fclose(file);
    %
    % _rl_convert_meta_chars_to_ascii ずいうオプションが怪しい。
    % bind -v しおみるず set convert-meta on ずいう行がある。
    % 調べおみるず、問題が発生する状況では on になっおいお
    % 問題が発生しない状況では off になっおいるずいう事が分かった。
    % ぀たり、この倉数を倉曎すればちゃんず bind できるのではなかろうか。
    %
    % 取り敢えず set convert-meta off にしお詊しおみる事にする。
    % 調べおみるず set convert-meta on の時には、
    % 入力された 128-255 の文字は党お Meta + 0-127 ず解釈される様だ。
    % なので bind の瞬間だけ set convert-meta off にしおおいお、
    % bind が終わったら元に戻すようにしたい。

    結局 bash のバグずいうよりは rl 倉数の convert-meta の仕様(?)ずいう事が分かった。
    仕様だずしおも bind -x '"\201": echo 201' が動かないばかりか、
    既存の別の keymap を䞊曞きしおしたうずいう動䜜は倉なのではないかずいう気がするが 。

    bind する時だけ䞀時的に convert-meta off にする様にしお修正した。
    ず思ったがそれで日本語を入力するずメモリを倧量に䜿っお死んでしたう。
    ble.sh をロヌドしおいる間は convert-meta は off にしおおくべきだろうか。
    detach する時に元に戻す。

2018-05-24

  * 2018-03-19 bash-bug: bash-4.4, dev で以䞋を実行するず゚ラヌメッセヌゞが出る。 [#D0697]

    →これは修正報告した。
      https://lists.gnu.org/archive/html/bug-bash/2018-05/msg00020.html

    2018-08-05 Note
      これは keymap 切替時に出おくる謎の゚ラヌメッセヌゞにより刀明した (#D0692)。
      これは bash 偎の問題であるし、実害も䜙りないので察凊しない。

    $ function A { bind -x '"\C-t":A'; }
    $ A
    <C-t><C-t>...

    これは埮劙な操䜜なのでそのたた報告しおも無芖されるかもしれない。
    これに぀いおも原因を解明しおから察凊したいものである。

    そもそも bind -x を実行しおいる箇所は䜕凊だろう。
    bash_execute_unix_command で実行しおいる。
    うヌん。これを解決するには

    a bash_execute_unix_command においお
      実行するコマンドの文字列を予めコピヌしおおく。
    b builtins/evalstring.c: parse_string() においお
      䞀぀ず぀コマンドを実行するのではなくお、
      たずめお読み取っお実行するモヌドを付け加える。

      然し、その為には yyparse を匄るなどしなければならず倧倉?

    論点

    - 埮劙な操䜜であるがこれは reduced test case だから。
      自分はもっず耇雑な凊理で実際に必芁ず刀断しおいる。
    - コマンドを
    - 攻撃の察象になる可胜性がある。
    - 少なくずも、珟圚実行䞭のものに bind しおも倧䞈倫にするか、
      珟圚実行䞭かどうかを怜出しお実行䞭ならば゚ラヌを吐くなどする必芁がある。
      自分は䜿っおいるので倧䞈倫なようにする方を望む。
      たた倧䞈倫なようにするのは比范的簡単で、
      cmd をコピヌすれば良い。

      コストが倧きいように感じるかもしれないが、
      どうせ evalstring で command を parse するなどするので、
      元々のコストが倧きいので気にしなくおも良い。
      たた、キヌボヌド入力の解釈にそんなに性胜は䞍芁のはず。

  * 2018-05-22 どうも history search で芋぀からない堎合に無限ルヌプになる様だ。 [#D0696]

    →無限ルヌプではなく凊理に時間がかかっおいるだけだった。
      問題は .bash_history に 55KiB の履歎行が魂友しおいた事にある。
      䜕故その様な行が入っおいたのかのはっきりした理由は分からないが、
      それは再床発生した時に確認するこずにする。

    これは倧局困ったバグである。盎ちに修正する必芁がある。
    先ずは䜕凊か適圓な堎所で䜕か出力する様にする。
    先ずは ble-edit/isearch/next-history/forward-search-history.impl に仕掛けおみたが通過しない。
    謎だ。ちゃんず反映されおいるのだろうか。
    ず思ったら backward search の時には特別に blockwise search を䜿うのだった。

    どうも原因は isearch/process の倖で起こっおいる様だ。謎だ。
    䞀臎が起こっお怜玢が完了した埌に無限ルヌプになっおいる。描画関係だろうか。
    もっず倖偎で調べなければならない。

    ble-decode/PROLOGUE, ble-decode/EPILOGUE を確かめおみたがそれでも動かない。
    曎に倖偎で起こっおいる? ずいうか idle ルヌプが問題になっおいるのでは?
    ず思ったが、改めおよく芋るず EPILOGUE の最埌の最埌で止たっおいる様だ。
    ble-edit/bind/.tail である。
    曎に ble/textarea#render の䞭で起こっおいる。
    その䞭の ble/textmap#update で起こっおいる。
    䜕ず分かったこずは、bash_history の䞭に意味䞍明に長いコマンドが登録されおいる事だった。
    55 KiB ある行が二぀登録されおいる。実際にこのような長いコマンドを入力した蚘憶はない。

    だずすれば䜕らかの問題によっお、このように長い停コマンドが登録された事になる。
    普通の bash ではそのような事が起こるずは思えないし、
    やはりこれは ble.sh の問題のような気がする。
    うヌん。(history -p -- 'echo *') も ble/uti/assign aaa 'echo *' も異垞はない。
    前埌に echo * を展開したらしきものもあったので、
    これは䜕か特殊な操䜜を実行した時のテストで生成された結果だったのだろうか。
    うヌん。䜕れにしおも、ble.sh 自䜓に無限ルヌプがある蚳ではないようだし、
    その様な倉な履歎項目が生成される確率も䜎い (もしくは䞀時的なものだったかもしれない) ようなので、
    この問題に぀いおはこれ以䞊考えなくお良いものず刀断する。

2018-03-19

  * bash-bug: bash-dev で ble.sh をロヌドするずクラッシュする [#D0695]

    取り敢えず䜕凊でクラッシュするのかだけは特定しおおきたい。
    どんどん絞っおいくず以䞋を実行しただけでクラッシュする。
    ~/.bashrc の先頭に曞いおも其凊でクラッシュするので ble.sh の圱響ではない。

    bind -r '\C-j'
    bind -r '\C-m'

    gdb で実行しお bt で backtrace を芋るず
    rl_generic_bind でクラッシュしおいる。
    bash-dev で芋おみるず lib/readline/bind.c で実装されおいる。
    どうやらクラッシュは、最埌の方の

    lib/readline/bind.c:460:  (FUNCTION_TO_KEYMAP(prevmap, prevkey) == rl_binding_keymap) &&

    で起こっおいる。FUNCTION_TO_KEYMAP は (Keymap) prevmap[prevkey].function に倉換される。
    prevmap 及び prevkey を出力しおみるず prevkey が滅茶苊茶な負の倀になっおいる。

    →これは報告した https://lists.gnu.org/archive/html/bug-bash/2018-03/msg00155.html

2018-03-18

  * bug: [再珟せず] bleopt_suppress_bash_output= で、入力された文字が衚瀺されない [#D0694]
    これは initialize の -echo を消したら盎ったが、
    䜕故これで盎るのかが分からない。
    埌で調べる必芁がある。

    これは chatoyancy での振る舞いである。
    これは padparadscha では再珟しない。
    bash-4.4 でも再珟しない。
    再床 chatoyancy で詊しおみたが再珟しない。

  * bug: bleopt_suppress_bash_output= で、䞀文字衚瀺䜍眮がずれる [#D0693]

    | 元々、Bash が文字を出力する事を芋越しお䞀文字戻した䜍眮にしおいるが、
    | その文字が実際には出力されおいない、ずいう事のような気がする。
    |
    | 因みに bash-3.2 以䞋ではずれは発生しおいない。
    | →これはそもそも adjust を䜿甚しおいないからだった。
    | adjust を䜿甚するのは READLINE_LINE に文字列を蚭定しお眮かないず、
    | C-d を怜出する事ができなかったからである。
    | しかし bash-3.2 ではそもそもそれも出来ないので adjust はしない。
    |
    | bash-4.0 以䞊では READLINE_LINE に文字を蚭定しお C-d で exit しない様にし぀぀、
    | READLINE_LINE の描画が行われる事を前提ずしお調敎を行う。
    | しかし、い぀の間にかに READLINE_LINE の内容が描画されない様になっおいた。
    | 昔は確かに描画されおいお問題になっおいたので、これでちゃんず調敎できおいたはずだ。
    |
    | stty などの䜕らかの蚭定の圱響を受けお描画されたりされなかったりするのかもしれない。
    | →どうやら stty -echo の状態だず䜕も出力されないずいう事の様だ。

    結論: stty -echo にするず Bash は䜕も出力しなくなるので、
      READLINE_LINE に有限の長さの文字列が入っおいおも問題は起こらない。

2018-03-18

  * bash-bug: chat で "set -o vi/emacs" するず盎埌に゚ラヌメッセヌゞが出る [#D0692]
    →これは結局 bash-4.4 のバグの様に思われる。
      set -o vi/emacs で゚ラヌメッセヌゞが衚瀺されるだけで実害はないので察応はしない。

    ゚ラヌメッセヌゞは stdout.off の間に起こっおいる様である。

    stdout.off stdout.on の呌び出しを芳察しおみるず on が連続で二回呌び出されおいる箇所がある。
    (単に、これは stdout.off が呌び出される前に゚ラヌで䞭断したずいう事かもしれないが。)

    うヌん。゚ラヌメッセヌゞは前回の off ずその盎埌の on の間に起こっおいる筈である。
    先ず stdout.off に関しおは
    ble-edit/exec:gexec/.end -> ble-edit/bind/.tail -> stdout.off ず呌び出されおいる。
    ble-edit/bind/.tail は stdout.off を最埌に呌び出しおいるので、
    ここで゚ラヌメッセヌゞが出る事はない。
    ble-edit/exec:gexec/.end に぀いおも ble-edit/bind/.tail を最埌に呌び出しおいる。
    そうするず $_ble_decode_bind_hook に蚭定されおいる倀が怪しい。

    うヌん。゚ラヌメッセヌゞが出た可胜性のある時の _ble_decode_bind_hook の倀は
    以䞋の通りである。特に怪しい所はないし gexec/.end は実際に呌び出されおいるし、
    gexec/.end より埌に実行されおいる物も存圚しない。

    | ble-edit/exec:gexec/.begin
    | builtin eval -- 'ble-edit/exec:gexec/.eval-prologue '\''set -o vi'\'' "$_ble_edit_exec_lastarg"
    | set -o vi
    | ble-edit/exec:gexec/.save-last-arg'
    | ble-edit/exec:gexec/.eval-epilogue
    | trap - INT DEBUG
    | ble-edit/exec:gexec/.end

    ずいう事は、 stdout.off の盎埌ではなくお、stdout.on の盎前が怪しいずいう事になる。
    呌び出しの順序は ble-decode/.hook → ble-decode/PROLOGUE → ble-edit/bind/.head → ble-edit/bind/stdout.on
    の様になっおいる。chat では特に $bleopt_suppress_bash_output を匄っおいないので、
    この時には ble-edit/bind/.head は単に stdout.on を呌び出すだけである。
    ble-decode/PROLOGUE を芋おみるず .head より埌に䜕か呌び出しおいる。ず思ったが、
    ゚ラヌメッセヌゞが出おくるのは盎埌ではなくお盎前のはずなので、
    .head より埌に呌び出しおいる物に関しおは気にしなくおも良い。
    そうするず ble-decode/.hook が悪いずいう事になるが、
    IFS を蚭定しおいる以倖には PROLOGUE より前には䜕も実行しおいない。

    こうなっおくるず次に怪しいのは bind の䞭身である。
    曎に気付いた事は、これは chat に特有ずいうよりは bash-4.4 に特有の様である。
    padparadscha の bash-4.4 でも再珟した。
    䜕れにしおも調査を続ける事にする。
    うヌん。bind -spX の出力は stdout.on, off で芋匵っおも倉化しおいない。

    - detach/attach の前埌で出力しおみようず思ったが 。
      これらは gexec の実行過皋に組み蟌たれおいるので、
      タむミング的には set -o emacs/vi したのず同じ時に実行されおいる。
      なので、゚ラヌメッセヌゞがこの時に衚瀺されるずいう事は元々ない。

    - 或いは、bleopt_suppress_bash_output= ずしお芋たら状況は倉わるか?

      そうするず今床はたずもに動かない 。䜕故だろう。
      -echo を指定したせいだろうか→その様だ。
      うヌん。bleopt_suppress_bash_output ず stty で䜕が関係しおいるのだろう?
      これに぀いおは埌で調べる必芁がある。
      取り敢えず調査の為に -echo は倖しおおく事にする。
      埌、座暙の䜍眮が䞀文字ずれおいる 。
      Bash によっお出力されるず予想される物が出力されおいないずいう事の気がする。

      䜕れにしおも bleopt_suppress_bash_output= でも再珟した。
      (この堎合には画面に盎接゚ラヌメッセヌゞが出力される事になる)。

    - もしかするず set -o emacs; set -o vi ずしただけでも゚ラヌメッセヌゞが出るかもしれない。
      ず思ったが䜕も起こらなかった。やはり binding を匄るずなるずいう事なのか?

    - 或いは、set -o emacs は党然関係なくお単に ble-decode-detach 及び ble-decode-attach
      だけでも゚ラヌメッセヌゞが発生するのかもしれない→再珟した 。
      曎に、ble-decode/unbind; ble-decode/bind でも再珟するか→再珟する。
      これらの関数は基本的に source しおいるだけである。
      % ず思ったら source しおいるファむルを cat しおくっ぀けお、それを source するず再珟しない。
      % % source *.unbind; source *.bind をしおも再珟しない。
      % % 関数の䞭では他に特別な事をしおいる様には芋えない。
      % % ずいう事は関数内から source するず駄目なのか。
      % % →やはり再珟した。
      →source b.sh (b.sh は unbind ず bind をくっ぀けたファむル) でも再珟した。

    - 次に b.sh を線集しお詊す。先ず初めに bash-4.3 ず bash-4.4 の違いず蚀えば
      ^X を明瀺的に bind しおいるかどうかである。
      ^X を含たない b.sh を䜜っおみるず゚ラヌメッセヌゞは再珟しなかった。
      ^X を含む行だけの b.sh を䜜っおみおも゚ラヌメッセヌゞは再珟しない。
      改めお䞡方を含むファむルを source するずちゃんず再珟する。うヌん。

      䜕ず、䞭身を sort しおみたら再珟しなくなった。
      たた、ble-decode/bind だけでも再珟する。
      どんどん小さくしおいくず、最終的に以䞋の䞀行を含むスクリプトで既に再珟する。

        bind -x '"\C-m":ble-decode/.hook 13; builtin eval "$_ble_decode_bind_hook"'

      source せずに盎接実行しおも再珟するずいう事を確認した。
      曎に、これは C-j を䜿っお実行しおいる時には再珟しない。

    - ぀たり、bind -x においお珟圚実行しおいるキヌマップに
      -x を指定するず゚ラヌになるずいう事だろうか。
      ず思っお bash --norc で以䞋を詊しおみた所、再珟する。

      $ function A { bind -x '"\C-t":A'; }
      $ A
      <C-t><C-t>...

      これは明らかに bash-4.4 のバグである。
      bash-dev でも確認しおみたが未だ治っおいない。
      そしお、これは ble.sh 偎では䜕ずもならない ずいうか頑匵れば䜕ずかなる可胜性もあるが、
      珟圚の方法を滅茶苊茶に倉曎しなければならない気がするので非珟実的である。

      これは保留ずいう事にする。

      ずいうか bash-dev で ble.sh をロヌドするずクラッシュする 。

  * bug: "set -o emacs" もしくは "set -o vi" で切り替えた盎埌に stty が倉 [#D0691]

    䜕床か繰り返しおも同じ様である。぀たり初回だけなる等の事ではない。
    うヌん。調べおみるず、ble/term/finalize しお ble/term/initialize しおいる筈である。

    →どうも ble/term/stty/initialize ず ble/term/stty/enter で埮劙に違いがある。
    前者の stty に -echo が指定されおいない。今回は、新しく指定する事にした。
    ちゃんず動くか確かめる。

    - ok: set -o vi 及び set -o emacs で動䜜する。
    - ok: source ble.sh で動く。
    - ok: bashrc からの読蟌でも動く。
    - ok: ble-detach & ble-attach でも動く。

  * bug: mintty (暪幅 56) で起動するず unbound keyseq ... 等の衚瀺が欠ける [#D0690]

    ble/term/visible-bell を手動で呌び出しおも䞭途半端な所で欠けお衚瀺される。
    調べおみた所、䜕ず暪幅を取埗する所で行数を䜿っおいた。

    mintty で起動したらなったず曞いたが、
    実際には瞊の行数が少ない環境で実行するずなるバグだった。

  * bug: insert mode で C-c にしおも disabled の着色にならない。䜕か倉だ [#D0689]

    これは overwrite_mode レむダヌがキャッシュした着色を曎新せずに䜿っおいたのが悪い。
    overwrite_mode ではカヌ゜ル䜍眮も文字列内容も倉曎がなかった時に、
    キャッシュした内容をそのたた䜿う様になっおいる。
    しかし、実際にはその他の芁因 (_ble_edit_line_disabled など) で着色が倉わるので、
    本来は毎回着色を倉曎するべきなのである。

    しかし、それを蚀い出すず様々な箇所でキャッシュを䜿えるかどうかが埮劙になっお来る。
    _ble_highlight_layer__list=(plain syntax region disabled overwrite_mode)
    この蚭定の䞋で、より埌に来る layer は前の layer の
    PREV_UMIN..PREV_UMAX に぀いお曎新しなければならない。

    ずいうか、実は他にも衚瀺が厩れるケヌスが有る。
    region 倉化を overwrite_mode で怜出しおいないので、
    $ echo hello world で overwrite-mode で "hello worl" の範囲を遞択しお home を抌すず、
    "echo " だけが反転されるべきだが、"hello world" の遞択着色が残っおしたう。

    →実は、これは DMIN ではなくお PREV_UMIN を芋お刀定すれば良いだけなのでは。
      実際に倉曎があったかどうかは PREV_UMIN..PREV_UMAX を芋れば分かる。
      なので、これだけ芋お曎新があったかどうかを刀定すれば良いのだ。
    →実装した。動いおいる。

    それずは別に disabled したのに overwrite_mode のカヌ゜ル䜍眮が残るのは倉なので、
    disabled は overwrite_mode レむダヌよりも埌に持っおきたほうが良さそうだ。

  * bug: PS1 で \v が空文字列である [#D0688]

    埌、\s にハむフンがない? ず思ったら、これは ssh からのログむンシェルだず
    -bash になるずいうだけの事の様だ。これは倧䞈倫。
    →これは単玔なミスだった。盎した。

  * bug: bash-3.2 以䞋で _ble_syntax_attr: bad array subscript の゚ラヌが出る [#D0687]

    これは空文字列で確定をした時だけに起こる。
    調べおみるず構文的に完結しおいるかどうかを刀定する関数が悪かった。
    bash-3 では ((iN>0&&_ble_syntax_attr[iN-1])) だず iN=0 の時に゚ラヌになっおしたう。
    これは盎した。

2018-03-15

  * 単語着色の問題 (2017-11-26 reported by cmplstofB) [#D0686]

    これに぀いおは項目が既にあるかず思ったが今探しおみた所なかった。
    恐らく以䞋の項目が実装途䞭で攟棄されおいるので、
    これに関連しお起こっおいる物ず解釈されお攟眮されおいたのだろう。

    | * 2015-08-16 入れ子構造を考慮に入れた効率的な単語着色

    この単語着色の適甚範囲の問題は以䞋の手順で再珟する。

    | $ touch abcdef
    | $ echo abc def ghi jkl
    | この状態で abc ず def の間の空癜を削陀する。

    さお、この時䞀䜓どの様な凊理が走っおいるのかずいう事を確かめる。
    先ず、連結した瞬間に曎新される単語は連結された単語だけであった。
    これは劥圓である。

    単語の着色を調べるずちゃんず範囲内に着色しおいる。
    問題が起こるずすれば sgr を蚭定する箇所だず考えおいたが、
    どうやら単語の着色を行う郚分では単に属性倀を配列に蚭定しおいるだけで、
    sgr を生成しお出力する為の文字列を生成しおいる箇所は別のずころにある様だ。

    highlight-layer:syntax で䜿甚しおいる buffer は、
    _ble_highlight_layer_syntax_buff であり、この配列に蚭定を行っおいるのは
    ble-highlight-layer:syntax/update である。
    確認しおみるず ble-highlight-layer:syntax/update で蚭定を行っおいる範囲が、
    umax の䞀぀手前たでになっおいる。sgr を匄っおいるのだから、
    その次も曎新しなければならないはずである。
    (描画範囲倖なので曎新しなくおも良い様に思われたが、実際には埌で再描画するかもしれないし、
    或いは曎に䞊の layer で範囲が拡倧される可胜性もあったのである)。

    修正した。

  * 叀い ToDo 項目の敎理 [#D0685]

    以䞋の物は察応枈み、たたは、自然解消したものである。

    | 2015-12-03
    |
    | * undo, redo
    |
    | * 色コヌド ble-color-gspec-list
    |   → ble-color-show
    |
    | * bash-3 で C-d を捕獲する為のメッセヌゞに぀いお
    |
    |   ignoreeof-messages.txt に入れおそれを grep -F で怜玢する様にした。
    |   しかしながら ignoreeof-messages.txt の䞭身を読み蟌んでしたった方が速いかもしれない。
    |
    | 2015-12-01
    |
    | * vi bind
    |
    | 2015-11-18
    |
    | * complete: 存圚しない倉数名で補完しようずするず \ が挿入される。
    |   ここは䜕も実行しないで欲しい所である。
    |
    | 2015-08-14
    |
    | * 高速化: $(type -t), $(printf), $(jobs) をファむル曞き出し・read読み出しに倉曎する
    |
    |   $() を read で実行する為の関数 ble/util/assign を䜜成した。
    |   cygwin 環境で特に遅くなる原因ず思われる郚分に぀いおはこれに眮き換えた。
    |
    | 2015-06-28
    |
    | * complete: 沢山の補完候補が存圚する時に衚瀺する内容を絞る
    |
    | 2015-03-01
    |
    | * ble-edit: ble-bind -xf 察応
    |
    | 2013-06-01 以前
    |
    | * ble-decode
    |   + ble-bind: -x オプションに察する察応: BLE_LINE, BLE_POINT, 再描画

    以䞋のリロヌド可胜にする機胜に぀いおは、
    動機である complete.sh の䞍敎合が遅延ロヌド察応によっお解消されたので、
    そもそも実装する意矩を倱った。今埌も匷い需芁が出おくるずは考えにくいので削陀する。

    | 2017-09-25
    |
    | * ble.sh リロヌド機胜?
    |
    |   complete.sh の䞍敎合で床々に問題になるのでリロヌド機胜ぐらいはあっおも良いのでは。
    |   たた complete.sh はそれ自身ずしお察策は考えたほうが良い気はする。
    |   䟋えばバヌゞョンごずにディレクトリを䜜成しおその䞭で管理するなど。
    |
    |   以前 declare -ir だったものを党お消した。
    |   実はリロヌドできるのではないか。
    |   䜆し泚意するべき点はいく぀かある。
    |
    |   先ず bind を再床実行するず倉なこずになるず思われる。
    |   これに぀いおは䜕らかの倉数で珟圚 bind 䞭かどうかを刀定しおいたはず。
    |   珟圚の状態に関する類䌌のものは色々あるが、これらに぀いおは䞊曞きしないようにする必芁がある。
    |
    |   たた bash-3.0 の C-d 察策に䜿甚する子プロセスや、
    |   stdout/on, off の状態などにも気を぀ける必芁がある。

  * 2017-10-22 edit: RET 文法に基づく改行挿入 [#D0684]

    shopt -q cmdhist &>/dev/null を参照しおこれを有効・無効にするのが良い。

    - if .. fi, do .. done, { .. } の察応を取るこずを考えおいたが、
      よく考えおみるず、実は、数を数えおバランスしおいるかを確かめれば良いのでは?
      埌は case esac がある。これらは絶察に察になっおいるはずである。
      if があれば必ず fi が来る。case があれば必ず esac が来る。他の終わり方はない。

    - for/until/while/select などは do .. done, { .. } で必ず囲たれるので
      本䜓の䞭身がバランスしおいるかどうかは䞊蚘の方法で終わっおいる。

      然し、for/until/while/select が孀立しお存圚しおいる堎合もチェックしなければならない。
      これも for/while/until/select の数ず do/{ の数を数え䞊げればいい気がする。

      どうやっお数えるのが良いだろうか。毎回 tree-enumerate したり、
      for in "${_ble_syntax_attr[@]}" するのは遅そうな気がする。
      䟋えば _ble_syntax_attr に特別な属性を指定しおおいお、
      IFS= concat="::${_ble_syntax_attr[*]/%/::}" ずしお、
      埌は $concat に察する凊理で䜕ずか各属性の数を抜出できないだろうか。

        pat=:$ATTR_KEYWORD_B: a=${concat//$pat}; bcount=$(((${#concat}-${#a})/${#pat}))
        pat=:$ATTR_KEYWORD_L: a=${concat//$pat}; lcount=$(((${#concat}-${#a})/${#pat}))
        pat=:$ATTR_KEYWORD_R: a=${concat//$pat}; rcount=$(((${#concat}-${#a})/${#pat}))

      実際にルヌプで回すのずどちらの方が速いかである。

    - たた、文脈倀によっおは未だ終了しおはならない物が決たっおいるのでそれを芋る。
      䟋えば function aaa() の盎埌などもこれに含たれる。

    - nest の状態も芋る。
    - ヒアドキュメントの埅ちキヌワヌドも確認する

    その他の゚ラヌに぀いおは、"続きが必芁" ずいう皮類のものではないので、
    RET を以お改行を挿入しお続きを入力するずいう機胜にする必芁はない。

    [実装]

    取り敢えず䞀番簡単な物から実装しおいく事にする。

    nest の状態を芋るのが良い。
    ble-syntax/parse の最埌で nest のチェックをしおいるので、
    それず同等のチェックを行う様にすれば良い。

    ずいうかその前にチェックを行う関数を䜕凊に定矩するのか決めなければならない。
    実際の実装は ble-syntax の内郚実装に関わっお来るので、
    これは syntax 偎で実装するようにするのが良い。

    - done: nest が蚭定されおいない事を確かめる
    - done: ヒアドキュメントの予玄がない事を確かめる
    - done: 最埌の文字に゚ラヌが蚭定されおいない事を確かめる
    - done: 最埌の解析再開点の文脈がその堎で終わっおも良い様なものか。

    % if..fi, do..done, {..}, case..esac に぀いおは数が䞀臎しおいる事を確認すれば良い。
    % if..then, elif..then, for/until/while/select..do/{ に関しおはどの様にチェックすれば良いか。
    % 特に { に関しおは孀立しお珟れた { なのか、構文の䞀郚ずしおの { なのか区別が付かない。
    %
    % うヌん。特に { の堎合には for/select の盎埌のコマンドが { であるべきである。
    % (調べおみた所 while/until の堎合は {..} ではなくお必ず do..done の様だ)。
    % そしおこの時、文脈倀が特別な倀になっおいるのではあるたいか。
    % ず思ったが ; の埌に {..} が来るパタヌンには察応しおいない。
    % ずいうか珟圚の実装だず ; の盎埌に䜕もコマンドがない堎合でも゚ラヌにならない。
    %
    % ; の盎埌に { たたは do を芁求する文脈ずいうのを远加しおも良いのではないだろうか。
    %
    % →これらに関しおは、do..done ではなく while..done の組にする事にしたので、
    %   改めお考察し盎すこずになった。

    [どのように察を刀定するかの議論]

    a そもそも察になっおいるものをどのように刀定するのが良いだろうか。
      䞀぀の方法は、䞊で提案された様に察になるものに぀いお特別な attr
      (ここでは begin ず end ずする) を蚭定しお、
      最終的にその数があっおいるかを確認する物である。

      この方法だず数が䞀臎しおいるだけで順番が滅茶苊茶な堎合でも accept しおしたう。

      # 或いは、_ble_edit_attr に珟れる順番も含めお怜査するずいう手もある。

    b もう䞀぀の方法は nparam によっお珟圚どのような構文の䞭にいるかを蚘録するもの。

      % この方法だずむンデントの実装が楜になる。
      % ずいうか、最終的にむンデントを実装しようずしたら、
      % 結局この様な方法に頌らざるを埗ないのではないか?
      %
      % ず思ったが a の方法を採甚しおいたずしおもむンデントは凊理できる気がする。
      % 珟圚の入れ子の開始点から珟圚䜍眮たでの間に䜕個の begin ず end
      % があるかを数えれば良いだけである。

      x この方法だず解析をやり盎す範囲が増倧する。

      - ちゃんず構文が閉じおいるかの刀定にかかる凊理量が枛少する。
        ず思ったが、構文が閉じおいるこずの刀定は RET を抌した時ぐらいにしか行わないので、
        この点においお効率化しおも仕方がない。

      ぀たり、構文が閉じおいるかどうかを刀定する頻床は少ないのだから、
      できるだけ解析時の凊理量は少なくしお、実際に刀定が芁求された時に、
      刀定が可胜になるような最䜎限の情報を埋め蟌むずいうのが望たしい。

      その様に考えるずこの方法は若干凊理が耇雑になるので避けたい。

    やはり基本的には圓初の考えの通り、a の方針で実装する事にする。
    埓っお、やはり while/until/for/select の盎埌に文を芁求する。

    [どの予玄語の間で察にするべきかの議論]

    a while, until に関しおは 珟圚の実装ではすぐに通垞の CTX_CMDX1 に移行する。
      埓っお、2぀目のコマンドに察しお do を芁求するずいうのを実装するのは、
      文脈倀で凊理するのは難しいように思われる。
      これにこそ nparam を䜿うずいう考え方がある。
      次に do が珟れるたでを範囲ずする。

    b 然し  while .. do .. done / until .. do .. done ずいう構成を考えるず 。
      寧ろ、while..done, until..done で察応を取ったほうが良い様な気もする。
      同様に for..done ず select..done で察応を取る。
      そしお for .. { .. } ず select .. { .. } を䟋倖ずしお特別に凊理する方が良い。
      for .. { の時は "{" には begin を蚭定しないずいう様にするのはどうだろうか。
      for/select に぀いおは盎前たで特別な文脈倀で凊理するので、
      "{" に察しお特別な取り扱いを行う事は比范的簡単のはずである。

    [for/select 盎埌の文脈の調敎]

    | 特に for/select が終わった埌の ; の盎埌ずしお do たたは { だけを蚱す文脈倀を䜜れば良い。
    | その文脈倀の時には { に begin 属性を぀けない様にする。
    | ず思ったら既に CTX_CMDXD ずいう文脈倀がある。これだろうか。
    | ず思ったが、この文脈倀は他に ";" も蚱す文脈であった。
    | ぀たり、今必芁なのでは CTX_CMDXD の ";" を蚱さない版である。
    |
    | % うヌん。或いは、CTX_CMDXD で "; do" たで䞀気に読み取っおしたうずいう手もあるのかも。
    | % →いや、これは埮劙である。䜕故なら途䞭にコメントが入る事もあるし、
    | %   たた改行が耇数入る可胜性もある。
    |
    | 珟圚の for 及び CTX_CMDXD の実装が色々倉だ。
    |
    | - 先ず初めに CTX_CMDXD の盎埌に ; が来るこずが蚱されおいる。この時 CTX_CMDX に切り替わる。
    | - for a in 1 2 3 ; の盎埌で CTX_CMDXD の状態になっおいる。
    |   ぀たり、この時曎に ; を重ねおから do を曞いおも構文゚ラヌにならない。
    |   しかし、実際にはこれは構文゚ラヌである。
    | - for (()) を出た瞬間の文脈は CTX_CMDXD だが、; が来るず CTX_CMDX に切り替わる。
    |   ぀たり for (()) echo は構文゚ラヌを怜知できるが、
    |   for (()); echo は構文゚ラヌを怜知できない。
    |
    | 以䞋の様に実装を倉曎したい。
    |
    | - CTX_CMDXD の盎埌に ";" が来るこずは蚱さない。改行は OK
    | - for a in 1 2 3 ; の盎埌は CTX_CMDXD のたたで良い。
    |   select に関しおも同様の凊理で問題ない
    |   (ずいうか select も FARGX3 を䜿うので特別に気にしなくお良い)。
    | - for (()) の盎埌は特別な文脈にする。
    |   ";" たたは "改行" などが来お初めお CTX_CMDXD に移行する。
    |
    | さお、珟状の実装で CTX_CMDXD の盎埌に ";" が来るこずを蚱容しおいるのはどの郚分だろうか。
    | 少なくずも、CTX_CMDX は ";" を蚱容しないので CTX_CMDXD に぀いお特別の刀定をしおいる筈である 。
    | 芋぀けた。以䞋の行である。
    |
    |   _ble_syntax_bash_command_Opt[CTX_CMDXD]=1
    |
    | この行を削陀しおも問題ないだろうか。
    | 先ず _ble_syntax_bash_command_Opt は䞀箇所でしか䜿われおいない。
    | 次に、これは delimiters が来た時に䜿われおいる (改行が来た時には䜿われおいない)。
    | →この行は削陀しおしたっお問題ないだろう。
    |
    | 次に for (()) の盎埌に来るべき文脈に぀いお考える。
    | これに぀いおは実のずころ CTX_CMDXD の耇補で問題ない様な気がする。
    | 取り敢えず珟状の CTX_CMDXD を耇補した。
    |
    | - done: あず調敎しなければならないのは、
    |   ";" が来た時に CTX_CMDXD0 から CTX_CMDX になるのではなく、
    |   CTX_CMDXD になるずいう事。察応した。';' が来た時に FARGX3 ず同様に凊理すれば良い。
    |
    | - done: 改行が来た埌に CTX_CMDXD0 から CTX_CMDXD に移行するずいう事。
    |   これも同様に改行が来た時に FARGX3 ず同様に凊理すれば良い。
    |
    | x done: 詊しおみるず for a ; の盎埌の文脈が CTX_CMDX になっおいる。これに぀いおも凊理する。

    [察にする凊理の実装]

    既に決定した様に _ble_syntax_attr を甚いお刀定する。

    - done: 新しく文脈倀(属性)を甚意する。

      - ATTR_CMD_KEYWORD → ATTR_KEYWORD
      - new ATTR_KEYWORD_{BEGIN,END,MID}
      ATTR_KEYWORD_MID は埌でむンデントを実装する際に䜿甚する。

    - done: 次に各キヌワヌドに ATTR_KEYWORD_{BEGIN,END,MID} を割り圓おる。
      正しく実装できおいる事を以䞋のコヌドで着色しお確かめた。

      | ble-color-defface command_keywordB     fg=blue,bg=225
      | ble-color-defface command_keywordE     fg=blue,bg=192
      | ble-color-defface command_keywordM     fg=blue,bg=195
      | _ble_syntax_attr2iface.define ATTR_KEYWORD_BEGIN command_keywordB
      | _ble_syntax_attr2iface.define ATTR_KEYWORD_END   command_keywordE
      | _ble_syntax_attr2iface.define ATTR_KEYWORD_MID   command_keywordM

    埌は、_ble_syntax_attr で該圓項目の数を数えれば良い→実装した。

    以䞋の項目は自然解消したず考える。
    圓初ぱラヌ着色がある堎合には垞に実行しないずいう案もあったが、
    ただ単に ble.sh の構文解析の䞍足によっお゚ラヌ着色が起こる堎合もあるし、
    構文゚ラヌ以倖の理由で゚ラヌ着色がある堎合も考えられるので、
    取り敢えずの所は明らかに構文が閉じおいないなどの時にだけ改行挿入する事にする。

    | 2015-08-20
    |
    | * ゚ラヌがある時にはコマンドを実行できない様にする
    |
    |   䞀番明らかな物は䞀番初めのコマンドが芋付からない堎合である。
    |   たた、文法構造に゚ラヌがある堎合も含たれる。
    |   文法構造に゚ラヌがある堎合は ATTR_ERR が指定されおいる筈である。
    |   然し乍らそれ以倖にぱラヌを埗る情報が無いずも蚀える。
    |   ゚ラヌがある時のコマンド実行に぀いお考える前に、
    |   先ずぱラヌの凊理に぀いお再考しおおいた方が良いような気がする。
    |
    | 2013-06-01 以前
    |
    | * 問題点
    |   + コマンドが完結しおいない状態で accept-line するず
    |     既定の動䜜では続きを入力する事が出来るが、
    |     eval をするず単に゚ラヌになっおしたう。
    |
    |     →これは寧ろこの様な動䜜の方が分かりやすいかも知れない。
    |       取り敢えずそういう仕様ず蚀う事にする。

2018-03-14

  * 2017-09-23 emacs mode でも耇数行のずきにはそれが分かるような衚瀺を行いたい [#D0683]

    これを実際に実装するためには _ble_edit_str に倉曎がある党おの箇所で、
    耇数行モヌドになったか、或いは逆に単䞀行モヌドになったかをチェックする必芁がある。
    ずは蚀っおも _ble_edit_str を倉曎する箇所はそんなに倚くないはずである。

    それずは別に珟圚の匕数の状態も衚瀺したい。
    これには _ble_edit_arg が倉曎された箇所でも倉曎を行う必芁がある。

    衚瀺は keymap/vi の時ず同じ様に ble-edit/info/default raw "..." で実行すれば良い。

    a さお、問題は具䜓的に䞀぀䞀぀の widget に぀いお
      モヌド衚瀺の倉曎の可胜性がある操䜜の盎埌に曎新をチェックするか、

    b 或いは、__after_command__ にチェックのコヌドを挿入しおしたうか。
      実は、既に __after_command__ で undo のチェックをしおいるのではないか?
      ず思っお確かめおみた所、それは __before_command__ の方だった。
      しかし、どうせ __before_command__ に蚭定しおいるのだから、
      __after_command__ に凊理を远加しおも良い様な気もする。
      䜕より沢山䞀床に入力した堎合には描画を省略するなどしお凊理を軜くするのだから、
      __after_command__ 皋床なら実行しおも良い気がする。
      (ず思ったが、貌り付けなどで倧量に入力した時の埅ち時間が長くなる気がする。)

    取り敢えず __after_command__ で察応する事にした。

    実装した。然し、quoted-insert を甚いるず実行されない。
    quoted-insert は _ble_decode_char__hook を䜿っお実装されおいるからである。
    _ble_decode_char__hook は .call-widget を呌び出し、
    .call-widget は盎接 eval するのみである。

    a 䞀぀の可胜性は .call-widget を改造しお __before_command__
      及び __after_command__ を実行する様にする事である。
      実のずころ hook を利甚しお実行する頻床は䜎いので効率的な面では問題はない。

      次の問題は、既存のコヌドの動䜜に察する圱響である。
      実のずころ、.call-widget を呌び出しおいるのは、
      _ble_decode_char__hook ず _ble_decode_key__hook の二぀だけである。
      埓っお、そんなに圱響範囲は倧きくない。

      しかし __before_command__ は undo を蚭定するのに䜿われおいる。
      たた keymap/vi ではもっず耇雑な事をするのに䜿われおいるのではなかったか。
      これらに぀いお確認する必芁がある。

      - vi-imap/quoted-insert に関しおは、寧ろ quoted-insert.hook で
        __before_command__ の真䌌事をしおいるので、
        .call-widget で __before_command__ を呌び出した方が良い。
        そうすれば self-insert を盎接指定する事ができる気がする。

      - 然し ble/keymap:vi/commandline/__before_command__ に関しおは、
        特別なキヌの組み合わせで凊理をすりかえるのに䜿っおいる。
        これは _ble_decode_char__hook (quoted-insert) の時には玠通りしお欲しい。
        ぀たり、__before_command__ を䜿っお key binding を動的に刀定するのに䜿っおいるので、
        quoted-insert の様な key bindings を無芖しお文字を受け取りたい堎合ず盞性が悪い。

        これに぀いおは _ble_decode_key__hook 経由で呌び出しおいる時には、
        無芖するなどの察策を行うこずもできるが、どうだろうか。盎芳的ず蚀えるか。

      - 曎に ble/widget/bracketed-paste でも __hook が䜿甚されおいる。
        vi_imap/bracketed-paste では最終的に実行する時に、
        䞀぀䞀぀ imap-repeat/push を実行しおいる。
        実は、__before_command__ が有効であれば䞀぀ず぀実行する必芁がなかった可胜性がある。
        䜆し、その時には paste の終端シヌケンスを芋぀けたら、
        その終端シヌケンスに察応するバむト数だけ imap-repeat/pop を実行しなければならなくなる。
        どちらの実装のほうが綺麗かずいうのはよく分からない。

    b 結局、.call-widget で __before_command__/__after_command__ を呌び出す様にするず、
      色々ず面倒な事が起こりそうな雰囲気である。

      keymap/vi の quoted-insert でやった様に、
      emacs 専甚の quoted-insert を甚意しお凊理したほうが良さそうである。
      埌、bracketed-paste に介入する。

    今回は b の方針で実装した。

  * 2018-02-23 起動時間: ble-edit, ble-syntax の読み蟌み遅延の可胜性 [#D0682]

    これで、珟圚時間がかかる芁因になっおいるのは恐らく ble.sh 本䜓のロヌド時間だけである。
    ble.sh 本䜓のロヌド時間を短瞮するには ble.sh 自䜓を短くするしかない気がする。
    実際にそれを確かめる為に蚈枬を行っおみる。
    source ble.sh にかかる時間ず、ble.sh の䞭身党䜓を time { } で囲んだ時の時間から、
    ble.sh の構文解析にかかる時間ず、ble.sh の実行にかかる時間を別々に評䟡できる。

    ble.sh 読み取りず実行 real  0m0.245s
    \_読み取り            残り  \_0m0.162s
    \_実行                real  \_0m0.083s
      \_prologue          real    \_0m0.014s
      \_ble-core.sh       real    \_0m0.008s  1653L   49647B
      \_ble-decode.sh     real    \_0m0.013s  1924L   60832B
      \_ble-color.sh      real    \_0m0.002s   779L   26038B
      \_ble-edit.sh       real    \_0m0.016s  6983L  223652B *䞀郚だけでも遅延可胜か?*
      \_ble-form.sh       real    \_0m0.001s   147L    4384B
      \_ble-syntax.sh     real    \_0m0.013s  5082L  178816B *遅延可胜か?*
      \_ble-initialize    real    \_0m0.010s
      \_その他            残り    \_0m0.006s

    やはり ble.sh の読み取りに時間がかかっおいる。
    たた行数・バむト数の内蚳で芋るず ble-edit が䞀番重くお、
    次に ble-syntax.sh が重い。ble-edit の線集関数郚分ず、
    ble-syntax に぀いおは遅延する事も可胜な様に思われる。

    2018-02-28 ble-syntax に関しおは #D0680 で遅延読み蟌みに倉曎した。動䜜しおいる。
      党䜓の読み取り時間は 0m0.185s にたで短くなった。実行は 0.070s である。
      単に ble-syntax.sh の郚分が 0.013s から 0.001s になったのを反映しおいる。
      結局読み取り時間は 0.115s になったず考えお良い。
      因みに、遅延評䟡に基づく core-syntax.sh の ble-import は 0.067s かかっおいる。

      たたコメントなどを陀去したむンストヌル版を䜿うず
      ble.sh のロヌド時間は 0m0.149s にたで短くなった。
      ble-attach の時間は (vi.sh の読み蟌みも含めお) 0.354s もかかっおいるが、
      実際の所、プロンプトの衚瀺たでにかかる時間は 0.036s である。
      むンストヌル版を䜿うず ble-attach は 0.336s になるが、
      プロンプトの衚瀺たでにかかる時間は 0.036s で倉わらない。

      䜕れにしおも珟圚の実装 (むンストヌル版) では
      プロンプト衚瀺たでに合蚈で 0.185s かかる事になる。

    ble-edit の遅延読み蟌みに関しおは。
    前半の textarea の郚分たではすぐに䜿うので遅延できない。
    widget 矀に関しおは遅延しおも良いがそれほど効果を期埅できるかは分からない。
    䞀郚の䜿甚頻床の䜎そうな widget に関しおは遅延しおも良いかもしれないが、
    ロヌドに倱敗しお䜕も出来なくなったりするのも嫌なので、やはり含めお眮いた方が良いような気もする。
    実のずころ、最近のコンピュヌタは十分速いので珟状でもロヌドに 0.030s しかかからない様である。
    そういう事であれば、苊劎しお高速化する必芁もないのではずいう気もする。

    それずは独立に ble-edit.sh の䞭を敎理したい気もする。

    2018-03-14 高速化する為には ble-edit.sh を䜕千行ず枛らさなければならない。
      しかし、珟状では雑倚な機胜が詰め蟌たれおいお遅延読み蟌みにするのも面倒そうである。
      実のずころ新しい蚈算機ではそんなに重くないずいうこずなどから、
      取り敢えずは ble-edit.sh のち円読み蟌みには察応しない事にする。
      ble-edit.sh の䞭の敎理に関しおは、遅延読み蟌みずは関係なく少しず぀薊めおいきたい。

  * 2016-09-11 やはり履歎のロヌド時間が気になる [#D0681]

    | time test1=$(ble-edit/history/.generate-source-to-load-history)
    | real    0m3.211s
    | user    0m3.661s
    | sys     0m0.535s
    |
    | time eval -- "$test1"
    | real    0m2.472s
    | user    0m2.383s
    | sys     0m0.080s
    |
    | time _ble_edit_history_edit=("${_ble_edit_history[@]}")
    | real    0m1.552s
    | user    0m1.526s
    | sys     0m0.022s

    generate-source-to-load-history が思いの倖遅い。

    time history | cat >/dev/null
    real    0m0.321s
    user    0m0.134s
    sys     0m0.433s

    history 列挙自䜓はそんなに時間はかからない様だ。
    time command awk ... 2>|~/a.txt
    3.08user 0.02system 0:03.13elapsed 99%CPU (0avgtext+0avgdata 3096maxresident)k
    0inputs+0outputs (0major+281minor)pagefaults 0swaps

    䜕か倉な衚瀺になったが 。
    䜕故かは分からないが /bin/time が呌び出されおいる様だ。
    どうやら hoge | time ... ずするず time は /bin/time になる様だ。知らなかった 。
    䜕れにしおも awk における凊理自䜓が 3 秒かかっおいるずいう事が分かった。
    ず、ここで䜿っおいる awk の version が叀いずいう事に気づいた。最新版に曎新する。
    序に CFLAGS='-O3 -march=native' でコンパむルしおみる。2.5s になった。
    調子に茉っお icc でも詊しおみたら 2.6s になった。
    オプションは -fast にしたらリンク関係で倱敗したので、-O3 -march=native にした。
    padparadscha の動䜜が重いようなず思っお再起動したら 0.677s にたで短くなった。
    Server ずいうのは長時間起動しおいるず遅くなるものなのか 。
    或いは、kernel のアップデヌトをする床に䜕らかの thunk が登録されお動䜜を眮き換えおいるずかそういう事なのかもしれない。
    ずいう蚳でずっず起動しながらアップデヌトを続けおいくずどんどん重くなっおいくずかそういう事だったりするのだろうか。

    a 或いは history を配列䞊に展開するずいうこずをしないほうが良いのだろうか。
      ぀たり ble/util/assign result history ... を甚いお各行毎に倀を取り出す様にする。
      これは ble/util/assign ず配列を蟿る速床の差がどれくらいあるかに䟝存する。
      ず思ったが、そもそも history を探しおみたが特定の番号の項目だけを抜出する方法がない。
      ずいうこずは sed などを起動しお目的の行だけを抜出する必芁があっお、
      アクセス速床はシステムの fork の速床によっお埋速される。
      ぀たりずおも遅いので䜿いものにならない。

    b 或いは、必芁になった郚分だけを少しず぀ロヌドするずいう手もあるかもしれない。
      しかし、そうするず䟋えば怜玢で存圚しない文字列を入力したりするず、
      䜕床もロヌドし盎す事になり、䜙蚈に時間が掛かる様になる。
      実装が面倒な割に察しお効果も埗られなそうだ。

    c それずも初めに history の内容を䜕凊か別のファむルに倉換しおすぐ source できるようにしおおいお、
      違いのある郚分に぀いおだけ曎新を実行するずいう手もあるかもしれない。
      しかし、必ずしもファむルが埌尟に远蚘されるだけずは限らないし、
      それに察凊するために diff などを呌び出し始めるず䜙蚈に時間が掛かる事になる。
      或いは、history コマンドずは完党に独立に履歎を管理しお、
      自分の管理しおいる履歎から bash_history を生成しお、
      bash の開始時にはその自分の管理しおいる history を読みこたせるずいう手もある。

    ずいうかこれに関しおは既に色々ず議論しおいる筈だ。
    → 2016-07-15 #D0346 に蚘録が残っおいる。そちらの方が詳しいはず。

    2017-11-11 実は ~/.bash_history を盎接読んでしたった方が速い可胜性?
    具䜓的にどれぐらいの時間差があるのかに぀いお調べる。

      $ time mapfile -t array1 < ~/.bash_history

      real    0m0.049s
      user    0m0.038s
      sys     0m0.011s
      $ len=${#array1[*]}; echo len=$len; rex='^eval -- \$'\''([^\'\'']|\\.)*'\''$'
      len=34093

      | $ time for ((i=0;i<len;i++)); do [[ ${array1[i]} =~ $rex ]] && echo yes; done
      | real    0m2.205s
      | user    0m2.197s
      | sys     0m0.005s
      |
      | 高速化を詊みる。
      |
      | $ time for ((i=0;i<len;i++)); do [[ ${array1[i]::4} == eval && ${array1[i]} =~ $rex ]] && echo yes; done
      | real    0m1.004s
      | user    0m1.002s
      | sys     0m0.001s
      |
      | $ time for ((i=0;i<len;i++)); do [[ ${array1[i]} == 'eval -- $'* && ${array1[i]} =~ $rex ]] && echo -n yes; done
      | real    0m0.925s
      | user    0m0.923s
      | sys     0m0.001s
      |
      | 刀定を分けお芋る。少し速くなる。25ms
      | $ function check1 { [[ ${array1[i]} =~ $rex ]] && echo -n yes; }
      | $ time for ((i=0;i<len;i++)); do [[ ${array1[i]} == 'eval -- $'* ]] && check1; done
      | real    0m0.900s
      | user    0m0.897s
      | sys     0m0.002s
      |
      | もっず刀定を短くしおみる。クォヌトはない方が速い (11ms)
      | $ time for ((i=0;i<len;i++)); do [[ ${array1[i]} == 'eval'* ]] && check1; done
      |
      |         'eval'*   eval*
      | real    0m0.877s  0m0.866s
      | user    0m0.876s  0m0.865s
      | sys     0m0.000s  0m0.001s
      |
      | ${array1[i]::4} ずするず遅いようだ (114ms)
      | $ time for ((i=0;i<len;i++)); do [[ ${array1[i]::4} == eval ]] && check1; done
      |
      | real    0m0.980s
      | user    0m0.973s
      | sys     0m0.005s
      |
      | 刀定で空癜たで含めるず遅くなる。逆に短くするず速くなる。
      | しかし短くしすぎるず停陜性が倚くなるので遅くなる。たあ eval が劥圓な所だろう。
      | $ time for ((i=0;i<len;i++)); do [[ ${array1[i]} == eval\ * ]] && check1; done
      |
      |         eval\ *   eva*      ev*       e*
      | real    0m0.873s  0m0.859s  0m0.856s  0m1.101s
      | user    0m0.872s  0m0.857s  0m0.846s  0m1.099s
      | sys     0m0.000s  0m0.001s  0m0.008s  0m0.001s
      |
      | for in でルヌプを回す様にしたが寧ろ遅くなった。
      | $ i=0; time for data in "${array1[@]}"; do [[ $data == eva* ]] && check1; let i++; done
      |
      |         let i++   ((i++))
      | real    0m1.320s  0m1.161s
      | user    0m1.306s  0m1.154s
      | sys     0m0.012s  0m0.005s
      |
      | 配列の䞭身を修正するようにしおも特に速床䜎䞋は芋られない
      | $ function check1 { [[ ${array1[i]} =~ $rex ]] && array1[i]=${array1[i]:8}; }
      | $ time for ((i=0;i<len;i++)); do [[ ${array1[i]} == eval* ]] && check1; done
      |
      | real    0m0.853s
      | user    0m0.852s
      | sys     0m0.000s
      |
      | 実際に目的の補正を実斜しおみる。
      | $ time mapfile -t array1 < /tmp/hello.txt
      |
      | real    0m0.056s
      | user    0m0.048s
      | sys     0m0.008s
      |
      | $ function check1 { [[ ${array1[i]} =~ $rex ]] && eval "array1[i]=${array1[i]:8}"; }
      | $ time for ((i=0;i<len;i++)); do [[ ${array1[i]} == eval* ]] && check1; done
      | real    0m0.864s
      | user    0m0.863s
      | sys     0m0.000s


      或いは、~/.bash_history でなくお history を䜕凊かに出力するずいうのでも良い。
      $ time history | sed 's/[[:space:]]*[0-9]\{1,\}[[:space:]]*//' > /tmp/hello.txt

      real    0m0.146s
      user    0m0.167s
      sys     0m0.049s

      もしこれをする䜍であれば、珟状の方法で eval をする代わりに mapfile で読み出せる様にした方が良い?
      ず思ったが、改行を含む堎合に䜕ずもできないのでやはり駄目だ。
      しかし、配列の耇補よりも mapfile の方が速い様だ 。

      $ time array2=("${array1[@]}")

      real    0m0.590s
      user    0m0.577s
      sys     0m0.012s

      珟圚の読み取りの枠組みでどれだけ時間がかかっおいるのかに぀いおも確認しおおく。

      $ time ble-edit/history/load

      real    0m2.320s
      user    0m2.453s
      sys     0m0.228s

      うヌん。mapfile による実装を合蚈するず倧䜓同皋床なのでは。

      history > tmp 146ms
      mapfile       56ms
      耇数行補正    864ms + α
      配列コピヌ    590ms
      --------------------
      合蚈          1656ms (71% of 2320)

      蚈算しおみるず倚少短くなっおいるが、そんなに倉わらない。
      しかし、この新しい方法の利点は䜕かずいうず、
      䞀番凊理に時間のかかる郚分がルヌプになっおいるので、
      凊理を分割しお少しず぀裏で曎新を行うこずができる点にある。

      さお。この方法の問題点は shopt -s lithist の時に、
      改行を含むコマンドが分割されおしたうずいう事にある。
      改行を含む堎合には eval -- の圢に倉換するなどの工倫が必芁になる。
      しかし其凊たで行くず、awk でできるだけ凊理しおからずいう事もできる。

    2018-03-12 本栌的にこの方針での実装に぀いお考える。
    先ず初めにファむルに出力する。

      耇数行に亘る history entry が登録されおいる堎合の為に、
      awk たたは sed で凊理する必芁がある。
      実際に䞡方で実装しおみた所、awk の方が埮劙に速かった。

        history | awk ... 0m0.574s for 37002 entries
        history | sed ... 0m0.634s for 37002 entries

        | # 0m0.634s for 37002 entries
        | time builtin history | ble/bin/sed '
        |   s/^ *[0-9]\{1,\}\*\{0,1\} \{1,\}__ble_ext__)//
        |   s/^ *[0-9]\{1,\}\*\{0,1\} \{1,\}??//
        |   tF
        |   ${H;s/.*//;bF;}
        |   H;d
        | :F
        |   x;s/^\n//
        |   /\n/ {
        |     s/['\''\\]/&/g
        |     s/\n/\\n/g
        |     s/.*/eval -- $'\''&'\''/
        |   }
        |   p
        |   ${s/.*//;x;/./{x;bF;};x}
        |   d
        | ' > "$tmpfile"

      awk 版を採甚する事にする。
      さお、この操䜜は時間がかかるので background で実行する?
      sleep ring だずかを実装するず良いかもしれない。
      うヌん。取り敢えずは sleep ring だずかは考えずに
      同期的に埅機しお凊理を行うこずにする。
      少しナヌザを埅たせるこずになるが、察策は埌で行えば良い。

      次に実行するのは mapfile である。
      配列を走査しお耇数行コマンドを修正するのも実装した。
      _ble_edit_history_edit に぀いおは、
      配列の耇補は時間がかかるので、これも mapfile で凊理するこずにする。
      䜆し、配列は走査せずに _ble_edit_history で修正を行った芁玠の番号を蚘録する方法を取る事にした。
      そうするず 11ms で曞き換えは終わった。

      | progress の衚瀺
      |
      | 配列を走査しおいる間は progress を info に衚瀺する様にした。
      | progress を Unicode の文字を䜿甚しお描画するずずれる。
      | 調べおみるず blesh 及び Poderosa は幅 1 ず認識しおいるが、
      | screen が幅 2 ず認識しおいる様だ。
      | 䜿っおいる screen は ~/local/bin/screen である。
      | cjkwidth emacs は .screenrc に曞かれおいる。
      | もしかするず cjkwidth のコヌドが誀っおいるずいう可胜性もある。
      |
      | ずれは \r を最埌に出力すれば収たる。
      | 䜆し、これで問題が発生しないのは端末の幅が十分にある時のみである。
      |
      | todo: screen の cjkwidth emacs のコヌドを確認する?
      | todo: progress を衚瀺するより効率的な枠組みを䜜成する?

      →これに関しおは新しく独立した項目を立おる事にした。

    2018-03-13 実は awk で曞き換えが必芁な index を調べおおけば、_ble_edit_history も 11ms で終わるのでは?

      | これを実珟する為には awk で別のファむルに曞き出せる様にしなければならない。
      | もしくは /dev/stderr に曞き出す? /dev/stderr は GNU awk では特別扱いの察象である。
      | POSIX awk では /dev/stderr が存圚する事が保蚌されおいるだろうか。
      |
      | 調べおみるず保蚌されおいない様だ。そしお実際に AIX には /dev/std??? は存圚しない。
      | https://unix.stackexchange.com/questions/338667/unix-systems-without-dev-stdin-dev-stdout-and-dev-stderr
      |
      | POSIX awk のペヌゞを芋おみるず、少なくずも redirection には察応しおいるので、
      | これを䜿っおファむルを保存すれば良い。

      実装した。䞡配列に぀いお 22ms で曞き換えが完了する。

        0m0.523s history | awk > tmpfile
        0m0.049s mapfile -t _ble_edit_history
        0m0.047s mapfile -t _ble_edit_history_edit
        0m0.022s 耇数行コマンド履歎の補正 (107項目)

      これで合蚈 641ms になった。

      結局、走査するルヌプがなくなったので progress は䜿われなくなった。
      以䞋に progress を衚瀺するのに䜿っおいたスクリプトの断片を残しおおく。

        local ret
        ble-edit/history/string#create-unicode-progress-bar "$i" "$len" 6
        local bar=$ret
        ble-edit/info/immediate-show raw $'processing multiline history [\e[38;5;63m'"$bar"$'\e[m]\r'

    2018-03-14 次に修正するべき事は、history | awk > tmpfile の高速化である。

      history -n に 37ms かかっおいる。
      その埌の history | awk 本䜓が 481ms である。
      因みに history | awk '{print}' > tmpfile だず 188ms なので、
      具䜓的に awk で実行しおいる凊理によっお 300ms 皋床時間を消費しおいる事になる。
      これに぀いおは短瞮のしようがない様に思われるので、background process を䜜成する。

      実装した。動く様になった。ず思ったら、実行した background process がゞョブに登録されおいる。うヌん。
      % これは subshell の䞭で shopt -u huponexit で & echo $! を呌び出す様にしお、
      % それを ble/util/assign から読み取る様にした。
      ず思ったが ble/util/assign で subshell を䜜るぐらいなら、単に result=$(...) を䜿えば良い。

      これで background で玠早くロヌドするこずが可胜になった。気にならない。

    これを以お履歎ロヌドの高速化は解決したものず考える事にする。
    以䞋の項目は自然解消した。

    | 2016-07-07
    |
    | * _ble_edit_history, _ble_edit_history_edit 初期化高速化に぀いお
    |
    |   これに぀いおの詳现な議論は 2016-07-15 #D0346 に残す。ここでは抂芁に぀いお述べる。
    |
    |   時間蚈枬するず 40% が generate-source-to-load-history (awk) であり、
    |   40% が eval -- '_ble_edit_history=(...)' であり残りの 20% が
    |   _ble_edit_history_edit=("${_ble_edit_history[@]}") である。
    |   どのステヌゞでも高速化の効果が同皋床にあるず芋お良い。
    |
    |   珟圚珟実的な手法ずしお残っおいるのは以䞋である。
    |   - _ble_edit_history_edit clone 遅延
    |   - generate-source の非同期実行
    |
    |   蚘述の汚さの割に倧幅な高速化が芋蟌める蚳ではないので珟圚は採甚しおいない。
    |   今埌高速化で問題になる様なこずがあれば䞊蚘の項目・その他に぀いお考える。

2018-02-27

  * 2018-02-23 idle: ble-syntax.sh の遅延読み蟌み [#D0680]

    ble-syntax は比范的重いモゞュヌルなので遅延読み蟌みにできるならばそうしたい。
    ble-syntax は倖から利甚しおいる関数が少ない (疎結合) なので分離可胜ず刀断した。

    [API確認]

    ble/util/idle の仕組みを敎えたので改めお考え盎す。
    先ず公開むンタヌフェむスの小さそうな ble-syntax に぀いお考える。
    ble-syntax.sh で定矩されおいる関数に぀いお調べるず、以䞋の様な物がある。

    - ble-syntax/*
    - ble-syntax:*
    - ble-highlight-layer:syntax/*
    - _ble_syntax_attr2iface.define

    これらの内他のファむルから呌び出される関数は以䞋の通り:

    - ble-syntax/completion-context
    - ble-syntax/parse
    - ble-syntax:bash/extract-command
    - ble-syntax:bash/simple-word/eval
    - ble-syntax:bash/simple-word/is-simple
    - ble-highlight-layer:syntax/update
    - ble-highlight-layer:syntax/getg

    ble-syntax/parse, ble-syntax/completion-context 以倖に関しおは
    complete.sh もしくは command-help から呌び出される物であり、
    半ば ble-syntax/parse が終わっおいる事が前提になっおいる物である。
    埓っお、ble-syntax/parse 及び ble-syntax/completion-context に぀いおだけ
    autoload に登録しおおけば良い様な気もするが、実際に誀っお䜿う事もあるかもしれないので、
    これらの関数に぀いおも ble-autoload しおおいた方が無難であろう。

    他に ble-syntax.sh で定矩されおいる倉数を参照しおいる箇所は。

    - _ble_syntax_VARNAMES (ble-edit.sh)
    - _ble_syntax_ARRNAMES (ble-edit.sh)
    - _ble_syntax_lang (ble-edit.sh)
    - _ble_syntax_bash_simple_rex_element (complete.sh)
    - _ble_syntax_lang (vi.sh)

    ble-edit.sh で参照しおいる倉数は䜕れも単に最初に蚭定すれば枈む話である。
    vi.sh で参照しおいる倉数もこれは最初に蚭定するので問題ない。
    complete.sh で参照しおいる郚分に関しおは これは ble/widget/complete
    の呌び出し時に ble-import syntax.sh するしかない。

    [実装方法]

    さお、問題は ble-syntax/parse を劂䜕に遅延するかずいう事である。

    | a 䞀぀の案は text が空の堎合には ble-syntax/parse は呌び出さないずいう物である。
    |
    |   x しかし、それだず有限の長さの文字列から ble-syntax/parse になった時の曎新が為されない。
    |
    |   x ok: 曎に、初回の ble-syntax/parse の呌び出しで蚭定されるべき初期倀が倉な倀になるのではないか?
    |     ず思ったが、よく考えたら ble-syntax/parse では、解析開始点が文字列先頭の時には既定の蚭定を甚いるのだった。
    |     埓っおこれに぀いおは問題はない。
    |
    | b 或いは、syntax.sh を読み蟌むたではダミヌの ble-syntax/parse を眮いおおいお、
    |   このダミヌの ble-syntax/parse では䜕も実行しないなど?
    |   そういう意味で蚀うず ble-highlight-layer:syntax/update 及び getg に぀いおも
    |   それに合わせた実装にしなければならない。

    (結局最終的に b に近い実装になった)

    ble-edit の実装を芳察しおみるず ble-syntax/parse は _ble_edit_str.update-syntax から呌び出しおいる。
    他からは呌び出しおいない。なので、匄るずすればここを匄れば良いだろう。
    扚、芳察しおみるず実は倉曎範囲がない時には ble-syntax/parse は呌び出されない。
    ぀たり、ble-syntax/parse に関しおはそのたた ble-autoload しおも良さそうに思われる。
    がしかし 入力したそばから䜕か入力した堎合には、取り敢えず無着色でも良いから呌び出すずいう態床も考えられる。
    この蟺りはどちらでも良い様な気もする。

    ずいうか ble-syntax/parse を呌び出さないず䜕が起こるのだろうか 。詊しおみる䟡倀はある。
    →詊しおみた所、䜕事もなく動いおいる。着色がされず補完ができないずいうだけである。

    次に、ble-highlight-layer に぀いおも考えおみる。実は既定で region 等は読み蟌たれるので、
    これらに぀いおの着色はすぐに有効になるのが自然である。
    問題は syntax をどの段階で凊理するのか ずいう事である。
    うヌん。これに぀いおは適圓なダミヌの ble-highlight-layer を最初に定矩すれば良い気がする。
    ダミヌの ble-highlight-layer は遞択範囲がない堎合の region ず同じように動䜜すれば良い。

    [実装]

    どうやら技術的に可胜の様に思われるので ble-syntax.sh の分離を実行する事にする。

    →実装した。動いおいる。ロヌド䞭に補完たで呌び出した堎合でも動䜜する。

    x 䜆し、ロヌド䞭に䞀頻り䜕か入力しお、その埌アむドルになっお syntax がロヌドされたずしおも、
      その堎では着色されず、次に䜕らかの操䜜があった時に初めお着色される。
      idle の埌には textarea#render を折角実行しおいるのだから、
      core-syntax.sh がロヌドされた瞬間に党䜓を invalidate すれば良さそう。

      a ×: 文字列党䜓を reset すれば良いのではないかず思ったが、
        textarea#render は賢い䜜りになっおいお、文字列の内容が同じならば反応しないようだ。

      b 結局 ble/textarea#invalidate を呌び出すしか無さそうだ。
        しかしプロンプトの蚈算も個別にキャッシュされおいるのでそんなには重くはなさそうだ。
        単に党䜓を再描画するシヌケンスを出力するずいうだけである。

      OK ble-syntax.sh の末尟で ble/textarea#invalidate を実行するようにしたら倧䞈倫。

    o bash-4.0 でも動䜜するか。
    o bash-4.1 でも動䜜するか。
    o bash-4.4 でも動䜜するか。
    o bash-3.2 でも動䜜するか。
    o bash-3.1 でも動䜜するか。
    o bash-3.0 でも動䜜するか。

    䜕れの version でも問題なく動䜜しおいる。

  * 2017-11-25 complete: 曎新する床に complete.sh の䞍敎合が問題になっおいる [#D0679]

    % やはり、遅延読み蟌みはやめた方が良いのでは。
    % 然し、それを蚀い出すず今埌察応する予定である
    % cmdinfo の類に぀いおも遅延読み蟌みできなくなる。
    % もしくは、安定した API の䞋での実装ずいう事になる。
    %
    % 或いは別の方法ずしお ble.sh の现かい version 毎に
    % complete.sh をむンストヌルするずいう手もある。
    % version の管理は面倒なので ble.sh の日付をそのたた䜿っおも良い。
    % 或いは、起動時にファむル䞀匏を䜕凊かにコピヌする。

    →これは idle になった時に遅延読み蟌みするずいう方法が良い。
    history の load 高速化も含めおその仕組みを䜜りたいので、
    その時に実装する様にする。

  * idle 時に䜕かを実行する為の枠組みを敎える [#D0678]

    以䞋の箇所で埅ちを行う必芁がある。

    - ble-attach
    - eval "$_ble_decode_bind_hook" 呚蟺

    read -t 0 (ずいうか ble/util/is-stdin-ready) を実行しお䜕も来おいなければ idle 凊理を実行する。
    idle 凊理の内郚では ble/util/is-stdin-ready を定期的に実行しお
    䜕か文字が来たら即時䞭断できる様に実装する。
    曎に続きの凊理を実行できる様に䞭断時に状態を蚘録する。

    | - _ble_decode_bind_hook 呚りに関しおは倚少考察が必芁になる。
    |   珟圚の実装では _ble_decode_bind_hook は専ら exec:gexec で䜿甚される。
    |   ずいうか、他の堎所で倀が蚭定される事はない。
    |
    |   もう少し詳しく芋る事にする。
    |
    |   | 先ず初めに ble-edit/exec:gexec/.setup の䞭で蚭定される。
    |   | 蚭定内容は以䞋を含む。
    |   | - ble-edit/exec:gexec/.begin
    |   | - コマンドの個数だけ以䞋を繰り返し実行:
    |   |   - ble-edit/exec:gexec/.eval-prologue ...
    |   |   - コマンド実行
    |   |   - ble-edit/exec:gexec/.save-last-arg
    |   |   - ble-edit/exec:gexec/.eval-epilogue
    |   | - trap - INT DEBUG
    |   | - ble-edit/exec:gexec/.end
    |   |
    |   | 次に $_ble_decode_bind_hook 経由で実行が実際に行われる。
    |   | 䞀番最初に呌び出される ble-edit/exec:gexec/.begin の䞭で
    |   | $_ble_decode_bind_hook はクリアされる。
    |   |
    |   | 最終的にコマンドが実行された埌に、
    |   | ble-edit/exec:gexec/.end が呌び出される。
    |   | 内郚で以䞋の関数が呌び出される。
    |   |   ble/term/enter
    |   |   ble-edit/bind/.tail
    |
    |   この様に考えおみるず、実のずころ特別に新しく hook を甚意するのではなくお、
    |   単に ble-edit/bind/.tail 蟺りで idle 凊理を実行すれば良い様な気もする。
    |
    |   因みに ble/term/enter は "ble/term/leave → コマンド実行 → ble/term/enter"
    |   の流れを構成する物であっお、ble.sh による凊理はこの倖偎で実行するべきものの様に思われるので、
    |   ble/term/enter の䞭で凊理するなどの可胜性は最初から陀倖しお良い。
    |
    |   さお。ble-edit/bind/.tail の䞭では info/reveal しお textarea#render しお stdout.off しおいる。
    |   アむドル時には textarea#render の埌で ble/util/buffer.flush >&2 しおから入れば良い。
    |   stdout.off はそれよりも埌で最埌に実行すれば良い。
    |
    | - ble-edit/bind/.tail がどの状況で呌び出されるのかに぀いお確認しおおく必芁がある。
    |   →これは基本的に ble-decode/EPILOGUE で実行される。
    |   コマンドの実行予定がある堎合には ble-edit/exec:$bleopt_exec_type/process を呌び出した時に、
    |   内郚で ble-edit/bind/.tail が予玄されるので、そのたた抜ける。
    |   コマンドの実行ず共に $_ble_decode_bind_hook の内郚で最終的に ble-edit/bind/.tail が呌び出される。
    |
    |   ble-edit/bind/.tail-without-draw に぀いおは、忙しい時に呌び出される物なので、
    |   アむドル凊理を行うかどうかに぀いおは確認しなくお良い。

    これらの様子を総合するず、ble-edit/bind/.tail の textarea#render の盎埌で
    アむドル凊理を実行する様にすれば良い。

    ble-attach の最埌の郚分でも ble-edit/bind/.tail を呌び出す事にした。

    o ok: 取り敢えず以䞋の様なダミヌの凊理が違和感なく動いおいる事を確認した。
      どうも 0.05 皋床の遅延が違和感の無いぎりぎりの様に思われる。

      | function ble-edit/test/count-up {
      |   while ! ble/util/is-stdin-ready; do
      |     ble-edit/info/show text $((_ble_test_count++))
      |     ble/textarea#focus
      |     ble/util/buffer.flush >&2
      |     ble/util/sleep 0.05
      |   done
      |   return 148
      | }
      | ble-edit/idle/push ble-edit/test/count-up

    o ok: 詊しに以䞋の様にしお芋たずころ、ちゃんず ble-attach 時に既に入力がある堎合には、
      それらの入力を凊理しおから履歎のロヌドが始たるずいう事を確認した。
      ぀たり ble-attach (from bashrc) でも ble/util/is-stdin-ready が正しく認識できおいる。

      | ble/util/isfunction ble-edit/idle/push &&
      |   ble-edit/idle/push ble-edit/history/load

    序で complete.sh の遅延ロヌドに察応した。動いおいる。

  * 2017-11-03 vi-mode (extract-block): [Optimize] 珟圚の実装では毎回フルに矩圢を蚈算しおいる [#D0677]

    しかし、䞀郚のコマンドでは䞀郚の情報しか必芁ずしないものも倚い。
    䟋えば xmap I, xmap A では sub_ranges[0] ず sub_x1, sub_x2 しか䜿甚しない。
    たた xmap O では sub_ranges[0] ず sub_ranges[最埌] しか䜿わない。
    extract-block に途䞭の行に぀いお取埗しないオプションがあっおも良い気がする。

2018-02-23

  * bash-3.0: コマンドの着色が垞に゚ラヌになっおいる [#D0676]
    これは ble-highlight-layer:syntax/word/.update-attributes/.proc の䞭に
    local var=() の圢匏の倉数代入があったのが原因だった。盎した。

  * 起動時間: プロンプト衚瀺たでの時間の短瞮 [#D0675]

    起動時間がどんどん肥倧化しおいく。起動時間を短瞮する事はできないだろうか。

    - 䟋えば、䞀番最初にプロンプトだけは衚瀺しおしたうなど。

      1 プロンプトを衚瀺する
        この為には ble-form.sh 及び ble-edit.sh の描画関連は読み蟌んでいる必芁がある。
        曎に着色関連で ble-color も読み蟌んでいる必芁があるかもしれない。

      2 次に ble-decode-bind の蚭定を行う
        これを実行しないずキヌボヌド入力を受けおも反応する事ができない。
        ただ、倚少遅れお凊理を行っおも問題ない様な気もする。

        珟状の実装では ble-decode-bind を実行した時点で
        __attach__ 等の凊理も実行する必芁がある。

      実は珟圚の実装では先に 2 を実行しおから 1 を実行しおいる。
      これを逆にするだけでも䜓感が異なるのではないかずいう気がする。
      取り敢えずそのようにした。

    - 曎に、keymap の初期化も遅らせる事ができるのではないだろうか。ず思ったが難しいかもしれない。
      ずいうか珟状で䞀番時間を食っおいるのは vi.sh の読み蟌みのような気もする。
      vi.sh の読み蟌みを遅延させるずするず 
      vi.sh 偎でキヌマップ初期化時に呌び出すべき hook を提䟛するずいう手もある。
      しかし、そうしたずしおも結局、実際にコマンドを入力できる様になるたでの時間は倉わらないので、
      あたり意味が無いのではないかずいう気もする。うヌん。

      実際に実装しおみた。bashrc の䞭で ble-bind を実行するずその堎で読み蟌んでしたうので、
      それぞれの keymap に load_hook を甚意しおそれに登録しおもらう事にした。
      実際にやっおみるず遅延しおロヌドする様になった。
      やはり䜓感ずしおはできるだけ早くプロンプトを出した方が安心できる気がする。

2018-02-22

  * vi-mode: BUG 行指向の貌り付けが動かなくなっおいる [#D0674]
    調べるずそもそも蚘録された時点で charwise になっおいる。䜕故だろうか。
    曎に Vy ずしおも charwise になっおいる。党然駄目だ。
    →盎した。ず思ったが䜕故これで党郚盎ったのかは謎である 。
    䜕らかの勘違いもあったかもしれない。珟状では動いおいるので良しずする。

    盎前の問題の Y や yy でカヌ゜ルが動く問題も
    これが関係しおいるかず思ったが関係なかった。

    x fixed: :reg においお既定のレゞスタ "" が衚瀺されおいない。盎した。

  * 2018-02-21 vi-mode: Y で行頭には動かないのが正しい動䜜 [#D0673]
    ずいうか yy でも動かないのが正しい動䜜。
    詊しおみるず g~~ では動く。ずいう事は y の時だけ特別扱いずいう事か。
    もしくは、䜕も線集が起こらなければカヌ゜ル䜍眮は動かさないずいうこずなのか。
    しかしだずするず charwise の y の時に動くずいう事の説明が付かない。
    やはり linewise y だけ特別にカヌ゜ルを移動しないずいう振る舞いなのだろう。

    - done: ずいう蚳で operator:y の line の箇所を倉曎する。

    - done: たた、operator:d の実装を operator:y の実装に頌っおいるのは
      operator:y 独自の動䜜を実装するのに䞍郜合であるから、
      operator:d はそれ自䜓で完結する様に実装し盎した。

  * vi-mode: support smap [#D0672]

    | 2017-09-17
    |
    | * cmplstofB: ビゞュアルモヌド・遞択モヌド?
    |
    |   * 遞択モヌドは範囲に察する挿入モヌドのような気がする。
    |     遞択モヌドは取り敢えず察応しないこずにする。

    * 遞択モヌドは範囲に察する挿入モヌドのような気がする。
      遞択モヌドは取り敢えず察応しないこずにする。

    - done: 遞択モヌドにもビゞュアルモヌドず同様に3皮類のモヌドが存圚する。
      vi_xmap ず䌌た別の keymap (vi_smap) を䜜成すれば実は盎ぐに察応が完了しおしたうのではないか。

    - done: 遞択モヌドではテキストオブゞェクトは呌び出されないず考えお良い。
      しかし、やはり埌になっお呌び出したくなったりするず行けないので取り敢えず xmap ず同じ動䜜で察応する事にする。

    - done: Select-mode: この説明によるずシフトを抌さずに移動コマンドを実行するず
      遞択モヌドを抜けるずいう事になっおいるが実際にやっおみるずそんな事はない。
      ず思ったが、これはどうやら keymodel 倉数の倀によっお振る舞いが倉化する様だ。

    - done: 埌は通垞の文字及び C-m を入力した時に operator c に続いお䜕か入力したのず同じ状態にする。

    x fixed: C-g で切り替えた時にモヌド衚瀺が曎新されない。修正した。

    x fixed: 文字を入力した時に無限ルヌプになる。そしお segfault した。
      これは operator が vi_smap を認識しおいないのが原因だった。

    - done: 䜕か入力した時の . で蚘録される内容はどうするか。
      普通に operator c が指定された堎合にはどの様な振る舞いだったか?

      因みに珟圚の実装で詊しに実行しおみた所 a が重耇しお再生されおいる。
      実は ble-decode-key で呌び出さずに盎接 self-insert しお良いのかもしれない。

    - done: vi-command/operator で .save-visual-state するべきだろうか。
      vim で詊しおみるず実際に蚘録しおいる様だ。埩元時はビゞュアルモヌドになる。
      珟圚の ble.sh の実装でもその様に動いおいる。

    x fixed: C-v で矩圢ビゞュアルではなくお矩圢遞択に移行しおいる。盎した。

    以䞋の機胜には察応しない

    - gV ずいう機胜の説明が謎である。
    - keymodel=startsel の時に "S-移動コマンド" で遞択モヌドに移行する機胜

  * ble-edit: ble/widget/.goto-char 廃止 [#D0671]

    #D0407 に倚少蚘録が残っおいる。
    珟圚ではこの関数は単に _ble_edit_ind を蚭定するだけで䜕もしおいない。
    _ble_edit_mark に察する代入ずの非察称性が気になるので、この関数は廃止する事にする。

    たた、珟時点でも幟぀かの箇所で _ble_edit_ind を盎接倉曎しおいる物がある。
    もし仮に将来的に再床 _ble_edit_ind の蚭定を怜出しなければならない状況になったずしおも、
    改めおこれらの箇所に぀いお䞀぀䞀぀必芁かどうかを刀定する必芁が出おくるだろうし、
    たた同時に _ble_edit_mark の怜出にも気を配らなければならない。

  * vi-mode (xmap txtobj quote): xmap での振る舞いに察応 [#D0670]

    振る舞いに぀いお調べる必芁がある。

    | 先ず初めに行を跚ぐこずはない。既に行を跚いでいる堎合には i" も a" もベルになる。
    | たた、行頭から数えお奇数番目の " から偶数番目の " を䞀぀の <quote> ずしお捉えおいる様だ。
    |
    | 先ず i" の前方拡匵に぀いお調べる。぀たりマヌク < 珟圚䜍眮の時の振る舞い。
    |
    |   % 先ずマヌクず珟圚䜍眮の間に <quote> 境界がない堎合に぀いお。
    |   %   珟圚䜍眮が quote の倖偎にいる堎合には次の <quote> の内郚を遞択する。
    |   %   珟圚䜍眮が quote の内偎にいる堎合には珟圚の <quote> の内郚を遞択する。
    |   %   䜆し、既に内郚を遞択しおいる堎合には <quote> の倖偎を遞択する様に拡匵する。
    |   %
    |   % 端点が <quote> 境界を跚いでいる堎合にはその端点は動かさない様だ。
    |   %   % - 珟圚䜍眮が <quote> の倖偎にいる堎合には次の <quote> の内郚の終点に行く。
    |   %   % - 珟圚䜍眮が <quote> の内偎にいる堎合には珟圚の <quote> の内郚の終点に行く。
    |   %   % - 既に <quote> の内郚終点にいる堎合には動かない。
    |   %   %   䜆し匕数ずしお 2 以䞊を指定するず倖郚終点に移動する。
    |   %   %   どんなに倧きな匕数を指定しおも単に珟圚の <quote> の倖郚終点に移動するだけである。
    |   %
    |   %   % <quote> の内郚にいる堎合にはその <quote> の内郚終点に移動する。
    |   %   % 匕数ずしお 2 以䞊を指定するず倖郚終点に移動する。
    |   %   % 3 以䞊の匕数を指定しおも 2 を指定した時の振る舞いず倉わらない。
    |   %
    |   %   珟圚䜍眮以降にある <quote> の内郚終点たで範囲を拡匵する。
    |   %   もし珟圚䜍眮以降に閉じた <quote> がなければ孀立 " の手前たで拡匵する。
    |   %   もし孀立 " もなければベル。
    |   %   匕数が 1 以䞋の時、その <quote> の内郚終点に移動する。
    |   %   匕数が 2 以䞊の時、1 文字拡匵しお " を範囲に含める。
    |   %
    |   % 䞁床珟圚䜍眮に " がある堎合 。
    |   %   この堎合は <quote> 関係なく、珟圚䜍眮の次の文字から "..." ペアを芋぀けお
    |   %   それを <quote> ず考える。埌は、䞊ず同じ振る舞いをする。
    |   %
    |   % 端点が " の䞊にある時、これは "<quote> 境界を跚いでいる時" ず同じだ。
    |
    |   先ず䞁床珟圚䜍眮に " がある堎合、
    |     その次の䜍眮以降から "..." ペアを芋぀けお終端の " の䜍眮を A ずする。
    |     䞀぀しか " がない堎合には、その " の䜍眮を A ずする。
    |   それ以倖の堎合、
    |     珟圚䜍眮の次の䜍眮以降から <quote> の終端になる " を芋぀けお、その䜍眮を A ずする。
    |     その様な " が芋぀からない堎合にはベルを鳎らしお䞭止。
    |     曎に、マヌクの䞀぀前から珟圚䜍眮の範囲に " が含たれない堎合、B = 1 を蚭定する。
    |
    |   a" の堎合、
    |     A の䜍眮に移動する。続いお空癜がある堎合にはそれも取り蟌む。
    |     B == 1 ならば、マヌクを A よりひず぀前の " の盎前たで移動し、その前に空癜があればそれも取り蟌む。
    |   匕数が 2 以䞊の時、
    |     A の䜍眮に移動する。B == 1 ならば、マヌクを A より䞀぀前の " の盎前たで移動する。
    |   匕数が 1 以䞋の時、
    |     A の手前に移動する。B == 1 ならば、マヌクを A より䞀぀前の " の盎埌たで移動する。
    |
    | i" で、マヌクず珟圚䜍眮が同じ䜍眮にある堎合には明らかに振る舞いが倉化する。
    |
    |   % <quote> 内郚にいる時にはその <quote> を A ずする。
    |   % <quote> 倖郚にいる時は、
    |   %   先ず backward に " を探しお芋぀からなければ forward に " を探す。
    |   %   もし芋぀かったら、次にそれより埌にもう䞀぀ " を芋぀ける。
    |   %   このペアを A ずする。もし芋぀からなければベルを鳎らしお䞭止する。
    |
    |   先ず [行頭, ind+1) から最埌の " を探す。芋぀からなければ forward に " を探す。
    |   もし芋぀かったら、次にそれより埌にもう䞀぀ " を芋぀ける。
    |   このペアを A ずする。もし芋぀からなければベルを鳎らしお䞭止する。
    |
    |   a" の堎合、範囲A党䜓ずその呚りの空癜を遞択する。
    |   匕数が 1 以䞋の時は範囲 A の内郚を遞択する。
    |   匕数が 2 以䞊の時は範囲 A 党䜓を遞択する。
    |
    | i" で、珟圚䜍眮がマヌクより前にいる時も調べる必芁がある。
    |
    |   % 珟圚䜍眮に " がある堎合、それより前の <quote> 開始点を A ずする。
    |   % 実は珟圚䜍眮に " があるかどうかは関係ない様だ。
    |
    |   珟圚䜍眮より前の <quote> 開始点を A ずする。
    |   芋぀からない堎合にはベルを鳎らしお䞭止する。
    |   [珟圚䜍眮, マヌク + 2) の範囲に " がなければ B = 1 を蚭定する。
    |
    |   a" の時は、A盎前たで移動しお曎に空癜を取り蟌む。
    |     B == 1 ならばマヌクを察応する " の盎埌たで移動し、空癜があれば取り蟌む。
    |   匕数が 2 以䞊の時は A の䜍眮たで移動する。
    |     B == 1 ならばマヌクを察応する " の盎埌たで移動する。
    |   匕数が 1 以䞋の時は A の盎埌たで移動する。
    |     B == 1 ならばマヌクを察応する " の盎前たで移動する。
    |
    | % a" に぀いおも同様に䞉通り調べる必芁がある。
    | % どうも a" の堎合は匕数を指定しおも効果は無いようだ。
    | % そしお i" の時ず違っお <quote> の倖偎に隣接する空癜も取り蟌む様だ。

    珟圚の遞択範囲が耇数行に亘っおいる堎合には throw (ベルを鳎らしお䞭止) する。
    以降は行内での拡匵を考える。
    行頭から偶数番目の " を 右" ずし、右" の䞀぀前にある " ã‚’å·Š" ずしお区別する。
    行頭を beg ずし、行末を end ずする。珟圚䜍眮を ind ずし、支点を mark ずする。
    遞択範囲は [min(ind,mark), max(ind,mark)+1) になる。

    a" の時 mode = a, i" で匕数が 2 以䞊のずき mode = q, それ以倖の時 mode = i ずする。
    mode = i は " を含たないような範囲である。もし "" 等の様に䞭身がない堎合は q ず同じ様にする。
    mode = q は䞁床 " を含むような範囲である。
    mode = a は mode = q から曎に右偎の空癜も取り蟌むように拡匵を行う (巊偎の空癜は取り蟌たない)。

    mark == ind の時、
      A1 = [beg, ind+1) にある最埌の " || [ind+1, end) にある最初の " || throw
      A2 = [A1+1, end) にある最初の " の終端䜍眮 || throw
      mode に応じお [A1, A2] を囲む。
    mark < ind の時、
      ind の䜍眮に " がある時
        A = [ind+1, end) にある最初の "
        A = [A+1, end) にある最初の " || A
      それ以倖の時
        A = [ind+1, end) にある最初の 右" || throw
      B = [mark-1, ind+1) に " が含たれない
      ind を mode に応じお終端点 A に移動する。
      B = true の時、mode に応じお mark を [beg, A) の最埌の " (必ず存圚) の䜍眮たで移動する。
    ind < mark の時、
      A1 = [beg, ind) の最埌の å·Š" || throw
      B = [ind, mark+2) に " が芋぀からない
      mode に応じお ind を開始点 A に移動する。
      B = true の時、mode に応じお mark を 右" に移動する。

    [動䜜確認]

    x fixed: 動䜜がおかしい。ず思ったらどうも surround S の振る舞いが倉だ。
      囲んでいる範囲の末端にある空癜を範囲から倖しおしたう様になっおいる。
      調べおみるず explicit にそういうコヌドになっおいる。
      これが適甚されるか適甚されないかの条件があるずいうこずだろうか。
      ysw の時には確かにその様な動䜜になっおいる。
      テキストオブゞェクト ysaw の堎合にもそうなっおいる。
      他は党お linewise な operator かもしくは vS, vgS である。
      ぀たり、末端の空癜を範囲から陀倖するのは ys の時だけである。
      盎した。

2018-02-21

  * vi-mode: vi_test で qx..q マクロに぀いおのテストを远加 [#D0669]

    ず思ったら動かない 。

    䜕ずなくテストを远加しおみた所 @x によっおマクロが実行されない。
    手で実行するず正しく実行されるので倉だ。
    マクロを実行する䜕らかの条件があっただろうか。
    或いは単にバグかもしれない。調べる必芁がある。

    どうやら register#play 迄は到達しおいる様だが、
    再生するべき文字列を取埗した時点で空文字列になっおいる様だ。
    :reg で確認しおみるずやはり空文字列になっおいる。
    これは再生の問題ではなくお蚘録の方の問題である。

    →どうも ble-decode/keylog/end しお入力されたキヌを読み取った時点で空の様だ。
    結局、原因は分かった。_ble_decode_keylog 配列に察する蚘録は ble-decode-key で行われおいるが、
    この時 _ble_decode_keylog_depth=0 かどうかを確かめおいる。
    これは実際に入力されたのではなくお二次的に呌び出された ble-decode-key を蚘録しない為の物である。
    テストを実行する為には _ble_decode_keylog_depth=0 を䞀時的に実行しお keylog を有効化しなければならない。

  * vi-mode: registers "0 "1 "- に぀いお。 [#D0668]

    どうも y や d でコピヌされた文字列がどのレゞスタに登録されるかは耇雑の様である。

    - 先ず、䜕れの堎合でも register ずしお "" 以倖のものが指定された時には蚭定されない。
    - y の堎合には "0 に登録される
    - d や c の堎合には改行が含たれるかたたは % ( ) ` / ? n N { } ず組み合わせた時に "1 に登録される
    - それ以倖の時には "- に登録される
    - "2 .. "9 に関しおは "1 が蚭定された時のみにシフトされる。

    % ( ) ` / ? n N { } に関しおは特別扱いで WIDGET を参照する事にすれば良い。
    元々の vim でもこれは vi ず互換性を持たせる為の振る舞いであるず曞かれおいるので、
    少しでも違うコマンドで実行された堎合には、特別扱いしないずいう事で良い気がする。

    所で  ( ) ずいうコマンドはあっただろうか 。
    →調べおみた所、存圚した 。カヌ゜ルを N 文先に進める or 戻すずいう動䜜の様だ。
    曎に { ず } も同様のコマンドである。
    これに぀いおは別の項目を立おお察応する事にする。

  * vi-mode: マクロで蚘録される内容に空癜が挿入されおいる。 [#D0667]

    これは䜕凊かの連結で倉な事が起こっおいる。やはり連結だった。

    動く䟋:
      IFS= eval 'value=${arr[*]}'
      IFS= eval 'value="${arr[*]}"'
      IFS= eval 'local value="${arr[*]}"'

    動かない䟋:
      IFS= eval 'local value=${arr[*]}'

    これは眠である 。Memo にも蚘録しおおく事にする。

  * 2018-02-18 vi-mode: register 0..9 に察応する [#D0666]

    https://qiita.com/nakabonne/items/84d61ae5e89e20de0157

  * 2017-10-17 vi-mode: support :reg [#D0665]

    内容を escape したい。これは info text ず同じ仕組みを䜿えば良いはず。
    →調べおみるず info では ble-edit/info/.construct-text で倉換しおいる。
    そしおこれは座暙蚈算もしおいる。其凊たでは必芁ない。
    代替になるものを実装する必芁がある。基本的に .construct-text を簡単化すれば良い。
    文字幅を蚈算しなくお良いので [[:print:]]+ で読み飛ばしおしたっおも良い気がする。

    取り敢えず実装した。

  * complete: 解析再開点の蚘録抑制により正しく補完できないケヌスがある [#D0664]

    Cygwin 䞊で䜕故か g++ の匕数が補完されない。

    gcc など他のコマンドに぀いおはちゃんず補完される。
    complete には䜕も登録されおいない。
    候補の衚瀺たではちゃんず動いおいる。

    [原因]

    | - どうも he たで入力しおいるのに a.exe や a.txt などの
    |   䞀臎しないファむル名が候補ずしお列挙されおいる。
    | - コマンド名に + が含たれおいるず駄目の様だ。
    |
    | そもそも単語切り出しに倱敗しおいる。
    | he たで入力しおいるのに COMPS="" になっおいる。
    | 遡るず context の生成の時点で振る舞いがおかしい。
    | ble-syntax/completion-context の方を芋に行く。
    | ble-syntax/completion-context/check-prefix が悪そうだ。
    | check-prefix の CTX_ARGX の郚分を、echo だず通過するのに g++ だず通過しない。
    | 䜕か倉だ。調べおみるずそもそも解析の時点でおかしい。
    | echo he だず h の䜍眮に解析再開点が蚭眮されおいるが、
    | g++ he だず h の䜍眮に解析再開点が蚭眮されおいない。
    | Linux の方では解析再開点はちゃんず蚭眮されれおいる。
    | bash-4.4 で詊しおもちゃんず蚭眮されおいる。
    |
    | うヌん。調べおみるず parse_suppressNextStat が蚭定されおいる。
    | コマンド名に + が含たれおいる堎合、埌の線集によっお倉数代入に化ける事があるので、
    | その次の解析再開点の蚭眮を抑制するずいうのが目的である。
    | そしお珟状では parse_suppressNextStat はこの甚途のみの為に存圚しおいる。
    | 導入の事情は #D0318 に曞かれおいる。
    | 䞀時期 time -p の解析 #D0320 でも甚いられたが、珟圚は甚いられおいない。
    | #D0318 を芋おわかったのは、var+ ずなっおいる時、
    | check-variable-assignment では var+ たで読んで parse_suppressNextStat を蚭眮しお抜ける。
    | 次にコマンドの読み取りで var たで読んで其凊に解析再開点を蚭眮しようずするが、
    | 其凊で parse_suppressNextStat が効いお解析再開点が蚭眮されいないずいう仕掛けになっおいる。
    | わざわざ var たでしか読たないのはそれが extglob +() を構成する + かもしれないからである。
    |
    | ここで magnate (Cygwin) ず padparadscha (Linux) での違いが分かった。
    | magnate 䞊では extglob が蚭定されおいなかったので、実は次のコマンドの読み取りで var+ たで読んでしたう。
    | するずそのたた次の解析再開点が抑制されおしたい問題になるのである。

    これの解決方法は簡単である。確か parse_suppressNextStat ずは別の仕組みで
    % 解析再開点の蚭眮を抑制する仕組みを敎えた筈である。
    parse_suppressNextStat を廃止しおそれに統合するのが良い。

    [察凊]

    解析再開点の蚭眮を抑制するのではなくお解析再開点に参照範囲も蚘録するこずで、
    再開時に dirty-range に応じお再開点を無効かどうか刀定できる様にする仕組みだった。
    これに䜿うのは ble-syntax/parse/set-lookahead ずいう関数だった。
    この関数は珟圚䜍眮を基準に䜕文字先たで先読みしたかずいう事である。
    #D0601 で導入されおいる。

    [実装] set-lookahead を蚭定する様にした。補完は動いおいる。

    x fixed: しかし、今床は解析がちゃんずできなくなった。
      䞍思議な事に lookahead が蚭定されおいない 。どういう事だろう。
      よく考えおみたら lookahead する文字数が足りない。
      variable assignment は + の次の文字が = でない時に倱敗するのだから、
      + の次の文字たで先読みしたずいう事を蚘録しなければならない。

    動いおいる。

2018-02-14

  * 2017-10-05 vi-mode: 最終行付近で + _ g_ などを呌び出したずきの振る舞いが異なる。 [#D0663]
    この蟺りの振る舞いに぀いおは色々調べる䟡倀はある。

    - vim では最終行で 2_ を抌すずベルが鳎る。移動しない。この動䜜は同じ。
      vim では最埌から2行目で 3_ を抌すず最終行の行頭に移動する。ベルは鳎らない。
      しかし同じこずを今の実装で行うず䜕故かその行の行頭に移動する。これはバグだ。

    - + に぀いおも調べる。vim は + も同様の振る舞いをする。
      そしお珟圚の実装も䜕故かその行の非空癜行頭に移動する。

    - 珟圚の実装では g_ は最終行の行末に移動する。この動䜜は vim ず同じだ。
      しかし最終行にいる時 2g_ ずするず vim はベルを鳎らしお動かないが、
      珟圚の実装ではそのたた珟圚の行の行末に移動しおしたう。

    + 及び _ に関しおは明らかにバグであった。
    指定された量だけ履歎項目内で移動できず、履歎移動にも倱敗しお、
    それでも履歎項目内で少しは動けた時は、nolx を修正しお其凊に移動する実装の筈だった。
    しかし、コヌドの共通郚分を利甚するためにこれを first-non-space に眮き換えたのが行けなかった。
    コヌドは同じであるがロヌカル倉数 nolx は同じ倀ではないのでこれだず正しく動䜜しないのだった。

    g_ に関しおは垞に成功する実装になっおいたので、倱敗する条件を远加した。
    行移動を芁求された (匕数 2 以䞊) のに、1行も移動するこずができなかった堎合にベル。

  * undo: 戻った埌の䜍眮、進んだ埌の䜍眮が䞍自然 [#D0662]

    珟状の実装では初めおその状態になった瞬間のカヌ゜ル䜍眮に移動しおいる。
    しかし、この動䜜は自然だろうか。redo で進んだ時はそれで良い。
    しかし、undo で戻った時には、最埌にその状態だった瞬間のカヌ゜ル䜍眮に移動するべきなのではないか。

    或いは別の実装方法ずしお、履歎移動が起こった時には diff を取っお、
    䞀番最初の倉曎点 (たたは最埌の倉曎点) にカヌ゜ルを移動するずいう手が考えられる。
    vim の実装はこれになっおいる様な気がする。

    この堎合には _ble_edit_str.reset-and-check-dirty の䞭で蚈算した倀を䜿えば良い。
    ず思ったが _ble_edit_str/update-dirty-range で蚘録しおいるのは描画・構文解析・配眮に぀いおだけなので、
    珟圚の undo によっお倉曎された範囲ずいうのは求めがたい。
    結局、凊理が二重になっおしたうかもしれないが呌び出し元で common-prefix / common-suffix を求める事にする。

    うヌん。コレに関しおは様々な考え方がある気がする。

    a 初めにその状態になった瞬間のカヌ゜ル䜍眮
    b 最埌にその状態だったカヌ゜ル䜍眮
    c 倉曎範囲の開始点
    d 倉曎範囲の終端点

    蚭定項目 bleopt_undo_point ずしお提䟛する事にした。

  * vi-mode: xmap <C-a>, etc. の動䜜に぀いお [#D0661]

    - V<C-a> の堎合は各行の最初の敎数に぀いお 1 ず぀増加させる。
      v<C-a> の堎合にも同様である。<C-v><C-a> の堎合も、
      矩圢を構成する各行の䞀番最初の敎数に぀いお増加させる。

    - Vg<C-a> の堎合は各行の最初の敎数に぀いお 1, 2, 3, ... ず぀増加させる。
      匕数を指定した堎合には {N}, 2{N}, 3{N}, ... ず぀増加させる。
      k個目に芋぀かった敎数は k 倍になるずいうこずである。
      (k行目の敎数が k 倍ずいうこずではない。数字がない行に぀いおはスキップする)

    - v 及び <C-v> においお敎数の途䞭で領域が切れおいる堎合、
      領域内に入っおいる郚分だけで解釈される。巊端も右端も。

    - 098 を 1 増やすず 99 ではなく 099 になる。
      099 を 1 増やすず 100 になる。
      000 から 1 枛らすず -001 になる。
      ぀たり動かす前の 0 padding を芚えおいるずいう事になる。

    - 範囲内に数字が芋぀からなかった堎合は `[`] は蚭定されないが . は蚭定される。

    実装の方法ずしおは vi_xmap/visual-replace-char を参考にすれば良い。
    たた nmap <C-a>, <C-x> に぀いおも 0 padding に察応する必芁がある。察応した。

    x fixed: 䞀番最初の行しか倉換されない。
      調べおみるず䜕故か delta が 0 になっおいる。
      䜕ず .repace-range で倉数 delta が leak しおいた。盎した。
      ちゃんず動くようになった。

    o 境界を跚ぐ数字に぀いお。右境界・巊境界共にOK
    o 行内に耇数の数字がある時、䞀番最初の数字だけ。
      V, v, C-v で確認。C-v に関しおは矩圢内で最初の数字。
    o 匕数がちゃんず䜿えるずいうこず。
    o g<C-a>, 2g<C-a> で等比数列で増加するずいう事。
    o g<C-x> で数字がない行があっおも、ちゃんず行番号ではなくお
      芋぀かった数字の数で倍率が決たっおいるずいう事。
    o 範囲内に数字がない堎合 `[`] は蚭定されないが . は蚭定される。
    o 098 → 099, 099 → 100, 000 → 001, -001 → 000, -000 → 001
    o 099 → 098, 100 → 99, 002 → 001, 000 → -001

    x ok: undo した時のカヌ゜ルの䜍眮が倉だ。

      % これは xmap r{char} でも同様に倉だ。
      % xmap c ... ESC で詊しおみるず xmap を解陀する瞬間のカヌ゜ル䜍眮が倉。
      %
      % 調べるず undo 埌の䜍眮は蚘録されおいた䜍眮をそのたた再珟するだけである。
      % 蚘録は undo/add した瞬間の _ble_edit_ind ず _ble_edit_str を蚘録しおいる。
      % 䞀緒に蚘録しおいるので異なる _ble_edit_str の時の _ble_edit_ind が再生されるなどの事は考えにくい。
      %
      % これはどうも最終的な䜍眮に移動する前に set-previous-edit-area を実行しおいるのが原因の様な気がする。
      % 取り敢えず最終的な䜍眮を調敎しおから set-previous-edit-area を実行しおみる事にする。
      %
      % 盎っおいない ず思ったがよく考えたらこの動䜜で良いのである。
      % 䜕故ならば最埌に線集が起こった時のカヌ゜ル䜍眮を蚘録しおいるのであっお、
      % その操䜜を実行する盎前の䜍眮を蚘録しおいるわけではないのである。
      % しかし、これは意図した動䜜であるずはいえ vim ではどの様に扱っおいるのか確認する必芁がある。
      % →vim の堎合にはた線集を行う盎前にいた䜍眮に戻るようである。
      %   䞀方で C-r で進む堎合にはその操䜜を行う盎前の䜍眮に行く。
      %   ぀たり、文字列の状態ず䜍眮を玐付けおいる蚳ではない。
      %
      % どうも u で戻った時には戻した線集が起こった䜍眮に移動し、
      % C-r で進んだ時には進んだ線集が開始した䜍眮に移動する様だ。
      % u で戻った時は戻った埌の蚘録の次の蚘録の蚘録点で、
      % C-r で進んだ時は進んだ埌の蚘録の蚘録点ず考えれば良いだろうか。
      % うヌん。然し、その様にするず䞍敎合が生じる可胜性がある。
      % 或いは、戻った時の diff を取っお線集が起こった先頭に移動すれば良いのかもしれない。
      % 珟に、 _ble_edit_str.reset-and-check-dirty を呌び出しおいるのであるから、
      % その dirty の先頭に移動すれば良いのではないだろうか。或いは末端のほうが自然か。
      % vim の振る舞いを芋るず倉曎範囲の先頭に移動しおいる様に芋える。

      結局、これは undo の問題なので別項目で考えるこずにする。

  * 2018-02-13 bug: ヒアストリングで $ret を指定するず以䞋の゚ラヌメッセヌゞ [#D0660]

    ((: ret: 匏の再垰可胜レベルを越えたした (゚ラヌのあるトヌクンは "ret")

    再珟できた。原因は ble-syntax:bash/simple-word/eval-noglob '$ret' である。
    →単玔なミスであった。芁玠数を調べるのに誀っお䞭の文字列を展開しおいた。盎した。

    念のために他にも同様のミスがないが怜玢しおみたが特にはない様だ。
    grc '\(\([^[:space:]]*\$\{[[:alnum:]_]+\[@\]\}'

  * vi-mode: g?? は rot13-encode lines だが g~? は backward-search switch case である [#D0659]

    - 珟圚の実装では vi_omap は "operator rot13" に玐付けおいるが、
      g~ g? の様に異なる組み合わせのオペレヌタを組み合わせた時は元々の motion ? の意味を取り戻す。
    - 因みに g~ gu gU gq に察応する omap ~, u, U, q に関しおは
      元々 motion ではないので vi_omap で認識できる必芁はない。
    - gw に察応する omap w は単語の意味であっお gww の様な重ね方には察応しおいない。

    a operator を二぀重ねた時の振る舞いに぀いお調敎が必芁である。

    b もしくは omap ? を特別な凊理に差し替えるずいう事も考えられる。
      ぀たり opfunc を芋お rot13 ならば operator rot13 を実行し、
      そうでなければ motion ? を実行する。

    今回は b の方法で察凊する事にした。

  * 2017-11-03 vi-mode (map / ? n N): backward search の䞀臎の仕方が異なる。 [#D0658]
    珟圚の実装では䞀臎範囲が珟圚の䜍眮以前にある䞀臎の最埌のものが圓たる。
    しかし vim を芳察するず、"䞀臎範囲の開始䜍眮" が珟圚の䜍眮より前にある䞀臎の最埌のものが圓たる。

    たた、vim では䞀臎する物がそれ以䞊ないずきに cyclic に䞀臎するが、
    ble.sh ではこれに぀いお敢えお察応しおいない。

    - fixed: 2017-11-06 曎に詊しお気付いたのだが、
      / や ? で新しい怜玢を始めるずきでも、
      珟圚䜍眮にある単語には䞀臎しない。
      珟圚の ble.sh の実装では以前の䞀臎の䞊にいる時には珟圚䜍眮には䞀臎せず、
      新しい䞀臎を始めるずきには珟圚䜍眮に䞀臎するようにしおいるが、
      これは党く無意味な凊理である気がする 。

      これは ble/keymap:vi/search/invoke-search で制埡しおいる振る舞いである。
      % 単に条件の "|| ! ble/keymap:vi/search/matched" の郚分を削陀すれば良いだけでは?
      % これに぀いおは具䜓的に動䜜を調べながら修正する。

      ず思ったら、この郚分を削陀するず怜玢開始䜍眮が倉な事になる。
      初回の怜玢䜍眮は飜くたで初回の怜玢䜍眮ずしお凊理するが、
      その䜍眮を埮修正するずいう方向で察策が必芁である。

      取り敢えず盎った様な気がする。
      bleopt_keymap_vi_search_match_current=1 の時、以前の動䜜に戻る。

    さお、然し backward search に関しおは振る舞いは未だ異なる。

    これは ble-edit/isearch/search 自䜓の振る舞いを匄らないず行けない。
    取り敢えず正芏衚珟を䜿っお "開始䜍眮" が珟圚の䜍眮より前にある物を探す方法を考える。
    これに぀いおは先頭の .{数} の郚分を調敎すれば良い気がする。
    →ble-edit/isearch/search に新しい方向 B を甚意した。
      埓来の - ず違っお開始点が珟圚䜍眮より前ならば䞀臎する。

    新しい方向 B を䜿っお実装しおみたが今床は重耇しお䞀臎する事が可胜になっおしたった。
    ぀たり、aiai[aiai] に䞀臎しおいる時に n を抌すず [aiai]aiai になるべきだが、
    珟圚の実装では ai[aiai]ai になっおしたう。
    これに぀いおは、再䞀臎の時は dir を倉曎するずいう様にすれば良い。
    盎した。動いおいる。

2018-02-13

  * [bug] ble-bind: ble-decode-unkbd があらゆる文字に぀いお ESC を返す様になっおいる [#D0657]

    連想配列の添字の $keycode を keycode に倉えたのがいけなかった。
    ずいうかそもそも䜕故連想配列になっおいるのだったか 。
    keycode は垞に敎数なのではないだろうか。
    →どうもそのようにしか芋えないので _ble_decode_kbd__c2k
    を連想配列から通垞の配列に倉曎した。

  * オペレヌタ ! や ys においお、䜜甚察象を着色 [#D0656]

    オペレヌタ ! や ys では続けおどの様な操䜜をするかを決定する為にナヌザの入力を埅぀。
    ナヌザの入力を埅っおいる間は、䜜甚察象の文字列範囲を着色するのが良い。
    取り敢えず察応した。

    - ok: 先ず着色する色は通垞の領域遞択ず異なる色にしたい。
      これには察応した。highlight-layer:region においお色 (sgr) も䞀緒に蚘録する事にした。

    x fixed: 矩圢ビゞュアルモヌドで S を抌しお ysurround を呌び出した時、着色されない。

      これは call-operator-blockwise を呌び出す時に、
      䞀時的に _ble_edit_mark_active を叀い倀に戻しおから、
      呌び出した埌で新しい倀 (぀たり vi_xmap/exit で蚭定された空文字列)
      に曞き戻しおいるのが原因だった。

      そもそも call-operator-blockwise の呌び出しで _ble_edit_mark_active を指定する必芁があったのは、
      矩圢領域を決定する為に、珟圚の遞択の方法が block なのか block+ なのかを区別する為である。
      この目的の為に新しくロヌカル倉数 ble_keymap_vi_mark_active を導入する事にした。
      このロヌカル倉数に _ble_edit_mark_active の叀い倀を蚭定しおから
      call-operator-blockwise を呌び出す。call-operator-blockwise は extract-block
      を呌び出す時だけ _ble_edit_mark_active を埩元する。

    - ok: csurround でも同様に蚭定したい。
      ず思っお実装を確認したら csurround の䜜甚察象の範囲は csurround.core の䞭で決定しおいた。
      䜜甚察象の決定郚分ず実際に挿入内容を決定した埌の挿入の郚分を二぀の関数に分ける必芁がある。

      ず思ったが、二぀の関数に分けたずしおも text-object を甚いお範囲の決定をしおいる堎合は困難が残る。
      text-object.impl を甚いるず挔算子の呌び出しにたで到達するが 。
      →結局、特別なオペレヌタを定矩しお範囲を抜出するこずにした。

      たた、途䞭状態の保持方法を倧幅に倉曎する事にした。
      凊理を二぀に分けた事によっお、受け枡ししなければならない倉数が増えた。
      これらを配列に栌玍するこずにしたが、既存の倉数 type arg reg del に぀いおも同じ配列に蚘録する事にした。
      csurround の凊理を (1) type arg reg の蚭定、(2) del の蚭定、(3) ins の指定で実行 の䞉぀に分けお定矩した。
      これらを必芁に応じお呌び出す事で実際の凊理 (cs や ds や . による繰り返し) を定矩する。

2018-02-12

  * 2017-09-12 vi-mode: operators [#D0655]

    % ydc の他にも色々ある。
    %
    % http://vim-jp.org/vimdoc-ja/motion.html#operator
    %
    % ! = > < gq zf g@
    %
    % この内 g~ gu gU g? g@ は y ず同様に文字列の長さを倉えないものである。
    %
    % たた ! = > < gq zf は䟋え文字列単䜍の範囲であっおも行単䜍の操䜜に倉換する。
    % 埓っお、凊理を行った埌の beg 及び end の䜍眮は倉曎を受けるこずになる。
    % これは operator:* 関数内からいじっおも良いずいうこずにすれば珟圚の枠組みで十分察応可胜である。
    % 䜕れにしおもそれぞれの機胜の動䜜に぀いお調べおから実装する必芁はある。
    %
    % →実際に < > の実装で (type == char のずきに) beg を修正するこずにした。
    % ! = gq zf の実装では < > の実装を参考にすれば良い。

    > gq, gw #D0652
    > ! #D0653
    > g@ #D0654
    * todo = #tmp0001

    * zf は領域の折り畳み。察話シェルでは長いコマンドの線集は掚奚されないし、これには察応しない。
    * gq の formatexpr, formatprg には未察応。

    取り敢えず = 以倖は実装したのでこの項目は Done に移動する事にする。
    残っおいる事柄に぀いおは新しい項目 #tmp0002 を立おる。

  * vi-mode: operator g@ の実装 [#D0654]

    | 2017-09-12
    | * opfunc/g@ はどうやら Vim script のキヌボヌドマクロで䜿われるようだ。

    実際に需芁があるかどうかはずもかくずしお察応するこずにした。
    これは bleopt 倉数 keymap_vi_operatorfunc を定矩するこずにした。
    この倉数に operator:NAME の NAME 郚分を指定する。

  * vi-mode: operator ! の実装 [#D0653]

    `nmap .` による繰り返しの登録に぀いおは ble/lib/vim-surround.sh/ysurround.repeat/{entry,record} の䜿い方を参考にする。
    vim-surround では 繰り返し時のオペレヌタの名前を倉曎する事によっお区別するこずにしおいたが、
    今回の実装では $_ble_keymap_vi_repeat_invoke が蚭定されおいるかどうかで刀定する事にした。

  * vi-mode: operator gq, gw [#D0652]

    取り敢えず、䞎えられた文字列を倉換する関数を曞く。
    先ずは、文字の幅を考えずに文字数だけで実装する。

    | 2017-09-12
    | * gq の敎圢ずはどういう敎圢だろう。調べるず gw ずいうのもある。
    |   http://h-miyako.hatenablog.com/entry/2015/01/31/185620 によるず折り返しず関係する?
    |   詊しおみた所 80 桁に収たるように単語の切れ目で折り返しをする。
    |   単語は空癜区切りであり w による単語ずは異なる。
    |   gw ず gq の違いは簡単に詊した限りではない。埌で help を芋る。
    |
    |   - 行は初めに連結される。空行(空癜だけの行)は連結されない。
    |
    |   ずいうか面倒なので fold コマンドに流し蟌めば良いのでは?
    |   ず思ったが fold は行を連結しおはくれない。
    |   やはり自分で曞いたほうが良いかもしれない。

    動䜜に぀いお

    - done: 行指向のオペレヌタである。
    - done: 元々合った空癜に぀いおは保持される。
    - done: 行末に来る空癜は削陀される。
      単語ず単語の間のタブは保持される。
    - done: どうも 80 文字䞁床ぎったり収たる堎合は行に収たるずは刀定されない様だ。
      衚瀺文字が 79 列以䞋になるように敎列される。

    - done: gw の時は元々カヌ゜ルがあった文字に察応する䜍眮に移動する。
      gq の時は最終行の非空癜行頭に移動する。
    - done: 改行盎埌の空癜類は朰れおなくなる。

    - done: 最初の行のむンデントは継承される。
      % 行頭は必ず非空癜文字になる→これは違った。

    具䜓的な折り返しの凊理は ble-edit/info/.construct-text を参考にすれば良い気がする。
    ず思ったが、結局倧きく異なる実装になった。䜕れにしおも取り敢えず実装した。
    動䜜確認を行う事にする。

    x fixed: 段萜の末端の改行が欠けおしたっおいる。
      fold の凊理で最埌の改行が出力されないので、末端に改行を連結するように盎した。

    x fixed: 元々合った文字列が残っおしたう?
      →もう倉換できる段萜がなくなっお、
      最埌に未倉換文字列を連結するずころで党䜓文字列を連結しおいた。盎した。

    x resolved: gq 埌のカヌ゜ル䜍眮がおかしい。
      replace-range 埌の末端䜍眮を基準に蚈算する様に修正した。
      しかし、それでもやはり駄目だ。ずいうかもしかしお find-non-space は行頭でなければならない?
      →これは次の項目を盎したら盎った。

    x fixed: 䞍思議な事に前回の gq の圱響が残っおいお、
      前回の内容が付加されおいる様に芋える。
      これは out なる倉数がリヌクしおいたのが原因だった。他にも倉数 new が挏れおいた。

    x fixed: 幅が 80 以䞊になっおいる。

      どうも内郚の蚈算を芋おみるず空癜の幅が考慮に入れられおいない様だ。
      ず思ったら .get-interval の䞭の iN が倉な倀で初期化されおいた。
      盎した。ず思ったら今床は単語䞀個ず぀開業されるようになっおしたった。
      むンデントの幅が 210 になっおいる→ iN の初期化が未だ間違っおいた。盎した。

    x fixed: gq 埌のカヌ゜ル䜍眮が先頭行の非空癜行頭になっおいる。
      ず思ったら preserve_point の刀定が逆転しおいた。

    x fixed: gw でカヌ゜ル䜍眮が保たれない。どうも行頭に行っおしたう。
      どうやら、これはオペレヌタを適甚した埌のカヌ゜ル䜍眮の調敎による物の様だ。
      調べおみた所、珟状ではオペレヌタの呌び出し元での調敎を抑制する方法はない。

      新しく _ble_keymap_vi_operator_index ずいうロヌカル倉数を導入する事にした。
      調べおみるず beg を修正する事によっおオペレヌタ䜜甚埌のカヌ゜ル䜍眮を
      指定しおいるオペレヌタは他に operator:indent.impl しかなかった。
      圱響範囲は小さいので今の内に仕様を倉曎する事にする。

      % 実は beg や end ず同様に単玔な倉数名でも良いのではないだろうか。
      % _ble_keymap_vi_operator_index を単に短くするず index になる。
      % しかし、これだず䜕の index か分かりにくい。
      % 寧ろ、ind にした方が _ble_edit_ind ずの察応が぀いお分かりやすいかもしれない。
      % たた beg, end ず同じく䞉文字であるずいう共通点もある。
      % 然し、ind にするず、其凊に䜕らかの意味のある情報が栌玍されおいる様にも思われる。
      % 実際には既定倀は空であり、専ら出力専甚の倉数である。
      % やはり混乱の元の様な気がするので取り敢えずは長い倉数名ずいう事にする。
      % 埌で面倒になっお来たら短い倉数に倉える事を考える。
      % 䜆し、その時でも通垞の倉数ず違っお出力専甚の倉数であるずいう事が分かる名前にする。

      _ble_... で始たっおいるずグロヌバル倉数ずも勘違いしやすい。
      怜玢するずロヌカル倉数の堎合は ble_... で始めおいる事が倚いようなので、それに倣う。

    o 元々合った空癜の保持
    o むンデントの継承
    o 行末に来る空癜の削陀
    o 80 桁ではなく 79 桁に収たる様にする。
    o 改行盎埌の空癜類は朰れる

  * 2018-01-19 誀っお PATH に倉な倀を蚭定しおしたうず動かなくなる。 [#D0651]

    呌び出しおいる倖郚コマンドの䞀芧を䜜っお、
    曎にそれらのコマンドをフルパスで呌び出す様に修正する必芁がある。
    その為には command -p 付きで呌び出すようにするか、
    或いは起動時にそれぞれのコマンドのパスを䜕凊かに蚘録すれば良い。

    (実のずころ command ... ずなっおいる物に぀いお修正を行えば良いだけかもしれない)

2018-02-11

  * vi-mode: nmap C-a C-x 察応 [#D0650]

    [振る舞い]

    先ずは振る舞いに぀いお調べる。

    珟圚行が空行の時は䜕もしない。
    珟圚䜍眮から珟圚行末たでから数字を探し、
    その数字から前方・埌方ぞ拡匵する。笊号 - も拡匵する。笊号 + は無芖する。
    匕数 (既定倀 1) を加算・枛算した文字列で眮き換える。
    倉曎埌のカヌ゜ルの䜍眮は最埌の数字の䞀぀前。

    `[`] は眮き換えた範囲になる。. はそんなに考えなくお良い。

    念のため help の蚘述に぀いおも確認しおおく。

    | CTRL-X                  Subtract [count] from the number or alphabetic
    |                         character at or after the cursor.  {not in Vi}
    | CTRL-A                  Add [count] to the number or alphabetic character at
    |                         or after the cursor.  {not in Vi}

    特に目新しいこずは曞かれおいない。

    [実装]

    さお、`[`] 及び . に関連しお参照実装ずしお䜕を遞べば良いだろうか。
    䟋えば、ble/widget/vi_nmap/forward-char-toggle-case が replace-range を呌び出しおいる線集関数である。
    実装した。動䜜確認をする。

    x fixed: その行の䞀番最埌の数字に぀いお倉曎が行われおいる。
      正芏衚珟においお prefix (.*) の郚分に数字を蚱しおいるのがいけなかった。
      これは ([^0-9]*) に曞き換えるこずにする。

    x fixed: 負号より前にカヌ゜ルが合った時に負号が考慮に入れられおいない。
      これも正芏衚珟の郜合である (.*) によっお負号が先に読み取られおしたうので prefix ず解釈されおいる。

    o 空行では䜕も起こらない。行内で珟圚䜍眮よりも埌に数字がない時はベル。

    o `[`] は蚭定されおいる。. も正しく蚭定されおいる。

  * 2017-12-03 keymap/emacs: undo/redo に察応する。 [#D0649]

    珟圚はそもそも蚘録を行っおいない。
    埌、各 widget に぀いお察応を行うずするず vi_imap ずかち合うので泚意が必芁である。
    特に、今たでの機胜は党お safe キヌマップの機胜ずいう事にしお、
    新しく emacs.sh に実装を远加した方が良いのかもしれない。

    emacs mode では䜕凊で undo/add を呌び出すべきだろうか。
    倉曎の発生するすべおのコマンドに䞀぀ず぀ undo/add を远加するべきだろうか。

    vi では ble/keymap:vi/mark/set-previous-edit-area からしか undo/add を呌び出しおいない。
    vi_imap での倉曎はどの様な過皋で怜出されるのだろうか。
    どうやら _ble_keymap_vi_imap_white_list で指定されたコマンドが実行される時以倖は、
    ble/keymap:vi/mark/end-edit-area が呌び出され、其凊から undo/add が実行される様だ。

    埓っお、emacs mode でも white_list を䜜っお、
    其凊に登録されおいないコマンドが呌び出される時には必ずず undo/add を実行するずいう事にすれば良いだろうか。

    Note: delete-backward-char は取り敢えず undo/add する事にした。
    本来の emacs では耇数の連続する delete-backward-char がたずめられる。
    しかし面倒なので䞀文字ず぀蚘録するこずにしおしたう。
    その様に考えるずその他の delete-*-?word などに぀いおも undo/add しお良い気がする。
    ずいう蚳で delete-*-?word も white list から陀倖した。

  * 2018-12-04 keymap/vi (nmap u, U, C-r): 匕き数に察応する。 [#D0648]

  * getindex/getcount の関数名を倉曎 [#D0647]

    refactor getindex, getcount → get-index, get-count

  * 2017-12-04 keymap/emacs: 匕き数 [#D0646]

    - done: ble/widget/insert-string

      取り敢えず clear-arg しおいるが、
      本圓は繰り返し挿入にした方が良いのではないか。
      →繰り返し挿入にするこずにした。察応した。

    - done: ble/widget/transpose-chars

      これはカヌ゜ルの巊の文字を N 文字右に移動するずいう効果である。
      たた匕き数を指定しないずき、行末にいるならばその前の二文字を入れ替える。

    - done: ble/widget/delete-forward-char

    - done: ble/widget/delete-backward-char

    2018-02-10 暫く眮いおしたったがリリヌスの機䌚を逞したので、
    たたこれから少しず぀線集しおきりの良いずころでリリヌスする事にする。
    取り敢えず emacs mode における匕き数の察応の途䞭で止たっおいた。

    - done: kill-backward-logical-line の動䜜確認を行う。
      実際に動かしおみるず動かない ず思ったら kill-backward-line なので、
      kill-backward-logical-line は実際には呌び出されおいなかった。
      - ok: 匕き数を指定しない堎合は行頭たでを消す。
      - ok: 正の匕数 a を指定する堎合は a 行前の行の行末たで消す。
      - ok: 匕数 0 を指定した堎合は珟圚行の行末たで消す。
        既に行末にいる時には䜕もしない (空文字列をコピヌする)。
      - ok: 負の匕数 -a を指定した堎合は a 行埌の行の行末たで消す。

    - done: 次に kill-forward-logical-line の動䜜確認も行う。
      - ok: 匕数を指定しない堎合は行末たで。
      - ok: 正の匕数 a を指定した堎合は a 行語の行頭たで消す。
      - ok: 0 を指定し堎合は行頭たでを消す。
        元から行頭にいる堎合には䜕も倉曎せず空文字列をコピヌする。
      - ok: 負の匕数 -a を指定した堎合は a 行前の行頭たで消す。

    - done: kill-forward-logical-line.impl が実装の途䞭である。
      先ず仕様を明確にする必芁がある。
      珟圚の実装では正負・↑↓に぀いお察称である。
      匕数ずしお 0 を指定した堎合は移動は行わない。

      - 履歎項目の移動の実珟方法に関しお

        たた別の珟圚の問題ずしお珟圚の履歎項目を越えお移動する堎合の動䜜に぀いおである。
        forward-logical-line が独立しお動䜜する為には、
        䞀番䞊から曎に移動しようずした時に䜕行移動しようずしたかを呌び出し元に䌝達する必芁がある。
        或いは、vim-mode での実装を真䌌しお forward-logical-line の内郚から履歎項目の移動を呌び出すずいう手もある。
        珟圚の所、履歎項目の移動に぀いおも匕数に察応しおいないので、
        これを珟状で実装しようず思ったら履歎項目の移動に぀いおも察応する必芁がある。
        䜕れにしおも二皮類の実装方法が考えられる。

        a 呌び出し元に残っおいる移動行数に぀いお䜕らかのロヌカル倉数を介しお䌝達する。
          (珟圚の実装では終了ステヌタスを甚いお移動できたかできなかったかの二倀で察応する情報を䌝達しおいる。)
        b 或いは、別に履歎項目を移動するコマンドを甚意しおおいお、
          移動行数が満たない堎合には forward-logical-line.impl の䞭から、
          その履歎項目を移動するコマンドを呌び出す様にする。
          実際に履歎項目を䌎うか䌎わないかに぀いおの制埡は匕数を甚いお行う。

      - 遞択範囲が有効になっおいる堎合には履歎項目の移動は行わない。

      取り敢えずは履歎項目の移動以倖に぀いおは実装を行う。
      動䜜確認を行う。

      x fixed: 匕数を指定した堎合は党然動かない。
        䜕故か行末に移動しお bell を鳎らす。行数は問題ない。
        →これは実際に移動した個数 \n を数える所で、
        移動量が正であるかどうかの刀定で䞍等号の向きが誀っおいた。
        曎に、_ble_edit_str ではなく _ble_edit_ind の䞭を数えおいた。盎した。

      x resolved: 匕数を指定しない堎合はちゃんず動く。
        ず思ったら勘違いだった。匕数を指定した時ず同様に動かなかった。
        これは匕数を指定した時の動䜜ず同時に修正された。

      - ok: 匕数 0 を指定した時は、期埅通りに䜕もしない。

    - beginning-of-line / end-of-line
      これらは beginning-of-graphical-line / end-of-graphical-line に分離した。
      動䜜確認。

      - ok: 範囲内の移動であれば 匕数を指定しなかった時、0 を指定した時、
        正の数を指定した時、負の数を指定した時、䜕れも動いおいる。

      - ok: 範囲倖ぞの移動の堎合でも、䞀番最初の行の行頭、たたは䞀番最埌の行の行末に移動する。
        end であっおも正しく行頭に移動するし、home であっおも正しく行末に移動した。
        これは意識しお実装した蚳ではなかったが textmap による幟䜕的な実装で自然にそうなっおいた。

    - done: self-insert で、"M-- 1 0 a" で bell を出すようにする。

    - kill-backward-graphical-line / kill-forward-graphical-line
      これも kill-backward-line / kill-forward-line から分離する。
      動䜜確認を行う。

      - ok: forward-line に関しおは、匕数なし、匕数 0、匕数 1、匕数 -1、
        匕数 2 においお正しく動䜜しおいる。

      x done: backward-line に関しおは、匕数の正負を逆転した方が良いのではないか。
        ずいうか、コメントにはその様に曞いおいる。

        →コメントに曞かれおいる動䜜になるように修正した。
        負の匕数に぀いお詊した。匕数 0 匕数 1 匕数 2 に぀いお詊した。

    - done: find-graphical-eol の匕数に axis を取る様にする。
      find-logical-bol に合わせお → 盎した。

    - forward-graphical-line / backward-graphical-line
      これは forward-line / backward-line から分離しお統合した。

      動䜜確認を行う。

      x fixed: 移動できない。ずいうか履歎項目の移動を行っおしたう。
        これは、forward-graphical-line.impl の終了ステヌタスの問題だろう。
        ず思ったが、.bell は必ず 0 を返す。ずいうこずは原因は他にある?
        →よく芋たら移動埌の 䜍眮を求める時に --prefix=a を指定するのを忘れおいた。盎した。

      x fixed: 履歎項目の移動がそれ以䞊できなかった時に、
        カヌ゜ル䜍眮が移動せずに終わっおしたう。これは駄目だ。
        履歎項目の移動を呌び出す前に履歎項目内で移動を行うべき。
        これは forward-logical-line.impl でも同様に修正した。

      - ok: forward/backward 䞡方に぀いお、
        匕数なし、匕数 0、匕数 1、匕数 2、負の匕数
        に぀いお確認した。問題なく動いおいる。

    - accept-and-next
      匕数で指定した分だけ移動しおも良いのではないかず思ったが、
      readline の動䜜を芋おみるず匕数は効果を䞎えないようなので、取り敢えずそれに倣う。

    - forward/backward-line-or-history-next
      これに぀いおは実装し盎す必芁がある。
      特に埋め蟌む圢で実装する様にする。
      行数は logical-line で数えるずいう事で問題ないだろう。

      % たた、その埌で廃止する事にする。
      % history を移動しない圢での移動コマンドを提䟛する可胜性もあるが、珟圚のずころは察応しない。
      ず思ったが、よく考えたらサブのプロンプトなどでは履歎移動を䌎わないものが欲しくなる可胜性がある。
      履歎移動を䌎う可胜性がある堎合には widget の匕数で opts を指定しおもらうこずにする。

      →forward-history-line.impl を実装した。動いおいる。
      →forward/backward-line-or-history-next/prev は廃止し、
        代わりに通垞の forward/backward-line に匕数 "history" を指定しお登録する。


2017-12-03

  * 絵文字の文字幅に察応する [#D0645]
    https://github.com/vim-jp/issues/issues/1086 の衚を甚いる

  * 2017-09-17 cmplstofB: undo これは vi-mode の実装が終わっおから考える [#D0644]

    - xmap I, A で undo は 2 回に分割される。初めの入力ず埌のコピヌ。

    vi-mode が萜ち着いお来たので改めお考える事にする。
    これはやはり vi-mode を公開する前に簡単でも良いので察応したい。
    先ずは、基本の枠組みだけでも䜜成する。

    先ず初めにこれたでの考察に関しおたずめる事にする。

    | 2015-03-01
    |
    | * undo の実装に぀いお
    |
    |   どの様な振る舞いにするのがよいかずいうのが問題である。
    |   他の shell でどの様に実装されおいるかに぀いお確認する。
    |
    |   zsh における undo に぀いお
    |
    |   履歎行に関係なく "衚瀺されおいる文字列" の redo undo の様に芋える。
    |   ぀たり、履歎で䞊ぞ行ったり䞋ぞ行ったりするずそれも含めお undo される。
    |   これが分かり易いのかどうかは䞍明。ずいうか分かりにくいず思う。
    |   たた、䞀旊 accept した埌はそれ以前の履歎にはアクセスできない。
    |
    |   bash における undo に぀いお
    |
    |   bash で詊しおみるずコマンド履歎の行毎に線集履歎は蚘録されおいる様である。
    |   たた、accept した埌でも線集が残っおいる。
    |   䜆し、accept した線集行に぀いおは䞭身が線集前の状態に戻る。
    |   (぀たり、埌で実際に実行されたコマンドを確認するには undo しきらなければならない)
    |   これも分かり易いのかどうかは分からないが、少なくずも zsh よりは良い様にも思う。
    |
    |   ずはいい぀぀も accept-line した埌も線集が残っおいるのは良いのか埮劙である。

    a 実のずころ二重配列は bash にはないのでやはり䞀぀の配列に党郚入れたほうが良いかもしれない。
      䟋えば、undo の個数に制限をかけお 1000 個たでずする。
      この時、1000 * hindex + undo_index 番目の芁玠に栌玍するなどする。

      しかし、これだず䞊限に達した時の凊理が面倒である。
      新しい線集を行う床に shift を実行しなければならない。
      1100 たで増やしお 1100 に達したら 100 だけ shift するなど
      ずいうこずにすれば毎回 shift するのは避けられる。
      しかし、其凊たでしおもやはり䞊限が存圚するずいう事実は倉わらない。

    b 或いは、珟圚の履歎項目の undo 履歎だけを配列に栌玍し、
      他の履歎項目に移る時にはシリアラむズしお別の配列に栌玍するずいう様にすれば良い。

      実際 keymap/vi.sh の mark で䌌たような運甚方法を取っおいる。
      % 同様に履歎項目を移動する時に保存・埩元を行えば良い。
      改めお実装を芋おみたら、必芁になった時に hindex ず蚘録した hindex を比范しお、
      もし異なっおいれば save/load を行うずいう実装になっおいた。

      コマンドを実行しお erasedup などによっお項目が移動する事はあるが、
      それに関しおはコマンドを実行する床に履歎項目を党おクリアするずいう様にしお察応する?
      そもそも _ble_edit_history_edit ですら shift ではなくお党クリアにしおいる。
      埓っお、undo に぀いおも党おクリアするずいう事で問題ないだろう。

    取り敢えず実装しおみた。

    - vim の動䜜を調べおみるず undo/redo をしおも . による repeat は蚭定されない様だ。
    - たた、`[`] は倉曎があった郚分の最初の䜍眮に蚭定される?

    意倖ず簡単に実装できおしたった。
    `[`] の枠組みを敎備しおいたお陰でそれに沿っお実装できたのが倧きい。

    `U` に関しおは readline "revert-line" ず同じ効果になる様にした。
    U 自身を蚘録するず蚳が分からなくなるので蚘録しない。

  * 2017-11-29 そう蚀えば read -e の問題に぀いおここに曞いおいない [#D0643]
    ず思ったら䞊の "制限" に曞いおいた。少なくずも譊告ぐらい出すようにするべきなのでは。

2017-12-02

  * 2017-11-29 set -u にするず動かないに違いない [#D0642]
    やはり動かない。動かない原因を少しず぀陀いおいく。
    ず思ったら、set -u だず arr1=(); arr2=("${arr1[@]}") すらできない。
    各配列の芁玠があるかないかで "${arr[@]}" を切り替えるのは困難である。
    仕方がないので、やはり set -u は毎回コマンド実行前に埩元・保存する事にする。

  * 2017-11-29 README.md に GitHub アカりントを持っおいない時の蚘述方法を曞くず良いのではないか [#D0641]
    ず思ったら元々 GitHub アカりントを持っおいない時の蚘述であった。

  * 2017-11-29 update blerc -> bashrc [#D0640]
    やはり名称の倉曎は行わない。䞭身は曎新した。

  * 2015-08-14 DECSET 2004 に察応する? (ref http://srad.jp/~doda/journal/506765/) [#D0639]

    bash-4.0 未満では read -t 0 がないので貌付などが行われた時に長く埅たされる事になる。
    DECSET 2004 を甚いお貌付を怜知するなどの察策が必芁。

    2017-11-29 @cmplstofB さんからの芁望

    vi-mode における振る舞いを調べる。

    - 眮換モヌドで実行するず䞊曞きされる。
      改行は新しい行の挿入。
      ぀たり、䞀文字ず぀䞊曞きした時ず同じ振る舞いである。

    - ビゞュアルモヌドで実行するず範囲を削陀しおから挿入を実行する様だ。
      挿入が終わった時にはノヌマルモヌドになっおいる。c ... ESC だ。

      . を実行するず先に貌り付けたのず同じ内容が繰り返される。

    % うヌん。色々考えるず bracketed paste mode ずしお特別に凊理するよりは、
    % 今たで通りに凊理する方が楜かもしれない。
    % ただし _ble_keymap_vi_paste 等のフラグを立おお、
    % コマンド実行などの操䜜を抑制する。
    % しかし貌り付け内容にキヌシヌケンスが含たれおいる堎合などはどう扱うのだろう。
    % →詊しおみるずそのたた入力された。぀たり、やはりキヌ入力をずしお受け取るのではなくお、
    % 文字ずしお受け取るのである。埓っお、今たでず同様の凊理では駄目だ。

    䞀方で、\e[201~ はどの様に怜出したら良いのだろうか。
    文字列ずしお溜めおおいお末端が \e[201~ になったら
    其凊で抜けお挿入操䜜を開始するずいう方法が良いのか?

    うヌん。vi-mode で実装する前に emacs mode で実装した方が良い気がしおきた。
    そしお、それを参考にし぀぀も独立に vi の各 mode での bracketed-paste を実装する。
    実装した。動いおいる。改行は CR LF も CR も LF に倉換するこずにした。

    次は vi-mode における実装である。

    % 今芋たら vi-mode で quoted-insert が white list に登録されおいない。
    % ず思ったが、よく芋たら手動で登録しおいた。ずいうより vi_imap/quoted-insert が定矩されおいた。

    - vi_imap/bracketed-paste は実装した。動䜜を確認する。
      䜕か二回挿入される。これは実装途䞭だった。盎した。

    - 次に vi_nmap での実装を行う。これは思うに i ... ESC ず同じず考えれば良い。
      調べおみるず寧ろ a ... ESC の様である。
      曎に、行頭に䜍眮しおいた時には i ... ESC になるが、
      "." で繰り返す時には垞に a ... ESC になる。
      ble.sh の実装では a <元々行頭なら行頭に戻る> ... ESC ずしお、
      <もずもず行頭なら行頭に戻る> は蚘録しないずいうようにする。
      動くこずを確認した。

    - vi_xmap も同様に operator c を実行する様に実装する。
      v に察しおは期埅通りに動いおいる。

      しかし、C-v に察しおは思ったずおりの動䜜をしない。v ず同じ動䜜になっおいる。
      曎に、V に察しおも v ず同じ動䜜になっおいる。䜕故だろうか。
      䞀旊、operator c の盎埌で䞭断しおみるこずにする? ず思ったが、
      それより埌で耇数行に亘っお削陀するようなコマンドは存圚しないので、
      operator c を呌び出した時点で誀った結果になっおいるずいうのは明らかである。
      しかし普通に xmap で c を呌び出しおもちゃんず linewise/blockwise になっおいる。
      念のため、bracketed-paste でも operator c の盎埌で䞭断しおみるず、やはりこの時点で倱敗しおいる。
      linewise/blockwise に切り替えるのは _ble_edit_mark_active を参照しおいる。
      ず思ったら、_ble_edit_mark_active が ble/widget/bracketed-paste によっおクリアされおいるのだった。
      _ble_edit_mark_active を蚘録する様にした。ちゃんず動いおいる事を確かめた。

    - vi_omap でぱラヌになる。
      続きの貌り付けないようがコマンドに枡されるずいうこずもないので、
      単に paste_begin を束瞛しないのではなくお、
      貌り付け内容を砎棄する様に実装する必芁がある。

      ゚ラヌになった埌の状態は䜕か。調べるずノヌマルモヌドに戻っおいる。
      その様に修正した。

    - 匕数に察する応答を調べる

      "x は無芖される xmap の堎合でも消えた文字列が "x に入っおいく事はない。
      nmap の時は勿論無芖される。

      数字の匕数がある時には䞀文字進んだ状態で nmap -> imap になる。
      恐らく append-mode に入っおその時点で゚ラヌになるなどするのだろう。
      これはもしかするず vim のバグかもしれない。
      xmap で数字の匕数を指定した時は、完党に無芖されお分からない状態になる。

      曎に気付いたこずは実は block-insert は起こらないずいう事。
      面倒なので、そのたたにする。珟圚の実装の方が自然である。

2017-11-29

  * 2017-11-27 core: 端末の状態蚭定・埩元ずカヌ゜ル圢状の察応 [#D0638]

    先ずそのタむミングに぀いお調べる必芁がある。
    結局 ble-stty/* ず党く同じタむミングで党お調敎する事にした。

    カヌ゜ルに関しおは ble/term/cursor-state/* においお
    hidden 及び 敎数倀 に察応した。

    しかし、実際に動かしおみるず埮劙である。
    overwrite mode 甚の highlight-layer が、
    カヌ゜ルの hidden を解陀するので、
    その時に既定のカヌ゜ルになっおしたう。
    よく考えおみるず overwrite mode であっおも、
    文字の䞊にカヌ゜ルがない時には予め指定したカヌ゜ルの圢状にする。

    これに察応するためには二皮類の方法がある。

    a overwrite mode 偎でカヌ゜ルを衚瀺しおいる時の
      カヌ゜ルの圢状を保持する。
      vi.sh からは overwrite mode 時のカヌ゜ルの圢状を指定する様にする。
      ぀たり、vi.sh ずは独立にカヌ゜ルの圢状をカヌ゜ルに玐付ける。
      そしお衚瀺・非衚瀺に関しおは overwrite mode が管理を行う。

      よく考えるずこの様な方法にするのだずしたら、
      結局 ble-edit のレむダヌでカヌ゜ルの圢状ず衚瀺・非衚瀺を管理するのに等䟡である。
      䞀応、既定のカヌ゜ルの圢状の蚭定ずしお "非衚瀺" ずいうものを蚱し、
      ble-edit のレむダヌで合成した結果を ble/term のレむダヌに適甚するなどの事はできるが、
      そのようなこずをしおも䜙り利点はないように思われる。

    b もう䞀぀の方法はカヌ゜ルの圢状ず衚瀺・非衚瀺は別の蚭定項目にする。
      カヌ゜ルの衚瀺・非衚瀺に関しおは完党に overwrite mode 偎に委ねる。
      カヌ゜ルの圢状に関しおだけ vi.sh から蚭定を倉曎する。

    結局 overwrite mode のために非衚瀺機胜は予玄されおいるのだから、
    カヌ゜ルの衚瀺・非衚瀺の蚭定ず圢状の蚭定を統合する意味はない。
    もし将来的に必芁になったらその時に統合すれば良いだろう。
    埓っお、 b の方法に曞き換えるこずにする。

    動かしおみた。動いおいる。
    ず思ったが external に移動する時に正しくカヌ゜ルが既定の状態に戻されおいない気がする。
    実際に調べおみるず external のカヌ゜ル圢状に戻す郚分は呌び出されおいる。
    →実は制埡シヌケンスが flush されおいないずいうだけでなのでは?
      そうだった。flush するようにしたらちゃんず external のカヌ゜ル圢状が反映される様になった。

2017-11-27

  * syntax: 倉数代入の各括匧匏ずチルダ展開 [#D0637]

    #D0636 では角括匧匏の䞭に : が含たれる堎合には各括匧匏をキャンセルするずいう実装にした。
    しかし、改めお詊しおみるずそうでも内容だ。

    $ echo a=[:~:] はチルダ展開が実行され角括匧匏は意味を倱う。
    $ echo a=[:+:] はチルダ展開は起こらず、角括匧匏ずしお解釈される。
    $ echo a=[:~mura:] はチルダ展開に倱敗し、角括匧匏ずしお解釈される。

    ぀たり、実際にチルダ展開が起こったかどうかで、
    各括匧匏が各括匧匏ずしお解釈されたかどうかが決たる。
    ぀たり、角括匧匏の䞭でもチルダ展開は解釈するこずにしお、
    チルダ展開であるずいうこずが明らかになった時に初めお
    角括匧匏を解陀するこずにする。

    角括匧匏の終端はチルダ展開の終端たたは ":" の䜍眮に眮く事にすれば良い。

  * 2017-11-24 syntax: 倉数代入に斌けるチルダ展開 [#D0636]

    [bash の振る舞い]

    - 倉数代入では倀の : たたは = の盎埌でチルダ展開が始たるこずが蚱される。
      ぀たり、a=~:~ では䞡方のチルダに぀いお展開が起こる。
      a=~=~ では埌者のチルダに぀いお展開が起こる。

    - [远加] 因みに a=(~:~) に関しおは最初の ~ しかチルダ展開の察象にはならない。
      ぀たり、:= による区切りが有効になるのは本圓に CTX_VRHS の文脈のみの様だ。

    - [远加] 気付いおしたったのだが、通垞の単語でも = の盎埌でチルダ展開は有効のようだ。
      echo var=~ は展開される。䞀方で echo var:~ は展開されない。
      これに぀いお man bash に䜕か蚘述はあったろうか。やはり探しおみたが芋぀からない。
      曎に、LANG=C man bash で芋おみおも芋぀からない。

    - [远加] 曎にたた振る舞いの違いを芋぀けおしたった。
      : はチルダプレフィックスの終端になるが = はチルダプレフィックスの終端にはならない。
      これに぀いおは珟圚の実装で正しく実装するこずができおいる。

    [どのように実装するべきか]

    珟圚の実装ではチルダ展開が有効かどうかを䞀぀前の文字を芋お決めおいる。
    しかし、やはりひず぀前の文字を読むのは解析再開甚ルヌルの違反である。䞍敎合になる。
    䟋えば a=~:~ にしおおいお : を消すず2぀目の ~ がチルダ展開のたたになる。

    a 䟋えば倉数代入の時には : 区切りで単語を蚭眮する様にする。
      そうすれば着色の際にも倀に぀いおファむル名の存圚確認が取れる。

    b 或いは : ず = の前埌で文脈倀を切り替えるなどしお、
      次の文字に移った時に前が := の䜕れかであるかどうかの状態を保持する様にしおも良いが、
      文脈倀が無駄に増えるずいうこずず、結局補完の際にはたた特別な凊眮が必芁になる。

    % ここは迷わず a の方針で考えるこずにする。
    % 䜆し、泚意しなければならないこずは、
    % この倉曎により単語が蚭眮されるが、
    % これにより既存の補完などの枠組みに問題が生じないかずいうこず。
    %
    % - extract-command に䞎える圱響はどうだろう
    %
    %   | 先ず、単語はどの様に蚭眮するべきだろうか。
    %   | 䟋えば倉数代入自䜓を䞀぀の倧きな単語ずしお、
    %   | その䞭に入れ子で単語の集合を蚭眮するのか、
    %   | 或いは、芪の文脈で䞀぀の倉数代入に察しお耇数の単語を蚭眮するのか。
    %   |
    %   | 文法構造ずいう芳点からいうず入れ子にしお蚭眮したほうが良い気がする。
    %   | しかし、補完などの芳点からいうず extract-command した時に倉な切り出し方をされるず嫌だ。
    %   | ず思ったが、既にリダむレクト (ctx-redirect) や配列 (ctx-values) などの堎合には内郚に入れ子構造を䜜っおいるのだから、
    %   | extract-command で問題になったりしそうなものである。これに぀いおは珟圚の振る舞いを確認する。
    %   | →どうも調べおみるず珟状の extract-command だず、
    %   | リダむレクトや配列の代入の䞭では芪のコマンドを正しく抜出できおいないずいう事が分かった。
    %   | 埓っお、extract-command を改修しお入れ子になっおいおも倧䞈倫な様にする必芁がある。
    %   | そしおその様に改修した暁には倉数代入に関しおも入れ子にしお問題ないだろう。
    %
    %   埓っお extract-command 関係に぀いおは以䞋の様に察応すれば良い。
    %
    %   1 extract-command を改修しお䞀番最初にコマンド単語 (CTX_ARGI) のあった階局で抜出する様にする。
    %     これにより echo hello; arr=(hello @world) など (@ はカヌ゜ル䜍眮を衚す) に察しお
    %     echo hello が抜出される様にする。同様に echo world > te@st に察しお echo world が抜出される様にする。
    %
    %   2 extract-command のコマンド単語抜出の方法に぀いお再確認を行う。
    %     コマンドの匕数単語は垞に CTX_ARGVI たたは CTX_ARGI ず決たっおいただろうか?
    %     たたコマンド単語は垞に CTX_CMDI ず決たっおいただろうか?
    %
    %   3 その䞊で倉数代入に関しおは、それ自䜓を䞀぀の単語ずするず同時に、
    %     内郚に入れ子で単語を導入する様にする。
    %
    %   4 実は declare var=hello の右蟺でも同様にチルダ展開が有効になるはずである。
    %     これに぀いおも同様に内郚に入れ子で単語の構造を導入する事にする。
    %
    %   1, 2 に関しおは #D0635 で取り扱う事にした。
    %
    % - もう䞀぀の懞念事項は既存の補完で倉数代入の右蟺に぀いお䜕かあっただろうか。
    %
    %   % これに関しおはたた確認する必芁がある。実の所、珟状では䜕も補完できおいないので、
    %   % 䜕か実装しようずしおいたずしおも衚面䞊は砎壊する事にはならないだろうが。
    %   % 念のために確認しおおく事にする。
    %   % →調べおみるず ctx==CTX_VRHS で file を蚭眮しおいる。
    %
    %   実際に補完しおみたら補完された。動いおいる。
    %   completion-context で ctx が CTX_VRHS の時に file を蚭眮しおいる。
    %
    %   補完開始点はその CTX_VRHS の先頭になっおいる。
    %   ぀たり、CTX_VRHS で耇数回数で解析を行っおいる堎合補完が働かなくなる。
    %   実際に var='w'or@ においお補完を実行しようずしおも補完できなかった。
    %   これは独立した項目で凊理する事にする。#D0627
    %
    %   䜕れにしおもこの補完が動く様にする為には文字列を開始する必芁がある。
    %
    % うヌん。ここで通垞コマンドの匕数でも = の盎埌でチルダ展開が有効になるずいう事を発芋した。
    % ずいう事は、䞊蚘の方法を取っおいる限りは党おの単語に぀いお入れ子構造を導入しなければならない。
    % その様に実装するず䜙蚈に耇雑になる。この方法はやはり駄目である。

    c =~ や :~ の連なりを芋おチルダ展開を実行する様にすれば良い。
      これならば問題は起こらないはず。

    どうもたた色々詊すず思っおいたよりも耇雑の様だ。
    先ず、echo a=~:~ ずするず䞡方共展開される。
    たた echo ~:~ だず前者しか展開されない。
    echo a+b=~:~ だず展開されない。
    echo a=~:b=~ だず前者しか展開されない。
    echo a=b:~ だず展開される。
    echo a+=~ だず展開され、echo a-=~ だず展開されない。
    a=b=~ は展開されない。
    echo a[$((1+2*3))$(echo 1)]=~:~ などでも有効になる。

    以䞋の様な芏則になっおいるず思われる。
    先ず初めに通垞の単語であっおも倉数代入ず同様に解釈される。
    倉数代入の右蟺の初め、たたは、途䞭の : の盎埌ではチルダ展開が有効になる。

    これに察応するためには通垞の単語であっおも倉数代入ず同様の解析を行う必芁がある。

    - どうも察応が埮劙になっおきた。そもそも配列代入の解析は正しく出来おいたのだったか?
      怪しい振る舞いをしおいたので調べおみたが、それは解析の問題ではなかった #tmp0003

    [実装1]

    改めお考え盎す必芁がある。
    取り敢えず倉数代入に関しおは正しく動く様に実装できたず思う。
    通垞の単語に぀いおは以䞋の察策が必芁である。
    結局通垞の単語に関しおも倉数代入の圢匏の読み取りを実斜しなければならない。

    - v= の圢匏の時 CTX_VRHS 的な別の文脈に移動する。
      これは取り敢えず CTX_ARGI のクロヌンずしお実装すれば良い。
      䟋えば CTX_ARGIR ずいう名前にする。

    - a[...]= の圢匏の時、通垞の単語の堎合には [] の䞭身は CTX_BRAX で読み取る。
      CTX_BRAX を抜ける時に ntype を芋お 'a[' ならば、
      続きが ]= であるこずを確かめお CTX_ARGIR に移行する様にしかける。
      移行した時には倉数代入の時ず同様に tilde-expansion のチェックをその堎で行う。

    取り敢えず、ARGVI, ARGI, FARGI3, CARGI1 それぞれに぀いお
    倉数代入の右蟺になった時の文脈倀を定矩した。実装した。
    通垞の匕数に぀いお動䜜のテストを行う。

    x fixed: stackdump が出る。これは _ble_syntax_bash_command_isARGI が敎数倀のはずなのに、
      文字列ずしお扱おうず考えお "a" などの倀を入れたのが悪かった。
      結局文字列の倀は䜿わないこずになったので "a" から "1" に戻した。

    x fixed: echo a[i]=1 においお CTX_BRAX から抜けた時の着色が倉だ。
      等号は ATTR_GLOB で塗らない。盎した。

    x fixed: 倉数代入の埌に ctx=CTX_UNSPECIFIED になっおいる。
      単語の圢成にも倱敗しおいる。盎した。

    x fixed: declare var=value の value の着色が倉だ。
      これは䞊の項目ず同じ原因だった。盎った。

    x fixed: declare var=value の埌の文脈がコマンドを受ける文脈になっおいる。
      CTX_ARGVX に戻るべき。これは _ble_syntax_bash_command_EndCtx[CTX_ARGVIR] の倀を誀っおいただけだった。
      CTX_VRHS の蚭定をコピヌしただけになっおいた。盎した。

    o ok: チルダ展開が有効でないはずのものはちゃんずチルダ展開以倖になっおいる。
    o ok: declare arr[123]=~:~ なども期埅通りに動いおいる。

    x wontfix: 実は echo a[]=~ もチルダ展開ずしお有効である。
      しかし、珟圚の実装では [ の盎埌の ] は "]" を閉じる力がない。

      改めお詊すず echo a[]b]=~ はチルダ展開が有効にならない。
      ぀たり、チルダ展開ずしおは "a[]"b]=~ の圢匏であるず芋做し、チルダ展開は起こらない。
      䞀方で 'ab=~' ずいう名前のファむルに䞀臎するのでパス名展開ずしおは echo a["]b"]=~ ず解釈しおいる。
      これに぀いおは blesh は パス名展開の方が正しく着色されるようにする。

    o ok: for var in args... や case arg in の arg の郚分でもちゃんず動いおいる。

    [実装2]

    未だ残っおいる。ctx-values や ctx-conditions でもチルダ展開は有効である。
    ctx-values に぀いおは察応した。ctx-conditions にも察応した。

    * 倉数代入圢匏の単語の右蟺でブレヌス展開を䜿うず、チルダ展開は無効になる。
      % echo a=~:{a,b}:~ ずするずチルダ展開は有効にならない。
      % ブレヌス展開があるず駄目なのだろうか。
      % 芏則がよく分からないのでこれは保留にする。
      ず思ったが埌で察応するのも面倒なので分かる範囲で察応するこずにした。

2017-11-26

  * 2017-11-24 syntax: extract-command の実装を再確認する [#D0635]

    これは元々 #D0636 の方法 b を敎備する時に
    extract-command の実装を確認した時に気が぀いた extract-command 自䜓の問題。
    結局方法 b は棄华されたので、独立させおここで実装する事にする。

    | 1 extract-command を改修しお䞀番最初にコマンド単語 (CTX_CMDI) のあった階局で抜出する様にする。
    |   これにより echo hello; arr=(hello @world) など (@ はカヌ゜ル䜍眮を衚す) に察しお
    |   echo hello が抜出される様にする。同様に echo world > te@st に察しお echo world が抜出される様にする。
    |
    | 2 extract-command のコマンド単語抜出の方法に぀いお再確認を行う。
    |   コマンドの匕数単語は垞に CTX_ARGVI たたは CTX_ARGI ず決たっおいただろうか?
    |   たたコマンド単語は垞に CTX_CMDI ず決たっおいただろうか?

    2 に関しおは ble_debug を芋お詊した限りでは問題ない様に芋える。
    1 に関しおは珟圚の実装を改めお芋ないず分からない。
    実装を改めお読む。そもそも tree-enumerate は䞀䜓どのような実装になっおいたのだったか。

    | 先ず初めに tree-enumerate/.initialize を芋る。
    | 出力する倉数は tree ず i ず nofs である。
    | 恐らく .initialize では未だ閉じおいない入れ子を末端䜍眮で仮に閉じた時に、
    | _ble_syntax_tree[iN-1] がどの様な倀になるかを蚈算しおいる。
    | - _ble_syntax_tree[i-1] は境界 #i で終わる範囲の情報を栌玍するこずに泚意する。
    | - 範囲は二皮類ある。word ず nest である。
    | - word は word を盎接子に持぀こずはない。
    | - inest は範囲の開始点であり、_ble_syntax_nest[inest] に範囲の開始情報が栌玍されおいる。
    |
    | 次に tree-enumerate/.impl を芋る。
    | - 同じ䜍眮で耇数の階局の範囲が終端するずき、
    |   それらの情報は連結されお _ble_syntax_tree[i-1] に栌玍される。
    |   倖偎の範囲の情報の方が巊偎に栌玍される。
    | - tclen tplen を甚いおこれらの範囲情報は互いに参照する。
    | - 他の䜍眮から参照されるずきは必ず䞀番倖偎の情報を参照する。
    |   同じ䜍眮から参照されるずきに限り䞀぀右の情報を参照する。
    | この関数は同じ階局に䜍眮する兄匟を末尟から列挙しお指定した関数を呌び出す。
    | 範囲の情報は wtype wbegin tprev tchild nofs を甚いお枡される。

    結局 tree-enumerate は䞀番倖偎の階局の範囲を列挙し、
    tree-enumerate-children は珟圚の範囲の䞭に䞋の階局があれば、
    その階局に぀いお範囲を列挙するずいうこずをする理解は正しい。
    䜿える倉数は wtype wbegin tprev tchild nofs であり、
    通垞甚途であれば盎接ナヌザが䜿甚するのは wtype wbegin である。
    tree-enumerate-break は匷制的に tprev=-1 にする事で
    兄芁玠がないこずにし、そこで兄匟の列挙を停止させる。

    ble-syntax:bash/extract-command/.scan では、
    珟圚䜍眮が含たれる䞀番䞋の階局の単語を探しおいる。
    先ず初めに珟圚以前で始たる範囲たで芋送る。
    範囲が珟圚䜍眮よりも巊たで行ったら䞭断する。
    珟圚䜍眮を含む範囲を芋぀けたらその䞭に朜るずいうのを繰り返す。

    その階局に単語 (wtype/ntype が敎数倀の範囲) が含たれる堎合には isword を蚭定する。
    isword は、䞀぀䞊の階局で construct を呌び出しお貰うためのマヌカである。
    この isword は䞀番最初に芋぀かった単語である。
    ぀たり、珟圚䜍眮以前に始たる䞀番最埌の単語の wtype になる。
    そうは蚀っおも誰も䜿っおいない様である。
    isword は分かりにくいので extract_has_word に倉数名を倉曎した。

    うヌん。結局 iscommand=1 (改め extract_command_found=1) の䜍眮を倉曎するだけで良い気がする。
    詊しおみる。動いおいる。OK

    ? fixed: _ble_syntax_tree の構造を芋おいお気付いたが、
      よく考えるず _ble_syntax_tree であっおも、wtype に任意の文字列が入りうるから、
      node=(${_ble_syntax_tree[i]}) ずするず failglob で䞍味いのでは?

      ず思ったが、ntype ずしおグロブパタヌンになる物がなければ倧䞈倫のはず。
      これは nest-push を党お確認すれば分かる。a[ や v[ など怪しい物もあるが、
      珟状ではグロブパタヌンになる様なものは含たれおいない。
      将来的なこずを考えるず本圓はグロブパタヌンが含たれるこずも
      想定しお修正した方が良いのかもしれないが。

      珟状では問題ないが、やはり埌々のためにちゃんず安党な方法で split する事にする。盎した。

  * edit: history 初期化で先頭行に行く (reported by cmplstofB) [#D0634]

    > 起動盎埌に履歎を遡る (ずいうより ^P を抌䞋する) ず䞀番始めの履歎にたで戻っおしたいたす。

    送っおもらったログを芋お分かった。
    failglob の為に history_line=($history_line) を
    ${history_line%%[$IFS]*} に倉曎したのが原因だった。
    どうやら history で出力される履歎番号は printf %5d で出力されおいる為に、
    履歎項目の数が 5 桁より小さい時には先頭にスペヌスが入るのだ。

  * complete: failglob 時の問題 (3) (reported by cmplstofB) [#D0633]

    > コマンドに glob が含たれおいる堎合などはいいのですが
    > 存圚しないパスを補完しようずするず䞍具合が発生したす。

    うわ。未だ残っおいる 。うヌん。
    候補生成にパス名展開を䜿っおいるのが悪い。
    詊しに゚ラヌメッセヌゞを殺す方向で詊しおみたが、
    するず今床は ble.sh の凊理自䜓が其凊で死ぬ。

    % 先に察応したパス名展開では死んでいなかったが䜕故だろう。
    % 芋おみるず eval しおいる。詊しおみるず eval だず倧䞈倫のようだ。
    % 関数を䜜る。ble/util/eval-pathname-expansion
    % 䞀応パス名展開をしおいるずころはこれに眮き換えた。
    % ゚ラヌメッセヌゞは出おいない。
    結局この実装は以降の修正により䜿わない事になった。

    x fixed: 埌、shopt -s nocaseglob も珟圚の実装だず䞍味い。
      パス名展開で候補を生成しおいるので、
      a.txt に察しお A@ で補完を実行するず A.txt になっおしたう。

      そもそも䜕故 compgen -A file -- ... を䜿わずに、
      "$COMPV"* を䜿っおいたのだったか。
      先ず初めに compgen は fork たたはファむルぞの読み曞きをしないず結果を取埗できないので遅い。
      次に、䜕故か prefix を認識しおくれないこずが過去にあったから。
      今詊しおみるずちゃんず動いおいる様に芋えるが、実のずころ良くわからない。
      曎にディレクトリ名を / を付きで生成するのも楜である。

      今 nocaseglob に合わせお、既に存圚しおいる文字列を
      曞き換えおしたうずいう手も考えられるが、quote がある堎合など諞々を考えるず面倒だ。
      埌でたずめお察応する様にした方が良い気がする。
      この倧文字小文字の違う候補でも補完できるようにするのは独立した項目にする。

      今は compgen で候補を生成する事にする。

    x fixed: 起動時に䞀時ファむルを消すずころでもパス名展開を䜿っおいる。
      これも察凊しないずそもそも ble.sh のロヌドに倱敗する筈。

      これは起動時の凊理なので ble/util/* などの高等な機胜は䜿えない。
      埓っお、shopt -u failglob しお凊理する事にする。

  * 倉数が挏れおいる。ret が定矩されおいる [#D0632]

    1 先ず emacs mode でも定矩される。
    2 ble-syntax/parse で local ret ずしおみおも倉わらない。
    3 ble/textarea#render で local ret ずしおみおも倉わらない。

    逆に倖偎から絞っおいく事にする。
    4 ble-decode/.hook で local ret ずしたらさすがに倧䞈倫だ。
    5 ble-decode/PROLOGUE, EPILOGUE は関係ないようだ。
    6 ble-decode-key で local ret ずしたら倧䞈倫だ。
    7 eval -- "$WIDGET" の前埌で ret が蚭定される様だ。
      ret の倀が砎壊される時の WIDGET を出力させるず以䞋の様になった。
      ret=0:WIDGET=ble/widget/vi_imap/accept-single-line-or vi_imap/newline

    どうも耇数存圚する様である。䞀぀は _ble_edit_str/update-dirty-range から。
    芋぀けた。以䞋で挏れおいる。

      ble/keymap:vi/mark/set-global-mark
      ble/keymap:vi/mark/set-local-mark

    盎したら取り敢えず ret の倀は保持される様になった。
    実は他の箇所でも挏れがあったような気がしたが、今の所は再珟しおいない。

    x 曎に、䞀回 normal-mode に入っおそれから insert-mode に入るず ret が消える。
      これも ret が挏れおいる蚌拠である。どうも normal-mode に入る瞬間に駄目の様だ。
      ず思ったが圓たらない。どうも実行盎前に insert-mode に入っおいお、
      insert-mode の実装で ret を宣蚀するのを忘れおいたずいうこずのようだ。

      さお、これは盎したず思ったが、未だ盎っおいない。
      insert-mode で local ret したが反応しない。ず思ったら xmap/insert-mode を芋おいた。
      そう思っお nmap/insert-mode で local ret をしお芋たがそれでも盎らない。
      vi_imap/normal-mode-without-insert-leave の方でも修正したがそれでも駄目。
      もう䞀床倖偎から絞っおいくしかないのだろうか。もう䞀床 ble-decode にしかける。

      | local ret=trap1
      |   builtin eval -- "$WIDGET"; local exit=$?
      | [[ $ret == trap1 ]] || echo "ret=$ret:WIDGET=$WIDGET" >> a.txt
      |
      | 結果
      | ret=<U+009C>:WIDGET=ble/widget/vi_imap/normal-mode-without-insert-leave
      | ret=<U+009C>:WIDGET=ble/widget/vi_nmap/insert-mode

      うヌん。䜕ず䞡方で ret が曞き換わっおいる。道理で片方だけ曞き換えおも反応しない蚳だ。
      ずいうかよく考えたら local -r ret すれば犯人が分かるのでは?
      ず䞀瞬思ったが駄目だ。local -r ret するず新しいロヌカル倉数の定矩も犁止されおしたう。

      normal-mode-without-insert-leave に朜る。ble/keymap:vi/update-mode-name が駄目だ。
      䞭を芗いおみるず呌び出しおいる関数は ble-edit/info/default しかない。やはりそうだ。
      蟿っおいくず ble-edit/draw/trace.impl にたですぐに行く。芋぀けた。

      改めお ble-edit.sh に぀いおも ret のリヌクがないか調べる必芁がある気がしおきた。
      他に 2 箇所同様の ret のリヌクを芋぀けた。盎した。
      心配になったので ble-syntax.sh ず ble-decode.sh も確認する。問題は芋぀からなかった。
      ble-color.sh も確かめた。䞀぀䞊の階局で local ret しおいる䟋を芋぀けたが、
      実際の凊理内容を芋るず䞍自然なので local ret は䞭に移動した。
      (ble-highlight-layer:plain/update / ble-highlight-layer:plain/update/.getch)

    x done: keymap/vi.sh の実装に぀いお䞀通り ret の䜿甚を芋おみたら、
      かなり local ret を忘れおいる箇所が芋぀かった。芋぀かった物は盎した。

    * たた最初の調査で "emacs mode でも定矩される" ず曞いたが、
      これは _ble_edit_dirty_observer に登録した
      ble/keymap:vi/mark/shift-by-dirty-range がそのたた動いおいお、
      曎にこれの䞭で ret が䞊曞きされおいたのが行けなかったようである。
      これに぀いおは emacs mode に入る時には _ble_edit_dirty_observer
      から消去する等の察策が必芁な気がする。

2017-11-25

  * 2017-11-23 complete: bug 補完で謎の珟象が起こっおいる。空癜が補完される [#D0631]
    ずいうか echo [a でも同様に空癜が補完される。
    echo $(echo > ) の > の埌で実行しおも同様である。
    曎に echo $(echo) の埌でも空癜が補完される。
    どうやら同じ点で nest-pop が 2 回起こっおいるずなっおいる気がする。

    % どうもこれは昔からあった振る舞いの気がする。埌で察応する事にする。

    ずいうか "echo @" でも空癜が挿入される。
    この振る舞いは今たでなかったはずだ。
    今たでは、候補䞀芧が衚瀺されたはず。
    ぀たり、これは最近埋め蟌んだバグである。

    調べおみるず空文字列の候補が生成されおいる。
    どうも compgen で䞀぀も候補が生成されなかった時に、
    ヒアストリングで <<< "$compgen" ずした時に空候補が䜜られる様だ。

    - そもそも compgen が空の時には候補生成の凊理はしなくおも良いのだから先に抜ける様に倉曎した。
    - 曎に、compgen に内容が含たれおいたずしおも空行がある堎合には、それを陀く様に倉曎した。
    - ble/util/assign-array も調敎した。

  * highlight: failglob で゚ラヌメッセヌゞが出る (reported by cmplstofB) [#D0630]

    > コマンドラむンで $ l* ず入力するず bash: 䞀臎したせん: l* ずいう
    > ゚ラヌメッセヌゞらしい衚瀺が入力䜍眮の右隣に発生し続く入力が劚げられたす。

    盎した。パス名展開を詊みおいる箇所では同様のこずが起こりうる。

    x fixed: あず、ble/string#split も火を吹いおいた。諊めお set -f する事にした。

    x fixed: たた、倱敗するコマンドを䞀床実行するずそれ以降どのキヌを入力しおも゚ラヌメッセヌゞが出る様になる。
      しかも、C-c などの操䜜が効かなくなる? DEL も効かない。䜕故? decode の問題だろうか。
      先ず初めにどのタむミングで゚ラヌが発生しおいるのかを確認しなければならない。
      これは getcount を実行する時に count=($(history 1)) に盞圓するこずを実行しおいたのが悪かった。

      調べおみるず類䌌の物は広範囲に亘っお存圚する。党お修正しなければならない。
      grc '=\(\$' で怜玢しお圓たるものを党般に調べる必芁がある。
      特に ble-syntax.sh における _ble_syntax_stat の類を ble/string#split で分割する必芁がある。
      ずいうのも、nparam にはヒアドキュメントの終端が入り * が含たれうるから。
      _ble_syntax_nest も同様である。

      倧倉なので ble/string#split-words 関数を远加した。

    - done: あず、パス名展開に倱敗したらその単語を゚ラヌ着色するようにする。

  * keymap/vi (cmap): C-d で終了しおしたうバグ (reported by cmplstofB) [#D0629]

    > たずえコマンドラむンに文字があっおも終了しおしたいたす。

    盎した。

2017-11-24

  * complete: 曎に key=key ずした埌に echo $key""@ も補完できない [#D0628]

    そのたた echo key@ だず勿論補完できる。
    調べおみるず is-simple は true を返し、曎に eval も期埅した倀 key になっおいる。
    䞀䜓䜕が問題で補完に倱敗しおいるのだろうか。

    うヌん。䜕ず別のファむル名だず再珟しない。
    しかも曎に倉数名を倉えたら動く。
    $ var=key
    $ echo $var""@

    途䞭の様子を調べおみたら 䜕ず $key"" が 67108969 ずいう倀に展開されおいた。
    成る皋、ロヌカル倉数の倉数名ず被っおいるために倉数の䞭身がすり倉わっおいる。

    [cf memo/D0628.extract-global-values.sh]

    | x [困難] これに察凊するのは困難である。倖郚文脈で評䟡するしかないが、
    |   評䟡の床に倖郚文脈にたで移動するのは難しい。
    |   凊理を完党にファむバヌにしお凊理しなければならないが、それは滅茶苊茶である。
    |
    | a [䞍可胜] 或いは declare -g key などずすれば倖郚倉数にアクセスする事ができるか?
    |   これは具䜓的に詊しおみないず分からない。詊しおみた所、
    |   declare -g key を甚いるずグロヌバルでの倉数の倀を倉曎できるだけであっお、
    |   グロヌバルでの倉数の倀を読み出すこずができる蚳ではないようだ。
    |
    | さお、グロヌバルでの倉数の倀を蚭定するこずができるのだから、
    | 䜕凊かにその倀を読み出す方法があるかもしれないず思っお怜玢しおみる。
    | しかし、サブシェルの抂念を知らずに倉数の倀が蚭定できないず盞談しおいる人や、
    | 関数内で倉数宣蚀のコマンド (local declare readonly typeset) を甚いた時に、
    | 自動的に関数内の局所倉数になるずいうこずを知らないで蚘事を曞いおいる人が圓たったりで、
    | "ロヌカル倉数を定矩しおいる時にグロヌバルの倀を読み出す方法" に぀いおの蚘事は簡単には芋぀けられそうにない。
    |
    | b [䞍可胜] よく考えおみたら declare -p -g var ずすれば芋る事ができる筈だ。
    |   しかし $var でアクセスできる様になる蚳ではないずいう事に泚意する。
    |   declare -p -g var 等しお埗られた結果から、
    |   先頭の declare 云々の郚分を消しお local を付加し、
    |   それから eval すればロヌカルに倀を䞞っず持っお来るこずができる。
    |
    |   - 所で declare -p にはバグがあっお改行に぀いお再珟できない、
    |     ず思ったがよく考えたらバグは bash-3.0 の話であり、
    |     䞀方で declare の -g オプションは bash-4.2 以降なので、
    |     これに぀いおは気にしなくおも良い。
    |
    |   - この時にその文脈での倉数名を䞊曞きしない様に泚意する必芁がある。
    |     倉数名は党お _ble_* ずいう名前にすれば良い。
    |
    |   䜕ず実際に詊しおみた所できないずいう事が刀明した。
    |   declare -g に -p オプションを指定するず -g は無効になる。
    |   "declare -g" で珟圚定矩されおいるグロヌバル倉数を党お出力できるのではないかずも思ったが、
    |   実際に詊しおみるずロヌカル倉数も含めお党倉数に぀いお、珟圚での文脈の倀が出力されるだけだった。
    |   結局グロヌバルでの倀は分からない。
    |
    | c [䞍可胜] 既に蚭定されおいるロヌカル倉数を党お unset すれば
    |   グロヌバル倉数に到達するこずができるはずだが、
    |   先ず、䜕回 unset したら良いかわからない。䞀番最埌に定矩されおいた倉数は分かるが、
    |   それが果たしおグロヌバル倉数なのか、それずもロヌカル倉数なのか刀別できない。
    |   declare -g var ずしおも倉数が "定矩" される蚳ではないので倚分駄目だ。
    |   曎に、unset した埌でたた元の状態に埩元する方法が存圚しない。
    |
    | d [䞍可胜] 或いはシグナルを甚いおシグナルハンドラから出力させるずいう手もある。
    |   これは遅そうだが仕方がない。実際に詊しおみた所駄目だった。
    |   先ず呌び出しの順序はちゃんず保たれおいる。
    |   しかしながら、ロヌカル倉数はそのたたにしお呌び出される様で、
    |   シグナルハンドラの䞭からでもロヌカル倉数の倀しか芋えない。
    |
    | e 或いは bind の䞀番倖偎で毎回党おのグロヌバル倉数を䜕凊かに蚘録するずいう手もある。
    |   しかし、これは明らかに滅茶苊茶遅い。特に _ble_* の類を陀倖する方法がない。
    |
    | f もしくは、党おのロヌカル倉数の名前を _ble_* に倉えるずいう手もある。
    |   その様にすれば _ble_* ずいう倉数名を参照しない限りは
    |   グロヌバル倉数の倀を (䜕もせずに) 参照できるずいうこずが保蚌できる。
    |   曎に、この方法は declare -g などず違っおどの bash の version でも䜿える。
    |
    |   然し、これはこれで倉曎コストが倧きいし、たたコヌドも読みにくく・曞きにくくなる。
    |
    | g c の方法に斌いおサブシェルに朜れば unset でグロヌバル倉数を掘り出しおも、
    |   倖偎では圱響が出ない様にする事ができるのではないか。
    |   unset を繰り返し実斜しお䞀番最埌に定矩されおいた倉数の倀を取れば良い。
    |   この方法でグロヌバル倉数が定矩されおいればそれを取埗できるずいう事が分かった。
    |
    |   v 実際に耇数階局の堎合でも各階局での倀を逐次的に取埗できるこずが分かった。
    |
    |   x ok: 途䞭にロヌカル倉数があった堎合は?
    |
    |     | 思ったのだが途䞭で -r のロヌカル倉数があった時に unset できるのだろうか。
    |     | →詊しおみたずころ駄目だった。できない。
    |     | これに関しおは -r なロヌカル倉数を蚭眮しないずいう今たでの方針を甚いおいる限りは問題ない。
    |     | complete の凊理の途䞭でナヌザ関数を通過するこずはないので問題にはならない。
    |     | ただ、䞭で補完などを呌び出すような widget を曞くずきには readonly にしない様に泚意するしかない。
    |
    |     グロヌバル倉数にアクセスするには途䞭のロヌカル倉数に readonly を指定しおはならない。
    |
    |     ずいうか詊しおいお分かったこずだが local -r 宣蚀しおしたうず、
    |     曎に呌び出した先の関数でその倉数を local 宣蚀するこずができなくなっおしたう。
    |     実際に怜玢しおみるずそれをやっおいる箇所が ble-syntax.sh に二箇所芋぀かった。これは消す。
    |
    |   x solved: 問題点はグロヌバル倉数が定矩されおいなかった時に、
    |     䞀番最初に定矩されたロヌカル倉数の倀を拟っおきおしたうずいう事である。
    |
    |     a その倉数がグロヌバル倉数かどうかを刀定するには、
    |       declare -g var=xxx を実行しお倀が倉化するかどうかを芋れば良いが、
    |       もしそれがグロヌバル倉数ではなかった堎合にグロヌバル倉数の倀を砎壊しおしたう。
    |       砎壊が起こらない様にする為にはサブシェルの䞭で倀が倉化するかどうか芋れば良いが fork が増える。
    |
    |       䞀応、以䞋の方法を甚いれば䜙分な fork は䞀回に抑えるこずができる。
    |       先ず初めに unset を繰り返す事で䜕階局の倉数が定矩されおいるかを調べ、
    |       その埌で改めお初めから unset を実行しお䞀番最埌の階局に移動し、
    |       そこで declare -g var=xxx に応答するかどうかでそれがグロヌバル倉数かどうか刀定する。
    |
    |     b 或いは declare -g var だけ実行すればそこに倉数が存圚するこずが保蚌されたりしないだろうか。
    |       或いは declare -g -r var などずすれば readonly な物をグロヌバル倉数ず解釈できる。
    |
    |     ここは b で実装しおみた。動いおいる。
    |
    |     c 䜆し、declare -g は bash-4.2 以降でないず䜿えないので、
    |       bash-4.2 未満では [[ ${var+set} ]] による実装に切り替える。
    |       しかし、これだずやはりグロヌバル倉数に到達できない堎合があり問題だ。
    |
    |       或いは、__ble_MaxLoop=20 迄回しおしたうずいうのも手である。
    |       fork に比べれば倧した凊理量ではない。たた、別目的にこの関数を䜿うずしおも、
    |       bash-4.2 未満の話なのでパフォヌマンスは䜙り気にしない事にする。
    |       その様に修正した。動いおいる。
    |
    |       唯、bash-4.0 未満 ${!varname+set} が期埅通りの動䜜をしおいない気がする?
    |       しかし普通に bash-3.2 -c 'var=hello; [[ ${!var+set} ]]' ずするず動いお芋える。
    |       たあ、調べるのも面倒なので、少なくずもグロヌバル倉数がある堎合には
    |       正しい倀を取埗できおいるので良しずする。
    |
    |   x ok: 途䞭に宣蚀だけの倉数があった堎合 (local var) は?
    |
    |     [[ ${var+set} ]] ずするず倉数が存圚するこずになっおいる?
    |     ず思ったが、それも2回だけで 2 回 unset するず倉数は存圚しないこずになる。
    |     ずころが、無芖しお unset を続けお行くず最終的にグロヌバル倉数に到達するこずはできる。
    |
    |     たあ、取り敢えず動いおいるので気にしない事にする。
    |
    |   x ok: もう䞀぀の面倒なこずは、サブシェルで実行するので、
    |     実行結果を返すために暙準入出力を甚いなければならないずいう事である。
    |     ずいっおもこれは面倒なだけで fork をするよりはコストも小さいし問題にはならない。

    結局 g の方法でテスト実装しお動くようなものができたのでそれを䜿う事にする。
    ble/util/print-global-definitions ずいう関数を定矩した。

    次に simple-word から倉数名を抜出する。テストした。
    それから倉数名が䞀぀以䞊ある時に print-global-definitions を呌んで eval する。
    幟らか修正したら、問題なく動いおいる。

    些现な事のために倧分実装が耇雑になったが仕方がない。

  * complete: ファむル world があるずき var='w'o@ (@ はカヌ゜ル䜍眮) で補完できない [#D0627]

    これは completion-context の CTX_VRHS においお、
    CTX_VRHS が最埌に蚭眮された䜍眮を補完開始点ずしおいるからである。
    䞊蚘の䟋で蚀えば o を起点に補完を実行しようずしおしたう。
    ここでは wbeg から倉数名をスキップしお補完を実行するべきである。

    この修正により以䞋の項目も解決した。

    | 2017-11-06
    |
    | * complete: リダむレクトのファむル名に @ が含たれおいるずき @ 以降で補完できない。

  * syntax: チルダ展開 [#D0626]

    チルダ展開が起こる文脈は?
    ctx-command ctx-values では起こる。
    ctx-conditions では %%起こらない%% ず思ったら起こっおいる様だ。
    ctx-redirect CTX_RDRF/CTX_RDRS/CTX_RDRD では起こる。

    extglob や [...] の䞭では起こらない。
    最初のブレヌス展開の䞭では起こる。が、これは面倒なので認識しない。

  * highlight: リダむレクト先ファむル名が耇数語に展開されたら゚ラヌ着色 [#D0625]

  * highlight: echo <<< {a,b} や echo <<< * ではグロブ展開が起きないのに、 [#D0624]
    着色はグロブ展開も含めおファむル名に䞀臎するかどうかが確かめられおいる。

  * 2015-08-15 syntax: CTX_CMDXC, CTX_CMDXF 等に斌いお redirect は蚱可するべきでないのでは? [#D0623]
    曎に、CTX_CMDXC においおは var=... も蚱可するべきではない。

    たた CTX_CMDX1 に぀いおも盎前のコマンドによっおは redirect は蚱可するべきでない?
    (while, if, do, then, else, '(', time の盎埌では redirect も可胜な様だ。)

    2017-11-24 改めお䞀通り動䜜を確認する事にする。

    | CTX_CMDX1 に぀いお調べた所、他に && などの盎埌が CTX_CMDX1 のようだが、これに぀いおも redirect は可胜である。
    | 結局、珟状のコヌドでは CTX_CMDX1 の堎合はい぀でも redirect は可胜に思われる。
    |
    | CTX_CMDXF は CTX_FARGX1 に改名した。CTX_FARGX1 では redirect はできない。
    | CTX_FARGX2 でも redirect はできない。これらは倧䞈倫。
    | しかし、CTX_FARGX2 から CTX_ARGI に倉換しおいるが、
    | bash は for a in aaa bbb > redirect; の圢匏を蚱しおいない。★これは修正が必芁
    |
    | CTX_CMDXE は fi fi などの文脈であるが、
    | この盎埌に > redirect がある事はい぀でも蚱される。
    | たた redirect の埌は CTX_ARGX0 になるずいう振る舞いも正しい。
    |
    | CTX_CMDXC は関数定矩の始たる前の文脈であるが、ここでは redirect は䜿えない。
    | この振る舞いに぀いおも ble.sh で詊したずころ正しい。
    |
    | CTX_CMDXD は for ((;;)) 盎埌の文脈である。
    | これも珟状の ble.sh の振る舞い通り redirect は䜿えない。

    結局 for a in の埌の匕数の列でリダむレクトを䜿えないずいう事に察応すれば良い。
    察応した。新しい文脈倀 CTX_FARGX3, CTX_FARGI3 を远加した。

2017-11-23

  * 2017-11-21 syntax: ブレヌス展開? [#D0622]

    | 少し詊しおみたが、ブレヌス展開が起こる条件が謎。
    | echo ${aaaa:-{a,b}{c,d}} # 起こらない
    | echo ${aaaa:-{a,b}{c,d} # 起こらない
    | echo ${aaaa:-a,b}{c,d} # 起こる a,bc a,bd
    | echo ${aaaa:-{a,b}}{c,d} # 起こる {a,b}c {a,b}d
    | echo ${aaaa:-a,b}}{c,d} # 起こる a,b}c a,b}d
    |
    | bbbb=1234; echo ${bbbb:-{a,b}{c,d}} → 1234{c,d}} ずなるので、
    | ${} は特に {} の入れ子の回数を数えるずいう事はしおいない。

    うヌん。仮説は以䞋の通り。
    1 先ず初めにブレヌス展開を詊行する為に {,} を抜出する。
      ${} が珟れたら {} の入れ子を数え぀぀スキップする。
      ブレヌス展開が芋぀かったら展開する。
    2 展開埌の単語に぀いお ${} 等の展開を行う。
      この時は ${} の䞭の {} の入れ子は数えず、
      "}" が珟れた時点で即座にパラメヌタ展開が閉じるずする。

    この 1 ず 2 の間の ${} の終端点の抜出の違いに䟝っお
    倉な振る舞いが生たれおいるず思われる。
    これは bash がおかしいので倚少の着色の違いは無芖する。
    基本的に ${} の抜出に埓い (぀たり {} の入れ子は考えない)、
    仮にブレヌス展開が {} の入れ子で無効化されおいたずしおも、
    気にせずに着色を実斜する。

    ブレヌス展開の着色に察応するのであれば、
    {aa..bb} や {aa..bb..cc} や {aa,bb} 等の途䞭の区切りに぀いおも着色したい。
    CTX_BRAX ず同様に delimiters が来たら抜ける。

    | a 初めは .. が来るか , が来るか分からない状態ずしお解析し、
    |   䜕か耇雑な構成が来たら , だけを受け付ける状態に移る?
    |
    | b ず思ったが .. が蚱されるのは内郚に構造がない時のみなので、
    |   "{" を nest-push する時点で .. の圢匏かどうかを刀定する事ができる気がする。
    |   正芏衚珟 (([0-9]+)\.\.([0-9]+)|[a-zA-Z]\.\.[a-zA-Z])(\.\.[0-9]+)?\} で読み取れる所たで読み取り、
    |   䞀番最埌たで読み切れたら {aa..bb} の着色を行う。
    |   もし途䞭で䞀臎しないず分かったら、その時点で , を受け付けるブレヌス展開の文脈に push する。
    |
    | c b の方法だず先読みのために䜕凊たで読んだかを調べなければならないので、もっず単玔化する。
    |   "{" が来たらそこから前方に [0-9a-zA-Z.]*\}? を読み取る。
    |   もし \} たで読み切ったら、䞭身が b の圢匏になっおいれば {a..b} ずしお着色し、
    |   そうでなければブレヌス展開ではなく通垞の文字列ずしお読み取る。
    |   途䞭たでしか読み取れなかった堎合には "{" で nest-push しお
    |   {,} 圢匏のブレヌス展開の文脈に入る事にする。

    ここでは c の方法を甚いるこずにする。

    ブレヌス展開の文脈でも角括匧匏やグロブパタヌンは有効である。
    ブレヌス展開から角括匧匏を呌び出した時には
    角括匧匏は通垞のコマンドの終端に加えお ,} でも終端する様に泚意する。

    取り敢えずブレヌス展開に察応する事にする。

    [実装]

    1 done: 先ず初めに _ble_syntax_bashc[CTX_ARGI] を修正する。
      "{" を远加した。

    2 done: 圱響範囲を確かめる。
      ${_ble_syntax_bashc[CTX_ARGI]} を参照しおいるのは、
      ctx-command, ctx-values, ctx-conditions, ctx-redirect である。
      曎に ctx-bracket-expression でも䜿甚しおいる。

      - ctx-values ではブレヌス展開は有効である。
      - ctx-conditions ではブレヌス展開は無効である。
      - ctx-redirect ではどうだろうか。詊しおみるず文脈によっお振る舞いが異なる。
        - CTX_RDRF で䜿うず曖昧だず蚀われお゚ラヌになる。
        - %%CTX_RDRH で䜿うずブレヌス展開は完党に䞍掻性の様だ。%%
          →そもそも CTX_RDRH は ctx-redirect の察象ではなかった。
        - CTX_RDRS で䜿った堎合も䞍掻性の様だ。
        - CTX_RDRD これは fd を受け取る圢匏のリダむレクトである。
          曖昧なリダむレクトだず蚀われお゚ラヌになる。

      ぀たり、少なくずも CTX_RDRF, CTX_RDRD ではブレヌスを認識し、
      そしお、゚ラヌ着色を蚭眮する必芁がある。ず思ったが、
      䞍完党なブレヌス展開の堎合には入る時に確実な゚ラヌ着色を実行できない気がする。
      ず思ったが、これは "}" が珟れおブレヌス展開が閉じる時に゚ラヌ着色すれば良い。
      そしお途䞭の "{" や "," は䞍掻性ずいう事にする。

    3 done: 取り敢えず ctx-command で䜿う為に check-brace-expansion を実装する
      実装した。動いおいる。

    4 done: 次に文脈毎に察応しおいく事にする。

      - ctx-values ではそのたた察応すれば良い。

      - ctx-conditions では着色しないし nest-push もしないずいう様にすれば良い。
        (或いは、そもそも ctx-conditions の通垞文字集合から "{" を陀けば良いのだが、
        新しい文字集合を定矩するのも面倒なのでそのたたにしおおく。)

      - これは CTX_RDRS %%及び CTX_RDRH%% でも同様に取り扱えば良い。
        たた CTX_RDRD 及び CTX_RDRF では䞀応読み取るが゚ラヌにする。
        ず思ったが > {1..1} 等の様に 1 個しか倀が生成されない時ぱラヌにはならない様だ。
        うヌん。これは展開の結果ずしおの゚ラヌであっお構文゚ラヌではないので、
        䜙り気にせずそのたた解析しおしたえば良い?
        唯、> {1..3} の様な堎合はやはり明らかに゚ラヌになるこずが分かっおいるので、
        この解析の時点で゚ラヌにしおしたっお良い気がする。゚ラヌにする事にした。

        特に nest-push した時には最終的に , なしで終わっおブレヌス展開ずしお有効にならない事もある。
        その様なこずを考えるず nest-pop した堎合にはわざわざ゚ラヌの着色はしなくおも良い?
        →これは次の項目で察凊する様に "," の前埌で文脈倀を倉えるこずにしたので、
        実は "," なしで終わったかどうかは刀定可胜である。
        ずいうか、"," より埌でしか "}" で終わる事ができない。
        取り敢えず珟状では "}" で抜ける時に゚ラヌを蚭定する事にする。

    5 done: 実は echo {aaa},bbb} は {"aaa}","bbb"} ず解釈される様だ。
      初めの "," が珟れるたでは "}" は有効でない。察応した。

    6 done: ctx-brace-expansion の入れ子に぀いお。察応した。

    7 done: CTX_PATN や CTX_BRAX ずの入れ子の関係に぀いお考える必芁がある。

      | CTX_PATN 及び CTX_BRAX の倱効の関係に぀いおたずめる。
      |
      | CTX_VRHS  -> CTX_BRAX 䞍掻性, CTX_PATN 䞍掻性, CTX_BRACE? 倱効
      | CTX_RDRS  -> CTX_BRAX 䞍掻性, CTX_PATN 䞍掻性, CTX_BRACE? 倱効
      | CTX_BRAX  -> CTX_BRAX 䞍掻性, CTX_PATN 䞍掻性, CTX_BRACE? 有効
      | CTX_CONDI -> CTX_BRAX 有効, CTX_PATN 有効, CTX_BRACE? 倱効
      | CTX_RDRF  -> CTX_BRAX 有効, CTX_PATN 有効, CTX_BRACE? 䞍掻性
      | CTX_RDRD  -> 同䞊
      |
      | 䌝播は CTX_BRAX, CTX_PATN, CTX_BRACE の間で行えば良い。
      | ず思ったが、そもそも CTX_BRAX 及び CTX_PATN の内郚での
      | ブレヌス展開を蚱可するのかは謎である。
      |
      | | うヌん。取り敢えず CTX_PATN の䞋からは奜きに CTX_BRACE に入れる様にする?
      | | ず思ったが、CTX_PATN の呌び出し元ずしお䜕が考えられるか。。
      | | うヌん。珟状では glob pattern が有効な ctx-command 系統の文脈に限っおいる。
      | | 埓っお、CTX_PATN の呌び出し元が䜕であれ CTX_BRACE に入っお問題はない。
      | |
      | | 䞀方で、今埌 ${var#pattern} に察応したこずを考えるず事情は耇雑になる。
      | | この堎合はブレヌス展開は無効にしなければならない。
      | | 䞀぀の方法は、${var#pattern} における extglob 及び 角括匧匏
      | | は別の文脈倀を䜿っお解析するずいう物である。
      | | ${var#pattern} の堎合には CTX_VRHS CTX_RDRS 等の䞍掻性凊理が䞍芁である。
      | | 䞀方で CTX_BRAX による䞍掻性凊理は必芁である。うヌん。然し 。
      | |
      | | そもそも CTX_PATN を抜ける条件である "}" をどの様に䌝播する぀もりだったか。
      | | もし CTX_PATN を抜ける条件ずしお "}" が有効かどうかを確かめる手段を䞎えるのだずしたら、
      | | この 「"}" で終わるかどうか」を以おブレヌス展開が有効かどうかを刀定できるはず。
      | | その様に考えれば、将来的に ${var#pattern} に CTX_PATN が察応するかどうかに䟝らず、
      | | 珟状ずしお CTX_PATN から CTX_BRACE に入るのを有効にしお良い気がする。
      |
      | 珟状では CTX_PATN からブレヌス展開はい぀でも呌び出せるこずにする。
      |
      | 1 先ずブレヌス展開に入るずきを考える。
      |
      |   CTX_PATN/CTX_BRAX が䞍掻性の時、その原因は CTX_VRHS/CTX_RDRS/CTX_BRAX のどれかである。
      |   原因が CTX_VRHS/CTX_RDRS のずきブレヌス展開は䞍掻性にする。
      |   原因が CTX_BRAX のずきブレヌス展開は通垞通りに凊理する。
      |   CTX_PATN/CTX_BRAX が有効のずきは、䜕も考えずにブレヌス展開を有効にすれば良い?
      |
      |   䜆し、CTX_BRAX の芪 nctx が CTX_CONDI の時にはブレヌス展開はやはり無効にする。
      |   CTX_PATN の芪 nctx に぀いおもチェックできるが、CTX_PATN は幟らでも入れ子にできるので、
      |   入れ子の階局によっおブレヌス展開が有効になったり無効になったりするのは分かりにくい。
      |   仕方がないので、[[ @() ]] の䞭ではブレヌス展開は有効になるように解析する。
      |
      | 2 次に CTX_PATN に入る時を考える。CTX_BRAX も同様にできそう。
      |
      |   特に CTX_BRACE(䞍掻性) から CTX_PATN に入る時はどうするべきか。
      |   䞍掻性芁因は CTX_RDRF, CTX_RDRD だが、䞡者ずも基本的には CTX_PATN, CTX_BRAX は有効である。
      |   埓っお、CTX_BRACE(䞍掻性) から CTX_PATN に入る時はそのたた CTX_PATN に入れば良い。
      |   CTX_BRAX に入る時も同様である。䞀方で、CTX_VRHS, CTX_RDRS によっお CTX_BRACE が無効化されおいる時は、
      |   そもそも CTX_BRACE? の文脈に突入しないので考慮しなくお良い。
      |
      |   問題は CTX_BRAX -> CTX_BRACE(有効) -> CTX_PATN/CTX_BRAX ずなる時だが 
      |   CTX_BRACE になっおいる時点で倖偎の CTX_BRAX は分断されるので、
      |   bracket expression ずしお有効なのかも分からない。
      |   埓っお、内郚で CTX_PATN や CTX_BRAX が有効でも良いのではないかずいう気がする。
      |
      |   ぀たり、これに関しおは䜕も考慮しなくお良い。ずいう事にする。
      |
      | 衚にする。
      |
      |   CTX_VRHS  -> ... -> CTX_PATN(䞍掻性) -> ブレヌス展開 x
      |   CTX_VRHS  -> ... -> CTX_BRAX(䞍掻性) -> ブレヌス展開 x
      |   CTX_RDRS  -> ... -> CTX_PATN(䞍掻性) -> ブレヌス展開 x
      |   CTX_RDRS  -> ... -> CTX_BRAX(䞍掻性) -> ブレヌス展開 x
      |   CTX_CONDI -> CTX_BRAX(有効)          -> ブレヌス展開 x
      |   CTX_BRAX  -> ... -> CTX_PATN(䞍掻性) -> ブレヌス展開 o
      |   CTX_BRAX(有効) -> ブレヌス展開 o
      |   CTX_PATN(有効) -> ブレヌス展開 o


    CTX_PATN/CTX_BRAX の入れ子に関しお衚にしおみたが分かりにくい。
    やはり日本語でたずめる事にする。

    以䞋のずき、ブレヌス展開は無効ずなり通垞文字列ずしお読み取られる。
    - CTX_CONDI/CTX_VRHS/CTX_RDRS からブレヌス展開を詊みるずき
    - CTX_VRHS/CTX_RDRS によっお䞍掻性化した CTX_PATN/CTX_BRAX からブレヌス展開を詊みるずき
    - CTX_CONDI の盎䞋にある CTX_BRAX(有効) からブレヌス展開を詊みるずき
    以䞋のずき、ブレヌス展開は䞍掻性ずなりブレヌス展開ずしお有効になったずき゚ラヌを蚭眮する。
    - CTX_RDRF/CTX_RDRD からブレヌス展開を詊みるずき
    - 䞍掻性の CTX_BRACE1/CTX_BRACE2 から入れ子のブレヌス展開を詊みるずき
    その他のずき、ブレヌス展開は有効になる。䜆し、bash ず違い以䞋の堎合を含む
    - CTX_BRAX によっお䞍掻性化した CTX_PATN からブレヌス展開を詊みるずき
    CTX_BRACE1/CTX_BRACE2 から CTX_PATN/CTX_BRAX に入る時は特別な凊理は䜕も必芁ない。

  * syntax: "{fd}>" 圢匏のリダむレクトで先読みに問題が生じる可胜性? [無問題] [#D0621]

    echo {f,d}> a.txt を echo {fd}> a.txt に曞き換えるずどうなるのか。
    うヌん。実はこれは問題にならない。䜕故なら、
    {f,d} の堎合には {f,d} たで䞀気に読み取るので、
    "," が消えるず必ず解析再開点は "{" になる。

    問題はリダむレクトずしお有効な圢になった瞬間に、
    解析再開点が "{" 以前になるこずが保蚌されるかである。
    もう少し萜ち着いお考える。リダむレクトずしお有効な圢でないずき、
    ある点でそれがリダむレクトずしお有効でないずいう事が刀明する点がある。
    䞊蚘の䟋で蚀えば "," の䜍眮である。これより前の䜍眮ではリダむレクトずしお有効である。
    この時、 "{" から "," の盎前の䜍眮たでの解析が 1 回で枈んでいれば問題ない。
    そしお実際にその様になっおいるかどうかに぀いおは 。
    珟状では /\{[0-9a-zA-Z]+|[0-9]+/ の連なりは䞀気に読み取るので途䞭に解析再開点が蚭眮されるこずはない。

    ブレヌス展開に新しく察応する際にも \{[0-9a-zA-Z]+ に぀いおは
    䞀気に読み取るずいう事を倉曎しない様にすれば倧䞈倫のはず。
    䟋えば、その文脈でブレヌス展開が有効でなかったずしおも、
    "{" 単䜓で読み取るずいうこずはせずに埌ろに続く alnum も䞀緒に読み取るようにする泚意が必芁である。

  * syntax: for ((i=0;i<10;i++)) { echo; } が構文゚ラヌになっおしたっおいる。 [#D0620]
    ble_debug=1 で芋るず (()) の盎埌は ARGX0 になっおいる。
    うヌん。is_command_form_for=1 の蚭定がうたく䌝播しおいないのが原因だろうか。
    調べおみるず is_command_form_for=1 は蚭定されおいるが、
    実際に ble-syntax:bash/ctx-command/.check-delimiter-or-redirect に到達する事には消えおいる。
    関数の呌び出しのされかたに぀いお勘違いをしおいるだろうか。

    ず思ったら ble-syntax:bash/ctx-command の先頭で
    local is_command_form_for= が実行されおいる。これが原因だ。これを削陀する。
    しかし、そうするず野に is_command_form_for ずいう倉数があった時に誀動䜜する。
    倉数名は _ble_syntax_bash_is_command_form_for 等に倉えるのが良いだろう。

  * syntax: [[ ]] の䞭で <>();|& の文字を䜿った堎合は構文゚ラヌにするべき [棄华] [#D0619]

    䜆し、 "<" ">" "(" ")" "||" "&&" 等の特別な単語の時にだけ゚ラヌでなくなる。
    ず思ったが、改めお調べおみるず "<" ">" "(" ")" "&&" は䜕れも単語を構成しおいない。
    Bash で゚ラヌが出おいる様に芋えたのは、
    各挔算子の䜿い方が誀っおいたからである。

    だずするずそもそもこの項目を立おた時に実装しおいた
    CTX_BRAX の方で䞍敎合が生じおいるかもしれないので確認する必芁がある。
    特に [aa&& でちゃんず && 挔算子の手前で CTX_BRAX から抜けるだろうか。
    →これは特に察策もしおいないので抜けるはずである。実際に確かめおもそうなっおいる。
      特に問題にはならなそうである。

  * 条件コマンドの比范の右蟺で怪しいずころが幟぀かある [#D0618]

    $ grc '== \$[^'\'']'
    修正した。色々バグっおいた気がする。

  * 2017-11-14 syntax: 埌 !; は履歎展開ではないはずなのに履歎展開ず解釈されおいる[保留] [#D0617]
    ず思ったが、文脈によっお履歎展開だったりそうでなかったりしおいる気がする。
    どうも履歎展開ず解釈されおはいるが、必ず展開に倱敗する?

    これは気にしなくおも良いずいう事にする。

  * syntax: *? 等の文字は extglob の時にしか着色されない [#D0616]

    | たた ble-syntax:bash/.update-_ble_syntax_bashc が extglob の倉曎に際しお呌び出されおいない。
    | →これは #D0615 で取り扱う。

    これは取り敢えず珟圚取り掛かっおいるこずが終わっおから察凊する。

    倚分、これは単に _ble_syntax_bashc で [ の他に * や ? も含める様にすれば良い。
    倉曎した。動いおいる。倚分倧䞈倫だろう。

  * syntax: shopt -u extglob にしおも _ble_syntax_bashc が曎新されない [#D0615]

    これは _ble_syntax_bashc の倉曎条件は histc12 及び shopt -q extglob で決たるのに、
    ble-syntax:bash/cclass/update の呌び出し元で勝手に histc12 だけで呌び出しを刀定しおいる為である。
    無条件に ble-syntax:bash/cclass/update を呌び出す様にすれば良い。

    曎に ble-syntax:bash/.update-rex_simple_word も、
    ble-syntax:bash/cclass/update の内郚で曎新が実行された時に限り呌び出す様にする。

  * syntax: hist1, hist2, hist12 等の倉数は bash 固有である [#D0614]

    これはロヌカル倉数ずしお管理するのではなく、
    グロヌバル倉数ずしお _ble_syntax_bash_* にした方が良い。
    珟圚は bash 決め打ちで initialize-vars の前に、
    local "${_ble_syntax_bash_vars[@]}" しおいるが、
    別の蚀語を甚いる際に動かない。

    もしくは、蚀語に䟝存したロヌカル倉数を定矩できる仕組みを提䟛する。
    本来はロヌカル倉数を定矩できる仕組みにするのが良い気がするが、
    蚭蚈がより耇雑になる割にそんなに必芁性があるか分からない。

    解析をしおいる途䞭に曎に別の解析を開始する等の事をしない限りは
    グロヌバル倉数にしおいおも特に問題にならない気がする。

    →取り敢えず盎した。_ble_syntax_bash_hist12 ずいうグロヌバル倉数に入れる事にした。
    hist1, hist2 は実際に䜿うずきに _ble_syntax_bash_hist12 の郚分文字列ずしお埗る。
    たた histstop に぀いおも _ble_syntax_bash_histstop ずいう倉数にした。
    ロヌカル倉数は廃止した。

2017-11-22

  * syntax: 倉数代入に斌ける pattern で入れ子 @(@()) の内偎が䞍掻性になっおいない [#D0613]

    これは var=@(aa|[bracket]) の [] も同様である。

    これは ble-syntax:bash/check-glob で
    ((ctx==CTX_PATN)) の分岐以䞋で attr を補正しおいるずころを参考にすれば良い。
    ずいうかこの郚分をより前方に持っおくれば枈む話なのでは?

    - ctx=$attr ずいう ntype は怜玢しにくいので ctx:$attr などに倉える。
    - たた ctx:$attr ではなく ctx:$ctx にする。
    - CTX_PATN を nest-push しおいる箇所で ntype を確定させる。

    これは #D0612 の察応に際しお統合的に察応した。

  * 2017-09-06 ble-syntax: echo ${a#[!0-9]} は履歎展開ではない [#D0612]
    どうやら "echo [!1 " ず入力しおも展開されない。[ の䞭は (察応する ] がなくおも) 履歎展開は無効ずいうこず。

    実は、もう少し詊しおみた所、以䞋は䜕れも履歎展開ずなった。

    $ echo [a!a
    $ echo [a!a]
    $ echo [[!a

    1 ぀たり、[! の組み合わせで始たる range expression だけ特別扱いする。
    2 range expression の䞭で [! の組み合わせは特に特別な意味は持たない。

    ずいうこず。しかし、それでも [! が特別な意味を持぀かどうかの刀定の為に、
    結局、珟圚 range-expression の䞭にいるかどうかの刀定は必芁になる。

    これに察応するには、やはり新しい文脈に察応するのが良い様な気がする。
    思うに $(()) ず類䌌の文脈にするのが良いだろうか。
    ずいうより $(()) ず違っお入れ子も考えなくお良いし、より簡単な気がする。
    或いは case のパタヌンの䞭ず同様の文脈ず考えおも良いかも。
    䜆し空癜・delimiterは来ない。これは䞁床 ctx-command の check-word-end/is-delimiter で良い気がする。
    ず思ったが、これは呌び出し元の文脈に䟝存する。䟋えば ${a#[a ]} などの堎合には
    其凊で bracket expression が終わったりはしない。これは ntype か䜕かで蚘録する事にする。

    うヌん。然し、条件コマンドずの区別がややこしい。
    或いは条件コマンドをチェックしお、それから [ をチェックする様にすれば良い気もする。
    䟋えば [[ の盎埌に文字列末端たたは delimiter が来る時には条件コマンドずし、
    それ以倖の時には nest-push する。

    nest-pop が同じ点で起こっおも良いのだったか。これは確かめる必芁がある。
    nest-pop は tree-append により情報を登録しおいる。
    tree-append は word の登録にも䜿う。぀たり同じ䜍眮で耇数の tree-append が来おも良い様にできおいる筈だ。
    問題は tree-append を耇数回出来るずしおも nest-pop が同じ䜍眮で
    䞀回しか呌び出されない的な仮定がないずは蚀い切れないこずである。

    角括匧匏の䞭で䜕が有効なのかに぀いお調べる。

      $ echo [@(a|\*)]
      * @ a

    これを芋るず角括匧匏の䞭では extglob も含めお意味を倱う様である。
    䜆し、quote は意味を倱わない。

    [実装1] ctx-command での実装

    先に ctx-command から入った堎合に぀いお実装するこずにする。
    取り敢えず nest-push に぀いお実装する。

    䜕が䜕だか分からなくなっおきたので取り敢えず
    ntype は気にせずに ctx-command から入った時の終端方法で実装しお動䜜確認する。
    その埌で様々な堎合に察応する事にする。

    x fixed: 空癜や文字列末端で終端しおいない。
      check-word-end の is-delimiter が効いおいないのではないか。
      実装仕掛けの ntype チェックで匕っかかっおいた。

    x fixed: stackdump が出る。
      これは check-word-end で nest-pop した時に、
      曎に倖偎の check-word-end を呌び出さなければならないのを抜かしたのが行けない。
      nest-pop が二重に起こる堎合も含めお動いおいるように芋える。
      ただ、この方法が蚭蚈䞊良いのかどうかは分からないが、取り敢えず。

    x fixed: [!a*] などで * が゚ラヌになっおいる。
      これは glob の入れ子を蚱可する様にすれば良い。
      盎した。echo [a*] や echo [!a] は OK。
      取り敢えず echo [![!a] も期埅通りに解析されおいる。
      echo [!a@(aaa|bbb)] は着色が倉な事になっおいるが、
      これに぀いおはたた埌で実装しなおせば良い。

    [実装2] 呌び出し元文脈に䟝存した振る舞い

    次に角括匧匏を抜ける䜍眮をどの様に特定するかに぀いお考える。
    珟圚の実装では垞に ctx-command から呌び出されたず思っお角括匧匏を抜けおいる。
    しかし、実際には角括匧匏に入った時の文脈によっお色々である。

    % * ntype はどうするのが良いか。
    %
    %   nest-push "$CTX_BRAX" する時の ntype はどうしたら良いか。
    %
    %   - "]" が珟れる前に䞭断される時にどのタむミングで䞭断するかを芋るためには、
    %     やはり呌び出し元の ctx が必芁になる。
    %   - たた内郚で CTX_PATN を実行する時には䞍掻性にしなければならない。
    %
    %   埓っおやはり ctx=$ctx を ntype にしお䌝播させるのが良いだろう。
    %   もう䞀぀の方法は type=command だずか type=vrhs だずかであるが、
    %   これは CTX_PATN 等ずの兌ね合いを考えるず面倒である。
    %
    %   よく考えおみるず、CTX_PATN ず混ざっおくるずより面倒な事になる 。
    %   CTX_PATN の堎合は䞍掻性にするかどうかは䞀番最初の呌び出し元が CTX_VRHS かどうかで決たる。
    %   或いは、途䞭で CTX_BRAX になっおその䞭で CTX_PATN を呌び出した時にも䞍掻性になる。
    %   䞀方で、CTX_BRAX の読み取り方の制埡はどの様に行われるかずいうず、
    %   䞀番最初の呌び出しにおける文脈に䟝存する。
    %   しかし、CTX_PATN ず同様に䞍掻性になった時の色にも泚意しなければならない。
    %
    % 珟圚の実装では突入時の文脈を指定する事にしおいるが、
    % この方法で問題ないだろうか。
    %
    % - [] の䞭で曎に [ や @(...) や * がある時にはどうするのか?
    %   [ は無芖する。@(...) は着色せずに読み取りを実行する。
    %   * や ? は *() や ?() になっおいるかもしれないので、読み取る。
    %
    % うヌん。実は䞀぀䞊の階局の ctx を考慮しお CTX_BRAX の終端を刀定すれば良いのではないだろうか。
    % そしお、それずは独立に着色のために ctx= を甚いるのが良いのではないだろうか。

    圓初の考えでは入った時の文脈の皮類に応じお ntype を蚭定しお、
    ntype に応じお CTX_BRAX の䞭で凊理を切り替えるずいう事を考えおいた。
    しかし ntype は CTX_VRHS CTX_BRAX の䞋に入れ子になっおいる時に、
    着色を無効化する為に甚いたいので、別の方法を考える。

    | 別の方法ず蚀っおも入った時の文脈を nest 情報から抜出するずいう事である。
    | ※実のずころこの nest 情報は入った時の文脈ずいうよりは、
    |   抜ける時の文脈ずいった方が正確である点には泚意する。
    | 入った時の文脈を取埗する関数ずしお ble-syntax/parse/nest-ctx を䜜った。
    | 今たでこれがなかったのは䞍思議であるが、䟿利そう。
    |
    | これを䜿っお文脈を取埗し、特別な文脈以倖では ctx-command 由来ずしお凊理する。
    | さお、どのような文脈で CTX_BRAX が nest-push されるだろうか。列挙する。
    | 珟圚 CTX_BRAX を nest-push しおいるのは check-glob のみであり、
    | この check-glob を呌び出しおいる箇所は以䞋の通り。
    |
    | - ble-syntax:bash/ctx-command (色々)
    | - ble-syntax:bash/ctx-values (CTX_VALI)
    | - ble-syntax:bash/ctx-redirect (CTX_RDR[FDS])
    | - ble-syntax:bash/ctx-conditions (CTX_CONDI)
    | - ble-syntax:bash/ctx-globpat (CTX_PATN)
    | - ble-syntax:bash/ctx-bracket-expression (CTX_BRAX)
    |
    | この内、ctx-command ctx-redirect は同様に扱っお問題ない。
    | 残っおいるのは党お単䞀の文脈倀なので盎接比范しお問題ない気がする。
    | 䞀぀ず぀芋おいく事にする。
    |
    | - CTX_VALI の堎合は、実は ctx-command ず殆ど同じ扱いで良い気がする。
    |   䜆し、")" が来たら終わる。でも ")" が来たら終わるのは ctx-command でも同じ。
    | - CTX_CONDI の堎合は、
    |
    |   % ctx-command ず䌌おいるが少し凊理を倉える必芁がある。
    |   % 空癜を陀く delimiter ぀たり ()<>;|& が単語に含たれるこずが蚱されおいる。
    |   % これらは䟋えば "()<>;|&" を chars から陀いお凊理すれば良いのだろうか。
    |   % 念のため確認する。[...] の䞭に delimiter の文字が珟れおも良いのだろうか
    |   % →ず思っお詊したら構文゚ラヌになる。ずいうか [...] の䞭でなくおも゚ラヌになる。
    |
    |   改めお考え盎す。先ず "()<>;|&" を含む単語で蚱されおいるのは、少数の物のみであり、
    |   曎にそれらに "[" が含たれる事はない。埓っお、()<>;|& が珟れた時点で [...] を抜けお良い。
    |   倖偎で自動的に゚ラヌが蚭定されるだろう。たた、空癜類が来た時も [...] を抜ける。
    |   結局、CTX_VALI ず同様に ctx-command ず同じ凊理をすれば良い。
    | - CTX_BRAX から check-glob を呌び出した時は nest-push が起こらない。
    |   ぀たり nctx が CTX_BRAX になる事はない。
    | - 結局特別な取り扱いをする必芁があるのは CTX_PATN だけの様だ。
    |   CTX_PATN では < や > が単䜓で珟れる事が蚱される。
    |   これは [] の䞭でも同様なのだろうか。どうも蚱される様だ。
    |
    |   さお、@([a|b]) はどの様に解釈されるのか?
    |   →調べおみるず @(["a|b"]) ず解釈されおいる様だ。
    |   @([a b]) は @(["a b"]) ず解釈されおいる。
    |
    |   @([a()b]) は @(["a()b"]) ず解釈されおいる。
    |   @(a|[) はどうも構文解析はうたくいくがパス名展開は倱敗しおいる。
    |   䜕れにしおも ")" が珟れた所で終わるずいう解釈で良さそうだ。
    |   うヌん。぀たり、[...] の䞭でも () の入れ子を远跡しなければならないずいう事。
    |   (埌のパス名展開で倱敗するかもしれないずしおも、構文解析䞊はそうなっおいる気がする。)

    たずめる。CTX_BRAX による読み取りの刀定は nctx を甚いお行う。
    - nctx を取埗するためのシェル関数 ble-syntax/parse/nest-ctx を远加した
    - nctx が CTX_PATN の時以倖は、ctx-command から呌び出したず考えたず時ず同様の凊理で良い。
    - nctx が CTX_PATN の時は、) が来たら終わる。
      ( が来たら nest-push しお入れ子を数える。
      その他の文字 (|<>*?@+!) は単に [...] に含たれる事が蚱される。

    x fixed: echo @([a|b]) で | の着色が゚ラヌになっおいる。
      これは特別に远加する必芁があった。
      他の文字 (*?!+@) は check-glob で着色される
      (extglob ならピンク、extglob でなければ黒) ので必芁ない。

    [実装3] CTX_PATN ず CTX_BRAX の入れ子に぀いお再確認

    | * CTX_BRAX の䞭で CTX_PATN になっお曎に "[" に出䌚った時にはどうするのか。
    |   調べおみるず、"[" を bracket expression ず認識しおいる様子だ。
    |
    |   echo [@(aaa|[!a])] は履歎展開が無効だが、
    |   echo [@(aaa|[a!a])] は履歎展開が有効になる。
    |   ぀たり [! の組を認識しおいる。
    |   ず思ったが、実は echo [[!a]] も履歎展開は無効だし、
    |   echo [![!a]] も履歎展開は無効のようだ。
    |   䞀方で echo [[!a や echo [!a は履歎展開が有効になる。
    |   ぀たり bracket expression が閉じおいれば [! の組の履歎展開は無効で、
    |   bracket expression が開いおいれば [! の組でも履歎展開は有効になる。
    |
    |   埓っお、CTX_BRAX であっおも [! は認識するべきである。
    |   䜆し、CTX_BRAX の時には nest-push はしないずいう事にする。
    |
    | * echo [![!a]] はどのように組たれるか?
    |   実際にファむル名に䞀臎させお詊すず
    |   echo [!"[!a"]"]" ず解釈される様である。
    |   ぀たり、[!...] の入れ子は考慮に入れられないが、
    |   "[!" の組で履歎展開にならないずいうこずだけは凊理される。
    |
    | * やはり [@(...)] の䞭で曎に [...] があった時の解釈が分からない。
    |   ファむル名に䞀臎させおみるず echo [@([aaa])] は、
    |   echo ["@([aaa"]")]" ずいうパタヌンになっおいる様である。
    |   これは実際の解析のたずたりずはばらばらの様に思われる。
    |   うヌん。぀たり最初の切り出しは ["@([aaa])"] ずなるが、
    |   実際の解釈では ["@([aaa"]")]" ずなるずいう事である。
    |   これは ble.sh の解析の枠組みでは盎接取り扱えない。
    |   ぀たり着色は ["@([aaa"])] のたずたりで行い぀぀も
    |   残った ")]" の郚分に぀いおの゚ラヌは
    |   ["@([aaa])"] の構造があるずしお抑制しなければならない。

    - [...] の入れ子は考慮に入れられない。
      ぀たり "[" の登堎に拘らず "]" の登堎ですぐに閉じる。
    - [...] の䞭でも [! の組は履歎展開の ! ずは認識されない。
      ぀たり、入れ子の勘定には入れないが、"[!" の組は認識しおいる。
    - [...] の䞭でも extglob @(...) のたずたりは有効である。
      䜆し、元の意味は倱う。぀たり、解析にだけ考慮される。
    - [...] の䞭で @(...) があっお、曎に䞭に [...] があった時の解釈は厄介である。
      䟋えば [@([abc])] の堎合には、
      構文構造ずしおは [@([abc])] のたずたりで切り出されるが、
      最終的なパス名展開の適甚に際しおは [@([abc] のたずたりで切り出されおしたう。
      これに぀いおは構文構造を優先しお着色する事にする。

    この蟺りの振る舞いに぀いおは珟圚の実装で問題ないはずである。
    問題は @([(...)]) の堎合に () の入れ子を凊理する必芁がある事である。
    check-glob を匄っお ctx==CTX_BRAX の時も入れ子を数える様にする。
    取り敢えず色はさおおき、構文構造は正しく解析できる様にする。
    取り敢えず察応した。

    [実装4] 入れ子になっおいる時の色の䌝播に関しお。

    % 改めお CTX_PATN が関わっおくる堎合を考える。
    % CTX_PATN の䞭で曎に [...] がある堎合には、
    % [... の䞍完党終端は CTX_PATN の終端ず同じにする。
    % 䞀方で、着色に関しおは CTX_PATN ず同じ色にすれば良い。
    % 䜆し、CTX_PATN の nest の時には別の色にしなければならない。

    | 倉数代入の右蟺でどうなっおいるか。
    |
    | $ echo=[a] # → パス名展開は起こらない。
    | $ echo=[!a] # → 履歎展開されない。パス名展開も起こらない
    | $ echo=[a!a] # → 履歎展開される。パス名展開も起こらない
    |
    | ぀たり、解析ずしおは [!...] を拟っおいるが、
    | パス名展開は起こらないず考えお良い。
    | 珟状の @(...) ず同様に nest-push しお解釈はするが、
    | 着色はしないずいうように凊理すれば良い。

    倉数展開の䞋の glob パタヌンは、党お解析はするが着色は無効化する。

    うヌん。特に色を無効化させるのであれば、
    色を倖偎から䌝播させれば良い様な気がする。

    CTX_VRHS から䞋はどう頑匵っおも党お無効化
    同様に CTX_BRAX から䞋はどう頑匵っおも党お無効化。
    それ以倖の時には nest の括匧は無色。それ以倖は着色。

    さお、珟圚 ntype=nest は他の甚途で䜿われおいるだろうか。
    どうも、ここで色を決定するこずにしか䜿われおいない様だ。

    ntype の意味を次の様に定める。
    1 ntype='nest' の時はその括匧及び内偎の | は特別な色を぀けない事を意味する。
      曎に内偎の [...] や @(...) は有効になる。
    2 ntype='ctx=...' の時はその括匧及び内偎の | はその ... で着色する事を意味する。
      曎に内偎の [...] や @(...) に察しおもその塗り朰しは継承する。

    取り敢えず実装した。

    * supported: here string でも glob/bracket は無効化されるべき。

    [実装5] 埌は新しく生じた䞍敎合を解決する。

    x fixed: [[ が無効になっおいる。

      これはどの様に察応するべきか。
      先ず初めに [ の盎埌に [ がある堎合はそれも䞀緒に読み取っおしたう?
      しかしそうするず今床は [[! の堎合に其凊たで読み取らなければならない。

      ずいうかそもそも珟状はどの様な状態なのだろうか。
      '[[' の郚分を芋るず i=$wbeg ble-syntax/parse/nest-push しおいる。
      これは぀たり単語の開始点が珟圚の解析 step の開始点以降である事を前提ずしおいる。
      珟圚の実装だずその仮定が厩れおしたっおいる。

      正しく実装し盎す為には、nest-push の点をずらすか、
      或いは [[ の連なりは䞀床に解析できる様に修正するか。
      取り敢えず [[ の連なりは䞀床に解析する様に修正する。
      これは盎した。

    x fixed: simple word で [] が蚱されなくなっおいる。
      これは _ble_syntax_bashc_simple に "[" が混入しおいたのがいけなかった。
      _ble_syntax_bashc_simple を _ble_syntax_bashc[CTX_ARGI] ず独立に生成する様にした。

  * syntax: プロセス眮換が @(<(echo)) で認識されおいない。 [#D0611]
    角括匧匏察応の途䞭で気付いた。
    これは元からあった問題である。修正した。

  * edit (command-help): quote されおいるず駄目 [#D0610]

  * edit (command-help): function, until が匕っかからない。 [#D0609]

  * 2017-11-14 complete: コマンドの補完候補に出おくる functions ずは䜕だろう [#D0608]
    実際には芋぀からないし実行できない

    →これはどうもディレクトリ functions が䞀臎しおいる様だ。
    所で、functions たで入力しお TAB を抌しおも functions ずいう候補が二重に出おいる所為で補完できない。
    他のディレクトリ名に぀いおも同様の様である。

    重耇を陀く様にしおみたがそれでも 2 ぀出お来る。
    異なる source から耇数珟れおいるのだろうか。
    ず思っお調べおみた所、ble-complete/source/command から 2 ぀珟れおいる。
    ble-complete/source-command では sort -u する様にしたはずなのにおかしい。
    ず思ったら、ble-complete/source/dir が明瀺的に呌び出されおいる。

    しかし、そうだずしおも䞍思議だ。shopt -s autocd は有効になっおいないので、
    前者からは候補が出おこない筈である。

    うヌん。ず思ったら、どうも compgen -c -- foo で
    foo がディレクトリ名に厳密に䞀臎しおいる堎合、
    foo も補完候補ずしお衚瀺されおしたうのだずいう事が分かった。
    これはどの様にしたら良いか。

    たた、実際に補完候補が確定した時の振る舞いに぀いおも考える必芁がある。
    䟋えば、確定された単語がディレクトリ名だったら / を埌眮する様にするなど 。
    しかし、コマンド名ずディレクトリ名が被る堎合はどうするのか謎である。
    mkdir grep ずしお調べおみるず、どうやら実行する時にはコマンド名の方が優先される様だ。

    a 䞀぀の方法はディレクトリ名ずしおの候補の堎合には予め / を埌眮する様にする。
      確定した単語が / で終わりか぀実圚するディレクトリ名だった時には、
      そのたた確定する。それ以倖の時には空癜を空ける。

      これだず / で終わる名前のシェル関数ずディレクトリ名が同じ時に、
      本来はシェル関数の方が呌び出されるはずなのにディレクトリ名ずしお解釈されお、
      空癜が埌ろに付加されない。しかし、たあ劥圓な振る舞いの範疇だろう。

    - 同様に autocd によっお列挙されるディレクトリ名の堎合にも / を埌眮する。
      その様にしないず既存のコマンド名ずディレクトリ名が被っおいた時に、
      ディレクトリに移動しようずしおもコマンドを実行しおしたうからである。

    適圓に実装した。

    - 実は shopt -s autocd かどうかには䟝らずに、ディレクトリ名は foo*/ で生成すれば良い。
    - foo ずいうディレクトリがある時に compgen -c -- foo で foo が列挙されおしたう問題に぀いおは、
      workaround ずしお "cand がディレクトリ名であっお該圓するコマンドが芋぀からないずき、
      その候補を陀去する" ずいう凊眮を取るこずにした。

  * syntax: declare, local, の類が予玄語の色になっおいる。 [#D0607]
    修正した。ず思ったら、今床は declare の䞊での倉数名の補完が効かなくなっおいる。
    ble_debug=1 で芋おみるず declare の盎埌の文脈が通垞のものに戻っおいる。
    ず思ったら、is_keyword でない時には埌で ctx=ARGX に䞊曞きされお、
    通垞の匕数のための凊理が行われおいる。

  * complete: echo echo などのように二重に候補が出るのは䜕故か。 [#D0606]

    これは compgen -c -- echo の時点で再珟する。
    どうも組み蟌みコマンドの echo ず通垞コマンドの echo が䞡方䞀臎しおいる?
    しかし、grep の堎合も同様に二぀衚瀺される。ず思ったが、これの堎合は alias だ。

    取り敢えず sort -u を呌び出すこずにしたが、
    実は compgen に重耇を発生させないオプションが合ったりするかもしれない。
    ず思っお man bash を芋るがやはり complete ず共通のオプション以倖はない。
    そしお complete には重耇を陀くなどのオプションはない。
    結局自前で sort -u を呌び出すようにしなければならない。

2017-11-21

  * 2017-11-11 complete: time の次に来るコマンド名で補完ができない。 [#D0605]
    これは恐らく文脈倀を増やしたのにそれを远加しおいないのがいけない。

    これは調べおみた所、time -p command たで䞀床に解析する様にしおいるのが原因である。
    コマンド名の先頭に stat (ctx) が蚭眮されおいないのが原因である。
    珟圚の補完の枠組みでは ctx を䜿っおいるので、これでは補完候補を生成できない。

    或いは、コマンドの候補を生成する時には先頭が "time [-p]" になっおいれば、
    その郚分は削っお候補生成を行うずいう様にも出来るが、
    それは実装ずしお汚い気がする。やはり新しく文脈倀を導入するほうが良さそうだ。

    →これは #D0604 の察応ず共に実装した。

  * 2017-11-14 syntax: time -p -- echo hello (bash-4.2 以降) [#D0604]

    実は time -p -- echo hello ずできる。
    time -- echo hello はできない。
    調べおみるず、これは bash-4.2 以降の以降である。
    bash CHANGES にもちゃんず曞かれおいた (bash-4.2-alpha/3.r)。

    これに関しおは途䞭に解析再開点を蚭眮する様にしたいので、
    やはり文脈倀を拡匵しお察応するこずにしたい。
    文脈倀の拡匵に関しおは CTX_CARGX1 などを参考にするのが良い気がする。
    in 等の代わりに -p が特別な意味を持぀ようにする。

    取り敢えず CTX_CARG{X,I}{1,2} を耇補する圢で CTX_TARG* を䜜った。
    然し、実際の凊理はもっず異なる圢になるような気がする。
    䞀぀ず぀ CTX_TARGX1 から順に察応しおいく事にする。

    少し察応した所で敎理した。ず思ったら完成しおいた。
    取り敢えず動いおいる。

  * 2017-09-05 syntax: function hello (()) は bash-3.0 では構文゚ラヌ。 [#D0603]
    →どうも調べおみた所 bash-4.1 たで䜿えなかった様だ。bash-4.2 以降で䜿える。

  * 2017-09-05 syntax: function hello (()) ずしおおいお function hello () (()) にするず解析が誀っおいる。 [#D0602]
    これは新しく導入した set-lookahead 2 で簡単に盎った。

  * 2017-11-14 syntax: echo $(echo > ) においお $() が閉じおいないずなっおいる。 [#D0601]

    元々 > の次に ) が来た時点で構文゚ラヌなのだから、
    ")" がどう取り扱われようず勝手なのかもしれないが、

    - やはり盎芳ずしおぱラヌは > の手前で止たっおほしいし、

    - 䟋えば、長いコマンドの最初の方の $() の䞭にリダむレクトを远加する時、
      䞀瞬この様な状態になったこずで郚分曎新が働かなくなるのも嫌である。

    埓っお、> においお ) が珟れたらその手前で nest-pop
    をするずいう蚳には行かないだろうか。

    nest-pop/tree-append の郜合で 1 文字以䞊進んでからしか pop できないず思ったが、
    よく考えおみれば、check-word-end 蟺りで確認を行っお、
    次に delimiter が来おいれば゚ラヌを蚭眮するず共に、nest-pop すれば良い。

    ず思ったが、調べおみるず実際にその様な実装になっおいる。
    䜕故だろう ず思ったら、そもそも単語が始たっおいない時には nest-pop は実行されない様だ。

    a それなら、単語を構成する文字が芋぀からない堎合には初めから nest-push しなければ良い、
      ず考えたが、駄目だ。先読みしおしたうず郚分曎新の時に砎綻しおしたう。
      先読みした分だけ呌び出し元で単語の蚭眮などしおしたうず、
      結局新しい文脈を䜿っお解析しおいる意味がない ずいうか、
      プロセス眮換などの構成を䜿っおいる時に察応がどんどん面倒になっおくる。

    b 或いは、次の䞀文字だけなら読むこずを蚱されおいるのだから、
      次の䞀文字が蚱される文字だったならば nest-push する。
      そしお、CTX_RDRF 等の文脈においお倱敗したならば、

      ず思ったが、次の䞀文字だけを芋るのだず [<>] がいる時に、
      それがプロセス眮換 [<>](...) の䞀郚かもしれないので、
      受け入れざるを埗ない。埓っお、[<>] の時は nest-push する。

    さお。nest-push するずころを修正したらすぐに倧䞈倫になった。䜕故?
    よく芋おみるずリダむレクトの埌に続く空癜類は既に
    redirection の始たりの蚘号の䞀郚ずしお読み取っおいた。
    埓っお、盎ぐに単語が始たる状態になっおいたのだった。
    なので単語に突入しないずいう状態にはならない。

    [プロセス眮換の先読み問題]

    䟋倖はプロセス眮換の時である。
    将来的にプロセス眮換を構成するかもしれない < が単䜓で入力された状態の時、
    䞀䜓どのように解釈されるべきか。

    ずいうか ble-syntax:bash/ctx-redirect/check-word-end で2文字以䞊先を参照しおいるが良いのだろうか。
    % うヌん。どうやら > A<(B から A<B に化ける時には、盎前の再開点は < であり ず思ったが、駄目だ。
    やはり問題になる気がする
    →珟実に問題になるこずを確認した。
      先ず echo >A<(echo) の状態にしおおいお ( ず ) を削陀するず、
      echo >A<echo においお、"<" の䜍眮で゚ラヌずいう事になる。
      䞀方で、普通に echo >A<echo ずするず構文゚ラヌにはならない
      (䜆し、echo ずいうファむルは芋぀からないずいう゚ラヌにはなる)。

    これはどの様に凊理するべきか。

    a 䞀぀の方法は先読みの文字数を 2 文字にするずいうこず。

      広範な倉曎が必芁になりそう。
      たた、解析再開が非効率になるのが気になる。
      実際どの皋床非効率になるのだろうか。

      それに解決策ずしおは䜙り綺麗でない気がする。
      䟋えば、今埌 3 文字先読みが必芁になったら、
      党䜓で 3 文字の先読みを蚱容するようにするのか? 際限がない。

    b 或いは、先読みをした時にはその文字数を蚘録する。

      % 因みに、読み取りの終端䜍眮を決めるのに、
      % 䟋えば [[:alnum:]]+ 的なこずをするので、
      % 実質必ず 1 文字以䞊先読みはしおいるような物である。
      % ただ、物によっおは $(( など、それ以䞊䞀床に読み取らないずいうものもある。

      この方法が良い様な気がする。
      䜆し、stat に新しい芁玠を远加する事になる。
      stat に芁玠を远加する時の方法に぀いお確認する必芁がある。

      たた、今回の問題の解決に実際に䜿わないずしおも、
      今たでの実装を考えるず先読みの文字数を指定できる様にするず倧分楜になる気がする。
      実のずころ、今たでの方法では "先読みをした堎合には、先読みされた郚分たで䞀気に解析する"
      たたは "先読みした時にはそこには解析再開点は蚭眮しない" ずいう方法を取っおいたので、
      実のずころ解析の効率が萜ちるずいうこずもない気がする。

    c もう䞀぀の方法は "曖昧な状態" を衚す文脈を甚意するずいうこず。

      しかし、これは <( の盎前に珟れる可胜性のある文脈倀党おに぀いお、
      その皮類が倍化するので始末が悪い気がする。
      或いは、別の倉数を䜿っお曖昧な状態を衚珟するずしおも、
      それは結局 b ず等䟡になるのではないだろうか。
      寧ろ、b よりも間接的なので分かりにくい。

    d 実のずころ解析再開点を蚭眮しないずいう察策だけで良いのではないかずいう気もしおきた。

      問題点は䜕かずいうず、珟圚の補完の枠組みでは解析再開点を甚いお補完候補生成方法を決定しおいるので、
      解析再開点を省略するずそこから始たる単語に぀いお補完候補の生成を行うこずができない事にある。

      珟圚の補完の枠組みは、解析再開点を甚いるのではなく単語などの情報を甚いるように倉曎するべきの気がする。
      ず思ったが、結局単語の詳现な情報はその単語の読み取りを開始した時の文脈倀に䟝存する。
      結局、解析再開点の情報も必芁になるのではないか。

      或いは、"無効化した解析再開点" の様なものを甚意しお、
      そこにおける文脈倀だけを蚘録するずいう手もある。

      やはり先読みの文字数を蚭定できるようにした方が柔軟な気がしおきた。
      たた、解析再開点を蚭眮しない方法だず、先読み䜍眮以降・次の再開点以前の範囲で倉曎があった堎合に、
      本来必芁のない再解析をするこずになる。曎に先読みが続くず解析再開点が連続で蚭眮されないずいう事になる。

    やはり先読みの文字数を蚘録する b の方針で考える。
    比范的倧きな曞き換えになるし、ちゃんずできるか分からないので取り敢えず commit を切る。

    [曞き換え]

    1 解析倉数の远加

      前回 nparam を曞き換えた時ず同様に行えば良い。
      泚意点ずしおは nparam は空文字列になりうるので、
      _ble_syntax_stat に栌玍する際には空文字列は none に眮き換えるか、
      或いは nparam の前に新しい倉数を挿入するかである。

      新しい倉数を導入する床に nparam の䜍眮が倉わるのは始末が悪いので、
      空の nparam は none に眮き換える事にする。
      これは _ble_syntax_stat に栌玍・から読み出すずころで匄れば良い。
      ず思ったら初めからそのような実装になっおいたので問題ない。

      nparam の次の解析倉数ずしお lookahead を远加する。
      調べおみたが新しい解析倉数の远加はそれほど倧倉ではないようだ。
      初期化ず保存ず ble_debug による出力に察応すれば良い。

    2 次に lookahead を芋お解析再開点を決定する様にする必芁がある。

      珟圚の実装では parse の以䞋の郚分で決定しおいる。

      | # 解析予定範囲の曎新
      | local i1 i2 j2 flagSeekStat=0
      | ((i1=_ble_syntax_dbeg,i1>=end0&&(i1+=shift),
      |   i2=_ble_syntax_dend,i2>=end0&&(i2+=shift),
      |   (i1<0||beg<i1)&&(i1=beg,flagSeekStat=1),
      |   (i2<0||i2<end)&&(i2=end),
      |   (i2>iN)&&(i2=iN),
      |   j2=i2-shift))
      | if ((flagSeekStat)); then
      |   # beg より前の最埌の stat の䜍眮たで戻る
      |   while ((i1>0)) && ! [[ ${_ble_syntax_stat[--i1]} ]]; do :;done
      | fi

      先ず flagSeekStat ずは䜕だろう。
      ずいうか䜕故 i1 end0 _ble_syntax_dbeg, _ble_syntax_dend など色々あるのか。
      コメントに曞かれおいた。_ble_syntax_d* は前回の解析でやり残した郚分を蚘録する。
      先ず初めに i1..i2 に前回の解析でやり残した範囲を読み蟌む。
      その埌で今回の文字列の線集範囲を甚いお i1..i2 を曎新する。
      flagSeekStat は、今回の文字列の線集範囲によっお解析を開始するこずを瀺す。
      flagSeekStat が立っおいないずき、前回の解析䞭断䜍眮から再開するが、
      必ず stat が蚭定されおいる䜍眮で䞭断される (予定) なので、わざわざ解析再開点を探す必芁がない。

      lookahead によるマヌゞンを取るのは flagSeekStat の䞭で刀定すれば良い。
      実装した。取り敢えず既存の解析再開の仕組みは動いおいる様に芋える。

    3 埌は、折に觊れお lookadhead を曎新すれば良い。

      lookahead の曎新はただ代入するのではなくお、
      前の倀よりも倧きい時に曎新するずいう様にする。

      そうすれば䞀回の解析の間に耇数箇所で先読みをした時に察応できる。
      元々2文字以䞊の先読みを実行する箇所は少ないのだから、
      このぐらいのチェックで遅くなるずいうこずは考えにくい。
      埓っお、速床に぀いおは気にしなくお良い。

    ず思ったが、実のずころ䞀回 lookahead を蚭定した埌に、
    解析䜍眮が進んだ堎合にはどうするのだろう。
    その堎合には lookahead を再び clear しなければならない。
    改めお lookahead の方法に぀いお考える。

    a 䞀぀の方法は必ず解析の最埌で lookahead を蚭定するずいう事である。
      その様にすれば lookahead の䜍眮がずれる事はない。
      しかし、問題点は check-process-subst 等で䞀臎するかどうか参照しおいるが
      匕っかからなかったずいう時に lookahead をどう蚭定するのかずいうこずである。
      或いは、匕っかからなかった時には lookahead は蚭定しなくおも倧䞈倫だろうか。

      実のずころ 2 文字ならば lookahead は蚭定しなくおも倧䞈倫である。
      䜕故なら 1 回の解析で少なくずも 1 文字は進み、
      曎に少なくずも 1 文字の先読みが存圚するので、
      もし倱敗しお別の方法で進む堎合には 2 文字たで先読みしお倧䞈倫である。

      では任意の文字数先読みするこずは可胜なのだろうか。

      % もしかするずそもそも先読みがなかったこずにできるずいう可胜性もある。
      % 䟋えば <() に぀いお考える。今 <a 等の様になっおいたずする。
      % この時䞀臎は倱敗しお < 単䜓に埌で匕っかかる。
      % ここで先読みがなかったこずにするずどうなるだろう。
      % "<(a" の様に "(" を挿入したずする。実際のずころ a たで芋お䞀臎しないず刀定したのに、
      % 解析再開の際には "<" の郚分に倉曎がないからずいう理由で、
      % 前回の解析結果が採甚されお、今回も䞀臎しないずいう様になっおしたう。
      % この䟋の時には、実際には > が読み取られおその次の文字たで先読みになるので問題にはなっおいなかったが、
      % 3 文字以䞊に枡る先読みの堎合にはやはり問題が発生する。

      䞀臎に倱敗したずしおも先読みしお動䜜を倉曎したのであれば、
      それを蚘録しおおかないず埌で䞍敎合が起こっおしたう。

      x 先読みの長さに関する制限もある。

        前回の解析ステップで先読みした長さを、
        次の解析ステップでは必ず党お取り尜くさなければならない。

        䜕故なら、解析再開点の決定では文字列倉曎範囲より前の再開点で、
        䞀番最初に芋぀かったものを採甚するからである。
        もし前回の解析ステップの先読みを取り尜くさないず以䞋のような堎合に問題になる。

          aaaaaaXa 文字列ず線集䜍眮
          +------- 解析再開点1 + 先読み
            +---   解析再開点2 + 先読み

        X の䜍眮で線集が起こった時、本来であれば解析再開点1 から解析を再開しなければならないが、
        実際には最初に芋぀かった解析再開点2 から解析が再開されおしたうこずになる。

    b もう䞀぀の方法は、珟圚は lookahead を "䜕文字先か" で管理しおいるが、
      実際の解析の過皋では "先読みした最埌の䜍眮の index" を管理する様にする。
      _ble_syntax_stat に蚘録する時に䜕文字先かの情報に曞き換える。

      | するず shift の察象になるのではないかずも考えたが、shift はしなくおよい。
      | % ずいうかむしろ shift するべきではないず思われる。
      | lookahead を蚭定するのは再開点ず先読み点の間で倉曎があった堎合に、
      | 解析再実行範囲を再開点たで拡匵するために甚いられる。
      | もし文字列倉曎範囲が再開点よりも前にある時には shift は必芁ない。
      | 文字列倉曎範囲が先読み点よりも埌にある時にはやはり shift は必芁ない。
      | 文字列倉曎範囲が被っおいるずき、
      | 再開点が文字列倉曎範囲に含たれる堎合にはそもそもその再開点は消滅するので気にしなくお良い。
      | 再開点ず先読み点の間で文字列倉曎範囲が始たっおいる堎合には shift しおもしなくおも、
      | その再開点は䜿えないずいうこずが蚈算しお分かる。
      | なので、shift の機䌚があるずしおも shift しおもしなくおも䜕も倉わらない。

      [結論] shift の必芁はない。

      % 或いは、寧ろ "䜕文字先たで芋たか" を蚘録する為だけに "先読み点" を蚈算しおいたのであっお、
      % 飜くたで "䜕文字先か" ずいう情報なのだず思えば自然かもしれない。
      % ず思ったがこの考え方はやはり安易な気がする。

      この方法を甚いれば a の所に曞いた先読みの長さに関する制限も自然に解消できる。
      こちらの方法を甚いるべきである。

    2' 改めお b の方法に埓っお lookahead を曞き換えるこずにする。
      倉数名はどの様にするべきか。lookahead を文字数ずしお、
      ilook を lookahead の䜍眮ずいうこずにしようか。
      曞き換えた。たあ問題なく動いおいる。

    3' 取り敢えず問題になっおいた郚分に぀いお蚭定を行う。

      % ず思ったら 再珟しない。珟圚は問題なく解析できおいる。
      再珟した。スペヌスがあるかないかで倉わる様だ。
      "echo > A<(echo)" から "echo > A<echo" に曞き換えるずなる。

      これの原因は䜕だったかずいうず "> A<(echo)" ずなっおいる時に、
      解析再開点が < の䜍眮に蚭眮されリダむレクト先の続きを読む蚭定になっおいる。
      ここで、<( ずなっおいる時には問題がないが < に曞き換わるず、
      ここはリダむレクト先の続きを読むのではなくお、
      新しい別のリダむレクトずしお読たなければならない。
      ぀たり、この解析再開点が誀っおいる。
      䜕故このような事になったかずいうず、そもそもこの解析再開点を蚭眮した時に先読みしお
      "<(" たで芋おリダむレクト先の続きを読むずした為である。
      ぀たり "(" が消滅する様な堎合には、この解析再開点は無効化されなければならない。

      さお set-lookahead で先読みしたこずを蚭定しおみる。
      正しく先読み情報が蚘録されおいる。
      そしお䞊蚘の線集の埌でも正しく文法が解析されおいるこずを確認した。取り敢えず OK

    4' その他のプロセス眮換の郚分に぀いおも確かめる。

      % ず思ったが、よく考えたらプロセス眮換に限らず
      % $(( や $( でも問題になるのではないだろうか 。
      % しかし、これらに぀いお問題になるのではないかずいう事は今たで意識したこずがない。䜕故か。
      %
      % 䟋えば $(( に぀いお考える。䞀臎した時には $(( の末端たで移動するので問題は起こらない。
      % 䞀臎しなかった堎合には、3 文字目たで芋たずきは代わりに $( の方に䞀臎するはずである。
      % この時、3 文字目も先読みしたこずになるので問題ない。
      % 2文字目たで芋お䞀臎しないずいう事が分かったずき、必ず埌で 1 文字は解析が進むので、
      % やはり 2 文字目の先読みの範囲に自動的になるので問題ない。

      $( や $(( で問題にならなかったのには、ちゃんず理由がある。
      $(( は 3 文字目たで芋お倱敗した時は必ず $( に䞀臎するので OK。
      先読み2文字以䞋の構造に぀いおは、そこで採甚されなかったずしおも必ず1文字進んで、
      その先読みで2文字は必ず進むので、気にしなくおも良い。

      - その他、同様に check-word-end で参照しおいる郚分に぀いおは、
        共通の関数 check-word-end/is-delimiter を甚意しおそれを䜿う事にした。

      - たた、starts-with-delimter ずいう関数も甚意する事にした。
        これは実際に読み取りを行うよりも前の䜍眮で呌び出すので、
        恐らく先読みの蚭定はしなくおも倧䞈倫。
        先読みが圓たればそれに察応する分だけ解析が進むし、
        先読みが倖れるずしおも1文字少ない郚分列で解析が進むので、
        先読みの文字数に問題は起こらない。

      - 最埌に starts-with-delimiter-or-redirect に぀いおは、
        'time' 予玄語に察しお䜿っおいる箇所ず、
        ctx-command の冒頭で䜿っおいる箇所がある。

        ctx-command の冒頭で䜿っおいるずころでは、
        最終的に察応する redirect たたは delimiter を読み取るので問題ない。
        'time' 予玄語に関しおはたた実装を芋盎す予定なので、
        ここでは未だ䜙り真面目に考えなくおも良い。
        実のずころ、駄目な気がする ずいうか check-word-end/is-delimiter を䜿うべきでは?
        →starts-with-delimiter-or-redirect ではなく check-word-end/is-delimiter を䜿う事にした。

    取り敢えずよしずする。

  * memo.txt: D0535 が重耇しおいる。D0587 も重耇しおいる。 [#D0600]

    以䞋を䜿っお調べたずころ重耇は他にはない。
    $ grep -ao '\[#D....\]' memo.txt | sort | uniq -cd

    跳びもない
    $ grep -ao '\[#D....\]' memo.txt | wc
    599

    番号が付いおいない項目もない
    $ grep -Ea '^  \* (.*\[#D....\]$)?' memo.txt


    どの様にしたら自動的にずらす事ができるだろうか。
    D05\(3[5-9]|[4-9].\) → D05\,(1+ \1)

    うヌん。
    D05\(3[5-9]|[4-9].\) → D05\,(+ \1 (if (<= \1 87) 1 2))
    D05\(3[5-9]|[4-9].\) → D05\,(let ((num (string-to-number \1))) (+ num (if (<= num 87) 1 2)))

    修正した。倚分、倧䞈倫。

  * syntax: $(()) が垞に゚ラヌの着色になっおしたっおいる。䜕故か。 [#D0599]

    [状況]

    調べおみるず nest-push した時に䞭で ARGX になっおいる。
    $() も赀くなっおしたっおいる。"$(echo)" も最初の " が赀くなっおいる。

    これは明らかに、#D0597 の曞き換えによっお単語内郚を解析する時の
    wtype を倉曎したのが原因である。しかしどの郚分で゚ラヌになっおいるのだろう。
    調べおみるず゚ラヌ着色は構文解析の時点で蚭定されおいる。
    特に nest-push が発生した時に限り起こっおいる様に思われる。

    [原因]

    もう少し調べおみる。先ず初めに $(( が来るず check-dollar に入る。
    ここで attr には CTX_PARAM が蚭定される。そしお nest-push をしおそのたた抜ける。
    抜けるず ble-syntax:bash/ctx-command に戻る。
    flagComsume=1 が蚭定されるので、埌でその分岐に入る。
    ゚ラヌが蚭定される条件は2パタヌンある。

    - 1぀は _ble_syntax_bash_command_expect[wtype] に蚭定されおいる wtype であるこず。
      これは違う。この配列に登録されおいるのは CMDXE などだけである。

    - もう䞀぀は unexpectedWbegin が蚭定されおいるこず。
      しかし、こちらだず考えるず倉だ。

      䟋えば " の堎合は "a" の様に単玔な堎合にぱラヌにはならない。
      䞀方で "$(echo)" だず゚ラヌになる。unexpectedWbegin は其凊にある文字で刀定するので、
      " の埌に䜕が来るかに䟝存しないはずである。

      ゚ラヌになるかならないかを分けおいるのはやはり nest-push したかしないかである。
      nest-push では unexpectedWbegin は曞き換えない。wtype は曞き換える。
      ずいう事を考えるず、やはり wtype が曞き換わる nest-push が怪しい。
      nest-push で wtype は -1 になる。しかし _ble_syntax_bash_command_expect に -1 はない。
      配列に -1 を指定すれば゚ラヌになる。ず思ったが、よく考えたら負の添字を枡すず、
      䞀番最埌の芁玠の倀が取れるのではなかったか。実際に詊しおみるずそうだった。

    [修正1]

    ${_ble_syntax_bash_command_expect[wtype]} の確認をする前に
    wtype が 0 以䞊である事を確認する様にした。盎った。

    test/benchmark/benchmark-201711-arithmetic.sh
    所で、0 以䞊である事を調べおから条件コマンドで䞭身を確認する時に、
    算術匏コマンドず条件コマンドに分割した方が速いのか、
    或いは、単䞀の条件コマンドのした方が速いのかに぀いお調べた。
    このケヌスの堎合にはどちらが速いずも蚀えないが
    基本的に算術匏で評䟡できるものは算術匏で評䟡した方が速い様だ。

    [修正2]

    盎ったず思ったら、今床は本来の目的の fi $(echo) を゚ラヌにするずいう機胜が駄目になった。
    nest-push しおいるので wtype が倉わっおしたい、゚ラヌを蚭眮する機䌚が倱われおいる。
    たた、今たで動いおいた様に芋えたのも nest-push しお wtype=-1 になった事で、
    誀った条件刀定により゚ラヌが蚭定されおいただけの事であった。

    nest-push があった堎合には nest-push する前の wtype が必芁になる。
    これは実は初めの wtype を芚えお眮くだけで良いのかもしれない。

2017-11-15

  * edit: echo !( !a ) で !a の盎埌で magic-space しおも展開されない。 [保留] [#D0598]

    珟圚の実装ではカヌ゜ル䜍眮よりも前の郚分に察しお展開を詊みる。
    しかし、どうやら "echo !( !a" だず構文゚ラヌか䜕かで倱敗する様だ。
    最埌の䜍眮たでカヌ゜ルを持っおいかないず展開されない。

    元々の bash の実装ではどうなっおいただろうか。
    echo !( !a の状態で SP をするず event not found の゚ラヌになる。
    そしお space も入力できない。これは䞍䟿だ。

    たた、!( !a ) の状態ならば magic-space すれば展開される。
    カヌ゜ル䜍眮もちゃんずなっおいる。

    echo !( !a) !a の状態で初めの !a の盎埌に magic-space を入れようずするず、
    履歎展開は䞡方共実行される。実行埌のカヌ゜ルの䜍眮は最埌から四文字目。
    これは展開で挿入された文字列の䞭途なずころである。
    ぀たり、実際に展開で挿入された文字列の䜍眮ではなくお、
    展開前の最埌尟からの䜍眮を芚えおおいお、展開埌に芚えおおいた最埌尟からの䜍眮に移動するだけの様だ。
    しかも、展開した埌に空癜を挿入するせいで、倉なずころに空癜が挿入されおいる。
    Bash の magic-space の実装は埮劙である。

    その様に考えるず珟圚の実装の方が劥圓に思われる。
    因みに、党䜓に察しお展開を実行しお、
    それでいお、展開埌の珟圚䜍眮に察応する箇所を特定する方法はあるだろうか。
    うヌん。難しい気がする。ならばわざわざ実装する必芁もないのではないだろうか。

2017-11-15

  * syntax: 以䞋ぱラヌにするべき。 [#D0597]
    if true; then true; fi <(echo)

    おかしい。fi echo はちゃんず赀く着色されおいるが、どの時点で着色されおいるのか謎だ。
    調べおみるず単語を読み取る時には赀くなっおいない。
    これは考えおみれば単語が終わるたでは、fi の埌に fi done などが来るかもしれないので、
    この時点では未だ構文゚ラヌかどうか分からないので、劥圓な凊理である。
    しかし、実際に赀くなっおいるのは誰が管理しおいるのだろうか。

    曎に気付くこずは fi echo$(echo) ずするず赀くならないずいう事である。
    fi $(echo) も赀くならない。これは問題である。

    これはプロセス眮換に限った話ではなくお党般的な問題の様に思われる。
    さお、そもそも珟圚の着色は䜕凊で行われおいるのかを特定する必芁がある。
    どうも、文法的に着色されおいる蚳ではなくお、埌付で着色されおいる様だ。

    うヌん。実は CTX_CMDXE 及び CTX_CMDXD では取り敢えず゚ラヌを蚭定しお、
    word が終わる箇所でもし蚱容できるコマンド名になっおいたら attr を蚭定する
    ずいう方匏で良いのではないだろうか。蚱容できるコマンド名は単玔なので必ず同じステップ内のはずである。
    CTX_CMDXE CTX_CMDXD 以倖にもあるかもしれない。
    これに぀いおは、埌付で着色しおいるコヌドを芳察すれば良い。
    所で、未だ埌付で着色しおいる郚分の特定には至っおいない。

    →倚分分かった。ble-highlight-layer:syntax/word/.update-attributes/.proc
      CTX_CMDXE 及び CTX_CMDXD では wtype に ATTR_ERR を蚭定しおいるのだ。
      そしお wtype が ATTR_ERR ならば赀く色を付けるずいう様にしおいる。
      然しながら、この刀定をしおいるのは $wtxt =~ $_ble_syntax_rex_simple_word の䞭なので、
      $(echo) などを含む単語に぀いおぱラヌの着色が起こらないのである。
    →では wtype に ATTR_ERR を蚭定しおいるのは䜕凊だろう。
      ble-syntax:bash/ctx-command/check-word-end の䞭で
      _ble_syntax_bash_command_expect を参照しおいる。
      この配列に正芏衚珟が登録されおいる問、この正芏衚珟に䞀臎しない物に぀いお
      wtype=ATTR_ERR を蚭定しおいる。

      逆に蚀えば、この配列に登録されおいる様な文脈の堎合には属性倀を取り敢えず ATTR_ERR にしおおいお、
      正しいず分かった時に改めお、期埅される属性倀を代入するずいう具合にするのが良い気がする。
      曎によく芋るず CTX_CMDXE CTX_CMDXC CTX_CMDXD で蚱容されるコマンドは䜕れもキヌワヌドなので、
      改めお期埅される属性倀を代入しなくおも正しい倀で䞊曞きされる様に芋える。぀たり、気にしなくお良い。

      % ず思ったが、属性倀を ATTR_ERR にしようず思っおも、
      % 実は属性倀は ctx の倀をコピヌしお蚭定する事になっおいるので、
      % 自由に蚭定できるようなものではない。
      % 特に単語の開始境界の䜍眮で蚭定できる物ずいう蚳ではない。
      ず思ったが、ctx の倀をコピヌしお蚭定する所で wtype も参照しお蚭定する事にした。動いおいる。

      ずころで、わざわざ wtype を蚭定しお highlight で色を付けお貰うこずもないのではないかずも思ったが、
      'echo' 等の様にしお囲んだ堎合には珟状の方法だず察応しきれないので、
      やはり wtype による゚ラヌ着色は必芁である。そのたたにする。

    しかし、それでも未だ if true; then true; fi <(echo) ぱラヌ着色が芋えない。
    やはり党䜓を゚ラヌの色で塗り朰したい物である。
    →単語を構成する芁玠は党お先頭に゚ラヌ色を䞊曞きする事にした。動いおいる。
    倚分問題も生じないであろう。

    さお、改めお今たで調べお問題だったものに぀いお確認する。䜕れも着色されおいる。OK
    正しい堎合にぱラヌの色は残っおいない。OK

    * resolved: 因みに、[[ echo ]] echo や (( echo )) echo に関しおは
      構文的に誀っおいるずいうこずがすぐに分かるのにも拘らず、
      ゚ラヌの着色が為されおいない。これも䜕故だろう 。
      _ble_syntax_attr にはちゃんず CTX_ARGI が蚭定されおいる。
      CTX_ARGX0 なのに ble-syntax:bash/ctx-command/.check-word-begin がちゃんず返しおいないのが悪い。
      しかしちゃんず返しおいるずしか思えない。ず思っお、呌び出し元を芋たら、
      䜕故か unexpectedWbegin に倀を蚭定するはずの所が壊れおいた。
      どうやら色々詊しおいる内にここを壊しおしたっおいた様だ。
      これに぀いおは盎った。

    * fixed: 埌、echo ずした時、普通は埌付の色で䞊曞きされるために芋えないが、
      その䞋にはコマンドの色が぀いおいるはずなのに黒である。これはどういう事か。
      _ble_syntax_attr[i]=ctx によっお珟圚の ctx を代入しおいる様にみえる。
      ずいうか ble_debug の䞀番巊の列に衚瀺しおいるのが attr だった。
      これによるずちゃんず CTX_CMDI が蚭定されおいる。
      だずすれば、attr から色に倉換する所で誀っおいるのか。
      別に bashrc で syntax_command の色蚭定を䞊曞きしおいる蚳でもない。
      䜕ず色指定を誀っおいた。元々 red ずなっおいたのを brown に曞き換えたのだったが、
      正しくは fg=red であるべきで、それを fg=brown に曞き換えるべきだった。盎した。

2017-11-14

  * syntax: [[ a == b ]] などが誀っお構文゚ラヌになっおいる。 [#D0596]
    これはごくごく最近発生した問題のはずである。

    盎した。序に、[[ ず ]] は今たで予玄語色にしおいたが、
    構文レベルで ATTR_DEL にする事にした。
    (今たでは構文レベルで [[ を ATTR_DEL にしおいたが、
    その埌の単語の着色で予玄語色になっおいた。
    ]] はそれを芋越しお構文解析の時点で予玄語色にしおいた)

  * syntax: - で始たる名前のコマンド・関数だず正しく着色されない。 [#D0595]
    これは type がコマンド名をオプションず勘違いしおいる為である。
    type を呌び出す時に -- を前眮すれば良い。

  * syntax: time の埌に䜕もなくおも文法的には正しい。 [#D0594]
    time -p の埌に䜕もなくおも文法的には正しい。

    実は ! / time の盎埌は特殊な文脈になっおいる様だ。

    以䞋はリダむレクトの文法の詳现に぀いお調べおいる時 (#D0591) に分かったこず。

    | 実は ! 単䜓でも OK
    | while !; do break; done
    | これは盎したのに盎っおいないず思ったら、
    | そもそもリダむレクトに関係ないので修正ずは関係なかった。
    | 独立に修正する必芁がある。
    |
    | 所が調べおみるず ! ; echo これは文法゚ラヌになる。䞍思議だ。

    調べおみるずたたよく分からない芏則がある様だ。

    $ ! ;                          # OK
    $ time ;                       # OK
    $ ! ; echo                     # Error 䜕故?
    $ time ; echo                  # Error 䜕故?
    $ while ! ; do break; done     # OK
    $ while time; do break; done   # OK
    $ while false; do ! ; done     # OK
    $ while false; do time ; done  # OK

    どうやら !, time 盎埌の ; の埌は CTX_CMDXE になっおいる様だ。

    2021-02-18 Note (#D1477): bash 4.4 で振る舞いが倉曎された。
      4.4 以降では time ; や ! ; の埌は通垞のコマンドも来る事ができる。

    もう少し調べる。

    $ time &        # Error
    $ time && echo  # Error (&& が来た時点で既に゚ラヌ)
    $ time || echo  # Error
    $ time | echo   # Error
    $ time |& echo  # Error
    $ case a in (a) time ;; esac  # Error
    $ case a in (a) time ;& esac  # Error
    $ case a in (a) time ;;& esac # Error

    ぀たり ; 以倖が来るずもう駄目ずいうこずである。
    さお、; 以倖に぀いおは珟状の振る舞いず䞀臎しおいるので、
    ; が来た時だけ特別扱いをすれば良い。

    ! ず time の埌は、珟圚の枠組みでは文脈倀ずしお CTX_CMDX1 になっおいる。
    これは䟋えば else の時も同じである。詊しおみる。

    $ if true; then true; else ; fi # Error
    $ if true; then true; time ; fi # OK
    $ if true; then true; ! ; fi    # OK

    やはり明確に !, time の盎埌だけ文脈が異なる。
    そしお、! ず time の盎埌はやはり類䌌の文脈の様だ。

    % ず思ったが、! に関しおは寧ろ else ず同じ?
    % 勘違いだった。構文゚ラヌではなくお単に ! が実行されお終了ステヌタスが 1 になっただけだった。

    取り敢えず CMD_CMDX1 を耇補するこずにする。耇補した。
    time ; 及び ! ; に察応した。
    次に行末での凊理に察応する。改行のある時ず、最埌(文字列末端)のチェックを盎す。
    倚分、これで察応できた。

  * syntax: 以䞋で ")" の䜍眮で誀っお構文゚ラヌが報告されおいる。 [#D0593]

    echo $({ time echo helo; })
    echo $(while true; do break; done)

    CTX_CMDXD の埌にコマンドがなくお終了しおも OK にする。

  * syntax: 予玄語ず倉数代入・リダむレクトの順番に関する修正 [#D0592]

    ずいうか time や ! 呚りの文法が分からなくなっおきた。詊しおみる。

    * ok: 䜕ず、以䞋の䜕れも文法的に正しい。
      今たで深く考えおいなかった実装でそんなに間違っおいはいなかった様だ。

      $ time ! echo hello
      $ ! time echo hello
      $ ! time ! echo hello
      $ time time echo # 䞀個しか time を指定しなかったずきず同じ
      $ ! ! echo
      $ ! ! ! echo # ちゃんず数に意味があっお奇数個・偶数個で振る舞いが倉わる

    * fixed: 以䞋は time はコマンドずしお実行される。! はコマンドが芋぀かりたせんず出る。

      $ > a.txt time echo
      $ > a.txt time -p echo
      $ a=b time echo
      $ > a.txt ! echo
      $ a=b ! echo

      % これに぀いおは !, time は CTX_CMDXV 以倖で有効ずいうこずにすれば良い。
      %
      % そう蚀えば他の特殊文脈での振る舞いはどうなのだろう。確かめる。
      % CTX_CMDXC の堎合は time があるず駄目である。! も駄目である。
      % CTX_CMDXE の堎合は劂䜕にもだめそうだが 䞀応詊すず time も ! も駄目だった。
      % CTX_CMDXD の堎合も詊すず time も ! も駄目だった。
      % これらは元々゚ラヌなので特別の察策はいらないだろう。
      % 特に ! や time を䞋手にコマンドずしお取り扱うず、
      % それ以降に埩号コマンドなどがある時に振る舞いがおかしくなるので、
      % これはそのたた通過するずいうこずで良い気がする。
      %
      % さお、どの様に察応したら良いだろうか。
      % 実際に '!', 'time' 等の刀定をしおいるずころを芋るず、
      % ctx は既に CTX_CMDI になっおいるので元々の文脈倀が分からない。
      % ここで、元々の文脈倀を過去に遡っお確認するこずは蚱されおいただろうか。
      % 少なくずも盎接に stat/attr 配列を参照しお確認するこずは蚱されおいない。
      % 郚分曎新の際にこれらの情報は曞き換わっおしたうからである。
      % | 或いは、必ず1回の step で '!' や 'time' の終端に達するず考えれば、
      % | 実は '!' や 'time' 以降の状態を参照しおも良い気もするが、
      % | 原則を砎るず汚くなっおなんだかよく分からないので、できるだけこれはしない。
      %
      % では word の情報ずしおこれらは蚘録されおいただろうか。うヌん。
      % どうも wtype ずしお蚘録されおいる気がする。
      % 調べおみるず CTX_CMDX[CDE] に関しおは実は既に wtype にそれが蚭定されおいた。
      % しかし、それ以倖の堎合に぀いおは wtype は word の䞭を解析する ctx (぀たり CTX_CMDI) に統䞀されおいる。
      % これには意味はあっただろうか。取り敢えず䞀旊 wtype になったものが ctx になるこずはないだろう。
      % なので wtype で CTX_CMDI に特別な意味を持たせおいるものに぀いおチェックすれば良い。
      % ble-syntax.sh で登堎する CTX_CMDI に぀いお wtype に関係するものは以䞋の二箇所で出お来る。
      %
      %   ble-syntax:bash/extract-command/.construct-proc
      %   ble-highlight-layer:syntax/word/.update-attributes/.proc
      %
      % これらは䜕れも tree-enumerate の過皋で呌び出される proc である。
      % ずいう事は最終的に登録される wtype だけしか効かない筈である。
      % 途䞭で CTX_CMDXV などになっおいおも倧䞈倫のはず。

      ずいうか、今気づいたのだが、そもそも

      $ a=b function hello [[ a ]]
      $ > a.txt function hello [[ a ]]

      等は䜕れも function をコマンド名扱いしおいる。
      他のキヌワヌドのチェックに珟れるコマンドを党お確認したが、
      䜕れもコマンド扱いされるようになる様だ。

      a うヌん。新しい文脈倀 CTX_CMDIV 的なものを導入する可胜性も考えたが、
        其凊たでするこずもない様な気がする。䜕より違いずいうのはここにしかない。

      b したがっお、CTX_CMDXC 等ず同様に wtype に蚘録するのが良い気がする。

      c ずいうかそもそも解析䞭の wtype を参照する箇所は他にあるのだろうか。
        探しおみた所芋぀からない。ずいう事は、実は開始時の wtype をそのたた指定しお、
        それから word-pop する盎前で調敎すれば良いだけなのではないだろうか。

        word-push では単に wtype 倉数に倀を指定するだけなので気にしなくお良い。
        実際に tree に登録されるのは word-pop の時である。
        そしお、既にそのこずを意識しお途䞭で wtype を曞き換えるずいう事は行っおいる。
        䜆し、その wtype の曞き換えの際には実際には元の wtype は参照しおいなくお、
        ctx に基いお新しい wtype を蚭定しおいるだけである。぀たり、wtype は䜿われおいない

        うヌん。念のため、以前実装した時にどうしおこの様にしたかを確認する。
        関係がありそうなのは #D0393 #D0382 #D0378 #D0372 #D0371 だが、
        䜕れにおいおも珟圚の実装に぀いおは議論されおいない。
        _ble_syntax_bash_command_bwtype を匄っおいる commit を芋おみるず、以䞋の通り。

          70e1e49d     2017-03-05 19:07:58 → これは #D0382 だろう。
          fdbfb399     2017-03-01 11:40:26 → これは #D0372 なのだろう。

        結局そんなに分からない。恐らく元々 wtype=ctx ずしおいたのを砎壊しない様に修正した結果、
        珟圚のような圢になったずいうだけで、これに察した意味は無いだろうず思われる。

      [実装]

      wtype には octx を蚭定する様にする事にした。
      check-word-end で _ble_syntax_bash_command_ewtype を䜿っお倉換しおから word-pop する。
      取り敢えず分かっおいる範囲での動䜜に砎壊が生じないこずは確認する。

      wtype が CTX_CMDXV だった時には予玄語は解釈しない様にする。
      盎しおみたら゚ラヌになった。うヌん → 修正した。

    * 倉数代入ずリダむレクトの埌は予玄語を解釈しないように倉曎したが、
      盞倉わらず予玄語の色で着色されおいる。
      これはコマンドずしおマヌクされた予玄語には珟圚予玄語の色を぀けおいる為である。
      しかし、思うに予玄語はそもそもコマンドずしおマヌクする必芁はないのではないか。

      (ずころで初めは以䞋のように曞いおいたが、実は予玄語党般に圓お嵌る話だった)

      | 所で、珟圚の実装では '!' は䜕も着色しおいないが、
      | type -t '!' ずするず keyword ず出るので keyword 色にするべきでは。
      | もしくは、[[ 等ず同様に倪字にするか。性質を考えるず time ず同じにしたい。぀たり青字。

      コマンドずしおのマヌクをしないずいう事にした時にどの様な圱響が出るかに぀いお考える。
      先ず初めに extract-command が正しく働かなくなる。予玄語の為の word type を甚意するべきだろうか。

      或いは、別の方法でコマンド着色の際に刀定を行う。
      䟋えば、初めから attr に予玄語の色が蚭定されおいる時には改めお着色は行わないなど。
      こちらの方が珟実的な気がする。

      さお、では予玄語に察応する語がコマンドずしお呌び出される時は、
      実際にはどのようにしお色を決めれば良いのだろう。
      䟋えば type -tP time などずすればコマンドがあるかどうか分かる様だ。
      しかし、a=b time は関数でも良いようだ。なので、関数があるかどうかも調べなければならない。

      そう蚀えば 'time' 等ずしお呌び出す堎合にも同じこずが圓おはたる。
      珟圚の実装では 'time' なども予玄語ずしお取り扱われお青くなったのだったろうか 
      ず思ったら、'time' ずした堎合には正しく解決できおいる。これを参考にする必芁がある。
      →これは ble-syntax/highlight/cmdtype2 の $type == $ATTR_CMD_KEYWORD 分岐で凊理されおいた。

      [実装]

      a 予玄語の時は語の先頭の attr を曞き換えれば良い ず思ったが、
        よく考えたら check-word-end に至った時点で既に先頭の attr は蚭定されおいる。
        この倀を曞き換える為には [[ で行っおいる様に、

          ble-syntax/parse/touch-updated-attr "$wbeg"
          ((_ble_syntax_attr[wbeg]=ATTR_DEL))

        ずいう様な事を明瀺する必芁がある。

        これだず解析の効率が䞋がるのではないかずも思ったが、
        よくよく考えおみるずそもそも予玄語の様な単玔な単語の堎合には、
        必ず 1 回で解析が終了するので、これで効率が䞋がるこずはない。
        寧ろ、ble-syntax/parse/touch-updated-attr "$wbeg" をわざわざ呌び出す必芁も、
        本圓は無いのかもしれない。ただ、これはルヌルずしお呌び出すようにしおおく。

      b wtype に蚘録された情報を甚いる。

        そう考えるず寧ろ check-word-end の支配䞋にある
        word-pop で登録される情報を匄る方が良い気もしおくる。
        然し、改めお実装を芋おみるず word-pop を䜿うずしおも
        珟圚のコヌドの流れでは word-cancel を実行しおから、
        再床 word-pop をしなければならないずいう面倒なこずになっおいる。

        word-cancel はそれなりに面倒なこずをしおいる。
        もしこの wtype を甚いる方法を採甚するずすれば、
        凊理の流れを倉えお word-cancel をしなくお枈む様にしたい。

      どちらの方が良いだろうか。

      | extract-command の芳点から考えおみる。
      |
      | | しかし、そうするずこれは extract-command に圱響が出おくる。
      | | (所で、extract-command を䜿っおいる command-help の方はどうなのだろう。
      | | 䟋えば a=b function ずなっおいた時、command-help の䞭からは
      | | それが予玄語の function なのか、コマンドの function なのか刀定ができない。
      | | command-help にも配慮した蚭蚈にするべきなのではないだろうか。
      | | ず思ったが、(attr を甚いる方法か wtype を甚いる方法か) 䜕れの方法を甚いたずしおも、
      | | 珟状の枠組みでは command-help に情報を䌝えるのは難しい。
      | | 或いは、extract-command においお単語開始䜍眮の情報たで党お返すようにすれば、
      | | 埌は attr/wtype に拘らず command-help 偎で奜きに調べるこずができる。
      | | もし wtype になっおいれば extract-command を返す時に、
      | | 先頭の単語の皮類も䞀緒に別の倉数かなにかで返すこずができる。
      | | しかし、珟状の実装ではそれが予玄語かそれ以倖かの二択なので、
      | | わざわざ倉数にしお返す意味があるのかずいう疑問も生じる。
      | |
      | | 曎に、よく考えおみるず command-help だけでなく、
      | | complete を行う時にもそれがコマンドかどうかによっお振る舞いは倉えるべきなのではないか。
      | | ず思ったが、complete の堎合にはそもそも予玄語に察しお匕数はないので、
      | | complete が呌ばれるこずもない気がする いや、for 等の堎合には complete が呌ばれる。
      | | もし complete で関数が登録されおいればやはり extract-command を呌び出すのが良いだろう。
      | | しかし、この時には bash の補完関数の仕組みではそれが予玄語かコマンドか刀定する仕組みがないので、
      | | 結局、そのような情報を提䟛する意味がない。
      |
      | - command-help で衚瀺するヘルプを遞択するずきには、䜕らかの方法で予玄語かそうでないかを区別したい。
      | - Bash の補完関数の枠組みを暡倣するずきは予玄語かそうでないかの区別はない。
      |
      | highlight の芳点から改めお芋おみる。
      |
      | wtype 及び attr は䜕れも簡単にアクセスできる物だろうか。
      | そもそも highlight は wtype を参照しお着色する方法を遞択しおいる。
      | その堎所は ble-highlight-layer:syntax/word/.update-attributes/.proc である。
      | 䞀応、この箇所で _ble_syntax_attr[wbeg] を参照すれば良いが、
      | やはり綺麗なのは別の wtype にする事の気がする。
      |
      | 改めお wtype CTX_CMDI を明瀺的に調べおいる郚分を探す。
      | これは先皋調べたものである。extract-command ず highlight 以倖では䜿っおいない。
      | extract-command の wtype == CTX_CMDI を新しく远加した wtype にも察応するずいう颚にするだけで良い。
      |
      | さお、wtype を远加するずしたらどの様な倀にするべきだろうか。
      | a 䞀぀の方法は新しい文脈倀を䜜るずいうものだが、
      |   実のずころ解析に関䞎しおいない文脈地は䜜りたくない。
      | b 或いは、既存の文脈倀を流甚する。しかし予玄語に向きそうなものはない。
      |   䞀応 CTX_CMDXE や CTX_CMDXD は予玄語しか次に受け付けないが、
      |   これらは既に来る予玄語名たでの空癜の色に同時になっおいる気がする。駄目。
      | c 或いは、ATTR_CMD_KEYWORD を甚いる。
      |   珟圚の実装では ATTR_CMD_KEYWORD は CTX_* ず重耇しないようになっおいるので問題はないはず。
      | もし wtype の方法にするずしたら ATTR_CMD_KEYWORD を甚いる。
      |
      | function の最埌の文字の゚ラヌの着色が透過するためには、
      | 予玄語の時には敢えお単語の皮類による着色を行わないずいう様にすれば良い気がするが、
      | その為には結局最初から _ble_syntax_attr を曞き換えお眮かなければならない。
      |
      | 或いは、function の゚ラヌ着色を今たで通りに䞊曞きしおも良いずしおも、
      | 予玄語に぀いお䞊から予玄語色で塗るずいうのは、
      | わざわざ highlight の phase で実行しなくお良い気がする。
      | 色の管理が面倒になるので、寧ろ文法解釈の時点で分かる色・属性はそこで蚭定した方が良い。

      [結論] _ble_syntax_attr[wbeg] を曞き換える。

      - wtype を甚いお刀定するず予玄語の時に改めお着色する必芁がある。
        予玄語の色は構文解析の時点で分かっおいるので、改めお着色の刀定をするのは無駄である。
        たた孀立 function の゚ラヌなど構文解析での゚ラヌ着色が䞊曞きされおしたう問題があった。
        これを解決する良い機䌚でもある。

      - _ble_syntax_attr[wbeg] を曞き換えるず、䞀芋、解析の効率が悪くなる様にも思われるが、
        実際には予玄語は単玔なので wbeg の䜍眮は同じ解析ステップの範囲のはずなので気にしなくお良い。

    この修正により以䞋の叀い項目は解消した。

    | 2015-08-15
    |
    | * ble-syntax.sh: `function' ず入力した時に最埌の n の郚分に゚ラヌを蚭定するが、
    |   command 名ずしおの着色の際に䞊曞きされおしたっおいる。

  * 2017-11-10 syntax: > a.txt ; echo が文法゚ラヌずされおいるが、これは文法゚ラヌではない。 [#D0591]

    * fixed: 以䞋は本来文法的に正しい
      > a.txt; echo

    他にも詊しおみるず色々新しいこずが分かった。
    以䞋は䜕れも文法的に正しい。

    * fixed: 以䞋は本来文法的に正しい
      while > a.txt; do break; done
      →これは色々詊しおみた所、
        リダむレクトを挟むず CTX_CMDXV になるずすれば良さそうだ。
        リダむレクトの埌に倉数代入があっおもいいし、
        倉数代入ず倉数代入の間にリダむレクトがあっおも良い。

    以䞋は本来文法的に正しくない。

    * fixed: 関数の本䜓の盎前
      function hello () > a.txt ((a+=b)) # 駄目
      function hello () ((a+=b)) > a.txt # 備考: これは正しい
      →これは CTX_CMDXC ではリダむレクトは駄目ずいうこずにすれば良い

    * fixed: fi などの盎埌にリダむレクトを挟んで fi などが来るずき
      if true; then if true; then echo hello; fi > a.txt fi # 駄目
      if true; then if true; then echo hello; fi fi # 備考: これは正しい
      →これは CTX_CMDXE でリダむレクトを挟むず CTX_ARGX0 になるずすれば良い。

2017-11-12

  * encoding: input_encoding を切り替えた時ごみが残るのでは。 [#D0590]
    detach の時にもこれは凊理するべき。
    ごみは flush するのかそれずもそのたた消去するのか。
    ble-decode/unbind で消去しおしたうのが良い気がする。

  * encoding: この蟺りで __ENCODING__ ずいう郚分を敎理する。 [#D0589]

    調べおみるずもう2箇所しか残っおいない。
    䞀箇所は ble-color.sh の ble-highlight-layer:plain/update/.getch で、
    これは C1 文字を M-^? の圢の衚瀺に倉える為のものである。
    これは ble/util/s2c でコヌドに倉換しおから刀定するこずにした。
    倚少重くなるかもしれないが仕方がない。

    ble/util/s2c は必ず Unicode の倀になるのだろうか。
    珟圚の実装を調べおみるず結局 builtin printf %d "'あ" を䜿っおいる。
    これは実際に詊しおみた所、eucJP でも 12354 ずいう倀を出力したので、
    最終的に Unicode に倉換しおから出力するようである。

    | 疑問: ble/util/s2c の実装は本圓に Unicode 倀を埗られおいるのだろうか?
    | [cf memo/D0589/D0589.test-printf-s2c.sh]
    |
    | eucJP で詊す。_ble_bash>=40100 の実装は OK
    | builtin printf %d "'あ" はちゃんず unicode の倀を返す。
    | 他の実装も結局同様に builtin printf を䜿っおいるので倧䞈倫のはずだ。

    もう䞀぀の __ENCODING__ は ble-edit/draw/trace に残っおいる。
    珟圚では LC_ALL=C ではなく LC_COLLATE=C にしおいるので、
    問題は起こりそうにないが念のため実隓する。
    詊しおみた所 glob でも正芏衚珟でも、
    ちゃんず LC_CTYPE に埓った文字の単䜍で切っお、
    その埌で LC_COLLATE=C に埓った比范になっおいる様だ。
    問題になるこずは無さそうに思う。
    [cf memo/D0589/D0589.test-lc_collate.sh]

    ただ、比范をする䞊で盎接 ST を正芏衚珟に埋め蟌んでいた。
    これは゜ヌスコヌド䞊 UTF-8 で笊号化されお埋め蟌たれおいる。
    UTF-8 でない環境で source ble.sh した時に問題になるず思われるので、
    ble/util/c2s 156 で文字を取埗するように倉曎する。

    | 唯、気になるのは ST に察応する文字が存圚しない環境で、
    | ble/util/c2s (もしくは printf -v var '\uXXXX') がどの様な結果を霎すかである。
    | [cf memo/D0589/D0589.test-printf-uXXXX.sh]
    |
    | 䟋えば空欄になるのか、或いは倉な文字がそこに入るのか、倉数に代入が行われないのか。
    | 手蚱の環境では ST のある文字コヌドしかないので取り敢えず別の文字を䜿う。
    | ここは呚回積分蚘号 ∮ を甚いるこずにする。U+222E である。
    | iconv -f UTF-8 -t EUC-JP <<< ∮dx ずするず以䞋の゚ラヌになる。
    |
    |   iconv: illegal input sequence at position 0
    |
    | 埓っお、これは EUC-JP に察応するもののない文字である。
    | さお、実際に printf '\u222E' を詊しおみるず
    | 䜕ず '\u222E' ずいう文字列がそのたた出おきた。
    | \u3042 (あ) はちゃんず ja_JP.eucJP でも倉換されおいる。
    | ず思ったら、実際に䜿っおいるのは $'\uXXXX' だった。
    | 改めお調べなおすず同じ振る舞いだった。'\u222E' ずいう文字列になる。
    |
    | 所で、もう䞀぀気付いたこずは $'\uXXXX' は、Bash が parse した時の文字コヌドで先に文字に倉換されおいる。
    | 埓っお、eval で評䟡を遅延させる必芁がある (これは実際に c2s でやっおいるこずずも䞀臎する)。

    →察応する文字が存圚しないずきは '\uXXXX' の圢になるので文字数が 2 文字以䞊なら倱敗ず芋做せば良い。

    % ずころで呚回積分蚘号の幅の蚈算が誀っおいるがこれはどうしおか。
    % どうも幅 1 ず思っおいる様だ。手蚱の emacs では倉なこずは起こっおいない。
    % そしお珟圚の ble.sh は emacs のテヌブルを元にしおいるはずなのだが。
    % →ず思ったらこれは盎したのだった。最新の ble.sh では倉なこずは起こらない。
    % ble.sh を線集しおいるシェルセッションが叀いのがいけなかった。

    他に動䜜に深く関わるもので Unicode の文字 (C0 GL でない文字) が盎接埋め蟌たおいる箇所はあるだろうか。
    実のずころ意味を持぀のは C1 皋床なので、C1 以倖を埋め蟌む意味がないように思われる。
    あるずすれば(゚ラヌ)メッセヌゞに日本語が含たれる堎合だが、
    日本語のメッセヌゞを出力する箇所はないはずだし、
    もし日本語メッセヌゞが UTF-8 で出力されたずしおも倧きな問題には至らない筈である。
    ST (\u009C) ず CSI (\u009B) は怜玢したが、今回察凊したずころ以倖にはない。
    倚分、他の文字も存圚しない。OK

  * ble_debug=1 で衚瀺しおいた内容が :q で消去されない。 [#D0588]
    これは info の仕組みを甚いお衚瀺しおいたので、
    :q をする時に消去されるはずなのではないか。

    ずいうか、普通どおりに exit しおも消去されない。
    ず思ったが補完候補達は初期されおいる気がする。うヌん。
    もしかしお高さの蚈算を誀っおいる?

    ず思ったが mode 倉曎の際に info が倉わる時には
    ちゃんず正しい高さだけ削陀されおいる。

    実装の方を芳察しおみる。
    ble/widget/vi-command:q は ble/widget/exit を呌び出しおいる。
    ble/widget/exit は ble-edit/info/hide を呌び出しおいる。
    もしかしお hide した物が再床描画されおしたっおいる可胜性?

    ず思ったが、再描画されるようなタむミングはなく exit しおいる気がする。
    うヌん。途䞭の出力の様子を芋おみるず䜕も出力されおいない?
    盎前の高さを確認しおみたが _ble_form_window_height にはちゃんず高さが蚭定されおいる。
    そしお hide の盎埌には高さが朰れおいる。

    うヌん。どうも調べおみるず ^O しか出力されおいない様だ。
    ず思ったが、どうやら alias less で確認しおいたために
    ゚スケヌプシヌケンスが衚瀺されおいなかったようだ。
    ちゃんず確認したら消去のシヌケンスは _ble_util_buffer に入っおいるこずは分かった。
    ESC[m^OESC[1B^MESC[8M ずなっおいる。SGR() ^O CUD(1) DL(8) である。
    では、䜕故実際に消去されおいないのだろうか。
    flush を挟んで芋る。しかしながら消去できおいない 。どういうこずだろうか。
    あれ、もしかしお高さの蚈算を間違えおいる? ず思ったがそんな事もない。

    うヌん。おかしい。もしかしお render の䞭で再描画されおいる?
    →そのようだ 。高さが埩元しおいる 。
    あ 分かった。textarea#render が䞭で syntax を呌び出しお、
    syntax は ble_debug=1 の時䞭で info を呌び出すのだった。

    ble/util/hide の方を埌にしたら収たった。

  * ble_debug=1 で衚瀺される内容の _ble_highlight_layer_disabled_buff [#D0587]
    の行が前の行にくっ぀いおいる。
    これは ble/util/assign の実装を倉曎しお行末の改行を陀くようにしたのが原因だった。盎した。

    改めお ble/util/assign の様子を芳察しおみるずどうも最埌の改行が陀かれおいる
    前提のコヌドが倚いような気がする。今たで動いおいたのはなんだったのか䞍思議である。
    䞀応動䜜を統䞀するために bash-4.0 未満でも最埌の改行は陀くようにした。

  * bind: bleopt input_encoding=C は動かない気がする。 [#D0586]

    玠盎な bind ではちゃんず入力を読み取れないので UTF-8
    では文字を 2 byte 衚珟に䞀旊倉換しおから読み取るなどの工倫をしおいる。

    これに正しく察応するためには、C であっおも特定のシヌケンスに぀いお特別な意味を持たせる必芁があるのではないか。
    そうするず、䟋え C であっおも C1 の領域の䜕れかの文字を生莄にするしかない。
    因みに vim では right を <80>kr ずいう衚珟でキヌボヌドマクロに蚘録する。
    これを考えるず <80>? を特別な衚珟に割り圓おれば良い気がする。

    % ずここたで曞いお思ったが、実は珟圚の蚭蚈は文字笊号化方匏の郚分ず、
    % bind の郚分が癒着しおいるのがいけないのではないか。
    % ぀たり、ble-decode/.hook から盎接 ble-decode-byte を呌び出しおいるが
    % その手前で特別衚珟からバむト倀に倉換する段があっおも良いのではないかずいう事である。
    %
    % そうすれば bind の文字笊号化方匏䟝存の郚分は解消するし、
    % 堎合によっおは孀立 ESC を受け取るために䜿った
    % <wait> などの仕組みに぀いおももっず綺麗に解決できるかもしれない。
    %
    % 取り敢えず、孀立 ESC の现かい取り扱いは抜きにしおも、
    % 文字笊号化郚分ずバむト受信郚分を明確に分離する。
    % 特別なバむトを受け取る時に䜿甚するシヌケンスずしお䜕を䜿うか考える必芁がある。
    % これには UTF-8 で決しお䜿われないバむトを䜿うのが良い気がする。
    % 勿論、完党に文字笊号化郚分ず分離するのであるから、UTF-8 で䜿われるバむトを甚いおも良い。
    % 然し、倚くの堎合 UTF-8 で䜿われるこずを考えるず効率の芳点などから考えお、
    % やはり UTF-8 では来ない様なバむト倀で凊理をするのが良い様に思われる。
    %
    % 先ず初めにどのバむトを甚いるのかを決定する。
    % UTF-8 で䜿われないバむトは \xFF \xFE ず、
    % 曎に䞍正な衚珟の先頭バむトになる \xC0 ず \xC1 である。
    % 実は珟圚の実装では \xC0? (䞍正な 2 バむト衚珟) に眮き換えおいるので、
    % \xC0 を特別なバむトずしお扱う事にすれば bind.sh の倉曎を最小限にできる。
    % 0xC0 を特別なバむトずしお採甚する事にした。
    %
    % 埌は、0xC0 自身をどう衚珟するかである。
    % 䞀぀の方法は \xC0\xC0 ずするものである。或いは \xC0\xC1 ずする。
    % 混乱を防ぐ為には \xC0\xC0 は避けた方が良い。\xC0\xC1 ずするず、
    % 仮に \xC1 を受け取りたい時ずの混乱を避けられないのではないかずいう懞念があるが、
    % 実の所それは䟋えば C-@ を受け取るのに \xC0\x80 を䜿う時に \x80 で混乱が眮きないかず心配するのず同じである。
    % 寧ろ、\xC1 は UTF-8 ずしお䞍正な倀であるので、寧ろ受信される頻床は殆どないず考えお良い。
    % ここでは \xC0 は \xC0\xC1 ずしお受け取る事にする。
    % \xC0 に぀いおは特に問題も起きそうにないので䞀旊 bind '"\xC0": "\xC0\xC1"' ず眮き盎す必芁もない。
    % ずいうか、その様な眮き換えをしおしたうず無限ルヌプになっおしたうので駄目だ。
    % 所で 珟圚 "\C-@": "\xC0\x80" 及び "\C-[": "\xC0\x9B" で眮き換えおいるが、
    % これらは最終的に \xC0 \x80 ずしお受信される。だずすれば、
    % この \xC0 ず本来の \xC0 はどの様にしお区別するのだろうか。
    %
    % ここで䜕故珟圚のような実装になっおいるかを思い出す。
    % その文字笊号化方匏で送られおこないような笊号に倉換する必芁があったのだ。
    % そしお UTF-8 の堎合にはたたたたそれぞれのバむトに察する
    % 倚バむト衚珟があったので、それを䜿うこずができたのである。
    %
    % しかし、本圓にそうしなければならないのかに぀いお考える。
    % 先ず、\xC0 を䜿っお衚珟するず決めた時点で、
    % \xC0 自身を区別しお受信する方法が必芁になる。
    % しかし "\xC0": "\xC0\xC1" などのようにするず無限ルヌプになるし、
    % 曎に、これだず "\x1B": "\xC0\x9B" なども "\xC0" に突入しおしたう。
    % "\xC0\xC1" にも同時に bind -x する事にするず単䜓の
    % \xC0 が来た時に timeout を埅぀こずになる。
    %
    % やはり笊号化の "穎" を突くしか無いのだろうか。
    % そうするず結局たた笊号化方匏䟝存になっおしたう。
    %
    % 或いは制埡文字は恐らくどの (珟実的な) 文字笊号化方匏でもあるだろうず考えれば
    % (そうでなければ C-@  C-_ の衚珟が普通ず異なっおしたい倧倉だ)、
    % 制埡文字のどれかを特別な文字ずしお組み合わせで受信するこずができる。
    % しかし、これもその制埡文字に察する timeout が発生するこずになる。
    %
    % 勝手に keymap-timeout を倉曎するず、それはそれでキヌシヌケンスが
    % 認識されなかったり、途䞭の timeout によっお文字が連なっお来た時に混乱が生じたりする。
    % なので keymap-timeout はそのたたにしおおく。するず 300ms の遅延が生じる。
    % 結局、既存の文字に割り圓おる時ず同様に問題になる。
    % 特に制埡文字は ASCII にないような倉な文字に比べお入力する機䌚が倚いし、
    % 結果ずしお倧きな倉化を霎す物もあるから遅延があるのは通垞文字に増しお問題がある気がする。

    結局、Bash のキヌボヌドマクロが反埩しお適甚されるこずにより、
    1察1の察応付を䜜るこずが難しい。埓っお、遅延などが起きない様にしようず思うず、
    文字笊号化方匏に䟝存しお䜿われおいないコヌドポむントを䜿甚するしかない。

    * しかし、やはりできそうな気がしおくる。本圓に䞍可胜なのだろうか。

      | 先ず前提ずしお、或る文字を盎接受信できないずきに、
      | bind '"\x1B": "\xC0\x9B"' などの様にしお別のシヌケンスにしお受信できる。
      | この時、受信できないバむト "\x1B" は圓然代替シヌケンスには含たれない。
      |
      | 問題は以䞋の様に芁玄できる。
      |
      | 1 256 皮類のバむトを 254 皮類のバむトで笊号化する方法を䜜る。
      | 2 この笊号に察しお再び笊号化を適甚しおも䞍倉である。
      |
      | 254 皮類ずいうのは、盎接受信できないバむトが 2 皮類存圚するずいう前提である。
      | この時 bind -x で受信するためには残りの 254 皮類のバむトで行わなければならない。
      | 芁求 2 は、bind '"\xC0": "\xC0\x9B"' に察しお反埩しお倉換が詊みられる実情を反映する。
      | この条件が満たされないず無限ルヌプに陥る。
      |
      | この様な笊号化は䞍可胜な気がする。
      | もう少し真面目に考える。ずにかく鍵ずなるのは盎接受信できないバむト
      | B1, B2 を衚珟するために䜿われるシヌケンスを構成するバむトである。
      | 特に Encode(B1) の先頭文字を B3 ずいうこずにする。
      | この時、曖昧でないためには B3 自䜓も笊号化しなければならない。
      | 無限ルヌプに陥らない為には B3 は B1-B3 以倖の文字で衚さなければならない。
      | これを繰り返すず最終的に文字がなくなる。よっお䞍可胜だ。
      |
      | これを克服するには少なくずも条件を緩くしなければならない。
      | 䟋えば bind -x '"\xC0\xC0": hoge' 等のようにする。
      | \xC0 は単䜓で受信されるこずはなくお必ず二文字に増やしおから受信するのだずすれば、
      | これで遅延が生じるこずはないように思われるず思ったが 
      |
      | 1 \xC0 単䜓で受信した時に次の文字が来ないか埅぀のでここで timeout 分遅延する
      | 2 曎に、たたたた本圓の入力に \xC0\xC0 の様な䞊びがあるずきに
      |   それが別のバむトに化けおしたう。

      やはり文字笊号化方匏の穎を䜿わずに
      完党な読み取りを実珟するこずは䞍可胜であるず刀断する。

      (党お Bash の bind で盎接受信できないバむトが存圚するのが悪いのだが)

    * さお、この時 input_encoding=C に぀いおは党おの文字が意味を持぀ので、
      穎など存圚しない様に思われる。䜕れかのバむトを犠牲にするしかない。
      䟋えば C1 制埡文字の䜕れかを犠牲にするのが䞀番圱響が小さいだろう。
      C1 制埡文字をコマンドの文字列を構成する文字の䞀぀ずしお䜿いたい時は問題だが、
      その様なケヌスは限られおいるので仕方がない。

      䞀番圱響が少ないず思われるのは、元からシヌケンスの䞀郚ずしお䜿われる様な文字である。
      䟋えば ESC がそれだが、これが䞁床 Bash では盎接受信できない文字である。
      次に CSI などがある。他に DCS SOS OSC PM APC 等がある。
      DLE (C-p) は実際に䜿われるので駄目。たあ CSI を䜿っお眮くのが劥圓であろう。

      さお CSI を犠牲にするず蚀えば、どの様にするのが良いだろう。
      実際に 8 bit CSI シヌケンスが送られおきた時ず干枉しないためには、
      これ自身も CSI シヌケンスになる様に構成するのが良い。

      | a 2文字で衚珟する案
      |
      |   たた CSI は、もし CSI シヌケンスを凊理するのだずしたら、
      |   結局䜕れにしおも 2 文字目以降を埅぀必芁があるので郜合が良い。
      |   private CSI を䜿うこずにする。特に、端末制埡甚のシヌケンスは
      |   逆に端末から送られおくるこずは無さそうなので、それが良い。
      |   䞋手に䜿われおいない private CSI は端末によっおは拡匵で察応しおいる可胜性がある。
      |
      |   然し、そのように考えおみるず実は private CSI ではなくお ANSI CSI seq の方が良いかもしれない。
      |   ず思ったが CUU, CUD, CUF, CUB などはカヌ゜ルキヌで䜿われおいるし、際どい。
      |   もしかするず端末によっおはその他のキヌに぀いおも ANSI CSI seq ず同じものを䜿っおくるかもしれない。
      |   しかしその危険性は private CSI の方が高いような気もする。結局 private/ansi は圓おにならないので
      |   実際の実装を確認するしか無い様に思われる。vt100 の function key f1-f10 で ESC O ? が䜿われおいる。
      |   ? には P Q R S t u v l w x が䜿われおいる。これらは避ける。
      |
      |   しかし、珟圚では CSI による制埡シヌケンスは䜿われず、
      |   専ら ESC [ による 7 bit の制埡シヌケンスが䜿われる。
      |   埓っお、そんなに気にする必芁もないのかもしれない。
      |
      | b 或いは 2 文字でなくおも良い。
      |   <csi>27;1;2047~ などずしおこれに察しお bind -x したう手もある。
      |   しかしこの方法で問題が生じないかは疑問である。
      |
      |   ず思ったが、bind -x で 2 文字以䞊に bind できるのは
      |   bash-4.3 以降なのでこれは駄目である。
      |
      | c うヌん。或いはそもそも CSI シヌケンスの圢をしおいなくおも良いのでは。
      |   CSI シヌケンスずしお䞍正なものに割り圓おるのが良い。

      ここは c を採甚する事にした。

    * 次に bind を笊号化方匏䟝存にするのであるから、
      bind.sh の方も笊号化方匏に䟝存しお切り替える様にするべきなのではないだろうか。

      䞀぀の方法は笊号化方匏毎に generate-binder を蚭蚈するずいうものである。
      もう䞀぀の方法は、珟圚の UTF-8 の generate-binder を元にしお、
      各笊号化方匏毎に埌付の補正を行うずいう方法である。
      各笊号化方匏毎の埌付の補正にする方が管理が楜であるように思う。
      䜕より新しい笊号化方匏に察応する時のコストが小さくお枈む。

      取り敢えず珟圚の UTF-8 甚の bind の敎理を行う。
      #D0583 で C-x に぀いお単玔化できないか考えたができなそうだ。
      #D0584 で ESC ESC に぀いお単玔化を考える。これは珟圚の枠組みでは䞍芁だった。

      珟圚の UTF-8 甚の bind で UTF-8 䟝存なのは以䞋の物である。
      bind の蚭定に䟝っおは倉わるかもしれないが気にしないこずにする。

        ble-decode/generate-binder/bind-s '"\C-@":"\xC0\x80"'
        ble-decode/generate-binder/bind-s '"\e":"\xDF\xBF"'
        ble-decode/generate-binder/bind-s '"\e'"$ret"'":"\xC0\x9B'"$ret"'"'

    [実装1] ble-decode-attach/ble-decode-detach で笊号化方匏䟝存の物にする。

    % bind 修正甚の関数を定矩した。
    % ble/encoding:C/rebind 及び ble/encoding:C/unbind である。
    % 曎にそれに応じお ble-decode-char+C も修正した。
    % isolated ESC にも察応しおいる。しかしその前に isolated ESC が UTF-8 でも動䜜するこずを確かめたい。
    %
    % 同時に ble/encoding:UTF-8/rebind 及び ble/encoding:UTF-8/unbind も甚意する。
    %
    % 曎にこの rebind, unbind を適切なタむミングで呌び出す様にする必芁がある。

    ず思ったがこの ble/encoding:UTF-8/rebind の時間蚈枬を行うず存倖に遅い。
    42ms かかっおいる。bind のキャシュを source するのにかかる時間が 19ms である事を考えるず遅い。
    やはり encoding 毎の bind キャッシュを考えるべきだろうか。やはりそうする。

    取り敢えず察応した。動いおいる。意倖ず倉なこずも起こらず普通に動いおいる。
    所で、やはり UTF-8 の binder を䞊曞きするようにしおいる為に、source には倚少時間がかかる。
    元々 18ms だったのが 26ms に増えおいる。8ms の増加である。
    たあ、UTF-8 でない倉な文字コヌドを甚いるこずの代償ずしおはそんなに倧きくないので気にしない。

    ずころで思ったのだけれど bind のキャッシュを生成するずきに
    bind.sh のタむムスタンプは芋おいるが、ble/encoding:C/generate-binder のタむムスタンプは分からない。
    新しい笊号化方匏に察応する時には、このタむムスタンプも確認する必芁がある。
    これに぀いおはメモに蚘録するこずにする。

    [実装2] 動的に笊号化方匏を切り替えるずきに぀いお察応する。

    新しく ble-decode/bind 及び ble-decode/unbind を䜜成した。

    今回の改修で memo.txt の冒頭にある文字コヌド察応に぀いおの以䞋の蚘述は叀くなったので曎新した。

    | ble-decode.sh (function .ble-decode-bind):
    | bash-3 で "ESC [" を bind する為に ESC [ を
    | utf-8 の非正芏な笊号 "\xC0\x9B[" に倉換しおいる。
    | bash-4.3 で "C-@" を bind する為に \C-@ を
    | utf-8 の非正芏な笊号 "\xC0\x80" に倉換しおいる。
    |
    | UTF-8 以倖の文字コヌドを䜿う堎合には
    | これらのバむト列を特別に認識する様にするか、
    | 別のバむト列を指定する必芁がある。
    | (これらは bind にハヌドコヌドされおいるが、
    | 倖郚から指定できる様に倉曎する必芁がある。)

  * decode: <C-q><C-[> ずするず ^[[27;5;91~ が入力される。 [#D0585]

    これは単䜓の ESC を ESC[27;5;91~ に翻蚳し、
    䜕かに前眮されおやっおくる ESC を ESC で受信しおいるのが原因。

    <C-q> の匕数ずしお䞀文字読み取るのに䜿うためには、
    寧ろ単䜓の ESC を ESC ずしお読み取っお、
    Meta ず解釈されるものを別の文字ずしお受信するべきなのではないか?

    しかし、そうするず今床は <C-q><left> の方がより倉な入力になっおしたう。
    珟状では ^[[C が入力されるがこれが ^[[27;5;91~[C などになる。
    どちらでも期埅通りに入力するためには bind/decode の偎で工倫しなければならない。

    | a 䟋えば同䞀の文字ずしお解釈されるが内郚的な衚珟の異なる UTF-8
    |   (芁するに䞍正な UTF-8 衚珟) を䜿っお䞡者を区別する方法。
    |   しかし、この違いは ble-decode-char たで来た時に吞収されおいるので、
    |   区別するこずはできない。
    |
    |   区別しようず思ったら ble-decode-byte:UTF-8 の䞭を匄るか、
    |   或いは、䞍正な UTF-8 衚珟に察しお ble_decode_Erro フラグを立おお、
    |   それの有無で ESC の皮類を特定するずいう方法がある。
    |   しかし、珟状では ESC の受信には垞に䞍正衚珟を䜿っおいるので、
    |   ble_decode_Erro フラグを぀けるずすれば垞に぀ける事になるので良くない。
    |
    | b もう䞀぀の方法は、ble/util/is-stdin-ready を修正しお、
    |   ble-decode-byte 及び ble-decode-char で凊理䞭の文字が残っおいるかどうかで、
    |   それが孀立 ESC か続きのある ESC かを刀定するずいう方法がある。
    |
    |   こちらの方が良さそうだ。問題点ずしおは䜕があるだろうか。
    |   䟋えば、キヌボヌドマクロに登録されたものを再生する時は、
    |   元々孀立 ESC だったものも Meta になっおしたうずいう問題がある。
    |   ず思ったが、これに぀いおは蚘録する時に ^[[27;5;91~ に倉換すれば良い。
    |   ず持ったが、<C-q><C-[> ずしお蚘録する時にはどうするのだろう 。
    |
    | c 或いは、孀立 ESC の時には、ESC に続いお
    |   無芖される文字 <wait> を読たせるずいう手もある。
    |   ぀たり、ESC は取り敢えずは Meta ずしお読たせお眮いお、
    |   Meta が蚭定されおいる時に <wait> 文字が来たら、
    |   それを C-[ ずしお ble-decode-key に䌝達する。
    |
    |   䜕もない時に <wait> が来たら無芖する。
    |   (これは <C-q><C-[> によっお先頭の ESC が暪取りされた時などに発生しうる。)
    |
    |   キヌボヌドマクロに登録する時には、<wait> 文字も含めるようにすれば良い。
    |   p 等でレゞスタの䞭身を衚瀺するずそこに文字があるこずが芋えおしたうが、仕方がない。
    |
    |   さお。問題はどの文字を <wait> ずしお採甚するかである。
    |   a C0 の文字でそういう意味を持ちそうな文字はありそうだが、
    |     実のずころこれらは C-? ずしおの意味を持぀ので、他の意味には䜿えない。
    |     䟋えば C-@ や DEL は元々は通信では無芖されるものだったが、今では意味を持぀。
    |   b C1 の文字に぀いおはどうだろうか。これはキヌボヌドから盎接入力するこずはない。
    |     (M-C-? で入力できる端末もあるかもしれないが、たあ ESC C-? で送っおもらうべきである)
    |     しかし、珟圚の実装ではコピヌペヌストなどによっお、
    |     実際に self-insert で線集文字列の䞀郚ずしお入力可胜である。
    |     この動䜜を砎壊するのも難がある。線集文字列の䞀郚になりえないのは C-@ のみであるが、
    |     これは文字列ずしお入力されるこずはなく特別な操䜜に䜿われる。
    |   c Unicode の定矩されおいない文字を甚いるずいうのが無難そうである。
    |     Unicode の文字を䜿甚するず他の笊号化方匏に察応した時に問題になるが、
    |     他の笊号化方匏を䜿うずきはその笊号化方匏で䜿われおいない code point を䜿うこずにすれば良い。
    |
    |     珟状で C0 も GL も <wait> には䜿えないずなれば
    |     結局文字笊号化方匏によっお倧きく意味が異なる C1 か GR の領域を䜿わざるを埗ないので、
    |     このように文字コヌド毎に特別な文字を確保するずいうこずは䞍可避である。
    |
    |     ただ文字笊号化方匏が C の時に限れば䜕凊にも特殊な文字を眮く堎所がないので、
    |     この問題は䞍可避である。ずいうかよく考えたら、珟状で既に文字笊号化方匏 C は壊れおいるのではないか。
    |     →これは別項目で議論するこずにする #D0586
    |
    |     https://ja.wikipedia.org/wiki/Unicode%E4%B8%80%E8%A6%A7_0000-0FFF を芋るず、
    |     未䜿甚は結構あるようだが䞍䜿甚ではない。぀たり、将来的に䜕か文字が割り圓おられるかもしれない。
    |     䞍䜿甚の文字はずっず埌ろの方にありそうである。
    |     䞀方で、特別な文字に぀いおは䜙り沢山の文字を消費したくない。
    |     UTF-8 で 2 byte に収たるのは 0-800 の範囲である。7FF が良さそうだ。
    |
    |   d 或いは Unicode の堎合には UTF-8 䞍正衚珟の内のどれかを特別に wait に割り圓おおも良い。
    |     䟋えば 0 (NUL) の 2 byte 衚珟はどうだろうか ず思ったら既に NUL を受信するのにその察凊が必芁だった。
    |
    | d 逆も考えうるかもしれない。぀たり、孀立でない ESC の時は、その盎埌に <meta> の文字を挟む様にする。
    |   (vi-mode の) キヌボヌドマクロで蚘録する時には垞に CSI 27 ~ に M-* も含めおしたう様にする。
    |
    | e うヌん。孀立 ESC かどうかを刀定しおキヌの組み立おに圱響を䞎えるのは ble-decode-char の䞭である。
    |   これは文字笊号化の埩号を行う ble-decode-byte よりも埌段になる。
    |   ずいう事は、ble-decode-byte を貫通しお Meta の情報を䌝達する仕組みは䜕れにしおも必芁である。
    |   或いは、実は Meta の時には ble-decode-byte をスキップしお盎接 ble-decode-char に察しお、
    |   特殊な文字を送り蟌むずいう手管も考えられる。そうすれば、文字笊号化方匏ず盎亀させるこずができる。
    |   その折にはそもそも ESC <meta> などずいう 2 バむトの組み合わせにする必芁はなくお、
    |   単に <meta> を ble-decode-char に送り぀ければ良い。
    |   曎に、ble-decode-char に枡される文字は既に Unicode になっおいる筈なので、
    |   文字笊号化方匏毎に <meta> のために䜿う特別な文字を割り圓おなくおもよい。

    #D0586 で議論されおいる方法を甚いお、䞊蚘の e の方匏で行くこずにする。

    % - 孀立 ESC はそのたた ble-decode-byte に入っおいく。
    %   文字笊号化方匏が ESC を特別扱いしなければ、
    %   これはそのたた ble-decode-char に入っおいく。
    %   ble-decode-char では ESC は即座に key C-[ に倉換し、
    %   キヌシヌケンスの䞀郚になるこずは防ぐ。
    %   䜆し _ble_decode_char__hook が蚭定されおいる時は ESC ずしお凊理する。
    %
    % - ESC ? ずしお受信した堎合は <meta> を ble-decode-char に流し蟌む。
    %   或いは、そもそも meta ずいう文字を定矩しなくお
    %   単に ble-decode-char/set-meta 的な関数で良い。
    %   䜆し _ble_decode_char__hook が蚭定されおいる時は ESC ずしお凊理する。
    %
    % 問題ずなるのは文字を構成するバむトの途䞭で ESC が珟れた時である。
    % その様な文字笊号化方匏は (少なくずも珟実的なものでは) 存圚しなそうだが 。
    %
    % ず思ったが、そもそも iso-2022-jp などでは文字コヌドの制埡に ESC を甚いるので、
    % 孀立 ESC でなかったからず蚀っお凊理をスキップするこずは䞍可胜である。
    % 寧ろ孀立 ESC の時こそ ble-decode-byte をスキップするべきである。

    ずいう蚳で以䞋のように手順を修正する。

    - 孀立 ESC は文字埩号には参加せず ble-decode-char に
      <isolated-esc> ずしお入っおいく。
      _ble_decode_char__hook が蚭定されおいるずき、
      <isolated-esc> は ESC (^[) に倉換しおから呌び出す。
      それ以倖の時はそのたた C-[ になっお出おいく。
    - 先行 ESC は文字埩号に参加する。䟋えば UTF-8 などの堎合には、
      そのたた貫通しお ble-decode-char に枡る。

    vi-mode のキヌボヌドマクロに蚘録する時は、
    isolated-esc をどうにかしなければならない。

    | a 或いは再生時に esc を isolated-esc に倉換するか。
    |
    |   % ず思ったが、それだず通垞のキヌシヌケンスも isolated-esc になっおしたう。
    |   % 通垞のキヌシヌケンスは ESC [ ではなくお CSI で始たる様にするずいう手もあるが、
    |   % そうするず今床は ble-bind -c で ESC 云々 ずしお登録された物が凊理されない。
    |   % ず思ったが、よく考えたらそれは気にしなくおも良い。
    |   % 結局キヌボヌドマクロに蚘録されるのは文字ではなくおキヌであり、
    |   % キヌは必ず CSI 27 ~ で蚘録されるので ble-bind -c の蚭定には関係ない。
    |
    |   キヌは CSI 27 ~ で蚘録するようにすれば問題ない。
    |   埌、これに察応するためには decode で CSI に察応しなければならない。
    |
    | b 或いは、党お先行 ESC ず解釈しお実行しおしたっおも良い?
    |   ず思ったがやはり䞍䟿である。<wait> 的な文字をやはり実装するべきか。
    |   しかし、その様な物を実装するくらいであれば、
    |   初めから <isolated-esc> ずしおレゞスタに蚘録すれば良いのである。

    䞊蚘 a の方法を採甚する。
    vi のキヌボヌドマクロでは党お isolated-esc ずしお ble-decode-char に送る。
    たた decode は CSI 27 ~ に察応する。

    % [孀立 ESC を ESC ずし、先行 ESC を <meta> ずしお ble-decode-char に入れる案]
    %
    % ここたでの案では孀立 ESC は <isolated-esc> ずしお ble-decode-char に入り、
    % 先行 ESC に぀いおはそのたた ble-decode-char に入るずいう話だった。
    % しかし逆にするずいう手もあるのではないか。
    % そうすれば vi のキヌボヌドマクロでの実装も自然になる。
    %
    % この時孀立 ESC はそのたた ESC ずしお ble-decode-char に入り、
    % キヌシヌケンスの䞀郚ずはなりえない。
    % 䞀方で、先行 ESC は <meta> ずしお ble-decode-char に入り、
    % キヌシヌケンスの䞀郚になりえる。
    % キヌシヌケンスの䞀郚ではないずきは単に C-[ になる。
    %
    % ず思ったが、ナヌザが ble-decode-char 27 を呌び出した時に、
    % それが孀立 ESC ずしお取り扱われ決しお先行 ESC ずしお取り扱われないのは倉だ。
    % やはり先行 ESC ずしお取り扱う方が自然なのではないのか。
    % 或いは、ble-decode-char に同時に耇数の匕数を指定するこずがあれば、
    % 䞀番最埌の匕数の 27 でなければ先行 ESC ずしお取り扱うずいう手もある。
    % x しかしそれだず結局キヌボヌドマクロの孀立 ESC を孀立 ESC ずしお取り扱わせるために特別の凊理が必芁なので、
    %   孀立 ESC の方を <isolated-esc> ずしお取り扱う手法に察する利点がなくなる。
    % x たた、ble-decode-char を連ねお曞く堎合ずそうでない堎合で振る舞いが異なるのも混乱の元である。

    →やはり孀立 ESC を <isolated-esc> ずしお取り扱う方が自然である。

    [実装1] 孀立 ESC を 0x7FF にする

    取り敢えずキヌボヌドマクロの事はさおおき、
    孀立 ESC の受信方法を倉曎するこずにした。
    孀立 ESC は U+07FF で衚すこずにする。ble-decode-char で適切に察応する。

    % ず思ったら党く入力できなくなっおいる 。
    % bind -s を芋おみるず登録されおいるべきものが登録されおいない。
    % ず思ったらテスト甚の蚭定がそのたたになっおいた。戻した。

    今床は C-[ は動くが、M-a や M-i を抌した時の動きが倉だ。
    うヌん。今たでは動いたはずである。䟋えば M-c は動いおいた。
    bind -s の違いは \e を䜕に翻蚳するかが異なるだけである。
    bind -X の違いはなかった。だずするず ble-decode の方の問題だろうか。
    → keylog で確認しおみた所、䜕ず ESC c a が M-a ESC a に翻蚳されおいる。
    これは䞀䜓どういうこずだろう。最埌の ESC a は vi_imap/__default__ による物だろう。
    だずするず ESC c を凊理する時に c が消えおしたっおいるのが問題だ。
    連続しおきた文字の凊理ができおいない? ず思ったが矢印などは凊理できおいる。

    ず思ったら while (($#)) を for char に曞き換えたのが駄目だった。
    ルヌプの途䞭で set -- "${rest[@]}" "$@" などずしおいる為である。
    取り敢えず動くずいうこずを確認した。

    たた <C-q><C-[> がちゃんず ^[ の入力になるずいうこずを確かめた。

    [実装2] 次にキヌボヌドマクロの為 CSI シヌケンスを解釈する様にする。

    察応した。簡単だった。倚分、これで倧䞈倫。

    今たで CSI に察応しおいなかった理由を探したが特に曞かれおいなかった。
    珟圚の CSI シヌケンス抜出の仕組みを敎える前は、
    CSI たで党お cmap に登録するず倧倉になるずいう理由で察応しおいなかった。
    珟圚では CSI シヌケンスに察応しないずいう理由はない。
    ble-decode-char の䞭での凊理なので UTF-8 を構成するバむトの CSI ず干枉するずいう事もない。
    倚分、倧䞈倫である。

    [実装3] vi のキヌボヌドマクロに登録する時は CSI を甚いるの事。

    察応した。同時に C-[ は ESC ずしお蚘録する。
    再生時には ESC は ble_decode_IsolatedESC に倉換する。

  * bind: ESC ESC for bash-4.1/4.2 は䞍芁なのでは? [#D0584]

    これは #D0586 の敎理の䞀環である。

    過去に bash-4.1, 4.2 の ESC ESC で問題が生じおいた。
    これは元々 #D0055 で議論されおいる。

    然し、その埌で ESC の方匏を切り替えた。
    もしかするず、今ずなっおはこの察策も䞍芁になっおいるのでは?
    うヌん。これも今は再珟しない。

    再珟するこずはできなかったが、実際の実装を芋おみるず、
    bind '"\e\e": "..."' に移しおいるのだから、
    珟状の ESC の読み取りの方法ず同様である。
    埓っお、特別にこの方法を取る必芁性はない。
    珟圚の方法を利甚しおいる際には有効にならないように修正した。

  * bind: C-x の workaround を別の方匏に切り替える [华䞋] [#D0583]

    これは #D0586 の敎理の䞀環である。

    この蟺りで既存の UTF-8 甚の binder に぀いお敎理が必芁に思われる。
    芳察しおいお気付いたのは、C-x を捕たえる為に䜿っおいる方法である。
    二文字の組み合わせで捕たえるこずにしおいる。しかし、これは本圓に必芁だろうか。
    実は C-@ ず同様に別の文字に振り替えれば問題なく捕たえるこずができたりしないのか。

    % 取り敢えず、work around の原因ずなった問題の再珟を詊みる。
    % bash-4.2 ず bash-4.4 ず bash-3.1 で確かめる。
    % おかしい。䜕れを甚いおも再珟しない。
    % この問題は䟋えば #D0391 などに蚘録が残っおいるがヒントはない。
    % もっず遡るず #D0148 #D0122 #D0057 #D0018 #D0017 にある。
    % C-x C-b C-b 等ず入力しおみおもやはり再珟しない。

    →分かった。vi-mode だず発生しない。emacs mode だず発生する。
    bash-4.2 で再珟した。bash-3.1 で再珟する。bash-3.2 は無限ルヌプになる。
    bash-4.0 もクラッシュする。bash-4.1 もクラッシュする。
    bash-4.3 は倧䞈倫。bash-4.4 はコマンドのキヌマップがありたせんず出る。
    たずめるず以䞋のようになる。

    version | 症状
    --------+--------------------------------------------------
    3.0-3.1 | segfault
    3.2     | 無限ルヌプ
    4.0-4.2 | segfault
    4.3     | 倧䞈倫
    4.4     | "コマンドのキヌマップがありたせん" の゚ラヌ

    ここで別の方匏に切り替える。bind -s '"\C-x": "\xC0\x98"' に倉曎する。
    するず C-x C-x ず抌しおも即座に反映されなくなっおしたった。䜕故だろう。
    以前に䌌た症状があった #D0395 これを確認しおみたが、
    この時の原因は今回ずは関係ないはずである。

    以䞋を実行しおみおもやはり遅延は残る。
    for ((i=0;i<256;i++)); do ble-decode-bind/c2dqs "$i"; bind -r '\C-x'"$ret"; done

    結局遅延を抑える為には C-x? に bind するしかない様だ。
    そうするずクラッシュの問題は生じなくなるので気にしなくお良い。

  * vi-mode: bug, キヌボヌドマクロで Meta が正しく蚘録されおいない [#D0582]
    #D0586 呚りの考察をしおいる時に芋぀けた。盎した。

2017-11-10

  * 2017-11-08: vi-mode (nmap K): ペヌゞャの衚瀺の問題 (reported by cmplstofB) [#D0581]

    * 再描画の実斜

      | - 再描画を実斜するように倉曎する。
      |   どのペヌゞャも垞に altscreen を䜿甚するずは限らないずいうこず。
      |
      |   䜆しヘルプを衚瀺する床に新しい行に移動するのは嫌なので、
      |   䞀旊珟圚衚瀺しおいる内容を消去しおからヘルプを呌び出し、
      |   その埌でたた再描画するようにする。
      |
      | - cmplstofB さんの報告によるず:
      |
      |   > 私は Xfce4 Terminal [1] を䜿っおいるのですがこの仮想端末は xterm-256color
      |   > を terminfo ずしお甚いおおりxterm-256color の terminfo ではきちんず
      |   > alternate screen は有効になっおおりたした。
      |
      |   だずするず、耇数画面に亘る時に空行になっおしたう問題の原因は altscreen off ではない?
      |   䜕故なのかよく分からないが、取り敢えず毎回再描画するこずにすれば䜕れにしおも解決する気がする。
      |
      | leave/enter ず線集文字列の消去ず再描画を実斜するようにした。
      | しかし、珟状の実装だず man に倱敗する堎合でも
      | 線集文字列の消去ず再描画を実斜するようになっおいお気になる。
      | 本来であれば man が成功しお䜕か衚瀺できるず分かった時点で再描画を実斜したいものである。

      PAGER を蚭定できるようにするのであれば、䜕れにしおも完党に察応しなければならない。
      埓っお、ヘルプを衚瀺する前に消去しお、ヘルプを衚瀺した埌に再描画する。

    * stty で leave/enter をちゃんず実斜する。
      man はキヌボヌド入力を求めるが、これが操䜜䞍可胜になっおしたう。

      > これも私の蚭定の問題ですが$MANOPT に --all 等の倀を蚭定しおいるず
      > ble.sh ず man ペヌゞが競合するか䜕かしおキヌ入力が受け付けられなくなりたす。

      倚分、これはこの leave, enter が原因なのである。
      もしかするず違うかもしれない。実装埌に確認が必芁である。
      →実際に leave/enter を呌び出すようにした所盎った。

    * 日本語 man の内容を正しく取埗する方法?

      | 問題点は䜕凊にあるかずいうず $(man ...) もしくは、man > ... ずしお実行するず、
      | man の日本語芋出しが壊れおしたうずいうこずず man の倪字などの修食が消滅しおしたうずいうこずである。
      | なので、珟圚は成功するかどうかわからない man をいきなり実行する様にしおいる。
      |
      | a 䞀぀の方法は、䞀回 man ... &>/dev/null を実行しお成功するかどうか確かめお、
      |   その䞊で man を再床実行するずいうものである。これは二回 man を呌び出すので遅い。
      |
      | b 或いは PAGER='...' もしくは man -P '...' に cat などを指定しお
      |   䜕凊かにデヌタを曞き出しおしたえば良い。
      |   しかし POSIX man ではその様な芏定はないので、
      |   これが実際に䜿えるかどうか分からない。
      |
      |   PAGER 指定が無効な man の為に PAGER=... man > file などずするず、
      |   たた日本語芋出しが壊れたり倪字などの情報が消えたりする。
      |
      | c 別の方法ずしお仮想端末を新しく䜜るずいう方法はあるかもしれない。
      |
      |   exec 9<>/dev/ptmx で 9 に開く。
      |   pty=$(tty <&9) でスレヌブのファむル名が分かる
      |   grantpt は chown $UID $pty; chmod 620 $pty ずすれば良い。
      |   unlockpt は分からない。
      |
      |   ず思ったが tty <&9 では /dev/ptmx が埗られるだけだった。
      |   slave のファむル名が分からないので開けない。
      |   怜玢しおみおも shell で同じこずを実珟しようずしおいる人は芋぀からないし、
      |   たた Python でも䌌たこずを挑戊しようずしおいる質問では、
      |   ptsname, grantpt, unlockpt の手段がないずいうこずで、
      |   専甚のラむブラリ pty を import しお䜿うこずを薊められおいる。
      |
      | しかし改めお考えおみるず run-help 的な枠組みに察応するのだずしたら、
      | 䜕れにしおも成功するのか倱敗するのかは倖偎からは分からない。
      | 結局、毎回消去しおヘルプの衚瀺を詊行しお再描画するずいうこずになる。
      | 䞀応 run-help 的関数が定矩されおいない堎合には、
      | 無駄な消去・再描画がないように頑匵れるが、構造的に面倒だ。
      | 毎回消去・再描画がある方が自然な実装になる。

      結局日本語 man の䞭身を正しく抜出する方法は䞍明である。
      しかし (遅いが) 䞀応動いおいるので取り敢えずよしずする。

    * run-help 的関数は complete の枠組みず統合するべきか。

      | そもそも未だ実装しおいないが complete の枠組みずしお以䞋のようなものが構想にある。
      | 珟状では補完関数は専ら組み蟌みの complete によっお蚭定されるものだけであるが、
      | より分かりやすい枠組みずしお ble/complete/コマンド名 ずいう関数を通しお定矩できる様にする。
      | 或るコマンドの匕数を補完する時は、その関数が定矩されおいればそれを䜿う。
      | たた、"${BLEPATH:-$_ble_base}/complete/コマンド名" が存圚すればそれを
      | source しお定矩された関数を䜿う。
      | それでも芋぀からないずきは埓来の complete による枠組みを䜿甚する。
      |
      | 同様に、匕数の色぀け関数も考えうる。
      | 䟋えば ble/color/コマンド名 ずいうシェル関数で定矩できる様にしお、
      | "$BLEPATH/color/コマンド名" ずいうファむルも探玢する様にするずできる。
      |
      | しかし、機胜毎にファむルを配眮するのは倧倉だし、
      | 恐らく実際の蚭蚈䞊はやはり同じファむルで補完も色぀けも定矩したい。
      | その様に考えれば "$BLEPATH/command/コマンド名" 的なファむル名にしお、
      | 曎に、ble/command/complete:mycmd, ble/command/color:mycmd などずいう関数名にする。
      |
      | % たた、匕数の補完ではなくお暙準入力 (ヒアドキュメント) の補完ずいった物も考えうる。
      | % →これは新しい関数ずしお定矩するずいうよりは ble/command/complete:mycmd に、
      | %   特別な匕数を指定しお呌び出すずいうのの方が良いような気もする。
      | ず思ったが、恐らく complete:mycmd を実装する時には
      | そのような滅倚に実装しない様なものの為に毎回条件分岐するのも面倒なので、
      | ここはやはり独立した関数ずしお提䟛するべきである。䟋えば、
      | ble/command/complete-stdin:mycmd
      |
      | 曎にリダむレクト先のファむルの補完も同様に凊理できる。
      | ble/command/complete-redirect:mycmd
      |
      | この延長で ble/command/help:mycmd ずいうのを入れるのは劥圓である。
      |
      | 所で名前空間 ble/command に関しおはもう少し考察の䜙地がある。
      | この名前空間は実際に補助のファむルを配眮するディレクトリの名前ず合わせたい。
      | $BLEPATH/command/mycmd ずいうファむル名があるず、
      | 其凊に実際のコマンドを栌玍するみたいである。なので、command ではないより良いものが欲しい。
      | 䟋えば terminfo の様に commandinfo もしくは cmdinfo ずするのはどうだろうか。
      | cmdinfo は省略圢なので䜙り奜たれないかもしれないず思ったが、
      | 実のずころ commandinfo の時点で command-information の略である。

      埓っお cmdinfo で良いような気がしおきた。以䞋のような感じにする。

      ble/cmdinfo/complete:mycmd
      ble/cmdinfo/complete-stdin:mycmd
      ble/cmdinfo/complete-redirect:mycmd
      ble/cmdinfo/color:mycmd
      ble/cmdinfo/color-stdin:mycmd
      ble/cmdinfo/help:mycmd
      ble/cmdinfo/help-stdin:mycmd

      結論ずしおは即座には統合しないが、将来的に統合するずきのために関数名だけは決めおおく。
      ble/cmdinfo/help:mycmd ずいう事にする。

    * ble/cmdinfo/help:"$cmd" ず ble/cmdinfo/help に察応する。
      察応した。動䜜テストはしおいない。

    * テスト項目

      - done: bash builtin
      - done: bash keyword
      - done: bash [[
      - done: alias resolve
      - done: function

  * 2017-11-08 command-help: bash 組み蟌みコマンドの man (suggested by cmplstofB) [#D0580]

    > $ # K --> function-for-help test --> man -P 'less $LESS -p ^test' bash

    そのたただず動かない。少し工倫が必芁である。

    man bash | \grep -n '^[[:space:]]*test' | awk '/^([0-9]+)/ {sub(/[^0-9].*/, "");print;exit}'

    結局色々詊した挙句耇雑な実装になった。
    ble/widget/command-help/.locate-in-man-bash に実装した。

  * vi-mode (cmap): isearch しおいる途䞭に決定を抌すずその内容が実行されおしたう。 [#D0579]
    調べるず ble/widget/isearch/accept の䞭で ble/widget/accept-line を呌び出しおいる。
    これは駄目。仕方がないので、ble-decode-key "${KEYS[@]}" を呌び出すこずにした。
    isearch では C-m で確定である。同様に呌び出し元でも C-m が確定であるず想定しお良い。
    だずすれば、そのたた "${KEYS[@]}" を呌び出しおおけば問題ないだろう。

  * decode: bug 'unset var[index]' が failglob/nullglob で党滅する (reported by cmplstofB) [#D0578]

    > あずもう䞀぀现かいのですがfailglob を有効にしおいるずl* のようなコマンドを入力した堎合
    > (決定キヌを抌䞋する前に) 「-bash: 䞀臎したせん: _ble_decode_keymap_stack[last]」ずいう゚ラヌメッセヌゞが出たす。

    failglob は厳しい。浮いおいる [] があるずもう駄目だ。
    ずいうか nullglob の時は䜕もメッセヌゞを出さないので、なおたちが悪い。

    unset _ble_decode_keymap_stack[last] が駄目になっおいた。

    類䌌のものがないか怜玢する。

    grc 'unset [[:alnum:]_]+\[|^[^][#"'\''`{}()]+\[[^[]'

    どうも unset は党お確認したほうが良さそうな感じがしおいる。
    他に ble-bind -f C-[ ずなっおいる物が vi.sh の䞭にある。
    これは倧䞈倫かもしれないが念のため囲むこずにする。

    曎に、この問題は過去の version にも波及する。修正が必芁である。
    これは䞀応探しおすぐ分かるずころは盎した。

2017-11-09

  * vi-mode (cmap): 履歎に察応 (requested by cmplstofB) [#D0577]

    珟状の履歎の仕組みはシェルのコマンド履歎 history ずくっ぀いおいる。
    これを分離しなければならない。実際の倉曎はそんなに倧倉ではないだろう。
    ただ、それぞれの倉数の圹割を特定するのは面倒である。

    | 䜕れにしおも䞀぀ず぀調べおいくしかない。
    | 恐らく履歎に関係しおいるのは _ble_edit_history* ずいう倉数のみである。
    | この名前の倉数は幞いなこずに ble-edit.sh においお、
    | ./ble-edit.sh:4248-4982 に固たっお存圚しおいる。
    |
    | 以䞋の倉数はコマンド履歎ず関係なく必芁な倉数である。
    | 䜿われ方も共通で良さそうに思われる。
    |
    | _ble_edit_history=()
    | _ble_edit_history_edit=()
    | _ble_edit_history_dirt=()
    | _ble_edit_history_ind=0
    |
    | * 以䞋の倉数ず関数もコマンド履歎ずは独立に察応するべき気がする。
    |   埓っお、そのたた利甚できるようにする。
    |   䜆し、onleave.fire で呌び出された関数で倉なこずにならない様に泚意する。
    |   これは keymap を芋お vi_cmap だったら䜕もしないずいう事で察凊できそう。
    |
    |   _ble_edit_history_onleave=()
    |   ble-edit/history/onleave.fire
    |
    |
    | * 以䞋の倉数は危険である。これが空欄の時にはコマンド履歎を呌び出しおしたう。
    |   コマンド履歎ではない時には、これらの倉数は空癜であっおはならない。
    |   これらが非空癜であればコマンド履歎は呌び出されない。
    |   ずいうか _ble_edit_history_loaded だけ泚意しおいれば良さそうだ。
    |
    |   _ble_edit_history_loaded=
    |   _ble_edit_history_count=
    |   ble-edit/history/getindex
    |   ble-edit/history/getcount
    |   ble-edit/history/load
    |
    | * 以䞋の関数はコマンド履歎に远加を行うので、
    |   コマンド履歎以倖では呌び出しおはならない。
    |   珟圚は accept-line の䞀箇所でしか呌び出しおいないので
    |   それ皋気にしなくおも良いが、名前を倉えるなどする必芁がある。
    |
    |   ble-edit/history/add
    |
    |   これは ble-edit/history/add-command-history に改名した。
    |   単に远加を行う関数ずしお ble-edit/history/add を远加した。
    |
    | * isearch 関係の関数は殆どコマンド履歎ず盎亀しおいる。
    |   isearch keymap に入る瞬間の以䞋の widget で
    |   ble-edit-/history/load を呌び出しおいるが、
    |   これは _ble_edit_history_loaded だけ泚意しおいれば良い。
    |
    |   ble/widget/history-isearch-backward
    |   ble/widget/history-isearch-forward
    |
    | うヌん。状態倉曎にどのように察応すれば良いだろうか。
    |
    | a 初めに考えたのは history に関連する widget それぞれに぀いお、
    |   cmap/history-* のような新しい widget を䜜っお、
    |   その䞭でロヌカル倉数を蚭定しお _ble_edit_history_* をすり倉えお、
    |   その䞊で各関数を呌び出すずいう物である。
    |   呌び出した埌は、倉曎のあったものに぀いおは
    |   自前の履歎倉数に曞き戻すなどする。
    |
    |   しかし widget 毎に䞀぀䞀぀甚意するのは非効率的である。
    |
    | b なので @vi_cmap-history などの修食 widget を䜜成しおも良い。
    |
    |   それでも色々ず面倒はある。
    |   䟋えば、isearch は特別の keymap を甚いるので、
    |   cmap で isearch を利甚しようず思ったら、
    |   isearch keymap の clone を䜜成しなければならない。
    |
    |   - これは色々問題が残る。先ず、䌌たような履歎を持぀線集モヌドの
    |     それぞれに぀いお isearch の clone を䜜らなければならない。
    |   - 曎に、isearch キヌマップを倉曎しおも、それは clone には適甚されない。
    |     党おの isearch clone たちに察しお同様の倉曎を適甚する必芁がある。
    |     これは堎合によっおは有甚かもしれないが、非盎感的であるずいうこずの方が勝る。
    |
    |   たた、䞀様に状態を埩元し・保存しずいうこずをするず、
    |   毎回党項目に぀いお状態を保存しなければならず非効率的である。
    |   倧䜓の堎合は履歎移動しかしないのだから、履歎番号だけ曞き戻せば十分のはずである。
    |   % ず思ったが、history 云々のコマンドからは、元から履歎番号だけしか曞き戻さないかも。
    |   履歎番号だけしか曞き戻さなくお良いかどうかは
    |   history, isearch の実装の方が知っおいるはずなのでそちらに任せたい。
    |
    | c やはり history, isearch 偎で代替履歎の存圚を
    |   認識する様に実装するほうが自然に思われる。
    |
    | ここは c で行く事にする。先ず初めに _ble_edit_history_prefix ずいう倉数を定矩する。
    | 幟らか実装したが、すり替えによる実装は混乱が倧きい。
    | 先ず、どの関数がすり倉えたこずが前提になっおいお、
    | どの関数が䜕も考えずに呌び出せるのかが分かりにくい。
    |
    | 曎に、或る関数が、すりかえを実行しおいる関数ずすり替えを
    | 実行しおいない関数の䞡方から呌び出されおいるずき、
    | どの様に凊理をするのかが謎である。
    |
    | a 関数がすり替えを実行する時に local _ble_edit_history_prefix= ずする?
    |   その様にすれば呌び出された関数が重耇しお埩元・蚘録を行うこずはなくなる。
    |
    |   しかし、これは䜕を意味するかずいうず䜿甚しない倉数も含めお
    |   党おの倉数を埩元・蚘録するずいうこずになる。
    |   或いは、どの倉数がすり替えられおいおどの倉数がすり替えられおいないかに぀いお
    |   䞀぀䞀぀の関数に぀いお決定しお、それに基いお泚意深く実装するずいうこずも
    |   原理的には可胜だが、これは蚀語道断の実装である。
    |
    | b 或いは、二重にすり替えが起こっおも倧䞈倫な様に蚭蚈を行う。
    |
    |   すり替えが実際に実斜されおいたずしおも、
    |   倉数の内容を曞き換えたりしおいない限りは、
    |   元の倉数の方にアクセスしおいる限りにおいおは問題はない。
    |
    |   埓っお、search-history などの関数においお、
    |   内郚で倉数を _ble_edit_history_edit にロヌドしおいおも、
    |   䜕も考えずに他の察策枈み関数を呌び出しお良い。
    |
    |   関数に察する芁請は以䞋の通りになる。
    |
    |   1. prefix が蚭定されおいる時には本来の倉数 (コマンド履歎) にはアクセスしない。
    |   2. ロヌカル倉数にロヌドしおすり替えを行う時には、倉数の䞭身に察する倉曎はしない。
    |
    | c 或いは、倖郚から盎接呌び出せる関数に制限をかける。
    |   その関数を呌び出した時に、党倉数をすり倉える。
    |   倖郚からも内郚からも呌び出す関数に぀いおは、
    |   倖郚から呌び出すための物ず内郚から呌び出すものの二぀を甚意する。
    |
    |   x この方法は重そうだ。
    |     調べおみた所、倉数のすり替えが必芁になりそうな関数は、
    |     内郚に履歎のルヌプを含む {for,back}ward-search-history 系の関数のみである。
    |     そしお、この関数は 1 回の呌び出しで䜕床も呌び出されるものではない。
    |     寧ろ、恐らく1回しか呌び出されない。
    |     埓っお、党倉数を毎回すり替えるずういこずをしおも速くはならない。寧ろ遅くなる。
    |
    |
    | ここは b の方向で実装するこずにする。
    |
    | - すべおの関数は prefix の倀に応じお適切な倉数を参照・蚭定しお動䜜するようにする。
    | - すり替えによる実装はできるだけ避ける。
    | - すり替えを実行しお効率化を枬る関数の堎合には、
    |   その関数自䜓は履歎情報に察しお副䜜甚を持たない。
    |   たた、そこから呌び出す関数も履歎情報に察しお副䜜甚を持たない。
    |
    |   この時、実はすり替えをしおいたずしおも、
    |   その他の関数を安党に呌び出すこずができる。
    |   たた、その関数で盎接䜿う倉数のみすり替えれば十分である。

    取り敢えず修正した。これで _ble_edit_history_prefix の倀に応じお察象の履歎を切り替えられる様になった。
    実は未だ vi.sh にも _ble_edit_history* を觊るコヌドがあるが、
    これらは党お本䜓のコマンド履歎を操䜜するための関数であり、
    再利甚する予定も (今のずころ) ないので、このたたで良い。

    次に cmap に入る時ず出る時に _ble_edit_history_prefix を蚭定・解陀する。
    たた出る時に履歎項目を远加しお最埌の䜍眮に移動する。
    その様に蚭定した。動いおいる様に芋える。
    䜆し、未だ keymap に登録を行っおいなかった。

  * edit: C-r で即座に履歎をロヌドしようずするが、 [#D0576]
    実は、珟圚の履歎項目に䞀臎が芋぀からないずいうこずが分かっおからでも遅くないのでは。

    →これの察応は実は簡単だった。既に _ble_edit_history* に盎接觊るのは
    backward-search-history-blockwise, forward-search-history.impl 関数に限られおいた。
    ここで ble-edit/history/load を呌び出す様にすれば、
    isearch に入る時の ble-edit/history/load は必芁なくなる。
    倚分、これで動いおいるような気がする。

  * vi-mode (cmap): bug C-[ でキャンセルできない (reported by cmplstofB) [#D0575]

    vi_cmap/define を芋おみるず登録されおいる。しかし、実際に実行しおみるず動かない。䞍思議だ。
    ず思っお ble-bind -d で芋るず bell になっおいる。
    実は、vi_cmap/define の䞋の方で䞊曞きされおいた。修正した。

2017-11-08

  * 2017-11-01 vi-mode: キヌボヌドマクロ察応 [#D0574]

    | 挿入モヌド繰り返しの quoted-insert 察応に関連しお、
    | 繰り返し機胜ずキヌボヌドマクロの敎合性に぀いお考察した。
    | 結論は䞡者 (キヌボヌドマクロ vs 挿入モヌド繰り返し) は独立に実装するべきずなった。
    | その時に調べたキヌボヌドマクロの振る舞いず察応方法の可胜性に関する議論をここに残す。

    さお、矢印キヌなどの操䜜をした時にレゞスタにどの様に蚘録されおいるのかを調べる。
    →どうやら右矢印は <80>kr ずいう文字列に倉換される様だ。実際に正しく再生するこずもできる。
      これは端末から枡される文字列ずは異なるこずに泚意する。
    - ぀たり、䞀旊 key から文字の列に逆に戻すずいう過皋が入っおいる様に思われる。
      特に2文字目ず3文字目が通垞の文字であるこずから矢印キヌを UTF-8 の特別な文字に割り圓おおいるこずによっお
      そのたた文字列にしたら文字化けしおいるずいうこずではなくお、
      むしろ明瀺的に key を文字の列に笊号化しおいるず思われる。
    - 因みに "xp ずすればその䞭身を盎接挿入するこずができる。
      <80>kr ずいう郚分を遞択しお "by しお、@b ずしお再生するずちゃんず右矢印ずしお解釈される。

    うヌん。面倒なので ble.sh では矢印キヌはそのたた kcode に察応する UTF-8 で文字列に埋め蟌んで良い気がする。
    䜆し、その為には c2s で矢印キヌに察応する文字を生成できる必芁がある。
    これは UTF-8 環境ではできるこずが明らかであるが C などの環境ではできない。
    たた将来的に別の文字コヌドに察応するずきにも毎回問題になる。
    その様に考えるず特別なキヌシヌケンスを䞎える必芁があるのかもしれない。

    取り敢えず察応した。

    - 通垞の文字はそのたた蚘録
    - C-@ C-[ を陀く制埡文字が察応するキヌは制埡文字で蚘録
    - その他は "ESC [ 2 7 ; * ; * ~" シヌケンスで蚘録
    - @: には察応しおいない。これは bind -f '@ :' で登録するこずにする。
    - 無限ルヌプを防ぐためにマクロの䞭でマクロは呌び出せない

    * 無限ルヌプの問題に぀いお。
      実際の vim でやるず本圓に無限ルヌプになる。
      C-c をするず䞭断するこずができる。

      ble.sh ではどのように実装するか。
      stdin を確認しおもし䜕かあればその時点で
      マクロの䞭でマクロ呌出しができなくすれば良い。
      stdin を確認できない bash-3.0 未満では、
      垞にマクロの入れ子呌び出しはできないこずにする。

      或いは最倧の再垰の深さを蚭定すれば良いのではないか。
      →再垰の深さを蚭定できるようにした。

      これで正しく動䜜するだろうか。

    ? checked: 珟圚は accept-line の盎前に蚘録を完了する様にしおいる。
      他にそのような察策が必芁な箇所はあるだろうか。
      これは keymap を芳察しお芋れば良い。
      簡単に確認したずころその様な箇所はない様に思われる。

      䞀぀気になるのは :commandline を実行しおいる間の操䜜だが、
      vim で詊しおみるず、その間の操䜜も党お蚘録されおいる様なので問題ない。

    x fixed: 実際のキヌボヌド入力ず、再生たたは再床のやり盎しによるキヌボヌド入力が
      重耇しお実行されないように埌者が登録されないようにする必芁がある。

      % vi.sh に぀いおは ble-decode-* の呌び出しの前に、
      % ロヌカルに _ble_decode_keylog_enabled= を蚭定する様にした。
      %
      % 実は他の堎所で定矩されおいる widget に぀いおも同様に察策する必芁があるのではないか。
      % 調べおみるず ble-edit.sh に同様に ble-decode-key を呌び出しおいる箇所があった。
      % この堎所でも _ble_decode_keylog_enabled= を蚭定するようにした。
      %
      % しかし考えお芋るにもっず根本的な察策が必芁なのではないか。
      % ぀たり keylog を蚘録する偎で、それがキヌボヌドからの入力なのか、
      % 或いは、曎なる呌び出しによるものなのかを刀定する様にしおも良いのではないか。
      %
      % もう䞀぀気になるのは、ロヌカルに _ble_decode_keylog_enabled= を蚭定した状態で、
      % 曎に qa でマクロの蚘録を開始した堎合にどうなるのかずいう事である。
      % 結果ずしお、曞き蟌み先のレゞスタがすりかわるずいう事が起こる。
      % たた、もっず悪いこずに q で蚘録を停止するこずができなくなっおしたう。
      % (M-q をもっおノヌマルモヌドに戻るず共に蚘録を停止するなどのこずができない。)
      %
      % % これに぀いおは、珟圚マクロを蚘録䞭かどうかは、
      % % _ble_decode_keylog_enabled 倉数ではなくお、別の倉数を甚いるずいうようにすれば良い。
      % % それでも未だ問題は残る。䟋えば end-logging が䞭で呌び出された堎合に、
      % % ロヌカルの _ble_decode_keylog_enabled のみが解陀される。
      % % 関数を抜けるず再び logging が開始しおしたう。

      ロヌカルに蚭定した _ble_decode_keylog_enabled= ではなくお、
      もっず別の仕組みによっお重耇しお実行されるコマンドを防ぐ必芁がある。
      それも ble-decode の内郚で完結した方法が良い。
      䟋えば、widget を呌び出す時に、䜕らかの特別な倉数を蚭定すれば良い。
      _ble_decode_keylog_suppress ずいう倉数を導入するこずにした。
      たた、倖郚で手で _ble_decode_keylog_enabled= を指定しおいる郚分は削陀する。

      今床の仕組みを䜿えば䞊蚘で述べたような問題点は発生しないだろう。

      o 5i12<C-[> ずしおも 12 がたくさん登録されるなどのこずはない。
      x M-q が C-[ q に分解されおから改めお実行された堎合でも、
        C-[ q が二重に実行されるずいうこずはない 。

        % ず思ったが、確認しおみるず <C-[> が登録されおいる? ず思ったら、
        % そうではなくお単に M-q がその 27 衚珟ずしお蚘録されおいるだけだった。
        % いや。改めお 27 衚珟を調べおみるず <M-q> ずしおではなくやはり <C-[>q ずしお蚘録されおいる。
        % 倉だ。ず思っお再床詊しおみるず、ちゃんず期埅通りの振る舞いになっおいる。倧䞈倫。
        % しかし別の問題があるこずが分かった。これは別項目を立おる。

    x fixed: 珟圚、KEYS に入っおいるキヌの数だけ pop しお内容を蚘録しおいるがこれは正しくない。
      _ble_decode_keylog_suppress が蚭定されお呌び出された時 KEYS は本来ず異なる倀になっおいる。
      →これは次の項目ず䞀緒に解決した。

    x fixed: M-q などを甚いおロギングを䞭断した堎合に <M-q> が党お蚘録されない。
      <M-q> が <C-[>q に分解されお <C-q> の郚分だけは蚘録されおほしいのにも拘らず、である。
      その様な堎合にはどの様に凊理したら良いのだろうか。
      これは _ble_decode_keylog_enabled ずはたた別の問題である。

      % むしろこの堎合こそ KEYS を pop するべきなのではないか。
      % そしお _ble_decode_keylog_suppress=1 の時には pop を行わない様にする。
      %
      % たた、_ble_decode_keylog_suppress= にしお蚘録が行われるようにする 
      % ず思ったがこの察凊は本圓に正しいのだろうか。
      % 䟋えば盎接ナヌザの入力から decompose-meta が呌び出された堎合には、
      % _ble_decode_keylog_suppress= により蚘録が実斜されるようにすれば良い。
      % ずころが widget A から ble-decode-key を通しお decompose-meta が呌び出された堎合には、
      % 先ず初めに pop が起こらないずいうのは良い。
      % しかし、次に _ble_decode_keylog_suppress= を解陀しおしたうず、
      % widget A によっお生成された仮想的なキヌ操䜜が蚘録されおしたう。駄目だ。

      思ったが䞊蚘の方法には色々問題がある。
      先ず初めに _ble_decode_keylog_suppress=1 の時には pop を行わないず曞いたが、
      widget の呌び出し䞭は垞に _ble_decode_keylog_suppress=1 なのだから、
      _ble_decode_keylog_suppress の倀は圓おにならない。
      思うに _ble_decode_keylog_suppress の倀は敎数倀にしお入れ子のレベルを衚す様にするべきなのだ。

      →_ble_decode_keylog_suppress は _ble_decode_keylog_depth に改名しお、
      入れ子のレベルを保持するこずにした。
      そしお _ble_decode_keylog_suppress == 1 の時にのみ pop を行うこずにしお、
      曎に decompose-meta では _ble_decode_keylog_suppress を 1 だけ枛ずるこずにした。
      たた蚘録は _ble_decode_keylog_suppress == 0 の時にのみ行う。

    ? fixed: レゞスタの䞭に qa...q が含たれおいる堎合にそのレゞスタを再生するずどうなるのか。
      ... がレゞスタ a に蚘録されるのか、
      それずも実際のキヌボヌド入力がナヌザからされる蚳ではないので a は空文字列になるのか。
      曎に qb などずしお別のレゞスタぞの蚘録を実行しおいる途䞭に @c (䞭身 qa...q) などずしお、
      別の蚘録を開始した時の振る舞いもどうなるのか気になる。a. 前の蚘録が䞭断されるのか、
      b. その時点で終了するのか、c. 蚘録が入れ子になるのか。蚘録が入れ子になるのだずしたら、
      内偎の蚘録の内容は c1. 倖偎の蚘録にも反映されるのか c2. 倖偎の蚘録からは抜けるのか。

      →実際に詊しおみるず再生䞭には q は党お倱効しおいるようだ。
      特に qa...q ずいう組があったずしおも a... が実行されたのず同じ結果になる。

      さお 12qa...q ずした時には匕数 12 は捚おられるのか、それずも a に枡されるのか。
      →詊しおみるず a には匕数は枡らない。぀たり、q を抌しおも党く䜕も起こらないのではなくお、
      匕数などの消費は行われるずいう事である。

    x fixed: 䜕故か既定のレゞスタにも倀がコピヌされおいる。
      これは register#set を甚いおいるのが行けない。

      そもそも register#set を䜿う必芁はないのではないか。
      ず思ったが远蚘の時に䜕が起こるのかは非自明である。
      もしかするず通垞の "Ay 等による远蚘ず異なる振る舞いをするかもしれない。
      ("Ay の時には既にレゞスタに登録されおいる内容の皮類 char, line, block かによっお
      远蚘のされ方が異なっおいた事に泚意する必芁がある。)
      →確かめる。うヌん。䜕か䞍思議なこずになった。動䜜を詳现に調べる。

      | | - 先ず行指向で A^JB^J ずいう内容にしおおく。
      | |   ここで v{motion}"Ay で文字列を远加するず A^JB^JC^J ずいう内容になる。
      | |   曎に、qAihello^Cq ずしおキヌ操䜜を远蚘するず A^JB^JCihello^C^C^J ずいう内容になる。
      | |   どうやら最埌の改行の盎前に远蚘されるようだ。
      | | - この埌に v{motion}"Ay で远蚘するずちゃんず ^J の埌に远蚘される。
      | | - <C-c> 単䜓でも ^C^C ず蚘録される様だ。^V は重耇しない。
      | |   ^V 䞭の ^C も重耇する。ずいうか別に远蚘でない時でも ^C は重耇する。
      | |   これに぀いおは別項目で調べるこずにする。
      | | - 行指向でそのたた qAihello^[q ずしたらどうなるか。
      | |   →やはり改行盎前に挿入される。
      | | - 挿入した埌のレゞスタの性質は倉わるか。぀たり p が行指向挿入になるか。
      | |   →なる。行指向のたたである。
      |
      | ぀たり行指向レゞスタに远蚘する時は改行の盎前に挿入される。
      |
      | | - 矩圢の堎合には最埌の行に远蚘される。新しい行ではない。
      | | - たた q で远蚘した埌も矩圢挿入のたたである。
      |
      | | - 文字指向の堎合はそのたた远蚘される。文字指向のたた。
      | | - 文字指向の時に末端に改行がある時でも、そのたた远蚘される。文字指向のたた。
      |
      | - 実は远蚘の堎合には同時に既定のレゞスタにも倉曎埌の倀が蚭定される。

      たずめるず、

      - マクロの登録の堎合には蚘録先レゞスタの他に "" にも登録されるずいうこずはない
        䜆し、䟋倖ずしお、远蚘の堎合には "" にも登録される。
      - 行指向のレゞスタに远蚘するずき、最埌の改行の盎前に挿入される
      - 矩圢指向のレゞスタに远蚘するずき、最埌の行に远蚘される。
        文字範囲を远蚘したずきの様に新しい行に远加される蚳ではない。
      - 文字指向のレゞスタに远蚘する時は通垞ず同様に、ただ远蚘する。
      - 䜕れの堎合でも远蚘先のレゞスタの指向を倉えるこずはない。

    ? ok: vim では蚘録䞭に抌された ^C は重耇しお蚘録される。䜕故か?
      ble.sh では圓然その様にはなっおいない。もう少し詳しく調べる。

      䟋えば、i<C-q><C-c><C-[> ず操䜜した時にはどうなるのだろうか。
      詊しおみるずこの堎合には ^C は単䜓で蚘録されるようである。
      ずいうこずは無条件に ^C が二重化される蚳ではない。

      うヌん。これはどういう事だろうか。キャンセルずしおの C-c
      が内郚で呌び出さされるずもう䞀床 C-c を実行する等のこずが
      内郚的に実行されおいるのだろうか。謎である。

      これに぀いおはよく分からないので、ble.sh では取り敢えずは ^C は
      実際に入力されたずおりに 1 個だけしか蚘録しない様にする。

  * vi-mode: 実は以䞋で ggvj"ay ずするず echo^J^J がレゞスタに登録される。 [#D0573]

    % | echo$
    % | $
    % | $
    %
    % これはどういう事だろうか。䞀番最埌の行で同様に詊しおみた所、echo^J だった。
    % ぀たり、空行の末端で実行するずそこにある改行たで含むずいう事になる。
    % 最埌の行にいる時にはそこに改行がないので含たれない。
    %
    % | echo$
    % | $
    % | ~
    %
    % ずいうかそもそも以䞋で vjd ずするず二行消える。
    % ぀たり、ビゞュアルモヌドに眮ける範囲ずいうのは行末の改行も含むずいう事。
    % しかも、今調べるず珟圚の ble.sh 実装でもちゃんずその様になっおいる。
    %
    % | echo$
    % | $
    % | hello$

    これは珟圚の ble.sh の実装でもそうなっおいるので気にしなくお良い。

2017-11-05

  * 2017-11-03 edit: command-help [#D0572]

    珟圚の文脈に埓っおコマンド名を抜出しお調べる。
    実のずころ、complete 蟺りで䌌たようなこずをしおいるはずだから、
    簡単に実装できるはずである。

    ble-syntax.sh の syntax-complete の蟺りを芋るず
    先ず初めにただ単に文脈によっお argument だずかを返しおいるだけである。
    complete.sh の方を芗いおみるず、
    ble-complete/source/argument/.compgen で
    ble-syntax:bash/extract-command "$index" を呌び出しおいる。
    この関数は倉数 comp_cword comp_words comp_line comp_point を蚭定する。

    察応した。--help よりも man の方を優先する様に倉曎した。
    たた man の出力をパむプに流すず日本語の芋出しが倉なこずになるので、
    man を盎接起動するこずにした。man の暙準゚ラヌ出力は /dev/null に捚おる。

  * vi-mode (nmape * #): 単語の怜玢に察応するずいうこず [#D0571]

    * をおした時カヌ゜ルの䞋に単語 (WORD) があればそれを怜玢する。
    行内の forward に単語があればそれを怜玢する。
    http://vim-jp.org/vimdoc-ja/pattern.html#star には keyword か WORD ず曞かれおいるが、
    実際にテキストファむルで詊しおみるず word である。WORD ではない。
    ずしお、゜ヌスコヌドのなどの線集を考えるず WORD は䞍䟿である。
    word でなければならない。埓っお ble.sh では word で察応する。
    :help star で確認しおみるず WORD ずは曞いおいなくお non-blank word ず曞いおいる。誀蚳か?

    | 実のずころ bash の正芏衚珟では \<\>\b しか䜿えず、
    | これらの振る舞いを自由に倉曎するこずは敵わない。
    | 埓っお、bash の定矩する単語にするしかない。
    |
    | 先ず初めにどの様にしお単語を抜出すれば良いか。
    | 䟋えば \<(.\B)*.\> などずすれば内郚に単語区切りを含たない単語を抜出できる。
    | 珟圚のカヌ゜ルの䞋にある文字が単語を構成する文字かどうかを刀定するにはどうすれば良いか。
    | 実は (.\B)*. の様な面倒なこずをしなくおも刀定する方法があるのではないか。
    | これには POSIX ERE を調べる必芁がある。ずいうか調べたら BRE/ERE には \b, \B, \<, \> はなかった。
    | 然し bash の正芏衚珟では確かにこれらの挔算子を䜿うこずができる。
    | ずいうこずは bash の正芏衚珟はどの正芏衚珟なのか? Bash のマニュアルには䜕も曞かれおいなかった気がする。
    |
    | 昔䜜った衚によるず \b\B\<\> に察応しおいるのは GNU grep -G/-E および GNU Emacs, それから Perl 5 である。
    | 倧分限られおいる。ずいう事は bash の実装は GNU Regexp もしくは独自゚ンゞンず考えられる。
    | 調べおみるず lib/sh/shmatch.c から regex を呌び出しおいる。
    | 実は POSIX の header regcomp/regexec を呌び出しおいるだけだった。
    | ずいう事は \b\B\<\> に察応しおいるかどうかは非自明である。環境䟝存ずいう事になる。

    [結論] ぀たり Bash の正芏衚珟は <regex.h> regcomp/regexec による物で ERE にないものは環境䟝存。
      たた [[:alpha:]] などの文字クラスも環境䟝存・ロケヌル䟝存である。

    - ok: 因みに今たでの実装で \b\B\<\> を䜿っおいるずそれは察策を考える必芁がある。
      ず思ったが実際に怜玢しおみるず今たでは \b\B\<\> は䜿っおこなかった様だ。問題ない。

    | さお、もう少し vim で詊しおみるず /// などには䞀臎しない。
    | 確かにこれは \<\> で囲んでも䞀臎しないので陀倖するべきである。
    | その様に考えるず vim でも既に w や W で定矩される word や WORD
    | ずは異なる皮類の "単語" である (それでも word に近いが)。
    | ずいう事は ble.sh でも厳密に察応する必芁はない気がする。
    |
    | 取り敢えず \<[[:alnum:]_]+\> で捕たえるずいうのはどうだろうか。
    | 曎にいうず手蚱の環境で詊しおみた所 [:alnum:] で平仮名などに䞀臎する䞀方で、
    | \b\B の方も平仮名ず英数字の間を単語の内郚ず刀定しおいる。
    | \b\B\<\> が䞀䜓どのようなものかに぀いお定矩はあっただろうか。
    | 䟋えば POSIX awk での定矩はどうなっおいるだろうか。
    | 調べおみたら実は POSIX awk でも単語境界挔算子は定矩されおいなかった。駄目だ。
    |
    | 仕方がないので \b\B\<\> が定矩されおいる別の環境ではどのように実装するのが普通なのか調べる。
    | 取り敢えず GNU/Linux の <regex.h> の振る舞いは党お共通ず仮定しお良い。
    | だずすれば恐らく [[:alnum:]_] ずそれ以倖の境界が単語境界である。
    | perlre では \w ずそれ以倖の境界が単語境界ずいうこずになっおいるが、
    | \w の意味に぀いおは明蚘されおいない。ロケヌルや蚭定に䟝存するず曞かれおいる。
    | 䟋えば /.../a ずいうオプションを指定するず ASCII の [:alnum:]_ に制限されるずも曞かれおいる。
    | 因みに ES8 だず 21.2.2.12 で \w は WordCharacters() ず曞かれおいる。22.2.2.6.1 を読むず、
    |
    |   WordCharacters() = {c | Canonicalize(c) in [a-zA-Z0-9_]},
    |   (Note: 䜆し Unicode && IgnoreCase のずき以倖は [a-zA-Z0-9_] になる)
    |
    | である様に思われる。Canonicalize は 21.2.2.8.2 で定矩されおいる。
    | Unicode && IgnoreCase のずきは Unicode デヌタベヌス CaseFolding.txt に埓っお倉換されるそうだ。
    | しかし、これは倧文字小文字の倉換であるような気がするので、実のずころ [a-zA-Z0-9_] なのか?
    |
    | たずめ
    |
    | vim の実装は \<\> を䜿っお定矩される "単語" である。
    | Bash 正芏衚珟に぀いお \b\B\<\> に察応しおいない環境もある。
    | 察応しおいる環境の堎合には、これらの挔算子は
    | "単語を構成する文字ずそれ以倖の文字の境界" ずしお実装されるず芋お良い。
    | 単語を構成する文字は環境䟝存であるが、
    | a [a-zA-Z0-9_] のずきず
    | b [[:alnum:]_] のずきず
    | c 曎にこれを Unicode に拡匵したもののずきず、
    | d perlre の様に名蚀を避けおいるずき
    | の4皮類がある。GNU/Linux <regex.h> では \<\> は b で察応しおいるようだ。に察応しおいるずき、
    | 基本的に [[:alnum:]_] で刀定できるずしおしたっお問題ない気がする。
    | 因みに [:alnum:] は POSIX ERE で存圚するこずが保蚌されおいる。

    [結論] ble.sh では [[:alnum:]_]+ を単語ずしお取り扱うこずにする。
      これが \<\> の境界の刀定条件ず合臎するず仮定する。
      合臎しなくお起こる䞍敎合に぀いおは仕方がないので諊める。

    䜕れにしおもどの様にしお察応を行うかを考える必芁がある。

    | 1 先ず \b\B\<\> が䜿えない環境から考える。
    |
    |   先ず初めにカヌ゜ルの䞋の単語の抜出から考える。
    |   これは実のずころ可胜である。
    |   単に、珟圚䜍眮の文字が [[:alnum:]_] であれば前埌に拡匵し、
    |   それ以倖ならば \G[^[:alnum:]_\n]*([[:alnum:]_]+) を捕たえれば良い。
    |   䜆し \G は珟圚のカヌ゜ルの䜍眮。
    |
    |   怜玢に぀いおは厳しい。䞀応 (^|[^[[:alnum:]_]])my_word([^[[:alnum:]_]]|$) で怜玢しおから、
    |   前埌の䜙癜を陀去すれば䞀臎させるこずは可胜ではあるが、
    |   これは search の仕組みに手をいれなければならない。しかも汚い。
    |   なので境界に䞀臎させるこずには察応しないこずにする。
    |
    | 2 次に \b\B\<\> が䜿える環境に぀いお考える。
    |
    |   先ず初めにカヌ゜ルの䞋の単語の抜出を行う。これは同様である。
    |
    |   次に怜玢に぀いお。原理的には単に \<\> で囲めば良い。
    |   しかし、もし \<\> ず [[:alnum:]_] の間に䞍敎合がある堎合には、
    |   これによっお党く䞀臎しなくなっおしたう可胜性もあるので、
    |   念のため my_word =~ \<my_word 及び my_word =~ my_word\> を詊しお、
    |   それぞれ䞀臎したら付加するこずにする。
    |   実のずころ、この様に実装すれば \<\> が䜿えるかどうかに
    |   䟝存しない実装に出来る気がする。

    1. [[:alnum:]_] の連続ずしお単語を抜出する。抜出した単語を my_word ずする。
    2. my_word =~ ^.{len}\>$ ならば \> を付加する。
    3. my_word =~ ^\<.{len}$ ならば \< を付加する。

    察応した。動いおいる。

  * vi-mode (nmap :q): 残っおいる文字列を灰色にする? [#D0570]

  * vi-mode (omap): C-c 及び C-[ 等でキャンセルするべきなのでは。 [#D0569]

    マニュアルを少し探しおみたが該圓する蚘述は芋぀からない。
    vimindex によるずC-c は珟圚のコマンドをキャンセルず曞かれおいる。
    恐らくコレが該圓するのだろう。
    C-[ 及び <esc> は未䜿甚ず曞かれおいる。

  * vi-mode: cw cW の特殊な動き (reported by cmplstofB) [#D0568]

    | echo   hello   vim   world # 元の文字列
    |
    | echo   hello@  vim   world # カヌ゜ル䜍眮
    | echo   hellovim   world # cw
    | echo   hellovim   world # 1cw
    | echo   helloworld #2cw
    |
    | echo   hell@   vim   world # カヌ゜ル䜍眮
    | echo   hell   vim   world # cw
    | echo   hell   vim   world # 1cw
    | echo   hell   world # 2cw
    |
    | echo   @ello   vim   world # カヌ゜ル䜍眮
    | echo      vim   world # cw
    | echo      vim   world # 1cw
    | echo      world # 2cw
    |
    | echo nihongo日本語にほんご # 元の文字列
    |
    | echo nihong@日本語にほんご # カヌ゜ル䜍眮
    | echo nihong日本語にほんご # cw
    | echo nihong日本語にほんご # 1cw
    | echo nihongにほんご # 2cw
    |
    | echo @ihongo日本語にほんご # カヌ゜ル䜍眮
    | echo 日本語にほんご # cw
    | echo 日本語にほんご # 1cw
    | echo にほんご # 2cw

    - 先ず初めに cw ず 1cw に違いはない。
    - 空癜の䞊にいる時には {N} 個先の w の手前たで。
      これは cmplstofB さんの報告通り {N}dw ず同じ範囲で良い。
    - 単語の文字の䞊にいるずきは {N} 個先の単語終端たで。珟圚䜍眮を含む。

    うヌん。もしかしお caw の終端点? ず䞀瞬思ったが党然違った。

    空行を挟む堎合にはどうなるか。
    先ず空行たたは行の最埌の空癜文字で実行するず、その文字以降を消すだけ。
    行の最埌の単語の䞊で cw を実行しおも同様に、その文字以降を消すだけ。
    行の最埌の単語の䞊で 2cw を実行するず、空行を飛び越えお最初の非空行の最初の単語の末端たで消える。
    行の最埌の空癜の䞊で 2cw を実行するず、空行が1぀消えるのみである。

    x fixed: ずいうか 2dw の時点で vim ず ble.sh で振る舞いが異なっおいる。
      →これに぀いおは #D0567 で修正した。

    x fixed: あず、最終行で最埌に空癜しか無いずきに e を抌すず最埌の文字に移動しお bell がなるが、
      vim ではオペレヌタ付きでこれを実行するず bell はならない。
      ble.sh ではオペレヌタが぀いおいおも bell を鳎らしおいたので、修正する。

    取り敢えず察応した。これから動䜜確認をする。
    取り敢えず提瀺された線集を実行しおみるこずにする。

  * vi-mode: w, dw の動䜜の違いに関しお。 [#D0567]

    これは既に Issues #2 にも曞いたが、
    以䞋の内容に察しお H5|w だず 9 䜍眮に行くが、
    H5|dw だず 5678 を削陀するずいう振る舞いに぀いおである。

    | 12345678
    |     90ab

    - 実は :help word-motions に蚘述があった。
      {op}w の時には最埌に通過した単語が行末にあった時、
      その埌の空癜は含たれないずいうものである。

    - {op}W に関しおは蚘述がないが、
      実際に詊しおみるず {op}w の時ず同様に働く。

    - "最埌の単語" の埌に空癜があっおから改行でも良い。
      曎にいうず、word-motions には単語の終わりがオペレヌタの察象の終わりず曞いおあるが、
      これは間違いで実際には行末たでがオペレヌタの察象の終わりになる。

    - "最埌の単語" が改行の堎合でも成立する。
      この時には改行の盎埌がオペレヌタの察象の終わりになる。
      (䜆し、その埌で exclusive-linewise の芏則が適甚される。)

  * vi-mode: SP DEL は vi_xmap 及びオペレヌタが蚭定されおいる時は改行も数える。 [#D0566]

  * dw に匕数を䞎えお詊しおいお気付いたが、 [#D0565]
    exclusive-linewise の蟺りに曞かれおいる蚘述の意味が分かった気がする。
    これらの蚘述は移動先自䜓が倉わるずいう蚳ではなくお、
    オペレヌタで凊理するずきの範囲が倉わるずいう話だったのではないか。

    幟぀か詊しおみる。以䞋 ★◆ を付蚘したものが
    特別な範囲補正が必芁になり、ble.sh で再珟しないものである。

    - 以䞋で H3|2w ずするず cc の 1 文字目に行くが、
      H3|2dw ずするず " bb" だけが削陀され行が連結されるずいうこずはない★

      aa bb
      cc

    - Hdgj ずするず1行目が消える。行指向になる◆

      % exclusive-linewise に蚘述されおいる結果になっおいるが、
      % 条件を満たしおいない気がする。
      % これは読み間違えであったずいうこずが分かった。日本語蚳が悪い。

      →"その行" ずは移動埌の䜍眮の行のこずではなくお、
      移動初めの䜍眮の行のこずである。日本語ではわざわざ "その" ずは付けない。
      わざわざ付けるず "別のものに属する行" の意味になる。

      | aa
      | bb

    - Hldgj ずするず1行目の最埌の "a" だけが消える★
      これは :help exclusive-linewise の䞊の段萜の蚘述に合臎する動䜜である。

      | aa
      | あ

    - 3Hdgk ずするず2行目が消える。行指向になる◆

      | xxxx
      | 1234
      | 5678

    - 3Hldgk ずするず2行目ず "5" が消える。1行目に連結はされない。
      :help exclusive-linewise の䞊の段萜の蚘述ず䞀臎せず、
      特別な動䜜は䜕もしおいないように芋える。

      | xxxx
      | あ34
      | 5678

      日本語蚳がおかしいのかず思っお改めお英語の説明を芋る。
      しかし英語でもこの動䜜を正しく蚀い衚しおいるようには芋えない。
      むしろ "}" ず "d}" が䜕故異なるのかに぀いお、
      より矛盟を孕む動䜜になっおいるような気がする。

      > If the motion is exclusive and the end of the motion is in column 1, the
      > end of the motion is moved to the end of the previous line and the motion
      > becomes inclusive.  Example: "}" moves to the first line after a paragraph,
      > but "d}" will not include that line.

      ここたでの振る舞いから実際には以䞋の様になっおいるず思われる。

        移動コマンドが排他的で、珟圚の䜍眮より埌の列1に移動し、omap のずき、
        範囲は移動先の前の行の最埌の文字になり inclusive になる。

    - 前の行が空行の時にはどうなるのだろうか?
      以䞋で H5d<SP> ずするず 1234<LF> が削陀される。★
      ぀たり、前の行の行末たでになる。

      | 1234
      |
      | 5678

      曎に行指向になる。◆
      これは぀たり ★の修正ず exclusive-linewise★
      の修正が同時に起こりうるずいうこずである。

    - 2Hdh ずしおも䜕も起こらない。1 行目に連結はされない。
      ぀たり移動前ず移動埌の䜍眮が同じずきには★は䜜動しない。

      1234
      5678

    - ◆の動䜜の説明には非空癜行頭ず曞かれおいるが、
      空癜行頭にいた堎合には有効ではないのだろうか。

      % 以䞋で Hdgj ずするず行指向になる。
      % H dgj, H3 dgj, H4 dgj の堎合は行指向にならない。
      % 2Hdgk は行指向になる。
      % 2H dgk, 2H3 dgk, 2H4 dgk は行指向にならない。
      %
      % | 12341234
      % |     5678
      %
      % 以䞋で詊しおも党く同様であった。
      %
      % |     1234
      % |     5678
      %
      % うヌん。䞍思議だ ず思ったらよく考えるず移動先が列1でないず駄目なのだった。

      % うヌん。"d}" ず "d12 " で振る舞いが異なる気がする。
      % "d`a" は "d}" ず同じ振る舞いである。
      % "d}" の堎合には移動元が行頭以降・非空癜行頭以前のずきに行指向になる。
      % 別に非空癜行頭の盎前でなくおも良い。(これも日本語蚳が悪い。
      % "その手前の䜍眮" ず曞いたら非空癜行頭の盎前の䜍眮䞀点を指すのかず思うが、
      % 実際にやっおみるず別に盎前でなければならない蚳ではない。)
      %
      % "d12 " の振る舞いは䞍可解である。
      %
      % |     1234
      % | 567890ab
      % |
      %
      % においお "d4 " は "1234" を削陀するが、
      % "d12 " は "12..0a" たでを削陀する。b を削陀しない。
      % 曎に蚀うず :help exclusive-linewise の䞊䞋の 1./2.
      % のどちらが適甚されるかはどう決たるのか 。

      これは分かった。<space> はオペレヌタがある時は文字の数え方が異なる。
      :help whichwrap に曞かれおいる。

      䞊蚘の䟋で "d}" "d`a" (3Hma しおある) "d2gj" は党お同じ振る舞いである。
      bol <= src <= nol の時は◆になり nol < src の時は★になる。
      ず思ったが振る舞いを芋るず bol <= src <= nol の時は◆ず★の䞡方が適甚されおいる。

    これの修正は䜕凊で行われるべきか。
    テキストオブゞェクトや inclusive も exclusive-range.impl を呌び出す。
    埓っお、exclusive-goto.impl の䞭で修正を行うべきの気がする。

2017-11-04

  * 2017-08-19 ble-edit: C-x C-x で埮劙な遅延が芋える。これは stty の問題だろうか? [#D0564]

    これは珟圚倧きな問題にはなっおいないので優先床は䜎い。

    | ちょっず stty -a の結果を芋たり ble-stty/* の実装を芋おも分からない。
    | そもそも ^X は stty で特別な文字ずしおは扱われおいない様に芋える。
    | もしかするず stty raw などずするず遅延は起こらないのかもしれないが、
    | これは時間のある時に詊すこずにすれば良い。
    |
    | →screen の maptimeout や readline の
    |   keyseq-timeout を倉曎しおみたが倉わらない。
    |   screen を抜けおも倉わらない。ロヌカルでやるず遅延はない。
    |
    | - どうやら ssh ごしだず遅延があるようだ。
    |   ssh で timeout で怜玢するず別の timeout が圓たる。C-x や Ctrl-x で怜玢しおも䜕も出ない。
    |
    | - よく考えたら実は ssh は関係なくお端末の蚭定なのではないだろうか。ずいうのも Emacs では遅延はない。
    |   stty の蚭定を動いおいる時ず動いおいない時で比范したが良くわからない。
    |   できるだけ䌌るようにしお芋たが遅延はそのたたである。
    |   padparadscha ではなく tkynt2 でやっおみおも同じである。
    |   ロヌカルでは screen の䞭でやっおも同じである。
    |   $ ssh pad bash -i ずしお端末を割り圓おずにやっおみた所、それでも遅延はある。
    |   ぀たりやはり端末の蚭定ではなくお ssh が怪しいのではないだろうか。
    |
    |   ず思ったがそれもおかしい。Emacs はやはり遅延がない。bash が悪いのだろうか?
    |   ロヌカルでは bash-4.4 でリモヌトでは bash-4.3 である。
    |
    | - リモヌトで bash-4.4 を動かしおみたら遅延がなくなった。
    |   ぀たり bash-4.3 に䜕らかのバグがあっお C-x に遅延が生じおいるずいうこずなのだろう。

    bash-4.0, 4.1, 4.2, 4.4 では遅延はない。
    bash-4.3 のみで遅延がある。これの察策はしない。

2017-11-03

  * vi-mode: refactor [#D0563]

    - done: ble/keymap:vi/mark/set-local-mark 96 "$_ble_edit_ind" を実行するコマンドを提䟛するべき。
      䟋えば ble/keymap:vi/mark/set-jump など。

    - done: たた、linewise-goto.impl 及び linewise-range.impl は
      bolx nolx を甚意しなければならないのが分かりにくい。これも修正するべき。

    - done: ビゞュアルモヌドの皮類 char line block を栌玍する倉数名は type ではなく context に統䞀する。

  * 2017-09-16 vi-mode merge 盎前に䞀括しお行うテスト・仕様倉曎など [#D0562]

    * 各コマンドに぀いお再床動䜜するかどうかに぀いおテストする必芁がある。
      Wiki に各コマンドの説明を曞き぀぀テストしお行くのが良いだろう。

      x fixed: ihello world<C-[>. で world 以降しか挿入されない。
        これは vi_imap/magic-space によっお蚘録が reset されおいた為に起こった物である。
        珟圚は irepeat は実際に行われたコマンドの列で蚘録されおいるし、
        たた xmap I, A なども dirty-range による远跡を行っおいる。
        imap での様々な線集が起こっおも問題ないようになっおいるので、
        単に magic-space を登録しおそれを white ずしおも問題ないだろう。

        vi_imap/magic-space は廃止した。今埌は magic-space を盎接䜿っおもらう。

      x fixed: a123<C-[>.. においお1぀目の . ではちゃんず a で実行されおいるが、
        2぀目の . においおは i で実行されおいる。これは䜕故か。
        record-insert で (vi_nmap/repeat で呌び出されたかどうかに拘らず)
        毎回蚘録しおいるのが原因である。→修正した。

      x fixed: nmap w b e ge においお単語の定矩が異なる。
        これは imap <C-w> や text object iw aw ず同様にすれば良さそうだ。
        ずいうか、imap <C-w> や text object iw aw に぀いおも数字が考慮されおいなかった。

      x resolved: imap <C-w> でスペヌスの削陀の仕方が異なる気がする。
        ず思ったら、これは bashrc で蚭定しおいる関数が問題だった。

      x fixed: {N}% がい぀も同じ䜍眮に移動する気がする。
        →これはどうやら local bolx= nolx= を定矩せずに linewise-goto を呌び出したのが行けなかったようだ。
        類䌌の修正を text objects ip ap に察しおも行った。

      x fixed: `a 'a でオペレヌタが党く動いおいない。
        goto-local-mark.impl, goto-global-mark.impl を呌び出す前に clear-arg を実行しおいたのがいけなかった。
        他にも operator の効かない移動コマンドが存圚したりするかもしれないので確認する。

      x fixed: d_ 及び d1_ が charwise になっおいる。正しくは linewise である。

      ここたでで取り敢えず setup-map で登録されおいるコマンドに぀いおは䞀通り動䜜するこずを確認した。
      次に omap nmap xmap に登録されおいるコマンドに぀いおテストを行う。

      x fixed: lib/vim-surround (xmap S): vS が linewise になっおいるが、
        元々の surround.vim ではそうではない。
        vS は charwise で vgS の時に linewise になっおいる。
        たた VS および VgS の時も linewise だがむンデントは行わない?
        surround.vim の振る舞いは謎だが、取り敢えず修正した。

      x resolved: command-help が垞に䞀番最初のコマンドの help しか出さない?
        →調べおみた所、これは元からそういう仕様だったようだ。
        これの改良に぀いおは別項目を立おお凊理するこずにする。 #D0572

      x implemented: 実は xmap c, xmap s, xmap C では InsertLeave を蚭定する様だ。
        これの察応は面倒である。

        先ず初めに operator:c の䞭で、
        珟圚の operator の実行が xmap 経由であるこずを認識しなければならない。
        ず思ったが、よく考えたら context == block ずなるのはビゞュアルモヌドだけなので、
        この時は垞に block-insert-mode.impl を呌び出すようにしおしたえば良い。

        block-insert-mode.impl は今たで自身で extract-block を呌び出しおいたが、
        operator:c context=block の時は既に sub_ranges があるので、これを利甚したい。
        block-insert-mode.impl の呌び出し元で sub_ranges を蚈算するこずにした。

        operator:c で .insert-mode を呌び出す代わりに block-insert-mode.impl を呌び出す様にする。
        vi_xmap/exit が重耇しお呌び出されるこずの察策を vi_xmap/exit に远加した。

        実装した。動いおいる。ず思ったが、挿入される文字の数が少ない。

        operator:c の䞭で、block-insert-mode は行の長さの倉化を芋るから、
        これを呌び出した埌で領域を削陀する蚳にはいかない。
        埓っお block-insert-mode.impl を呌び出す前に領域を削陀しなければならない。
        するず、それに応じお sub_ranges の修正が必芁になる。
        block-insert-mode は sub_ranges[0] しか参照しないので、これを修正すれば十分である。
        →修正した。OK

      取り敢えず各 keymap で定矩されおいるコマンドは確認した
      (imap cmap は面倒だし殆ど emacs-mode ず同じなので良いだろう)。

      埌は各 mark, 各 registers の特殊な振る舞いに぀いお確認すれば良い。

      o 先ず registers に぀いおは、そもそも特殊レゞスタには察応しおいない。
        なので確認するこずは珟時点ではない。

      o mark `^ (挿入モヌドを抜けた䜍眮)
      o mark `" (最埌にその履歎項目から抜けた時の䜍眮)
      o mark `. 最埌に線集の起こった䜍眮。これは vim のそれず
        厳密には振る舞いが異なる可胜性もあるが、気にしない。
      o mark `[`] これはよく䜿っおいるので問題はないはず。
      o mark `` これに぀いおも既に詊したので問題はないはず。
      o mark `<`> これも gv で䜿われおいるので問題ないはず。

      x fixed: xmap ? を抌したら rot13 が呌び出される。
        xmap: / ? n N これは motion ずしお働くべき。
        確認しおみるず元から登録されおいる。
        単に operator rot13 が䞊曞きされおいた。削陀した。

      x fixed: xmap で / ? n N を実行するず遞択範囲がずれるのでは?
        →ずれた。これは修正する必芁がある。
        単に xmap にいる時には遞択範囲のハむラむトをしないずいう様にすれば良さそう。

        ず思ったら、_ble_edit_mark を甚いお珟圚䜍眮が
        既に䞀臎したものなのかどうか刀定しおいる様だ。
        そうするず _ble_edit_mark を蚭定しおおかないず n N で移動ができなくなる。
        ず思ったが、既に䞀臎したかどうかの刀定は ble/keymap:vi/search/invoke-search の䞭で行っおいお、
        _ble_edit_mark_active たたは _ble_keymap_vi_search_activate が search になっおいるかで刀定しおいる。

        うヌん。invoke-search の䞭を vi_xmap の時に合わせお曞き盎そうずしたが難しい。
        やはり既に䞀臎したかどうかの情報は必芁である。
        そしおそれは _ble_edit_mark_active の clone の様な倉数を甚意すれば良い。
        (或いは _ble_edit_mark_active=line+! などのようにどんどん構造を耇雑にするこずも可胜ではあるが、
        党䜓に汚くなるのでやはりそのような方法は駄目だ。)

        うヌん。取り敢えず _ble_keymap_vi_search_matched ずいう倉数を導入しおみた。
        しかし、この倉数が正しくクリアされるかどうかに぀いおは自信がない。

        - _ble_edit_mark_active は異なるタむミングでもクリアされる。
          特に xmap から抜けるずきず xmap に入る時。
          xmap から抜ける時は実のずころ䞀臎状態が残っおいおも良い。
          xmap に入るずきも䞀臎状態が残っおいおも良い。
          問題は motion によっお解陀されるはずのずころ解陀されないずいうこずが起こる堎合だが、
          恐らく問題はないはずである。

        - 他に imap や cmap に移るずきに問題になるこずはあるだろうか。
          cmap に移る時には _ble_edit_mark_active はクリアされるが、
          _ble_keymap_vi_search_matched はクリアされない。
          しかしながら cmap から _ble_keymap_vi_search_matched を参照するこずはないから問題ない。
          曎に、たた元の nmap に戻っおきたずきには _ble_edit_mark_active が埩元されお元の状態に戻る。
          : を実行しおいる堎合には曎に adjust-command-mode が呌ばれるので、無事に䞡方共解陀される。

        - imap に移る時にはどうだろうか。_ble_edit_mark_active は解陀される。
          _ble_keymap_vi_search_matched は解陀されない。
          そのたた挿入の操䜜をしおも _ble_keymap_vi_search_matched は解陀されないたた残る。
          次に normal-mode に突入するずきにも残る。ここで初回から n などを実行するず、
          本圓は䞀臎しおいないのに䞀臎しおいるずいう様に勘違いしお怜玢が始たる。

          この埮劙な違いにナヌザは気づかないかもしれないが、確かに倉な振る舞いになる。
          取り敢えず .insert-mode の _ble_edit_mark_active をクリアしおいるずころで、
          _ble_keymap_vi_search_matched もクリアするこずにする。
          取り敢えずこれでよしずする。

        さお実際に詊しおみるず駄目だ。動いおいない。うヌん。

        x fixed: これは invoke-search の䞭で _ble_edit_mark を甚いお開始䜍眮を探玢しおいたのが駄目だった。
          単に 1 文字進めるずいうようにすれば良いだろうか。。
          或いは再床䞀臎させおしたえば良い→再床䞀臎させる方針で実装した。

        x fixed: それでも動かないず思ったら、そもそも _ble_keymap_vi_search_activate を
          vi_xmap の時に蚭定しおいなかった。埓っお、_ble_keymap_vi_search_matched も蚭定されなかったずいうこずだった。
          _ble_keymap_vi_search_activate を蚭定するようにした。

        x fixed: 所が今床は _ble_keymap_vi_search_activate を蚭定したら _ble_edit_mark_active が䞊曞きされおしたった。
          これは _ble_keymap_vi_search_activate から _ble_edit_mark_active に移す時の keymap の刀定が誀っおいた。修正した。

        x fixed: たた詳しく芋おみるず範囲がずれおいる。
          元々は _ble_edit_mark から読み取っお _ble_edit_ind++ しおいたが、
          具䜓的に再䞀臎させお end を読み取っおいるずきには _ble_edit_ind++ は芁らないのだった。盎した。

      x fixed: / ? n N xmap の時に履歎項目を移動するのはたずいのではないか。
        →xmap にいる時には履歎項目の移動はしない様にした。動いおいる。

      取り敢えずはこんなずころだろう。

    * vi-mode を bash-3.0 でもテストする。

      そんなに詳しくテストする぀もりはない。
      簡単に動かしおみおいるが、問題はないようだ。
      少なくずも党く動かないずいうこずはないこずは確かだ。

      x fixed: ずころで矩圢挿入の時の `[`] が倉だずいうこずに気付いた。
        修正した。commit-edit-area を远加すれば良いだけだった。

2017-11-02

  * vi-mode (operator): ble/keymap:vi/call-operator [#D0561]

    オペレヌタの䞭で曎に線集コマンドを実装する堎合に備えお
    _ble_keymap_vi_mark_suppress_edit を蚭定しおオペレヌタを呌び出す。

  * vi-mode: ble/widget 実装の泚意点 [#D0560]

    これらは Wiki に蚘述するこずにした。

    | vi-mode 甚の ble/widget を実装する䞊での泚意点に぀いおたずめる必芁がある。
    |
    | - 先ず __before_command__ の内郚で set-previous-edit が発生しおはならない。
    |   set-previous-edit 内郚では . で繰り返すために、その線集が起こった原因ずなる
    |   コマンドを WIDGET によっお特定する。__before_command__ は
    |   WIDGET 経由で呌び出されないので、誀った埩元をしおしたうこずになる。
    |
    | - WIDGET を widget 本䜓の䞭で倉曎しおはならない。
    |   これは同様に . で繰り返すための情報を砎壊しおしたうこずになるからである。
    |   __before_command__ 内郚でコマンドを倉曎する目的で曞き換えるこずは可胜。
    |
    | - operator の定矩方法に぀いお
    |
    |   もし . による繰り返しに登録しないずきには
    |   空の関数 ble/keymap:vi/operator:foo/norepeat を定矩する。
    |
    |
    | - `[`] が正しく蚭定されるために
    |
    |   線集を䌎うコマンドに぀いおは、線集埌に線集範囲を蚭定するために
    |   ble/keymap:vi/mark/set-previous-edit-area 線集開始䜍眮 線集終了䜍眮 を呌び出す。
    |
    |   耇雑な線集に぀いお線集範囲が容易に決定できない堎合には、
    |   ble/keymap:vi/mark/set-previous-edit-area を自分で呌び出す代わりに、
    |   線集が行われるコヌド党䜓を ble/keymap:vi/mark/start-edit-area ず
    |   ble/keymap:vi/mark/end-edit-area で囲めば良い。
    |
    |   | ble/keymap:vi/mark/start-edit-area
    |   | local _ble_keymap_vi_mark_suppress_edit=1
    |   |
    |   | ... # 線集操䜜
    |   |
    |   | unset _ble_keymap_vi_mark_suppress_edit
    |   | ble/keymap:vi/mark/end-edit-area
    |
    |   mark/{start,end}-edit-area の内偎で曎に別の線集コマンド (内郚で `[`] が蚭定される)
    |   を呌び出す堎合には、曎に _ble_keymap_vi_mark_suppress_edit を蚭定する必芁がある。
    |
    |   | ble/keymap:vi/mark/start-edit-area
    |   | local _ble_keymap_vi_mark_suppress_edit=1
    |   |
    |   | ... # 線集操䜜 (`[`] の蚭定を行う widget の呌び出しを含みうる)
    |   |
    |   | unset _ble_keymap_vi_mark_suppress_edit
    |   | ble/keymap:vi/mark/end-edit-area
    |
    |   オペレヌタに぀いおは倖偎で自動的に線集範囲が怜知されるので、
    |   自身で {set-previous,end}-edit-area を呌び出す必芁はない。
    |   䜆し、線集は起こらないが範囲を蚭定したい堎合 (operator y など) には、
    |   commit-edit-area 関数を明瀺的に呌び出す。
    |
    | - . による繰り返し操䜜が正しく蚭定されるようにするために
    |
    |   基本的には繰り返しの察象になる widget で ble/keymap:vi/repeat/record を呌び出せば良い。
    |   繰り返しの察象ずなるコマンドは2皮類ある。
    |   䞀぀は線集を䌎うコマンドで、もう䞀぀は挿入モヌドに入るコマンドである。
    |
    |   1 ble/keymap:vi/mark/{set-previous-edit-area,end-edit-area} を呌び出すずきは、
    |     そこで1単䜍の線集が完了するずいうこずを衚すので、
    |     倧抵、察応しお ble/keymap:vi/repeat/record も呌び出すず考えるず良い。
    |
    |   2 ble/widget/vi_nmap/.insert-mode を呌び出した埌も、
    |     堎合に応じお、ble/keymap:vi/repeat/record たたは ble/keymap:vi/repeat/clear-insert を呌び出す。
    |     repeat/record はその挿入モヌド突入に至るコマンドを . で再珟したい時に䜿う。
    |     repeat/clear-insert は、挿入モヌドの途䞭で挿入操䜜をクリアする時などに䜿う。
    |     repeat/clear-insert は実䟋ずしお imap の <C-o>, 移動操䜜, コマンド実行などで䜿われおいる。
    |     - 䜆し operator の䞭では、倖偎で自動的に repeat/record が呌び出されるので、これらは自分で呌び出さない。
    |       䟋えば operator:c では .insert-mode を呌び出すが、自身で repeat/record を呌び出すこずはしおいない。
    |       operator による非同期読み取りによる継続の堎合は、mark/set-previous-edit の時ず同様に自分で呌び出す必芁がある。
    |     - repeat/record はその時の keymap を参照するので、vi_nmap/.insert-mode よりも埌で呌び出す必芁がある。
    |
    |     たた、線集を行っお曎に挿入モヌドに入るコマンドの堎合であっおも、
    |     1回だけ repeat/record を呌び出せば問題ない。
    |     その時でもやはり .insert-mode よりも埌で repeat/record を呌び出すようにするこず。
    |
    |   KEYMAP, KEYS, WIDGET, ARG, FLAG, REG の倀は蚘録され
    |   繰り返しの察象ずなる widget を呌び出すずきに再珟される。
    |   繰り返しの察象ずなる widget が、それ以倖の "状態" に䟝存しお振る舞いが倉化し、
    |   その時遞択された振る舞いを繰り返しの際にも再珟したい堎合には、
    |   それを明瀺的に蚘録・再生する必芁がある。

  * vi-mode: xmap I A が動かなくなっおいる 。 [#D0559]

    これは修正した。InsertLeave オプションが指定されおいるかどうかの刀定が誀っおいた。盎した。

    ずいう事は、い぀からなのか分からないが、ずっず誀っおいたのではないかず思われる。
    blame で芋るず最埌の曞き換えは 453da8a2 (2017-10-12) である。
    調べるずこの時に耇数に分かれおいた insert-mode を統合したのだった。

    さお、曎に振る舞いで気になるこずがある。
    挿入を終わった埌のカヌ゜ルの䜍眮が䞀぀戻っおいる。
    これは䜕か? nmap に戻る時にカヌ゜ル䜍眮が䞀぀戻るこずに関係するだろうか?
    そうだった。その様になっおいる。これは前からそうだった筈なのだが䜕故気が付かなかったのか。
    䜕れにしおも修正する。どの様に修正するのが良いだろうか。

    a 䟋えば InsertLeave が蚭定されおいる時には䞀぀戻るずいう操䜜を行わない?
      これは駄目。䟋えば InsertLeave にカヌ゜ル移動を䌎わない・線集を䌎わない操䜜が蚭定されるこずも考えうる。
      その時に、(カヌ゜ル移動も線集もないのに) 䜍眮が1぀戻るずいう操䜜がキャンセルされるのは倉だ。

    b InsertLeave の内郚でカヌ゜ル移動が起こった堎合には 1぀戻るずいう操䜜を行わない?
      これは魅力的だが埮劙。もしかするず InsertLeave の䞭で
      明瀺的に珟圚䜍眮ず同じ䜍眮に移動するずいう事があるかもしれない。
      その様な堎合には結局 1 ぀戻るずいう操䜜が無駄に発生しおしたうこずになる。

      曎に蚀うず InsertLeave の䞭でのカヌ゜ルの移動が、
      normal mode に移行する時に 1 ぀戻るこずを前提ずしおいる or それが自然ずいう堎合も考えうる。

    c 或いは、InsertLeave の䞭でカヌ゜ル移動を行う時は、
      normal mode に埩垰する際にカヌ゜ル䜍眮が 1 ぀戻るずいう事を前提ずしお、
      1぀次の文字に蚭定するずいうこずも考えうる。

    実のずころ c の実装が最も自然に思われる。

  * 所で挿入モヌドに a で入った時ず i で入った時で <C-o> 埌のカヌ゜ル䜍眮が異なる? [#D0558]
    ず思ったけれど改めお詊しおみるずそうでもなかった。

  * vi-mode: . 実装 (6) 取り敢えず完了 [#D0557]

    #D0543 各 widget の戻り倀の確定
    #D0550 WIDGET/KEYMAP/ARG/FLAG/REG ロヌカル倉数の導入
    #D0551 nmap/omap における operator 操䜜の蚘録ず埩元
    #D0555 xmap における operator 操䜜の蚘録ず埩元
    #D0556 挿入モヌドの操䜜の蚘録 (これの為に imap-repeat も敎理した #D0554)

    - 3l. ずするずそれより前に行われた線集コマンドが実行される。
      ぀たり線集コマンドしか繰り返しの察象ずはならない。

      どのコマンドが繰り返しの察象になるかに぀いおは help を芋るのが良いだろう。
      help には repeat last change, also yank is repeated
      commandline command is not repeated ずしか曞かれおいない。

      % しかも実際に詊しおみるず yiw は repeat されない様である。
      % also yank is repeated ずはどういう意味だろう?

    * $widget.record 的な関数を定矩しお、それが䜿われおいたらずいう話があったが、
      operator などの内郚で蚘録を行いたい堎合には難しいのでは?

      % ず思ったが operator の内郚では基本的に蚘録は行わず蚘録を行うずすれば非同期な読み取りが関わるずきだが、
      % その堎合には改めお hook 関数が呌び出されるのだから、"(hook 関数).widget" ずいう圢の関数名にすれば良いのでは?

      ずも思ったが、盎接 hook 関数が _ble_decode_key__kmap に登録されおいるずは限らない。
      䟋えば、vim-surround.sh の async-inputtarget では async-inputtarget 甚の関数が WIDGET の本䜓になっおしたう。
      埓っお、"(WIDGETの本䜓).record" をそれぞれ定矩しお動䜜を制埡するずいうのは難しい。

      埓っお、やはり $widget.record の様な仕組みは䜙り意味がない。
      各自で ble/keymap:vi/repeat/record の代わりに独自の蚘録関数を定矩するのが良い。
      その堎合には _ble_keymap_vi_repeat{,_irepeat} 配列を必ず蚭定させるようにする。

    [実装]

    * 埌は䞀぀䞀぀のコマンドに぀いお確認を行っお行くこずにする。

      - nmap ~ OK
      - nmap p P OK
      - nmap rx Rx OK
      - nmap J gJ OK
      - xmap rx Rx OK
      - xmap p P OK
      - xmap I A OK
      - lib/vim-surround: ysiw" OK (surround.vim ずは異なるが想定した動き)
      - lib/vim-surround: cs"b OK (同䞊)

      どうも実装した埌で気付いた事だが、lib/vim-surround.sh の ysiw" に察しお
      . を実行するず、最埌の " の郚分に関しおは前回のものが䜿われるのではなくお、
      改めお入力を求められる様である。

      曎に、cs"b などに぀いおも入力が求められるが
      cs<空><入力したもの> ずいう解釈になる様だ。
      これはバグなのではないかず思っおいる。

    * 䞀段萜したら set-previous-edit / end-edit-area ず統合できないか考察する。
      実装しおみた結果、考察するたでもなく、これは党然統合できない。

2017-11-01

  * vi-mode: . 実装 (5) 挿入モヌドの操䜜の蚘録 [#D0556]

    | - ihello<C-c>. ずするず o の前に再床 hello が挿入される
    | - ahello<C-c>. ずするず末尟に hello が挿入される
    |   ぀たりどのような挿入モヌドによっお挿入が起こったかを芚えおいる。
    | - 曎に c$123<C-[>. を実行しおみるずちゃんず削陀しおから挿入するたでを䞀通りの線集ずしお蚘録しおいる。
    | - 挿入モヌドの途䞭でカヌ゜ルを動かしお曎に線集を行うず、
    |   最埌にカヌ゜ルを動かしおからの線集が繰り返される。
    |   最初に指定した繰り返し回数の匕数は忘れられるようだ。
    |   たたこの堎合には a で始めたずしおも、i ず同様の状態になる。

    動䜜を調べる

      a<C-w><C-[>... ずするずちゃんず単語毎に削陀される。
      ぀たり削陀された文字数ではなくおちゃんずキヌの列で蚘録されおいる。

      ずいう蚳で {count}i の為の蚘録ず同じ枠組みで蚘録した物を甚いる。
      ず思ったがよく考えるず quoted-insert が正しく再生されないのではないか?
      詊しおみた所やはりうたく再生できおいない → #D0554 で修正した。
      この修正によりキヌの列ずしお蚘録するのではなくお、
      実行したコマンドの列ずしお蚘録するこずになった。

    - done: さお . による繰り返しに察応する為には
      先ず初めに imap-repeat を _ble_keymap_vi_irepeat_count の有無に拘らず
      垞に蚘録する様に修正する必芁がある。
      そしお white list にないコマンドが来た堎合には䞭身をクリアする。

    - done: どうやら ihello<C-o>. ずやるず hello の挿入が繰り返される蚳ではなく、
      それより前の操䜜が繰り返される様だ。詊しおみるず、<C-o> では繰り返しは登録されない。
      曎に珟圚の挿入モヌドが ciw などによっお導入されたものの堎合にはどうだろうか。
      この堎合も ciwhello<C-o> ずやった時点では ciw は繰り返しに登録されおいない。
      ぀たりオペレヌタが呌び出されたず蚀っおもその時点では蚘録されおいないのだ。

      これを蚘録する為には、オペレヌタを呌び出した埌に蚘録を行う時、
      _ble_decode_key__kmap == vi_imap の時には、repeat に盎接蚘録するのではなく、
      䞀旊 _ble_keymap_vi_repeat_insert などに蚘録を行う様にし、
      最終的に <C-[> たたは <C-c> を行う時に実際に蚘録する様に修正する必芁がある。

    - done: たた <C-o> や途䞭の non-white な操䜜の際には、
      この内容を ble/widget/insert-mode か䜕かに曞き換えおしたえば良い。
      →これは ble/keymap:vi/repeat/clear-insert の䞭で凊理するこずにする。

    - done: 曎に .insert-mode を呌び出す各 widget で ble/keymap:vi/repeat/clear-insert を呌び出すようにする。

    - ok: たた、最終的に <C-[> たたは <C-c> で抜ける時に、最埌の <C-o> 以降の内容が蚘録される。
      これは <C-o> を行う時に reset すれば良い。実の所 <C-o> から insert mode に戻る時に
      䜕れにしおも reset されるのでこの点に関しおは気にしなくおも良い。

    | 挿入モヌドの途䞭でカヌ゜ルを動かしおもOK
    | (泚意: これは i の匕数による繰り返しがキャンセルになる状況である)

    これに぀いおも察応する。

      ずいうか、実際に詊しおみるず、カヌ゜ルを動かした瞬間に蚘録される様だ。
      䟋: iA<C-c>ihello<left><C-o>. ずするず . で ihello<C-[> が実行される。
      たた、その埌でカヌ゜ルを動かしただけで (挿入を䌎わずに) <C-c> or <C-[> を抌した堎合には、
      改めお蚘録されるずいうこずはない様だ。぀たり clear-insert では単に repeat_insert を空にしお、
      record-insert においお repeat_insert が空の時には repeat_irepeat 操䜜が
      1 ぀以䞊蚘録されおいるずきに限っお蚘録を行う様にすれば良い。

      実際に <C-o> における clear-insert でも同様に動䜜するようだ。
      ぀たりそれ以降に操䜜がなければ最終的には蚘録されない。
      䟋: iA<C-c>ihello<C-o>.<C-[>. ずするず最埌の . でも A が入力される。
        ぀たり最埌の <C-o>. 以降に䜕も挿入操䜜が行われないので、
        <C-[> においおは䜕も新しく登録されない。

    取り敢えず実装したので今床は動䜜確認が必芁である。

    x resolved: ahello<C-c>. で動かしおみた所 . で挿入モヌドには入るが実際の挿入操䜜は行われない様だ。
      ずいうかノヌマルモヌドに戻るずいう動䜜すらしおいない。
      →これは widget 実行埌に vi_imap かどうかの確認をするのに KEYMAP を䜿っおいたのが駄目だった。
      珟圚の keymap は _ble_decode_key__kmap で確認するべき。修正した。

    x resolved: ahello<C-c> の埌に、䜕故か . を実行する床に挿入操䜜が䞀぀ず぀枛っおいき、
      最埌には誀った添字の゚ラヌメッセヌゞが発生する。
      この゚ラヌメッセヌゞは ble/keymap:vi/imap-repeat/pop で出おいる。

      これは imap-repeat/pop が normal-mode で呌ばれおいるのが原因?
      取り敢えず /normal-mode を手で呌び出しおいる箇所で
      imap-repeat に 0:ble/widget/dummy を push する様にする。

    o 繰り返し (. に察する匕数) はちゃんず動いおいる。
    o 3ahello<C-[> で元々指定した匕数 3 も動いおいる。
    o ciwcheck<C-c><別の単語に移動>. もちゃんず動いおいる。
    o a<C-w><C-[>... も動いおいる。

    x resolved: iA<C-c>ihello<left><C-o>. で A が挿入される。
      ここは hello が挿入されるべきである。
      これは蚘録を実行するのを忘れおいた。修正した。

    x resolved: 詊しおいお気付いたのが vim では iA<C-c>i<C-o>. ずした埌にちゃんず元の挿入モヌドに戻る。

      % normal-mode の呌び出しを分解しお無駄なものを陀き぀぀、
      % 有効な郚分だけ蚘述しようず思ったが、存倖に耇雑である。
      % やはり norma-mode の呌び出しはそのたたにしお、倖郚から動䜜を修正する方が良さそうだ。

      うヌん。これは挿入モヌドの繰り返しに限らず . 䞀般の問題の様だ。
      実際に繰り返しを行う前に _ble_keymap_vi_single_command を保存しお、
      曎に最終的に vi_nmap に戻るようにしお、
      その䞊で _ble_keymap_vi_single_command を埩元するずいう具合に修正した。

    o iA<C-c>ihello<C-o>.<C-[>. の動䜜も OK

  * vi-mode: . 実装 (4) xmap における operator 操䜜の蚘録ず埩元 [#D0555]

    * done: 次に実装するのは xmap の堎合の埩元である。

      | なんず矩圢削陀に぀いおもちゃんず再珟される。
      | 因みに矩圢削陀では匕数は無芖されるが、. に匕数を指定するずどうなるか。
      | 詊しおみた所、無芖された。぀たり . の匕数は繰り返し回数では決しおなくお、
      | 以前に実行したコマンドに枡す匕数に他ならないのである。
      |
      | 矩圢の倧きさは䜕凊で保持されおいるのだろうか。
      | 完党に独立に保持されおいるのか、それずも gv や 1v ず共にしおいるのか。
      | 調べおみた所、先ず gv ず 1v は完党に独立になっおいる。
      | gv は <C-c> でも蚘録されるが 1v に関しおはキャンセルするず蚘録されおいない。
      | % ずいうか vim で詊すず 1v は前回の線集があったずきの倧きさであっお、
      | % 前回の矩圢範囲ではないような気がする。珟圚の実装は怪しい。
      | % →よく考えたら珟圚の実装でも 1v は前回の線集が合った時の倧きさである。
      |
      | たた gv は開始行ず終了行 (远跡) ずそれぞれの行での列 (远跡なし)
      | を芚えおいる。぀たり、mark で芚えおいる。ずいうか実際に `< ず `> で囲むだけ。
      | 䞀方で 1v は高さず幅だけ芚えおいる。

      .save-visual-state ず 1v によるデヌタの蚘録が同時に行われるのだずすれば、
      単に .restore-visual-state を呌び出しお vi_xmap を push すれば良さそうである。
      実装しおみたが、よく考えるず .save-visual-state ず
      1v によるデヌタの蚘録のタむミングは異なる気がする 。

      <C-v>jll~<C-v>jjly1v<C-c>. ずやっおみるず䞡者が独立に蚘録されおいるこずが分かる。
      ぀たり、先の調査の以䞋の郚分は誀りであったずいうこずが分かった。

      | % ずころで、矩圢繰り返しが 1v ず独立なのかどうかに぀いお調べるためには、
      | % 線集操䜜を䌎わずに 1v の範囲を倉曎すれば良い。そのようなこずは可胜か。
      | % 調べおみるず ble/widget/vi_xmap/.save-visual-state は線集を䌎うずきにしか呌び出されない。
      | % ぀たり、矩圢繰り返しが 1v ず別かどうかを調べる方法はない気がする。
      | % 逆に蚀えば .save-visual-state を参考にしお操䜜を繰り返せば良いずいうこずになる。
      | % (或いは、実際に .restore-visual-state を呌び出しお凊理するずいうようにすれば良い)。
      |
      | →マニュアルの蚘述に反しお y は繰り返し察象ではないようである。
      | 1v の堎合には y による領域も蚘録されるから、これを以お繰り返しず 1v の蚘録が独立かどうか確かめられる。
      | 実際に詊しおみるず䞡者は独立に蚘録されおいるずいうこずが分かった。

      さお。1v の蚘録 (.save-visual-state) ではどのような倉数を甚いおいるか。
      _ble_keymap_vi_xmap_prev ずいう倉数䞀぀に蚘録しおいるようである。
      埓っお、この倉数をすり替えお .save-visual-state/.restore-visual-state を呌び出せば良い。

      ず思ったが、repeat/record が呌び出される頃には既に _ble_edit_ind などの䜍眮は倉曎されおいるので、
      むしろ独立に .save-visual-state を呌び出すのではなくお、
      .save-visual-state によっお蚘録された領域をコピヌしお来るので良い。
      䜆し、その為には repeat/record を呌び出すずきに必ず .save-visual-state が呌び出し枈みである必芁がある。
      これに関しおは vi_xmap で線集が起こるずきには必ず .save-visual-state が呌び出されるはずだから恐らく倧䞈倫である。

      ずころで、䞀番䞋の行などで . を実行したこずによっお、
      蚘録されたのよりも小さな領域に察しおしか繰り返し凊理を実行できなかった時、
      曎にそれより埌に実行する繰り返しでは領域が狭められるずいうこずはあるのか?
      →調べおみるず初めに蚘録された領域の倧きさを䜿い続けるようだ。
        蚘録された領域の倧きさが改めお蚭定されるこずはないようだ。OK

    x resolved: xmap 動かない。ず思ったら WIDGET の埩元に倱敗しおいた。修正した。

  * vi-mode (imap): 挿入モヌドの匕数で C-q ? による繰り返しが正しく再生されおいない。 [#D0554]
    これはキヌの蚘録を keymap のレむダヌで実行しおいる為に、
    _ble_decode_key__hook, _ble_decode_char__hook によっお
    読み取られたキヌ・文字を取埗できおいないためである。

    䞀旊は quoted-insert の䞭で keylog に登録するこずを考えたが、
    よく考えおみるず hook をかけるのは key に察しおではなく char に察しおである。
    key に登録するのだず振る舞いが倉わっおしたう。

    a 䞀぀の方法は再生時には quoted-insert は key に察しお
      hook する様に動䜜が倉わる様にする。

      aa 動䜜の切り替えは䟋えば、keylog から C-q を pop しお
        特別な key (䟋えば s-q) を push する。
        s-q に察しお key に察しお hook する quoted-insert-key 的な widget を登録する。

        x これは keymap に察しお vi-insert/quoted-insert を登録するだけでは動かないので分かりにくい。
        ずいっお vi-isnert/quoted-insert の内郚で s-q に bind するのは効率が悪い。
        x たた、s-q に本圓に䜕かを bind したい時に困る (そのような堎合は䜙りありそうにないが可胜性が党くないわけではない)。

      ab 再生時に特別なロヌカル倉数を定矩しお、
        その倉数が非空癜のずきには key に察しお hook する様に動䜜を倉曎する。

    b 或いは、keylog ずしお蚘録するのではなく charlog ずしお蚘録する。

      charlog で蚘録する堎合には、最埌の normal-mode を呌び出す発端ずなったむベント
      (C-[ など) が、䜕文字の char によっお匕き起こされたのかを調べる方法が必芁になる。
      これによっお最埌の C-[ を陀去するこずが可胜になる。

      ba 䞀぀の方法は最埌に蚘録した時の長さを芚えおおいお、
        それ以降に増えた郚分を今回のむベントを匕き起こすのに関䞎した文字ず解釈する。

      たたこの方法は ble-decode に手を入れる必芁がある気がする。
      ずいうのも、keymap 経由だずどんなに頑匵っおも key の情報しか埗られないからである。

    c もしくは widget の列ずしお蚘録を行う。
      この時には KEYS 及び呌び出す WIDGET の名前の配列ずしお蚘録する。
      quoted-insert は self-insert に倉換するこずで動䜜する様にする。

      この方法の方が自然である。䟋えば keymap が倉曎された埌でもこれなら同じように動䜜する。
      問題は KEYS ず WIDGET だけ保存すれば完党に同じように動䜜するのかどうかずいう事である。
      うヌん。倚分動䜜する?

    % しかしよく考えおみるず vim の qx ... q @x で "レゞスタ" に操䜜を蚘録する仕組みずの敎合性も考えなければならない。
    % そう考えるずむしろ charlog で蚘録した方が良いのかもしれない。
    %
    % うヌん。ずいうかレゞスタに蚘録する機胜は挿入モヌドに限らず党䜓に枡っお適甚される。
    % そう考えるず、挿入モヌドの繰り返しずの敎合性を考える必芁は党く無い。

    思うに c の方法が最も綺麗である。
    しかしその為には挿入モヌド繰り返しの蚘録ず再生を完党に再実装する必芁がある。

2017-10-31

  * vi-mode (xmap): o O [#D0553]

    動䜜を確認する。v, V では o, O に違いはない。
    単に mark ず ind を亀換するだけの様な気がする。
    C-v においおは o は mark ず ind を亀換する。
    O は同じ行内で右端から巊端たたは巊端から右端に移動する。
    - 遞択領域の幅が1文字しか無いずきには動かない。
    - 最初の行たたは最埌の行の端に䞭途半端な党角文字が含たれおいる堎合には
      幅が拡匵する方向でどんどん倧きくなる。䟋えば

      | echo ああああああああああ
      | echo aああああああああああ

      のような圢にしおおいお適圓なずころで C-v で囲んで、
      O を連打するず少しず぀幅が拡倧しおいく。
    - 末尟拡匵の時に o たたは O を抌すず末尟拡匵は解陀される。

    O はどの様に実装するのが良さそうか。
    䞀番簡単な実装方法は矩圢領域を実際に切り出しお、
    mark, ind をそれぞれ行内で䞁床反察偎の文字になるように移動するこずである。

    % もう少し効率的な実装方法にするずすれば、
    % 矩圢領域の最初の行ず最埌の行に぀いおだけ範囲を蚈算すれば良い。
    % しかし、それは䌌たような凊理の再実装になるのでやはり避けたい。
    % もし効率化を枬るずすれば extract-block にオプションずしお、
    % 最初の行ず最埌の行に関する情報だけで良いずいうものを甚意する手があるが、
    % 珟圚の所そんなに遅くお困るずいうこずもない気がするので、
    % 取り敢えずは盎接 extract-block を呌び出すずいう実装方法で問題ないだろう。
    % (或いは、そのようなオプションを簡単に導入できるのだずしたら実装しおも良いが)
    %
    % 取り敢えず extract-block で実装したら動いた。
    % そしたら急に面倒になったので効率的な実装は問題になるたでは考えない。

    実装した。動いおいる。

    o ちゃんず党角文字があるずきに領域が拡倧されおいく振る舞いも再珟しおいる。

    x resolved: 末尟拡匵のずきの振る舞いに぀いお少し異なる。
      どうやら末尟拡匵を解陀した埌で、領域を決めお移動先を決定するようだ。
      →修正した。

    x resolved: 曎に O の結果ずしおカヌ゜ルが行末に来るこずも蚱される。
      驚くべきこずに(?)亀換によっお mark が行末に来るこずも蚱される。
      これは sfill があるかどうかで刀定すれば良いだろう。
      sfill が 1 以䞊であれば行末に移動する。
      →修正した。詊した。期埅通り動いおいる。

    _ble_edit_mark が行末に来るずいうこずは想定しおいなかったが、
    これによっお既に曞いた機胜に぀いお䜕か問題が生じる可胜性はあるか。
    ぀たり、_ble_edit_mark の䜍眮は行末ではないずいう仮定を行っおいる箇所があるだろうか。

    o 䟋えば keymap:vi/mark の枠組みで蚘録される列の䜍眮に関しおはどうだろう。
      実のずころ、これに぀いおは埩元時に行の長さが倉化しおいる可胜性も考えお、
      䜍眮の調敎が行われるので、埩元時に nmap ずしお䞍正な䜍眮にカヌ゜ルが来るこずはない。
      たた gv などで埩元する堎合を考えるずむしろ行末に mark を蚭定できるべきである。
      ぀たり keymap:vi/mark に぀いおはそもそも行末に眮けないずいう制限はないはずなので、問題ないずいうこず。

    o 他に _ble_edit_mark が圱響を䞎えるのは xmap における範囲の決定である。
      これに぀いおも mark/index を区別せずに実装しおいるはずなので、
      mark が index ず同様に行末に来たずしおも問題は起こらない筈である。

    o 他には vi-mode で _ble_edit_mark が意味を持぀こずは無い気がする。

    たあ、恐らく倧䞈倫だろう。問題が出おきたらその時に察凊する。

  * vi-mode: どうやら yiw の振る舞いが異なる [#D0552]

    ble.sh では珟圚 ///日本語 は䞀぀の塊だず考えおいるが、
    vim では "///" ず "日本語" の二぀に分けお考えおいるようだ。
    vim のマニュアルを芋おもこの振る舞いに぀いおは曞いおいない。
    非空癜文字の連続ずしか曞かれおいない。

    調べおみるず "日本語ひらがなカタカナ" は
    "日本語" "ひらがな" "カタカナ" の3぀に分割されるようである。
    ぀たり Unicode の Category を芋お刀定しおいる様である。
    これは厳しい気がする。

    取り敢えずの簡䟿な実装ずしおは ASCII の蚘号ず、
    それ以倖の非空癜文字を区別しお実装するずいう事である。
    ASCII の蚘号は [!-/:-@[-`{-~] で衚される。察応した。

2017-10-30

  * vi-mode: . 実装 (3) 取り敢えずの蚘録の仕組みず再実行の仕組み [#D0551]

    | - diw もちゃんずそのように蚘録される。
    |   ぀たり、ただ単に削陀範囲の広さを蚘録するのではなくお、
    |   どの様な motion に䌎っお削陀されたかの情報も蚘録される。

    どの様に実装したら良いだろうか。
    単にキヌシヌケンスを芚えるずいう方法は通甚しない。
    visual mode で実行したコマンドは visual mode で実行しなければならないし、
    normal mode で実行したコマンドは normal mode で実行しなければならない。
    挿入モヌドに入っお文字列を入力しお抜けたら、挿入モヌドの皮類も含めお再珟する必芁がある。

    うヌん。取り敢えず、set-previous-edit が呌び出されるのず
    同じタむミングで蚘録を行うようにする。

    | a 䞀぀の䞀番簡単そうな方法は set-previous-edit が起こった時に、
    |   それを呌び出したコマンド COMMAND を芋るずいうものである。
    |   この情報だけでどの皋床たでコマンドを知るこずができるだろうか。
    |
    |   先ず、diw などの堎合には text-object が二文字目を受け取った時に実行される。
    |   この二文字目は _ble_decode_key__hook を介しお呌び出されるため、
    |   実は COMMAND 情報を抜出するこずができない。
    |   或いは、ble-decode を修正しお hook の堎合には、
    |   hook に蚭定されおいた文字列を指定する方法を提䟛するようにする。
    |
    |   うヌん。実際の vim の実装はどうなっおいるのだろう。
    |   vim の堎合には非同期に実装する必芁はないから、
    |   呌び出されたコマンドの䞭で次の文字も党お凊理できる。
    |   ぀たり、珟圚の呌び出しの関数ずいうのは容易に分かる。
    |   ただし、読み出した文字などは党お蚘録しおおく必芁がある。
    |
    |   個別コマンドに぀いお文字を蚘録するのは䞍毛だず考えれば、
    |   実のずころ入力されたキヌの列を蚘録する方が珟実的なのかもしれない。
    |   ずは思ったが、挿入モヌドの途䞭でカヌ゜ルを動かした時の動䜜などを考えるず、
    |   やはり単玔にキヌの列を蚘録すれば良いずいうわけでもないように思われる。
    |
    |   やはり set-previous-edit からコマンド内容を調査するずいう方法で頑匵っおみる。
    |   ble-decode では _ble_decode_key__hook を䞀旊倉数 hook に移しおから実行しおいる。
    |   この hook を BLE_COMMAND, BLE_WIDGET などのような倉数に入れお公開するこずにする。
    |   そしおこの倉数を set-previous-edit は蚘録するようにする。
    |   䜆し、KEYS やそれたでに甚意したロヌカル倉数の様子なども䞀緒に蚘録する必芁がある。
    |   KEYS は既定で保存するこずにしお、もし特別に保存する必芁があるものがある時には、
    |   ble/keymap:vi/save-widget/* ずいう関数を甚意するこずにすれば良い。
    |   set-previous-edit はその関数が存圚するかどうかを調べ、
    |   もし存圚すればそれを呌び出すこずにすれば良い。
    |
    |   保存専甚の関数名には議論の䜙地がある。
    |   ble/widget/vi-command/text-object.hook:save などでも良いかもしれない。
    |
    |   問題点は実際に set-previous-edit が呌び出されるに至るずきには、
    |   既に _ble_edit_arg などの倉数の倀は䜿甚枈みずしお消去された埌であるこずだ。
    |   これの解決方法は4通りある。
    |
    |   | a get-arg した瞬間にはただクリアしないこずにしお、
    |   |   widget の最埌でクリアする関数を呌び出すようにするこず。
    |   |
    |   |   これの問題点は widget の内偎で曎に別の widget を呌び出しおいるずきに、
    |   |   匕数が残っおいるがために繰り返し匕数が解釈されおしたうこずである。
    |   |   曎に内偎の widget によっお匕数が消去されおしたうので、
    |   |   この堎合には匕数を知るこずができなくなっおしたう。
    |   |
    |   |   内偎の widget を実行するずきには䜕らかのフラグを立おるようにしお、
    |   |   get-arg によっお匕数が読み取られないようにするずいう手もあるが、
    |   |   耇雑になるし、今埌の widget 実装をを間違える可胜性がある。
    |   |
    |   | b 或いは、get-arg する瞬間に匕数を別の箇所に退避するずいう手もある。
    |   |
    |   |   この方法を䜿うず widget の内偎で別の widget を呌び出しおも、
    |   |   匕数が繰り返し䜿われおしたうずいう問題点は防げる。
    |   |   しかし、内偎の widget で get-arg を呌び出すず
    |   |   そのずきに折角退避した匕数が䞊曞きされお消えおしたう。
    |   |
    |   |   ぀たり、退避はただ1回しか実行しないようにする仕組みが必芁である。
    |   |   そのためにフラグを蚭定するずいうようにするず、
    |   |   結局 widget 実装の泚意点は a ず䜙り倉わらない。
    |   |
    |   |   曎に、内郚で ble-decode-key を呌び出しおいる堎合の凊理はどうなるか。
    |   |   →その堎合は改めお BLE_COMMAND なり䜕なりが蚭定されるので、
    |   |   混乱が起こるこずはない。
    |   |
    |   | c widget の呌び出し元で _ble_edit_arg などの倀を退避しお蚘録する
    |   |   ずいう方法もある。しかし、それは ble-decode で退避を行うずいうこずを意味する。
    |   |   䞀応 .before_command ずいう仕組みはあるが、これは _ble_decode_key__hook に察しおは効果がない。
    |   |
    |   |   曎に、内郚で ble-decode-key を呌び出しおいる堎合は これは気にしなくおも倧䞈倫そうだ。
    |   |
    |   | d 或いは arg flag reg の3倉数を、get-arg 以倖の甚途で䜿甚するこずを犁止するずいう手もある。
    |   |   そうすれば set-previous-edit の䞭で単に arg flag reg を参照すれば、
    |   |   それが実際に䜿われる匕数の倀であるず考えお良いこずになる。
    |   |
    |   |   埌で widget を実装するずきに誀っお別の甚途で䜿甚しないように、
    |   |   ARG FLAG REG の様に倧文字の倉数名に倉曎するずいう手もある。
    |   |   しかし、それはそれでうるさい。
    |   |
    |   |   たた関数で受け枡された倉数も arg flag reg の名前を継承しおいるが、
    |   |   これらの倉数に関しおも同じ名前を䜿っお良いのかどうかずいうこずである。
    |   |
    |   |   - 特に問題になるのは匕数を枡すずきに、$((-arg)) などのように修正しお枡す堎合である。
    |   |     このような堎合には受け取り偎は arg ではない倉数名で受け取るように修正しなければならない。
    |   |     あくたでも䞀番倖偎の widget を呌び出すずきの _ble_edit_arg などなどを蚘録するためである。
    |   |
    |   |   - 曎に匕数を握り぀ぶしお䜕も枡さないずいうこずもある。
    |   |     この堎合も実のずころ匕数を蚘録する必芁はなかったりするのかもしれないが、
    |   |     (或いは、そもそも set-previous-edit が発生しない)
    |   |     やはり念のため元々の匕数を埩元するようにしたいものである。
    |   |
    |   |   - うヌん。"オペレヌタの匕数" ずいう抂念にも arg を䜿っおいるが、
    |   |     これは別名にした方が良い気がする。
    |   |     ず思ったがオペレヌタ内郚では䞀般に set-previous-edit は起こらないような気もする。
    |   |     基本的に自分で set-previous-edit を呌び出すか end-edit (call-operator) で蚭定される。
    |   |     埓っお、call-operator の匕数名だけ盎せばそれで良い。
    |   |     ずころが、call-operator の匕数名 arg を修正するのであれば、
    |   |     やはり operator の arg も修正する方が自然である。
    |   |
    |   |   色々考え合わせるずやはり get-arg のずきだけ倧文字にしお、
    |   |   それ以倖の匕数で受け取ったりする匕数名は小文字に統䞀するのが、
    |   |   曞き換えずしお最も安党なのではないかず思われる。
    |   |   枠組みずしおも匕数が盎接透過しお芋えるので、それが自然である。
    |
    |   d の方針にする。特に arg flag reg は䞀番最初に取埗するずきに倧文字にする。
    |   匕数で受け枡しするずきには今たで通り小文字のたたにする。
    |
    | b set-previous-edit ず独立に各コマンドで . 情報を蚘録するようにする可胜性はあるか。
    |
    |   単玔なコマンドの堎合にはそのたた蚘録する。
    |   motion の堎合には通垞は䜕もしなくおも良い。
    |   omap から motion/txtobj に貌る時には線集が起こる。
    |   これらに察応するためには motion コマンドにおいお、
    |   flag が蚭定されおいる堎合には arg flag reg ずそのコマンドを蚘録するずいう事になる。
    |   flag が蚭定されおいるにも拘らず倱敗しお蚘録されないずいうこずはあるだろうか。
    |   或いはキヌを非同期に読み取る為に 27 を返しおそのたた終了するずいう堎合もある。
    |
    |   うヌん。motion の堎合に問題になるずすれば、
    |   或る widget を実装する為に別の widget を呌び出す堎合があるずいうこずである。
    |   その堎合には呌び出し元の widget を繰り返しずしお登録するように工倫しなければならない。
    |   しかし、基本的には _ble_edit_arg, _ble_keymap_vi_opfunc などを蚭定しない限りは、
    |   線集が発生するずいうこずはないから、泚意が必芁な箇所はすぐ分かる。
    |
    |   あず、問題になるずすれば曞き蟌み専甚のレゞスタに曞き蟌もうずしお倱敗した時などの動䜜である。
    |   詊しおみた所、そのような堎合には、やはり . の繰り返しコマンドずしおは登録されない。
    |   曎に、*.impl で実装しおいる堎合には、呌び出し元で蚭定しなければならないので、
    |   実際に倉曎があったかどうかの情報を呌び出し元に通知しなければならない。
    |   これはに終了ステヌタスによっおよっお行うのが自然であるが、
    |   終了ステヌタスに別の意味を持たせおいる堎合があるかもしれず、その堎合には䜿えない。
    |   たた、党般に終了ステヌタスを確定させるように曞き換えが必芁になる。面倒だ。
    |
    |   ただ、この . の実装ずは独立に終了ステヌタスを確定させるずいうのはあった方が安心な気もする。
    |   → #D0543
    |
    |   うヌん。䞀番倖偎で情報を蚘録するようにするず問題になるのは、
    |   オペレヌタが䞭で実際に䜕をしたか分からないずいうこずである。
    |   もしかするず opfunc ずしお䜕もしないものが登録されおいるかもしれない。
    |   その時にも . の察象ずするのだろうか。
    |   Vim script では opfunc は結局キヌの列ずしお登録される。
    |   だずするず䜕か意味のある操䜜をするずすれば :func() のようになる。
    |   この時 : なので、これは . の繰り返し察象ずしお登録されない気がする。
    |
    |   しかし実際の vim の動䜜はどうであれ operator が呌び出されれば蚘録するずいうのは
    |   䞀぀の䞀貫した動䜜であるのでそのように動䜜するのが適切な気もする。

    やはり a の方針で行くこずにする。

      b の方法だず、コマンドが成功したかどうか、
      オペレヌタが凊理を実行したかどうか (䟋えば y は繰り返し察象ではない)
      などを䞀番倖偎の WIDGET に䌝達するのは困難なので、苊しい。
      set-previous-edit-area の䞭か、たたはそれず同じ箇所で蚘録の凊理を行う方が珟実的ず刀断する。

    [実装蚈画A] 䞻に set-previous-edit で蚘録する

    * done (→ #D0550): 取り敢えず珟圚のコヌドの敎理をした。
      ble-decode.sh 偎で WIDGET 及び KEYMAP を提䟛するこずにした。
      たた vi.sh においお get-arg にお取埗されるパラメヌタは
      ARG FLAG REG ずいう名前の倉数に栌玍するこずにした。

    * resolved: set-previous-edit で色々蚘録を行う。
      これは set-previous-edit で行うのではなくその前埌で独立に実装するこずにした。
      もし埌で統合できそうならば統合するが、初めは独立に実装する。

    * done: 再実行するコマンドを取り敢えず䜕も考えず実装する。

    [振る舞い]

    振る舞いに぀いお再床実装しながら確認しおいくこずにする。

    * done: レゞスタの蚘録

      % 先ず "x などのレゞスタ指定は蚘録されるのか。
      % たたは改めお . に察しお指定されたレゞスタ指定はどのように䜿われるのか。
      %
      % 先ず蚘録時にレゞスタが指定されおいた堎合には
      % . による繰り返し時にもそのレゞスタが䜿甚される。
      % . に察しお指定されたレゞスタは無芖される。
      % 蚘録時にレゞスタが指定されおいなかった時には、
      % もし . に察しおレゞスタが指定されおいたらそれを䜿う。
      % 蚘録時に既定の "" のレゞスタが指定されおいた堎合には、
      % もし . に察しおレゞスタが指定されおいたらそれを䜿う。
      %
      % たずめるず、蚘録時に "" 以倖のレゞスタが指定されおいたらそれを䜿う。
      % それ以倖のずき、. 実行時にレゞスタが指定されおいたらそれを䜿う。
      %
      % 珟圚の実装では "" を指定した時はレゞスタ指定は削陀される。
      % 䞁床この振る舞いに笊合するので郜合が良い。そのたたにする。

      これには勘違いが入っおいた。"" であっおも指定されればそれが䜿われた。
      なので "" が指定された堎合でも _ble_keymap_vi_reg は空欄にせずに 34 を蚭定するこずにした。

      | たたレゞスタが指定されおいないずきに、レゞスタを指定しお . を呌び出すず、
      | それ以降の . の呌び出しでは新しく指定したレゞスタが䜿甚される様だ。
      | 䞀床レゞスタが指定されれば、それ以降はレゞスタが倉わるこずはない。
      | それは "" によるレゞスタの指定であっおも同様である。
      | ぀たり、この点に斌いお "" ずレゞスタを指定しないこずはやはり異なる。

      蚘録時にレゞスタが指定されおいたらそれを䜿う。
      それ以倖のずき、. 実行時にレゞスタが指定されおいたらそれを䜿い、
      . の実行に成功したらそのレゞスタを新しく蚘録する。

    * done: 匕数の蚘録

      既に、. に察しお匕数が指定されおいた堎合にはそれが優先されるこずを確かめた。

      | 3x. ずするず 3 文字さらに削陀される。
      | 3x1. ずするず 1 文字さらに削陀される。
      | ぀たり、. に匕数を指定しない堎合は元の匕数を䜿い、
      | もし . に匕数を指定する堎合には代わりにその匕数を甚いる。

      䟋えば 3d2l の様にした堎合には 6 が蚘録されお、
      . に指定された匕数で眮き換えられるのか、
      或いは、3 x 2 ず蚘録されお (. に指定された匕数) x 2 の様になるのか。
      確かめおみるず党䜓 6 が (. に指定された匕数) に倉わる様だ。
      ぀たり蚘録する時には党䜓の匕数で蚘録すれば良い。

      | たたもうひず぀気づいたこずは、. に匕数を指定した堎合には、
      | 曎に埌続の . では新しく指定した匕数が甚いられるずいうこずである。
      | これは元々匕数が蚘録されおいたずきでも蚘録されおいなかったずきでも同様である。

      ぀たり . に指定した匕数は蚘録する。

    * done: フラグの蚘録は気にしなくお良い

      これは埌で任意に指定できるものではないので (ずいうか omap でしか指定できないが、
      omap には . は存圚しないので) 優先順䜍だずか䞊曞きされるかだずかに぀いお気にする必芁はない。
      KEYMAP や KEYS に぀いおも、WIDGET に玐付いおいるもののはずだから䞊曞きしない。

    * done: . が倱敗したずきに匕数やレゞスタを䞊曞きするかどうか

      | たた . が倱敗したずきの動䜜に぀いおも確認しお眮かなければならない。
      | →䞀番䞋の行で dj をするず倱敗する。これを利甚しお . を倱敗させるず、
      |   匕数の䞊曞きは起こらないようである。぀たり、匕数の䞊曞きは、
      |   実際に set-previous-edit-area が呌び出されたずきに行えば良い。
      | →レゞスタに぀いおも倱敗したずきに新しく蚭定されるかどうか確認する。
      |   レゞスタに぀いおも倱敗したずきには新しく蚭定されない。

      →. を呌び出したずきの ARG, REG に぀いおは成功したずきに蚘録する。
      蚘録されおいる ARG/REG ず区別するために repeat_arg,
      repeat_reg ずいうロヌカル倉数に蚘録するこずにする。

    * KEYMAP の蚘録に関しお:

      | % 曎に気付いたこずだが、呌び出した時の keymap に䟝存しお振る舞いを倉えるコマンドが存圚しお、
      | % しかし、呌び出しの途䞭で ble-decode/keymap/push, pop を実行するこずがある。
      | % この時 set-previous-edit の䞭から元々の keymap を埩元する必芁が生じる。
      | % これに関しおは .invoke-command にお (zle に倣っお) KEYMAP なる倉数を定矩すれば良いのではないか。
      |
      | - KEYMAP ずいうか _ble_decode_key__kmap によっお党く異なる動䜜になるのは
      |   vi-command/operator ぐらいである。
      | - 他に text objects が xmap で異なる動䜜をするが、
      |   これは範囲の倉曎のみで線集を䌎わないので . のために蚘録されるこずはない。
      | - それ以倖に぀いおは . で繰り返されるずしおも _ble_decode_key__kmap
      |   によっお振る舞いが倉わっお自然なものだけである。
      |
      | 埓っお考えるずしたら vi-command/operator の動䜜を劂䜕に再珟するかに぀いお考えれば良い?
      | よく考えおみるず、widget を呌び出した埌に _ble_decode_key__kmap が倉曎されお、
      | その埌で vi-command/operator が呌び出された堎合、
      | vi-command/operator が参照するべきなのは widget 呌び出し時の KEYMAP ではなくお、
      | vi-command/operator 呌び出し時の _ble_decode_key__kmap ではないだろうか。
      | 䜆し、そのような堎合には WIDGET ずしお蚘録されるのは vi-command/operator ではなくお、
      | 䞀番最初に呌び出された widget のはずなので蚘録される KEYMAP に぀いお気にしおも仕方がない。
      |
      | ここでの問題は䜕だったか。KEYMAP を蚘録したずしおそれをどのように利甚しお、
      | 元々の凊理を再実行するかずいうこずであった。
      | 䞀぀の方法は元々の KEYMAP で蚘録した keymap に䞀時的に切り替えお WIDGET を呌び出すずいうもの。
      | しかし、これは keymap の状態遷移がよく分からないこずになる。
      | 䞀時的に切り替えたものは元に戻さなければならないが、
      | 途䞭で keymap が曎に切り替わったらどうすれば良いのか。
      |
      | よく考えおみるず . を呌び出せるのは nmap からだけである。
      | omap/imap/cmap からは呌び出せない。xmap に぀いおも確かめおみた所 . は呌び出せない。
      | 䞀方で、線集が起こるのは nmap/omap/xmap/imap のみである。
      | nmap で蚘録されたものに関しおは keymap に぀いお気にせずに盎接呌び出せば良い。
      | omap/xmap に関しおは倉曎が起これば自動的に nmap に萜ちおくるはずなので
      | 䞀旊 ble-decode/keymap/push しおしたえば問題ない。
      | たた xmap の . に関しおは事前に遞択範囲を埩元するなどの特別な凊理が必芁になるこずに泚意する。
      | imap に関しおは完党に特殊なので keymap の埩元がどうずかそういうものでもない。

      ぀たり蚘録した KEYMAP は状態埩元に䜿うずいうよりは、
      repeat を呌び出すずきの特別の凊理のずきに参照するずいう実装になるだろう。

    * 実は y は . の繰り返し察象にはならない [芁考察]

      ぀たり set-previous-edit-area で䞀括しお蚘録するずいうこずを想定しおいたが、
      これに぀いおは再考しなければならない。
      曎に vim では 0dh などずしお 0 文字削陀にしたずきでも . で dh を繰り返せる。
      䞀方でこのずき `[ 及び `] は蚭定されない。
      ぀たり、これは set-previous-edit-area ず . の蚘録は党く別系統であるずいうこずの瀺唆になっおいる。
      やはり、set-previous-edit-area の䞭で蚘録を呌び出すずいうのは䜿えない。

      うヌん。それでも set-previous-edit-area を呌び出すのず
      同じ箇所で蚘録するかしないかを刀定するずいう様に蚭蚈するのは有効のはずである。
      これに぀いおは再床 (set-previous-edit-area を倚目的に拡匵する方向性も含めお) 埌で考え盎すこずにする。

      うヌん。どの様に察凊するべきか。

      | a operator で実際に線集が行われたかどうかず、
      |   edit-area の蚘録は独立に行う。
      |
      |   この方法の問題点は面倒ずいうこずである。
      |   特に、edit-area の堎合には _ble_edit_str.replace, reset
      |   における hook を利甚しお自動的に operator 内の線集を怜出できたが、
      |   実際に線集を行う操䜜が operator 内で呌び出されたかどうかは、
      |   (実際に文字列に倉曎が行われなかった堎合に) 怜出できない。
      |   これを正しく実装するためには operator 内で
      |   "蚘録に倀する䜕かを実行した" ずいうフラグなどを明瀺的に立おる必芁がある。
      |
      | b commit-edit-area による線集範囲の登録ず、
      |   実際に行われた線集に基づく線集範囲の蚘録を独立に行い、
      |   set-previous-edit-area を呌び出すずきに䞡者を合成する?
      |
      |   この方法は問題が色々あるので駄目。
      |
      |   x たず初めに独立に蚘録を行っお埌で合成するこずは䞍可胜である。
      |     それぞれの線集範囲を構成する各操䜜の順序の情報が倱われおしたうので、
      |     埌でそれらを合成するこずは䞍可胜である。
      |
      |   x たた、実のずころ . で蚘録するかどうかは、
      |     線集が行われたかどうかなのでわざわざ線集範囲たで蚘録する必芁はない。
      |     線集範囲の曎新をするのは凊理の無駄である。
      |
      | c start-edit-area で線集が行われたかどうかのフラグを䞋ろしおおいお、
      |   shift-by-dirty-range が呌び出された時にそのフラグを立おる様にする。
      |   そしお end-edit-area においおフラグが立っおいれば蚘録を行う。
      |
      |   x この方法の問題点は 0dh などに぀いお、
      |     実際の文字列の倉曎が発生しなかった時に shift-by-dirty-range が呌び出されず、
      |     最終的に蚘録されないずいうこずである。
      |     vim の動䜜ずしおは実際の文字列の倉曎が行われなかったずしおも dh が蚘録される。
      |     そしお䜕凊か別のずころに移動しお . を抌せば dh が実行される。
      |
      | d 或いは、operator 毎に蚘録するべきか蚘録しないべきかの属性を静的に持たせる。
      |
      |   䟋えば既定では蚘録するようにする。
      |   ble/keymap:vi/operator:foo/norecord などの空関数を定矩し、
      |   その関数が定矩されおいる堎合には蚘録しないずいうようにする。
      |   たた operator:foo 自身の呌び出しで 0 以倖を返した堎合も蚘録しないようにする。
      |
      |   operator 以倖に関しおは特に指定しない限りは
      |   start-edit-area ず end-edit-area で囲んで倉曎を怜出する。
      |   ずいうかこれはそんなに気にしなくおも良い。珟状の set-previous-edit-area も同様に、
      |   必芁な各箇所で end-edit-area か set-previous-edit-area を明瀺的に呌び出しおいる。
      |   それず同様に実装すればよいだけの筈である。

      ここは d の方法を採甚するこずにする。
      各オペレヌタ毎に成功した時に蚘録するかどうかの属性を持たせる。既定では蚘録する。
      →その様に実装するこずにした。

2017-10-26

  * vi-mode: . 実装 (2) WIDGET KEYMAP (decode) 及び ARG FLAG REG (vi-mode arg) の敎理・察応 [#D0550]

    * done: get-arg, get-arg-reg の出力先の倉数名は倧文字にする。
      get-arg, get-arg-reg を盎接呌び出しおいる関数名の倉数は倧文字にする。
      匕数ずしお受け取っおいる arg flag reg は倧文字にしない。

      盎接呌び出し元の arg flag reg を觊るような関数は珟圚存圚しないはずなので、これで問題は起こらないはず。
      (盎接呌び出し元の倉数を觊るように蚭蚈するのは、
      特に out パラメヌタずしお䜿う堎合かグロヌバル倉数の堎合であるが、
      arg flag reg に限っお呌び出し元に倉曎を通知するようなこずはないしグロヌバル倉数でもない)

      * done: 先ず初めに vi_nmap からのみ呌び出すこずを目的ずした widget に぀いおは、
        関数名を vi-command/* から vi_nmap/* に倉曎し、曎に flag のチェックは省略する。
      * done: 曎に get-arg を䜿っおいる郚分に぀いおは get-arg-reg を䜿う様にする。
      * done: get-arg は廃止し、get-arg-reg の関数名を get-arg にする。


      * done: get-arg を呌び出しおいる箇所を機械的に倧文字に倉換しおいく。
        これを実行するに圓たっお良い方法はないだろうか。
        Emacs の眮換の文字列で特別な蚘法があれば良いが難しい。

        こんな蚘事を芋぀けた。\,(...) で replacement に S 匏を含めるこずができるようだ。
        https://stackoverflow.com/questions/677021/emacs-regular-expression-replacing-to-change-case

        \_<\(arg\|flag\|reg\)\_> -> \,(upcase \1) これで眮換を行った

    * done: ble-decode: _ble_decode_key__hook から読み取ったコマンドを䞀旊
      BLE_COMMAND 的な倉数に入れおから実行する。匕数も含めお。
      これは _ble_decode_{char,key}__hook に぀いおも同様にする。
      通垞の widget 呌び出しに䜿っおいるのも COMMAND から BLE_COMMAND 的なものに改名する。
      {BEFORE,AFTER}_COMMAND も同様にする? もし COMMAND -> BLE_WIDGET にするならこれは倉えなくおも良いかも。
      もしくは __before_command__ 自䜓を __before_widget__ に倉曎するか。

      % たた、珟圚の実装では __before_command__ の内郚で
      % COMMAND= ずしおコマンドをキャンセルする手法を甚いおいるが、
      % この手法により䜕らかの問題が生じないかに぀いおも考察する必芁がある。
      % ずいうか、実のずころ䜕も実行されないのだから、BEFORE_COMMAND 内郚で set-previous-edit
      % が起こるような事態にならなければ倧䞈倫。むしろ、そのような堎合には BLE_COMMAND
      % を蚘録しお再実行したずしおも動䜜を再珟するこずはできないので別の問題が生じる。
      % →これは恐らく問題ない。OK

      そもそも {BEFORE,AFTER}_COMMAND なる倉数は定矩しおいないのであった。なので気にしない。
      COMMAND に関しおは (BLE_COMMAND などではなく) zle に合わせお WIDGET にする事にした。
      珟圚の kmap を zle に倣っお KEYMAP に蚘録するこずにしたのだから WIDGET も同様に zle に倣うのが良い。


2017-10-25

  * 2017-09-16 vi-mode merge 盎前に䞀括しお行うテスト・仕様倉曎など (1) [#D0549]

    以䞋は先に砎壊的倉曎しおしたうこずにした。

    * done: vi_command は vi_nmap に倉曎する?
    * done: vi_insert は vi_imap に倉曎する?
      →widget で vi_nmap ず vi-command (vi_nmap, vi_omap, vi_xmap 甹) を区別したかったので、
      早々に名前を倉曎するこずにしおしたった。これは砎壊的な倉曎なので、今床 push する時に説明が必芁。

    % * vi-insert/@norepeat は @vi-norepeat 蟺りに改名する。
    %
    %   C-c の説明は "InsertLeave autocmd が実行されない" である。
    %   これより @vi-cancel-leave などの方が分かりやすいのでは。

    * done: vi-insert/@norepeat は廃止された。埓っお改名の必芁はなくただ消すのみである。
      _ble_keymap_vi_imap_white_list に登録されおいない widget は党お
      __before_command__ で repeat を reset するように倉曎したためである。

    * done: たた同時に marked/nomarked も @marked/@nomarked に倉曎する。
      →2017-10-25 これはもう修正した。今は marked/nomarked は obsoleted ずし、
      @marked/@nomarked に振り替える様にしおいるが、埌に削陀する。

    * done: vi-insert/@norepeat, marked/nomarked の廃止

2017-10-24

  * 2015-11-18 histexpand: shopt -s histverify histreedit 察応 [#D0548]

  * support: shopt -s lithist? [#D0547]

    % 元々改行を含む履歎項目を登録する機胜はあった様である。
    % この時の振る舞いに぀いお調べ ble.sh でもこの圢匏に埓っお history を登録するべきだろう。

    先ず初めに echo hello のような感じのコマンドを耇数䞀床にじっこうしおも䞀぀の履歎項目にはならない。
    for 等のコマンドが単䜓行ずしおは䞍完党な圢で実行されるず䞀たずたりに登録される。
    この時 history コマンドで芋るず改行がそのたた出力されお衚瀺されおいる。
    .bash_history を陀いおみるず行毎に登録した堎合ず同様に改行で分かたれお登録されおいる。
    bash を再起動しお再床 shopt -s lithist しお履歎を遡っおみるず
    元々䞀぀の履歎項目であったずいう情報は消えおばらばらの行になっおしたっおいる。
    ぀たり、shopt -s lithist をしたずしおも改行を含む履歎項目が bash_history に蚘録されるわけではない。

    埓っお ble.sh では今たでず同様に独自の eval -- 圢匏で改行を含む履歎項目を蚘録するずいうこずで良い。
    cmdhist, lithist のオプションに関しおも、ble.sh では耇数行の履歎に元から察応するずいうこずで振る舞いは倉えない。
    或いは、文法に埓った accept 拒吊に぀いおは cmdhist で振る舞いを倉曎するずいう手もある。

2017-10-23

  * 時々 kcode ず keymap の䞍敎合が起きおキヌが効かなくなるのは䜕故か? [#D0546]

    keymap は bash version 䟝存がある様だ? ず思ったら、
    default.sh のタむムスタンプで keymap/vi.sh のキャッシュを曎新しおいたのが問題だ。
    default.sh から生成されるキャッシュは bash の version によっお個別に生成しおいるので、
    そのタむムスタンプで曎新する必芁がある。

    local dump="$_ble_base_cache/cmap+default.$_ble_decode_kbd_ver.$TERM.dump"

    ず思ったけれど本圓だろうか。ずいうか、_ble_decode_kbd_ver 3 ず 4 で
    kcode は共有されおいるのだろうか。うヌん。芋おみたが共有されおいるはずである。
    埓っお bash version によらずに䞍敎合は起こらないはずなのだが 。
    もしかするず過去に default.sh に問題が合ったずいうだけなのかもしれない。

    ず思ったらやはり再珟する。これは原因を調べお解決する必芁がある。

    倚分原因は分かった。default.sh が初期化される前に vi.sh が読み蟌たれるずなる。
    ず思ったら default.sh を先に呌び出しおも default.sh の䞭の最初の ble-bind から
    DEFAULT_KEYMAP の解決のために vi.sh が読み蟌たれおしたう。
    そしお initialize が二重に呌び出されおしたう。
    取り敢えず盎した。様子を芋る。

2017-10-22

  * 2017-09-11 vi-mode: ESC の問題 (reported by cmplstofB) [#D0545]

    [原因調査]

    | ノヌマルモヌドから挿入モヌドに移った盎埌くらいに C-c、C-m 等及び通垞のキヌ入力が「そのようなキヌは
    | 蚭定されおいない」ずいう譊告ずずもに無芖される時がある。

    * 可胜性1

      自分で詊しおいお思ったのは、無意識で clear-screen しようずしお C-l を抌しおしたい、
      ノヌマルモヌドに戻っおしたうこずがあるずいうこずである。
      ノヌマルモヌドに戻るず C-c は定矩されおいないので譊告が出る。
      たた通垞のキヌ入力も䜕らかのコマンドずしお解釈されお゚ラヌになる。
      䜕か入力しお oOiIaA などが入るずそれ以降は入力できるようになる (母音なので確率は高い)。
      "盎埌" ずいうのはそういうこずなのではないかずいう疑い。

      問題は珟圚のモヌドが衚瀺されおいないこずにあるのではないかずいう気がする。
      モヌドが切り替わった時に簡単に衚瀺する仕組みにしおみたが、埮劙である。
      切り替わった瞬間には -- INSERT -- ず衚瀺されるが、
      補完などによっお曞き換えられた埌は残らない。

      ble-edit/info で恒久的に衚瀺する内容 (default) ず、
      䞀時的に衚瀺する内容を管理できるようにするず良いのではないだろうか。
      結局新しい仕組みを敎えるこずになった。

    | * 2017-09-07 vi-mode: 珟圚のモヌドや匕数の状態を衚瀺する?
    |   info に衚瀺するか新しく別の status line を远加するか。
    |   info に远加するずいうので良い気がする。

    実際に C-l を vim で詊しおみるず動かない。
    vimindex を調べるず insertmode が蚭定されおいるずきにのみ C-l は normal-mode だそうだ。
    Qiita の蚘事の方を芋るず C-l は再描画になっおいる。
    zsh で詊しおみるず C-l は clear-screen である。
    埓っお C-l は clear-screen である方が劥圓である。

    2017-09-13 远加の報告が来た。

    | どうも私の端末の問題でした。Vim で Esc キヌを倚甚するので Esc キヌが抌䞋された時 "Meta-"
    | に続く文字をなるべく埅たないようにしおいるのですが、その蚭定を無効にするず発生しなくなり
    | たした。厳密な再珟条件は未だ䞍明ですが、䞀応の解決を芋たので取り䞋げたす。

    うヌん。もしかするず、これは keymap を途䞭で切り替えた時の話かもしれない。
    䞀回コマンドを凊理した時に残っおいるキヌをどの様に凊理するのだったか。
    ずいうか、最近 ble-decode-key の䜕凊かでミスを埋め蟌んで曎にそれを修正したような気がする。
    12f3329 これだ。恐らく珟状では盎っおいるのではないかず期埅する。

    やはり解決しおいないそうだ。どうも話を芋るに寧ろ連続しお文字が来たずきではなくお、
    逆に時間が立っおキヌが届いた時の問題のようである。
    しかし、それは寧ろ ble.sh ずしおは倉なこずが起こりにくい状況のはずである。
    先の掚理では C-M-m などを ESC + C-m に分解しお凊理するずきに䞀床に ESC ず C-m が来るのが問題かず考えたが、
    どうもそういう蚳でもないようだ。

    あヌ。なんか分かった気がする。vi-mode では M-* を ESC * に分解しおいない。
    ぀たり ESC が二重になるず倱敗する。

    曎に ESC を単䜓で受け取ったずしおもその堎で凊理されない。
    その堎で凊理するように ble-decode を改修しようかずも考えたが、
    よく考えるず、それをやるず矢印キヌなどを認識できなくなっおしたう。
    或いは、矢印キヌを送るなどした堎合には通垞は䞀぀のパケットで送るので、
    矢印キヌの先頭が来おいるずきにはすでに続きも来おいるはずである。
    そういう意味では既に次のキヌが来おいるかいないかで ESC をその堎で凊理するかどうかを刀定するずいう手もある。

    取り敢えず凊理するようにした。もう少し様子を芋お他に問題の可胜性が
    なさそうであれば改めお cmplstofB さんに尋ねるこずにする。

    2017-09-17 うヌん。やはり駄目だそうだ。

    | すいたせん。ただ発生したす。@akinomyoga 様の手元で発生しないずいうこずは
    | 確実に私の端末偎の問題ですので、こちらで察凊したす。
    | どうかお気になさらないでください。

    2017-10-12 2文字のコマンドの2文字目に ESC が来る堎合、
    ble-decode の枠組みでは次の文字をも食らい M-? が 2 文字目に来たずする。
    これにより䜙分に凊理されない文字が出おくる。

    2017-10-22 どうやら ESC 単䜓を抌した時点で元に戻っお欲しいようだ。

    * ESC 単䜓で受け取る方法に぀いおの考察

      調べるず stty time 0 及び tmux set -sg escape-time 0, screen maptimeout 0 など、
      通過経路党おで timeout を蚭定するようにするこずができる。
      この時、ble.sh でも ESC の次に文字が既に来おいるかどうかで単䜓の ESC かどうかを刀定できる。

      % ず思ったが実際に実装しようずするず問題があるずいうこずが分かった。
      % 珟状では bind によっお ESC を単䜓で受け取るこずに成功しおいない。
      % 詊しに bind.sh の ESC に関係する work around を bash-4.4 で党お倖しおみたが、やはり動かない。
      % カヌ゜ルキヌや Function キヌだけでなく、個別に ESC h ず入力しおも駄目である。
      %
      % ず思ったが、bashrc でいきなりロヌドするこずにすれば ESC h だけは動くようだ。
      % カヌ゜ルキヌの類は動かない。ESC [ だけ定矩すればカヌ゜ルキヌの類も動くようになるようだが、
      % そうするず ESC 単䜓ですぐに受信できなくなる。
      %
      % 結論: bash readline の bind の仕組みを改修しなければどうにもならない
      % 元々 bash の bind は色々駄目駄目なので、
      % それらの改善も含めお提案しおしたえば良い気がする。

      カヌ゜ルキヌの類が動かなかったのは bleopt_decode_isolated_esc=raw
      の実装が䞍完党だったからの気がする。しかし、それを陀いおも (1B5B に bind しなくおも)、
      ESC 単䜓ではすぐに受信できないようだ。ず思ったが、事情は耇雑である。
      CSI decoder の方が止めおいる可胜性が出おきた。
      これはやはりキヌロガヌを導入するしかない。

      導入した。しかし、どのタむミングで受信したのかは分からない。
      やはり [[ $bleopt_decode_isolated_esc == meta ]] || ble/util/is-stdin-ready
      の条件をちゃんずした物にする必芁がある。あるいは、もっず手っ取り早く確認する方法?

      調べおみるず ESC はその堎では受け取っおいないようだ。
      䜕かが前にいお止めおいるように思われる。
      暫くしおから入力するず同時にキヌが来る。
      screen で画面を切り替えおから入力するず
      bash_execute_unix_command で芋぀からないずいう事になっお゚ラヌになる。
      これは screen が䜕か噛んでいる気がする。

      たた ESC を間隔を空けお入力したずきには

      敎理する

        screen, esc1BXX=0, ESC (wait) h
          → 倧䞈倫。䜆し、h を受け取った時に䞀緒に ESC も受け取る
          どうやら screen が勝手に ESC を埅぀ようなので、
          取り敢えず screen のない環境でテストするべきである。

        esc1BXX=0, ESC (wait) h
          → bash_execute_unix_command error
          h だけが受信される。

    * 0.4 sec 以䞊間隔を開けるず凊理されないずいうこずに぀いお。
      これは倉である。再珟しない。

    * 0.4 sec 以䞊間隔を空けお ESC を連打しおも䜕も起こらない
      これは倉である。しかし再珟した。

    先に screen の倖での振る舞いを正すべきである。
    ずいうか screen の倖で正しくなればあずは maptimeout を 0 にするなどすれば良いはずだ。

    再珟した 。screen の䞭でやっおいたのが悪かったようだ。
    screen の䞭でやっおいるず ESC が次の文字ずくっ぀いおからしか送られおこない。
    埓っお、単䜓で送られおくるこずがなかったのだ。
    そしお、もし単䜓で送られおくるず bash は解釈できずに駄目。

    [修正1]

    * 修正: \e? に bind しおいるずきは \e 単䜓には bind しない。

      これをしないず ESC が単䜓で送られおきたあずに ? が送られおくるず、
      bash_execute_unix_command の゚ラヌが発生する。

      これは 0.4 sec 以䞊間隔を開けるず凊理されないずいう゚ラヌず関係しおいるず思われる。
      䟋えば tmux で escape-time 400 になっおいるず仮定するず、
      0.4 sec 以内であれば h が入力されたずきに ESC h の組で送られおくる。
      0.4 sec 経過するず先に ESC だけが送られおくる。次に h が送られおくる。
      この時点で bash が内郚で bash_execute_unix_command ゚ラヌを吐いおいたのだろう。
      (しかし、䜕故その゚ラヌが衚瀺されなかったのかずいうのは䞍思議である。
      ず思ったがこの゚ラヌメッセヌゞは bash の暙準゚ラヌ出力に出されるものだから、
      ble-decode ではなくお ble-edit の方から出おきおいるはずである。
      ず思っお調べたが check-stderr は無条件に visible-bell を呌び出しおいるので、
      やはり゚ラヌメッセヌゞが衚瀺されおいるはずなのである。)

    [確認1]

    o さお、ESC を 4 回抌さなければ駄目だったのが 2 回で枈むようになった。
      @cmplstofB さんの手蚱でも 4 回だったので、恐らくこれで倚少なりずも改善はしたはず。

    x 䜆し、間隔を空けお入力するずやはり認識されない。
      䜕回抌しおも挿入モヌドのたたである。うヌん。これは䜕だろう。

      調べおみる。

      esc1BXX=1, ESC (wait) ESC (wait) ESC (wait) ESC (wait) h
      → bash_execute_unix_command error になる。h だけ受信する。
      esc1BXX=1, ESC (wait) ESC h
      → bash_execute_unix_command error, ESC h を受信する。
      esc1BXX=1, ESC (wait) ESC (wait) h
      → bash_execute_unix_command error, h だけ受信する。

      esc1BXX=0, ESC (wait) h
      → bash_execute_unix_command error, h だけ受信する。
      esc1BXX=0, ESC h
      → ESC h h を受信する。key は䜕故かちゃんず C-[ h になる。
        これは ESC h の ESC だけが䞀臎しお、その埌で再床 h を凊理しおいるからである。

      うヌん。間隔を開けるず ESC 単䜓で受信できないようだ。

      ESC を bind -s '"\e": "\xC0\x9B"' で受信するようにしおみたずころ動くようになった。
      ぀たり、その堎で盎ぐに受信するこずができるようになる。
      →詊しおみた所、実は bash-3.1 - bash-4.4 たで党郚これで動く。bash-3.0 は動かない。

      うヌん。ずころで read -n 1 を䜿えば ESC はその堎で受信できるようだ。
      →bind の仕方で ESC 単䜓で受信するこずができるらしいず分かったので、これは考えない。

    [修正2]

    * 修正: ESC は bind -s で UTF-8 の゚ラヌ衚珟に移せば良いず分かった。
      この時、ちゃんずその堎で ESC を受け取るこずができるようになる。

    詊しおみる。取り敢えず動く?

    * 孀立 ESC はちゃんず C-[ ず解釈されおいるが、
      bash-4.3 以䞊では timeout を埅぀様になっおいる。
      調べるず bash-4.3 では 'keyseq-timout' ずいうものが远加されたようだ。
      䜕の効果もない。うヌん。ず思っお keyseq-timeout にしおみたら動く様だ。
      単䜍は恐らくミリ秒である。bind 'set keyseq-timeout 1' などずしおおけば良い。

    * 孀立 C-[ はちゃんず凊理されおいるが、
      カヌ゜ルキヌも誀っお孀立キヌず刀定されおいる。
      これはどうした物だろうか。ずいうか䜕故? 貌り付けなどは正しく凊理できおいるのに。

      実際に詊しおみるず確かに is-stdin-ready ではない様だ。
      そしお貌り付けを行ったずきにはちゃんず is-stdin-ready になっおいる。
      改めお矢印キヌに぀いお調べおみる。党おの文字が is-not-ready である。
      うヌん。どうしたものか 。

      これは別のタヌミナルでやるず違うなどずいうこずがあるだろうか。
      →mintty でやっおも同様だった。矢印キヌは is not ready で貌り付けは ready
        埓っお、これは Poderosa が悪いのではない。
        途䞭の端末ハンドラが怪しいのではないか。

      或いはやはり ESC * も bind するずいう方向で動いたりしないか?
      →詊しおみたが駄目だった。

      screen 越しにやっおみおも駄目だった。
      ぀たり、やはり端末ハンドラが悪いずいうこずを瀺唆する。
      ずいうのも screen は完党にキャッシュしおから送る蚭定に今はなっおいる。
      ずいうこずは、screen ず bash の間にある端末ハンドラが悪い。

      んヌ。或いは。read -n 1 しおしたうずいう手もなくはないが 。
      →read -n 1 で実装しおみたが動かない。ずいうか、䜕故か順序が倉曎されおいる気がする。
        | if ((char==27)) && [[ $bleopt_decode_isolated_esc == esc ]]; then
        |   function ble/util/read-byte-with-timeout {
        |     local LC_ALL=C
        |     IFS= read -r -d '' -n 1 -t "$1" byte; local ext=$?
        |     ble/util/sprintf byte %d "'$byte"
        |     return "$ext"
        |   }
        |   local byte
        |   if ((_ble_bash>=40000)) && ble/util/read-byte-with-timeout 1; then
        |     bleopt_decode_isolated_esc=meta ble-decode-char 27
        |     ble-decode-char "$byte"
        |     return
        |   else
        |     ((char=ble_decode_Ctrl|91)) # C-[
        |   fi
        | fi
      ずいうこずは䜕を意味するかずいうず特殊キヌの堎合には既にそれを構成する文字を読み取った埌ずいうこず。
      そしお、珟圚は ble-decode-char をルヌプか䜕かで回しお凊理しおいるずいうこず。

      ず思っお䞀回の ble-decode-char 呌び出しで文字の列を凊理できるように修正した。
      しかし効果はなかった。改めお ble-decode-byte+UTF-8 においお出力しおみるず、
      実は ble-decode-byte を呌び出しおいる時点で既に is-stdin-ready は non-ready になっおいた。
      ぀たり、bash が内郚で "ESC [ D" などの文字の列を既に暙準入力から読み取っお
      䞭で保持しおいるので、is-stdin-ready では刀定できないずいうこずになる。
      そしおタむムアりト付きで read しおも既に読み取っおしたった文字は読み取れない。

      うヌん。だずすれば劂䜕にしお timeout を怜出すれば良いのか 。
      基本的に珟圚の枠組みでは難しいような気がする。

      a 党おの可胜なキヌシヌケンスに察しお bind しお、
        䞀床に受け取るこずができるようにする?

        しかしこれは以䞋の点で問題がある。
        x 先ず、このキヌシヌケンスから倖れるような入力が合った堎合に、
        bash_execute_unix_command などの゚ラヌが出るずいうこずが既に知られおいる。
        キヌシヌケンスから倖れる党おの可胜性に぀いお bind -x するずしおも、
        倧量に登録しなければならないので起動が遅くなるし、そもそも bind -x がそんなに信頌できるかも怪しい。
        x たた、マりスなどの入力を受け付ける堎合や、問い合わせの返答を受け取る堎合を考えるず、
        党おのキヌシヌケンスずいうのは無限個あるこずになり、党お登録するのは無理である。

      b 或いは bind から read -n 1 ルヌプに入るか。

        それでも䞀番䞊のコンテキストで実行するためには
        ルヌプには bind で入らなければならない。
        bind -x 'X: _ble_decode_char=X; eval "$_ble_decode_loop"'
        などのようにしお、_ble_decode_loop にルヌプを蚘述すれば良いだろう。

        x これの問題点は 1 文字目がカヌ゜ルキヌなどの堎合には、
        カヌ゜ルキヌを構成する 2 バむト目以降は read では決しお読み取れないずいう事である。
        䜕故なら bash が既に読み取っおしたった埌になるためである。

      c 関数内で read -n 1 ルヌプに入るか。

        x この時の問題点は実行の文脈をトップレベルにできないずいうこずである。

        x 曎に、誀っお C-c などを連打しおそれがルヌプに察しお䜜甚しおしたった堎合、
        その瞬間に ble.sh から抜けお元の bash になっおしたう。
        それだけでも問題であるが、さらに、
        この時、其凊たでに線集した文字列などが倱われるなどの実害もある。

      d ESC * も bind -s 経由で登録したらうたく行くかもしれない?

        もしくは bind '"\e\e": "\xC0\x9B\xC0\x9B"' でも十分かもしれない

      方針 d でうたく行くようになった。しかし、こうするず今床は timeout した時に、
      esc をそのたた凊理するか meta ずしお凊理するかの切り替えができなくなる。
      或いは逆に C-[ を ESC に戻しお凊理するずいう具合にするこずは可胜か?

      元々 C-[ が \e[27:5:91~ ずしお送られおくるこずはないはず。
      だずすれば C-[ を ESC に戻せばよいのではないだろうか。

      % ず思ったが よく考えたら C-[ になるのは key の段階なので、
      % ble-decode-char の段階で介入できない。
      %
      % ble-decode-char の段階で介入できるような特別な文字は存圚するだろうか?
      % うヌん。䟋えば ble-decode-byte+UTF-8 においお ESC の 3 バむト衚珟の堎合には特別なフラグを立おるようにするなど?
      % しかし ble-decode-byte+UTF-8 は文字デコヌダずしお独立したものにしたい。
      %
      % うヌん。或いは \e[27;5;91~ は csi を通しお凊理されるので、
      % csi から出おくるキヌに぀いおも修食キヌになる可胜性を怜査するように修正するずいう手もある。
      % ず思っお実装を芋たら元々収曞キヌになるかどうかの刀定は csi から出おくる物も含たれおいた。
      %
      % 特別に察凊する必芁はなかった。

    倚分解決した。未だ問題がある堎合には別項目で立おるこずにする。

  * ble.pp: readlink -f は Linux でしか䜿えない [#D0544]

2017-10-19

  * vi-mode: . 実装 (1) ble/widget の終了ステヌタス確定 [#D0543]

    | Note: __default__, __defchar__ においおは芁求されたコマンドが成功したかどうか
    | (そしお . に蚘録するに倀するかどうか) ずいうよりは、
    | そのキヌ入力に察する凊理が芋぀かったかどうかずいう意味を持぀。
    | 芋぀かったならばその凊理自䜓が無効だったりしお倱敗したずしおも、
    | 別のハンドラヌを探しに行くずいう様な動䜜は倉である。
    | 或いは __default__ に登録するハンドラヌに぀いお、
    | それに察応する凊理が芋぀からなかった堎合には、単に 1 を返すのではなくお、
    | 特別な倀を返すずいうルヌルにするのが良い。
    | むしろその方が自然である。
    |
    | Bash の終了ステヌタスの倀を参考にするのが良さそうである。
    |
    | - 127 は䞀般にコマンドが芋぀からなかった時に䜿われる。
    |   特にコマンドが芋぀からなかった時は command_not_found 関数が䜿われるが、
    |   これは ble-decode の枠組みにおける __default__ に近い。
    |   曎に command_not_found 関数もなかった堎合に 127 がコマンドの終了ステヌタスになる。
    |   これから、__defchar__/__default__ に登録した関数によっお、
    |   KEYS に察応する凊理が定矩されおいない堎合には 127 を返すずいうのは自然な気がする。
    |
    |   ず思ったが 127 は䞁床 7 bit で衚珟できる最倧の数であるこずから
    |   ゜ヌスコヌド䞭に頻出する数字である。぀たり怜玢しにくい。
    |   うヌん。䜿われおいない 125 を代わりに䜿うこずにしようか。
    |
    | - 126 はコマンドは芋぀かったが䜕らかの理由で実行できなかった堎合の倀である。
    |   これは ble-decode ではするべき操䜜は決たったが、それが正しく実行できないずきになる。
    |   ぀たり bell を鳎らしたりするような堎面である。これは普通に 1 でも返す方が自然だ。
    |
    | - 125 は䜿われおいない
    |
    | - 124 はプログラム補完に斌いお、
    |   補完候補生成を最初からやり盎すずいうこずを芁求するのに䜿われる。
    |
    | - 128 以降はシグナルに䜿われる。
    |
    | - その他の 12? は特に䜿われおいないようだ
    |
    | - 148 = 128+20 (SIGTSTP) は C-z による䞭断時。
    |   珟圚 isearch の fib には 27 を甚いおいるが、根拠は匱い。
    |   こちらの方が説埗力があるかもしれない。
    |   たた 27 は別の目的でも䜿われるのでなかなか怜玢しにくいずいう問題もある。

    → __default__, __defchar__ の終了ステヌタス 125 に察応した。
    → 䞭断・継続のための終了ステヌタスは 27 から 148 に倉曎した。

    その他の widget に぀いおも終了ステヌタスに぀いお再確認しお、
    党䜓に終了ステヌタスを定矩枈みになるようにした。

2017-10-17

  * 2017-10-14 vi-mode: レゞスタ察応 [#D0542]

    operator 呌び出しの前埌で _ble_edit_kill_{ring,type}
    を入れ替える実装にする事にした。
    これは単に曞き換えお行くだけである。

    * done: call-operator-*wise を改修しお kill_ring, kill_type を
      埩元・保存する様にする。

    * done: 珟圚 operator:* は _ble_keymap_vi_operator_delayed
      を甚いお凊理の継続の情報を呌び出し物に䌝えおいるが、
      これは終了ステヌタスによる方法の方が自然なのではないかず思われる。
      →終了ステヌタス 27 によっお続きを別のずころで凊理するこずを衚す事にした。

    * done: call-operator-*wise の呌び出し元を修正する。

    * done: 以䞋の関数の呌び出し元の修正
      - done: exclusive-goto index flag reg nobell
      - done: inclusive-goto index flag reg nobell
      - done: exclusive-range p q flag reg nobell
      - done: linewise-goto index flag reg opts
      - done: linewise-range p q flag reg opts

    * done: 以䞋の関数は盎接 kill-range/copy-range を呌び出しおいる。

      - done: ble/widget/vi-command/copy-current-line
      - done: ble/widget/vi-command/kill-current-line
        䞊蚘の関数に぀いおは operator 経由で呌び出す様に倉曎した。

      他にもあるず思われる。ず思ったら、他は党お operator y/d/c 経由だった。

    * done: 埌は kill_ring kill_type を盎接觊っおいるコヌド
      vi-command/paste.impl vi_xmap/paste.impl がある。

    * done: operator:* の終了ステヌタスを確定させる。
      特に 27 を返すこずは特別な意味を持぀ので。
      27 を返すもの以倖は 0 を返すように修正した。

    レゞスタぞの远蚘の振る舞い

    "倧文字によっお既存のレゞスタぞ内容を远加できるそうだ。
    しかし v V C-v を混圚させるずどうなるのか。

    C-v に v を远蚘したら C-v だった。
    ただし、v で远蚘した分に぀いおは nfill は蚭定されおいないようである。

    今の実装の問題点

    * resolved: "x を前眮するず実際に倉曎がなかった堎合でも
      レゞスタに kill_ring kill_type の内容が登録されおしたうのでは?
      ず思ったが "x を前眮したずきの内容は事前に "x の内容になっおいるので、
      倉曎がなかった堎合は改めお "x に倀を栌玍しおも以前ず倉わらないので問題ない。

    * resolved: 珟圚は "x を指定したずきにはそのレゞスタだけに倀を蚭定しおいる。
      しかし、vim の動䜜を確認するず無名レゞスタにも同じ倀をコピヌするようである。

      a これに察応するためには、䟋えば䞀぀の方法は
        local _ble_edit_kill_{ring,type} を事前に蚭定せずにそのたた凊理を実行し、
        埌で _ble_edit_kill_{ring,type} の内容をレゞスタにコピヌするずいうもの。
        もし远蚘を指定された堎合には、レゞスタに远蚘した埌で远蚘内容を
        _ble_edit_kill_{ring,type} に曞き戻す。

        この方法の問題点は実際に _ble_edit_kill_{ring,type} が倉曎されたか
        どうかを怜出しなければならないずいうこずである。
        もし "x を蚭定しおも䜕も倉曎がなかった堎合には、
        _ble_edit_kill_{ring,type} の内容をレゞスタにコピヌ・远蚘しおはならない。
        実際に詊しおみたが、やはり、䟋えば "ag~ ではレゞスタに倉曎は起こらない様だ。

        たたこの方法だず operator から芋える _ble_edit_kill_{ring,type} の内容は
        無名レゞスタのそれであっお、ナヌザが "a で指定したレゞスタの内容ではない。
        % (_ble_edit_kill_{ring,type} の内容を倉曎した時は "a に察する倉曎であるにも拘らず。
        % ず思ったが、これは埮劙である。䜕故ならナヌザに䟝る倉曎は "" ず "a の䞡方に適甚されるから)

      b もう䞀぀の方法は、取り敢えず local _ble_edit_kill_{ring,type} は事前に蚭定し、
        それをレゞスタにコピヌ・远蚘した埌で、
        unset _ble_edit_kill_{ring,type} しお本来の kill_ring に倀を戻すずいうものである。
        しかし、この堎合でも kill_ring に倉曎があったかどうかを怜出する必芁がある。

      c やはり䞀番劥圓な方法は実際に .copy-range .kill-range する箇所で
        コピヌ・远蚘などの凊理を行うずいうこずである。

      → c の方針で曞き盎した。operator:* の呌び出しは結局党お
      call-operator 経由で行うこずになったので、曞き換えは簡単である。
      operator 偎でもレゞスタに觊るものは限られおいる。

    Note

    * done: omap では "x は䜿えない。぀たりオペレヌタを入力する前に "x は蚭定しなければならない。
      →nmap ず xmap に個別に '"' を登録するこずにした。

    色々曞き換えたので動䜜確認を行う。

    * done: レゞスタ远蚘に぀いお: (v, V, C-v) x (v, V, C-v) が正しく動䜜するか。
      - v v, v V, v C-v は確認した。
      - V V, V v, V C-v も確認した。
      - C-v v, C-v C-v, C-v V も確認した。

    x resolved: ysiw" の入力途䞭に bell がなる。動䜜は正しい。
      w たで入力したずころでなる。どうも operator:ys で 27 を返すずなるようだ。
      →call-operator-* の戻り倀をチェックしお倱敗したら bell を鳎らすようにしおいた箇所があった。
        27 を返した時には䜕もせずに退出するべきである。その様に曞き換えた。
        他にも call-operator-* を呌び出しおいるが戻り倀に察応しお適切な凊理をしおいないずころが
        幟぀か合ったのでそれも盎した。

    * resolved: これは前からだず思うが行指向の kill_ring を最終行で貌り付けたずき、
      䜙分に改行が挿入されるのは䜕ずかならないのだろうか。
      →これは盎した。たた `[`] で蚭定される範囲も盎した (次の行頭には行かない)。
        䞡倉曎に぀いお確認した。

2017-10-12

  * ble-edit: 耇数行線集時に .SHELL_COMMAND を実行するず、 [#D0541]
    色々ず座暙蚈算がずれおいる。先ず初めに線集䞭の文字列が残っおしたう。
    曎に、.SHELL_COMMAND が出力した内容が䞊曞きされお消えおしたう。

    座暙蚈算は合っおいる。みたずころちゃんずした堎所に移動しおから実行しおいるように芋える。
    ず思ったら分かった。端末の䞀番䞋にいるずきに起こり、端末の䞊の方に煎る時には起こらない。
    ぀たり、描画領域の高さの確保がちゃんずできおいないこずが原因である。
    取り敢えず䞀時的に端末の高さを 0 にするずいうこずが必芁である。

  * vi-mode (visual mode): J gJ [#D0540]

    これは詊しおみた所 block, char かどうかずは関係なく、垞に行指向で凊理するようだ。
    これの察応は簡単だった。

  * vi-mode: (insert) で C-c するず衚瀺は (insert) のたた [#D0539]
    ノヌマルモヌドに戻っおいる気がする。
    よく分からないので、ble.sh では C-c で
    単にノヌマルモヌドに戻るこずにする。

  * `[ `] は挿入モヌド䞭でのカヌ゜ル移動でも途切れるが、 [#D0538]

    % そのようなものにたで察応しおいるず遅くなるず思われるので今は察応しない。

    もしかするず white_list に茉っおいないコマンドで
    dirty-range#clear すれば良いだけかもしれないが。
    いや、移動した埌で䜕も倉曎しないずいうこずも考えられるから、
    end-edit-area, start-edit-area を実行するべきだろうか。

    しかし white_list に含たれるかどうかのチェックには時間がかかるのではないかずいう心配がある。
    珟圚の蚭定では挿入の匕数が蚭定されおいない限りは white_list のチェックは行っおいない。
    `[`] を蚭定するためにこれを利甚するずいうのは、垞に white_list のチェックを行うずいう事に等䟡である。
    self-insert は特に頻繁に通過するだろうから、特別に察凊するずいうのは劥圓である。

    さお、結局 `[`] の挿入モヌドにおける厳密な振る舞いに察応するこずによるオヌバヌヘッドは、
    .before_command における white list チェックのオヌバヌヘッドのこずだず考えられるず分かった。
    珟圚の実装では特に white list の䜿甚は繰り返しが指定されたずきだけにしおいるが、
    実のずころ将来的に undo を実装する際には結局同様にチェックしなければならない気がする。
    結局、white list のチェックを免れられないのであれば、ここで察応する。

  * vi-mode (xmap I): より vim に違い動䜜 [#D0537]

    どうも色々ためすず切り出し䜍眮の決定はそんなに簡単ではないようだ。
    珟状では行を芚えおおいた内容ず比范しお䞀番初めに倉曎の合った点からずしおいるが、
    これはたたたた挿入した文字列が元々合った内容ず䞀臎しおいる堎合に切り出し内容がずれお問題になる。
    vim で詳しく調べおみるず、どうやら I が始たっお以降の倉曎範囲を芚えおいるようである。
    どこから開始点よりも前 (前の行での倉曎も含む) で倉曎があれば (倉曎前ず倉曎埌が同じだったずしおも)、
    切り出し䜍眮は開始点になる。もし倉曎が開始点よりも埌にあれば倉曎はそこからになる。
    さお、倉曎範囲は䜕凊に蚘録されるだろうか。挿入モヌドによる `[`] はどうか。

    - 詊しおみた所 C-o から埩垰した時点で新しい `[ が始たるようである。
      䜆し䜕も入力しない堎合には最終的に抜けるずきに `[ `] は蚭定されない。
      これは通垞通りに入るずきず少し異なる動䜜である。

    - さお、もし I の InsertLeave が `[ `] を䜿甚しおいるのだずすれば、
      途䞭で C-o を挟めば以前の線集に぀いお忘れおその点からの挿入になるはずである。
      →詊しおみた所 C-o をした瞬間に InsertLeave が消去されおしたう。
      因みにこの動䜜は珟圚の ble.sh でも同様である。

    埓っお、`[ `] を甚いお倉曎範囲を決定するこずが可胜である。

    - ず思ったが、vim の動䜜を調べおみるず挿入モヌドの䞭であっおも
      カヌ゜ルキヌなどを甚いお移動したりするずその郜床 `[ `] が蚭定されるようである。
      ぀たり、正しい実装の `[ `] に頌る蚳には行かない。

    - 曎に、珟状の実装では挿入開始点の蚘録に `[ を䜿甚しおいるがこれも正しくない。
      より前に倉曎があったりするず `[ もずれおしたう。
      別の mark を蚭定する必芁がある → これには特別な mark 1 を甚意するこずにした。

    - 矩圢挿入を開始しお以降の "倉曎" を环積しお蚘録するにはどうすればよいか。
      珟状の `[ `] はそれに近いが挿入モヌド開始時に開始点に "倉曎" を蚘録しおしたうのでこれは埮劙に違う。
      曎に将来的に vim ず同じ `[ `] の動䜜にしたずきに、動䜜が倉わっおそれも問題になるだろう。

    結局矩圢挿入モヌドのずきだけ曎新する dirty-range をもう䞀぀甚意するしかないのだろうか。

  * 2017-10-05 vi-mode (visual): p P [#D0536]

    前回 p たたは P 消したものを芚えおいお、それを貌り付けおいる気がする。
    vimindex のペヌゞには曞いおいない。ペヌゞが叀いのかもしれない。
    :help v_P ずするず v_p たたは v_P の説明を芋るこずができる。

    1 help には挿入しおから削陀するず曞かれおいるがこれは嘘だ。

      ABC
      ABC

      に察しお

      e
      e

      を、初めの B 1文字を矩圢遞択しお p するず

      AeC
      AeBC

      ずいう結果になる。これは぀たり遞択範囲 B を削陀しおから e を挿入しおいるこずを意味する。
      カヌ゜ルは最初の e

    2 文字ビゞュアルに矩圢を貌り付けるずどうなるか。

      12345
      67890
      xyzwt

      abcde
      fghij

      これに぀いお C-v b → g を v 2 → 9 に察しお貌り付けるず次のようになる。

      1b0
      xgyzwt

      カヌ゜ルは b
      これも先に削陀しおから貌り付けが起こっおいるこずを瀺唆しおいる。

    3 文字ビゞュアルに改行を貌り付けるずどうなるか。

      ABCDE
      FGHIJ

      の v C → D に行を貌り付けるず以䞋のようになる。

      AB
      12345
      67890
      E
      FGHIJ

    適圓に既存の機胜の組み合わせで実装した。
    テストする。C-v → C-v は確認した。
    䞊蚘のケヌス 1 2 3 は䜕れも再珟した。

    4 V を C-v に貌り付ける堎合

      ABCDE
      FGHIJ

      の C-v B → G に p で貌り付ける堎合。

      ACDE
      FHIJ
      12345
      67890

      曎に P で貌り付ける堎合には前に貌り付けられる。
      珟圚の実装だず以䞋のようになっおしたう。

      A
      12345
      67890
      CDE
      FHIJ

    5 v を C-v に貌り付ける堎合

      A12345CDE
      F12345HIJ

      文字列 12345 を C-v B → G に貌り付ける堎合には、各領域に繰り返し挿入される。

      A45
      678CDE
      FHIJ

      貌り付けられる文字列に改行が含たれる堎合は、繰り返しは行われない。

    これはどう理解したら良いだろう。
    貌り付けられる察象が C-v のずきには特別な察凊が必芁ずいうこずか。

    あずカヌ゜ルの䜍眮に関しおも確認しおおく必芁がある。
    1 ず 2 は合っおいる。3 はカヌ゜ル䜍眮が違うずいうか 行末に来おいる。
    通垞の行指向の p P は行末に来おいない ず思ったが、
    実際に v_p の実装では文字指向の p P を䜿っおいるので、この動䜜は別の問題である。

    結局、3x3 のパタヌンに぀いお個別に paste の仕方を倉えお実行するこずにした。
    色々ず匕数を䞎えた時の動䜜などを芳察するずこの方法で良かったようだ。
    簡単に各堎合の動䜜の確認もした。倧䞈倫。

2017-10-11

  * isearch が動かなくなっおいる。 [#D0535]
    リファクタリングの過皋で条件が反転しおいた。

  * complete: complete -p -D が働いおいない気がするが  → 124 に察応 [#D0534]

    % complete.sh を芋るず察応しおいるように芋えるし、
    % 過去の蚘録を芋おも動いおいた様子がある。

    どうも前から動いおいなかった疑いがある。
    先ず初めに compgen に -D オプションが混入するず゚ラヌになっお、
    そもそも補完関数も呌び出されない。

    さお、無事に補完関数は呌び出されるようになったが、䜕も候補が生成されおいない。
    どうやら __load_completion では定矩をロヌドするだけで候補生成は行わない様だ。
    䞀方で、玠の bash でやるずちゃんず候補が生成できおいる。
    これが意味するずころは玠の bash は、もし候補生成がされなかった堎合は、
    新しく远加された定矩を甚いお再床候補生成を行うずいうこずである。

    䜕ず。マニュアルに曞かれおいた。
    -D による補完関数が 124 を返したずき、
    再床補完が詊みられるのだず。察応した。

    * git 補完関数の末尟空癜の問題

      | * 2015-11-23 プログラム補完: 末尟空癜の問題点
      |
      |   珟圚 git 補完関数に合わせる圢で勝手に末尟の空癜を陀去しおいる。
      |   しかしこれで良いのか? これだず空癜で終わるファむル名などがあった堎合に問題になる。
      |   (その様なファむル名は滅倚にないずは思われるが 。)

      % git の補完関数は倉なこずをする。候補の末尟に空癜を付加し compopt -o nospace を指定する。
      % ble.sh の complete は末尟の空癜を゚スケヌプする仕様になっおいる。
      % これは compgen -A file の空癜を含むファむルずの䞀貫性のためである。
      % 埓っお git の補完関数の堎合には sed で末端の [[:space:]]+ を陀去する必芁がある。

      git の時にだけ work around を远加しようず思ったが、
      どうやら bash-completion は䞀般にそのような蚭蚈になっおいる疑いがある。
      分からないので取り敢えず珟圚の仕様を保持するこずにする。
      ず思ったが、やはり末端に空癜のあるファむル名を補完するずきに問題になる。

      うヌん。やはり git だけ特別扱いするこずにする。

    そういえば、やはり git は以前問題になったのだから、
    以前は complete -D が動いおいたずいう事になる。
    恐らく bash の version によっお compgen に -D があった時に
    ゚ラヌになるかどうかが違うずいうこずなのだろう。

    * しかし、䞍思議なのは玠の bash ではこの問題が発生しおいないずいうこずである。
      ぀たりファむル名の末尟の空癜はちゃんず゚スケヌプされるが、
      git subcommand の末尟の空癜ぱスケヌプされないずいうようになっおいる。

      もしかしお git の補完関数はファむル名を補完しおいるずきには
      nospace を指定せずに末尟空癜も付加せずに候補を生成するのではないかずいう説を思い぀いた。
      ぀たり nospace は末尟空癜を゚スケヌプしないずいうサむンになっおいるのではないかずいう説である。
      しかし詊しおみるず、垞に nospace を指定しおいる。

      うヌん。しかし /usr/share/bash-completion/completions/git に
      compopt -o filenames +o nospace ずいう行がある。この行が実行されおいるずきには、
      ファむル名末尟の空癜がちゃんず゚スケヌプされるようになるずいうこずではあるたいか。
      そしお自前のシェル関数の compopt は実行されないずいうこずなのではないだろうか。

      そう思っお適圓なコマンドを䜜っお詊しおみた所、
      ちゃんず自前のシェル関数が呌び出されるずいうこずが分かった。

        function _alpha { compopt +o nospace; }
        function alpha { echo "$@"; }
        complete -F _alpha alpha
        alpha hello.txt

      ずいうこずはやはり git の補完では実際には compopt は呌び出されおいないのだろう。
      やはり玠の bash で正しく動䜜できおいる理由が䞍明である。

      曎に玠の bash の補完の振る舞いに぀いおも調べおみたが、

        function _alpha { compopt -o nospace; local w=${COMP_WORDS[COMP_CWORD]}; for a in hello world 'abc efg'; do [[ $a == "$w"* ]] && COMPREPLY=("$a "); done; }
        function _alpha { compopt +o nospace; local w=${COMP_WORDS[COMP_CWORD]}; for a in hello world 'abc efg'; do [[ $a == "$w"* ]] && COMPREPLY=("$a "); done; }

      特に -o nospace / +o nospace で゚スケヌプをしたりしなかったりずいう事はないようだ。
      ずいうか、基本的に補完関数によっお生成された候補ぱスケヌプしないようである。

      ずいうこずはスペヌスを含むファむル名を補完した時に゚スケヌプしおいるのは誰なのかずいう謎が生じる。
      実のずころ、bash は盎接 compgen を呌んでいるのではなくお、
      内郚的な凊理の䞀環ずしおファむル名を候補に生成しおいるので、
      それがファむル名による候補かどうかを知っおいお、
      その内郚的にしか知り埗ない情報を甚いお゚スケヌプするかしないかを決めおいる可胜性がある。

      % 面倒なのでここたでにしお深入りしない事にする。

      ず思っお ble.sh でやっおみたらい぀の間にかに正しく動くようになっおいる。
      ぀たり __git* の生成するものに぀いおぱスケヌプせず、
      ファむル名候補の堎合にぱスケヌプする。
      どうやら git はサブコマンドしか候補を生成しない様だ。
      そしお䞀臎するものが芋぀からない堎合には自前でファむル名候補を生成するなどのこずはしない。
      これによっお ble.sh の通垞のファむル名候補にフォヌルバックする。
      結果ずしおファむル名候補の堎合には正しく゚スケヌプされるずいう動䜜になる。

      取り敢えず OK ずいうこずにする。

  * 2017-10-10 vi-mode (mark): < > ` ' " . などの蚭定をそれぞれ実装する必芁がある。 [#D0533]

    - done: [] は盎前の倉曎たたは yank 範囲 → #D0529
    - done: <> は前回のビゞュアルモヌドの遞択範囲 → #D0531 で同時に察応
    - `' は最埌のゞャンプ前の䜍眮

      ゞャンプには以䞋の皮類がある。
      - done: 新芏ファむル䜜成 → これは新しい行のロヌドず解釈しお良いだろう
      - done: `x 'x / ? n N L H % G (last-line)
      - 保留: M ( ) [[ ]] { } :s :tag これらのコマンドはそもそも未察応 → #M0006 に蚘録

      どうやらオペレヌタによっお移動する堎合にはゞャンプ元の蚭定は行われない様だ。

    - done: " は最埌の終了時の䜍眮
      これはシェルにおいおは履歎項目を移動する盎前の䜍眮ずするので良いだろう。
      しかしどのタむミングで蚘録するのが良いだろうか。

      a 䞀぀の方法は _ble_edit_str.reset を通しお呌び出される
        update-dirty-range の hook でそれを怜出しお実行するこずである。
        ず思ったが、その呌出のタむミングでは既に元の文字列が倱われおいる可胜性がある
        (確認しおみたら reset のずきはそうではないず分かったがこの仮定に䟝存するこずは危険である)
        ので、もっず他の方法があるず良い。

      b 或いは、ble-edit 偎で history を移動する、もしくは、
        新しい行に移動するずきの hook ずいうのを甚意するずいう手がある。

    - done: . は最埌の線集䜍眮
    - done: 珟圚 `[ `] は yank の効果を入れおいない。
      yank (copy-range もしくは block copy) があった時にも曎新するように蚭定すべき。
      実のずころコピヌをしおいるのは .copy-range を呌び出しおいる箇所か、
      或いは operator:y のみである。他の操䜜は党おは快適倉曎を䌎うので自動的に登録されおいる。
      察応した。

  * vi-mode (visual block): 元から行末にいる時に $ を抌しおも末尟拡匵が衚瀺に反映されない。 [#D0532]
    内郚的にはちゃんずできおいるはずだが、描画郚に状態倉化が䌝わらないので、
    衚瀺が曎新されないのが問題である。これに察応するためには、
    末尟拡匵も _ble_edit_mark_active を䜿っお衚珟するしかない?

    その堎合には埓来の _ble_edit_mark_active を参照しおいる箇所も曞き換える必芁がある。

    →その様に修正した。元々䜿っおいた _ble_keymap_vi_xmap_eol_extended ずいう倉数は廃止した
    ble/widget/vi_xmap/linewise-operator.impl の蟺りで保存される矩圢の皮類に぀いおも修正した。

  * 2017-10-08 vi-mode (visual): I A [#D0531]

    振る舞いを調べる。先ずは I に぀いお。

    | - 矩圢ビゞュアルのずきだけしか特別な動䜜はしない。
    |   行ビゞュアルでもコピヌは起こらない。
    |
    | - 先ず途䞭でカヌ゜ルを䞭で移動しおも倧䞈倫。
    |   これは匕数による繰り返しずは振る舞いが異なる。
    |   曎に䞭で動かすのではなくお䞀回倖に出お戻っおきおも OK
    |
    |   - 別の行を匄っお戻っおきおも倧䞈倫。
    |     行の数が倉化するず駄目。行を挿入しお削陀しお合蚈で倉わらなければ OK。
    |     ず思ったが範囲よりも埌に行を远加しおも倧䞈倫。
    |
    |   - ずいうか同じ行の前埌もいじっおも倧䞈倫?
    |
    |   - 同じ行の前を幅が倉わらないように匄るずベルが鳎っお行頭に移動する。
    |     幅が倉わっおも䜕か動く。開始点はずれる前の䜍眮で決たり、終了点は最埌に挿入した文字列になる。
    |     重芁な結果。
    |
    |     | AAABBB -> AAA123BBBaaa -> AAA123BBBaaa
    |     | AAABBB    AAABBB          AAA123helBBB
    |     | AAABBB    AAABBB          AAA123helBBB
    |
    |     どうやら行内の%%文字数%%幅を数えお増分を蚈算しおいるようだ。
    |
    |   - 抜けるずきに、挿入文字列の途䞭にいおも倧䞈倫。䜆し、倖にいるず駄目。
    |
    |   - 行の数が倉化するず駄目だったが、
    |     もし行番号だけを芋おいおカヌ゜ルが同じ番号の行にいれば動くずいうこずだず、
    |     行の数が倉化した分だけカヌ゜ルの䜍眮をずらしお元々別の行だった所で挿入モヌドを抜ければ、
    |     同様に働くのではないかず考えた。が、詊したら動かなかった。
    |     やはり vim では行は远跡されおいる気がする (mark の振る舞いを芋るず)。
    |
    | - 途䞭で改行を入れるず動かない。I でも A でも。
    |   前に䞀回動いた(遞択領域のかかっおいる行たちの次の行に新しい内容が挿入されるような動き)
    |   ような気がしたけれどなんだったのだろう。
    |   しかし実際にそのような動䜜が起こる堎合があるずしおも分かりにくいので取り敢えず実装しない。
    |   ずいうわけでこの振る舞いに関しおは取り敢えずは考えないこずにする。
    |
    | - I に察する匕数に䟝る繰り返しが適甚されおから、
    |   他の境界に察するコピヌが起こる。

    この時点での仮説では I は以䞋のように動く

    1 矩圢範囲の先頭行の行番号ず衚瀺暪幅ず矩圢の巊端の䜍眮を蚘録する。
      曎にその行自䜓も芚えおおく。
    2 挿入モヌドから抜けるずきの凊理ずしお次に続くものを登録する。
      挿入モヌドから抜けるずきは先に匕数による繰り返しを実行する。
      これは匕数による繰り返しがない堎合や、匕数に䟝る繰り返しが無効になった時も含む。
    3 カヌ゜ルのある行が 1 で蚘録したものず䞀緒でなければキャンセル。
      カヌ゜ルのある行の行番号が 1 で蚘録したものず䞀緒でなければキャンセル。
    4 衚瀺暪幅の倉化量を枬る。これが正でなければキャンセル。
      倉化量の分だけ 1 で蚘録した巊端の䜍眮から文字列を切り出す。
    5 その時点での続く行の、蚘録した巊䜍眮に 4 の文字列を挿入する。
      新しく行が挿入されおいたりしおも関係なく、
      その時点での先頭行からの盞察䜍眮で挿入行が決たる。

    | 矩圢範囲の先頭行を芚えおおくのには ble.sh の実装では _ble_edit_mark でも䜿えば良い?
    | ただ挿入モヌドの操䜜の途䞭で _ble_edit_mark が曞き換えられるこずもあるので別に甚意するべき
    |
    | ? 途䞭で行分割が起こった堎合は 1 で蚘録した行はどうするのか。
    |   たた分割された行に察しお挿入が行われたりするのだろうか。
    |
    |   →詊すず行頭に玐付いおいる気がする。たた分割された行に察しお挿入が行われる。
    |   うヌん。行分割した䞊で矩圢巊䜍眮の内容を元ず同じにすれば動くが、
    |   行分割した䞊で矩圢巊䜍眮よりも前の内容が異なるず起動しない?
    |   これは行分割を行わなかった堎合ず様子が異なる。
    |
    |   うヌん。よく分からないのでこれに぀いおは無芖でも良い気がしおきた。
    |   行分割を行わなかった堎合ず同じ凊理にすれば良い。
    |
    | ? 詊すず 以䞋で C の列で C-v I しお、G の埌に平仮名を入れお、
    |   それから抜けるず以䞋のようになる。行の内容を蚘録しおおいお、
    |   䞀番初めに倉曎のあった䜍眮を怜出しおいるのか?
    |
    |   | ABCDEFGH -> ABCDEFGあH
    |   | ABCDEFGH    ABCDEFGあH
    |   | ABCDEFGH    ABCDEFGあH
    |
    |   うヌん。しかし、矩圢巊䜍眮より前で倉曎が起こるず、
    |   矩圢巊䜍眮からのコピヌになる。
    |
    | - 䞭途半端に党角文字に被っおいるずき、
    |   党角文字の前で挿入が開始される。
    |   コピヌは矩圢範囲内に入った文字列だけ行われる。
    |
    |   挿入した文字列に含たれる党角文字が、
    |   元の矩圢の巊端に䞭途半端に被っおいるずきは、
    |   その党角文字党䜓がコピヌの察象になる。
    |   コピヌの終端がそれに応じお移動するずいうこずはない。
    |
    |   挿入した文字列に含たれる党角文字が、
    |   元の矩圢の右端に䞭途半端に被っおいるずきは、
    |   䜕か文字が分解されお倉なこずになる。
    |
    |   | echo hello world
    |   | echo hello world
    |   | echo hello world
    |
    |   | echoあい hello wld
    |   | echo あ<e3><81>hello world
    |   | echo あ<e3><81>hello world
    |
    |   コピヌ先に党角文字が鎮座しおいるずきの振る舞いはどうか。
    |   →その党角文字の手前に挿入される。
    |   党角文字が鎮座しおいないその他の行に぀いおは圱響はない。

    以䞊のこずから手順に以䞋の倉曎を加える。

    1a 行の内容も蚘録する
    4a 行の内容を比范しお䞀番初めに倉曎の合った点を求める。
      この点が矩圢巊端より巊にあれば矩圢巊端を切り出しの開始点ずする。
      もしこの点が矩圢巊端より右にあればこの点を切り出しの開始点ずする。
    4b 切り出し範囲に被る党角文字があればその党角文字も取り蟌む。
    5a コピヌ先に党角文字が鎮座しおいるずきには、
      その党角文字の前に挿入する。
      タブが鎮座しおいるずきにはタブは空癜に倉換する。

    䞊の手順の 5a での挿入は p による挿入ず同じ気がする。
    ず思ったが p の堎合には党角文字の前に空癜を挿入しお䜍眮を調敎しおから
    挿入するのであった。぀たり、埮劙に振る舞いは異なる。

    % 実装するずするず先に set-mark を統䞀的に実装しおおく必芁がある。
    % 1 の開始䜍眮を芚えおおくのに䜿うのは `[ が良いず考えおいたが、
    % 実は `< の方が適切なのでは? ず思ったが I ではそれで良いが A だず駄目なので、
    % このたたで良い。

    - 因みに末尟拡匵の状態で A をしおそれから実行するずちゃんずそれぞれの行末に远蚘される。
      空癜が挿入されお桁が合わせられるなどのこずは起こらない。
    - たた、挟たれた行で短い行があった堎合には (末尟拡匵でないずき)、
      ちゃんず空癜が挿入されお桁が合わせられる。

    取り敢えず実装した。取り敢えず動く。

  * vi-mode: dd を続けお行うず "bash: index: substring expression < 0" ずいう゚ラヌが出る [#D0530]
    これは ble/keymap:vi/mark/end-edit の䞭の条件匏を間違えおいた。

  * vi-mode (mark): `[ `] [#D0529]

    盎前の倉曎範囲たたは yank 範囲ず help には曞かれおいる。動䜜を調べる。

    - 挿入モヌドの範囲も登録される。
    - 実際に䜕も入力しなかった堎合でも登録される
    - C-o するず `[ は既に蚭定されおいるず分かる。
      2回目の C-o でも同じ点のようなので C-o によっお挿入モヌドの範囲が途切れたりはしない。
      䞀方で、`] に関しおは C-o する床に新しく蚭定し盎されおいる気がする。
      ず思ったが、1回目の2回目の C-o の間に䜕も入力しなければ `] は最初の C-o ず同じになる。
      ぀たり、`] は C-o の床に蚭定されるのではなくお文字が挿入される床に毎回蚭定されおいるず考えるべきだろう。
      䞀方でその実装は効率が悪いように思われるので、ble.sh の実装では C-o の瞬間に実行するこずにする。
      振る舞いが倚少異なるこずになるが、これに぀いおは䜕凊かに説明を曞いおおくこずにすれば良い。

    取り敢えず operator 呌び出しの箇所ず、挿入モヌドに入る、たたは出る箇所での `[ `] の蚭定は曞いた。

    - done: x s X delete Y S D C p P J gJ r gr でも set する必芁がある気がする。芁確認
      ビゞュアルモヌドの各挔算子も同様である。他にもバッファ内容に倉曎を霎すコマンドは党お察象である。

      これは _ble_edit_str/.replace-range 及び _ble_edit_str/.delete-range を党お確認しお察応した。
      _ble_edit_str.{reset,replace} は盎接は觊っおいない。
      実のずころ殆どの操䜜は operator の䞭で行っおいるので、倉曎点はそれほどなかった。

      - rx grx に関しおは ble/widget/self-insert を介しお挿入を行っおいたので、
        これは気づきにくかった。他に self-insert を介しお nmap から倉曎を行うものはなかった。
      - Y S D C の内、ble/widget/vi-command/kill-current-line これも芋萜ずしおいた。盎した。
      - x s X delete の類はオペレヌタを介しお操䜜しおいるので察策は必芁ない。
      - p P J gJ は既に盎した。

    - done: operator で beg の曎新はしおいるが end の曎新はしおいないずいう堎合があるかも。芁確認

      ずいうか、そもそも䞭身を曞き換えたりするず end は意味を成さなくなっおいるのではないだろうか。

      a 䞀぀の手は operator を呌び出す前に beg - end を蚭定しおしたうずいうものである。
        この時の問題点は2぀ある。

        x 先ず領域拡匵を行っお倉曎した堎合に end が beg に萜ちおしたうずいうこず。
        x もう䞀぀の問題は end が末端ではなく最埌の文字を指しおいるこずにより、
        䞭身に察しお倉曎を行った堎合やはり end が beg に萜ちおしたうずいうこずである。

        だずするず各 operator に察しお end を正確に蚈算しおもらうずいう手しかない。

        x 曎に詊しおみお気付いたこずは operator 操䜜埌のカヌ゜ル䜍眮ず、
        operator による倉曎䜍眮は必ずしも䞀臎しないずいうこずである。
        䟋えば矩圢遞択で先頭に党角文字が跚っおいる状態で d で削陀するず、
        党角文字は空癜に眮き換えられおカヌ゜ルは残った空癜の埌に配眮される。
        䞀方で `[ による倉曎開始䜍眮は空癜の前に蚭眮される。
        実は、既に beg は倉換埌のカヌ゜ルの䜍眮を指瀺するために䜿甚しおいる。
        ずいうこずは、倉曎範囲を調べるためには別の方法が必芁になる。

      b 或いは、倉曎操䜜の開始前に空の dirty range を甚意しお、
        埌は shift-by-dirty-range においお、その dirty range も䞀緒に曎新する。
        曎に倉曎操䜜の終了時にその dirty range を元にしお mark を蚭定する。

        この方法を甚いれば end が beg に萜ちおしたう問題も発生しない。
        各 operator で操䜜を指定する必芁もない。

        効率的には䞍満な点もあるかもしれないが、耇雑さの床合いから蚀っお劥圓に思われる。
        或いはもっず良い効率的な方法が芋぀かればその方法でも良いが 。

      結局 b の方法で再床実装し盎すこずにする。

  * vi-mode 匕数を指定した挿入モヌドを抜けた時の動きが倉だ。 [#D0528]

    先ず初めに繰り返し回数を正しく反映できおいない。
    次にカヌ゜ル䜍眮が正しくない。
    特に、次のコマンドでカヌ゜ルが倉な動きをする。

    →decompose-meta で分解される前の M-h が蚘録されおいた。これは駄目だ。盎した。

2017-10-10

  * 2017-09-08 vi-mode: gi [#D0527]

    倉数 _ble_keymap_vi_insert_mark だけ甚意した。

    これは本来は mark を実装しおから考えるべきである → #D0526

    次に `^ の蚭定を実装する。

    - 先ず繰り返しを行っおいる堎合には繰り返しを行ったあずの䜍眮が蚘録される。
    - C-c で䞭止をした堎合でも蚘録される。
    - C-o で入ったずきは珟圚地に移動するだけである。぀たり、C-o に入る瞬間に蚘録される。
    - 未だ `^ が蚭定されおいないずきは gi はその堎で挿入モヌドになる。

  * vi-mode: mark 実装 [#D0526]

    vim で mark に぀いお振る舞いを確認した所、
    行ず列をそれぞれ芚えおいるようだ。
    文字の挿入・削陀を行っおも列の修正は行われない。
    行の挿入・削陀を行うずそれに応じお行は修正される。
    行が削陀されるず mark も消滅する。

    この振る舞いを厳密に再珟する必芁があるかは分からない。
    もし厳密に再珟するずなるず .kill-range / .delete-range に介入しお、
    既存の mark に぀いお毎回耇雑な蚈算を実行する必芁があるずいうこずになる。

    たた mA ず ma の振る舞いの違い (履歎項目ごずのマヌクかグロヌバルなマヌクか)
    の実装に぀いおも考える必芁がある。履歎項目ごずのマヌクの堎合には、
    履歎項目を移動する毎に保存・埩元をするかあるいは履歎番号に玐付いた蚘録の方法を採甚しなければならない。

    a 毎回保存・埩元をするずなるず色々問題がある。
      先ず初めにどのタむミングで保存・埩元を行うかである。

      history/goto で保存・埩元を行うずするず䜕らかの hook の機構を甚意するか、
      保存・埩元の察象ずなる倉数のリストを倖郚から指定できるようにする必芁がある。
      しかし、䜕れにしおもこれは遅そうである。

      よく考えおみれば mark に觊る機䌚ずいうのは少ないのだから、
      いざ蚘録たたは読み出しを行おうずした段階で、
      珟圚の履歎項目に察応するものをロヌドするようにすれば良い。

    b 履歎番号に玐付いた蚘録の方法の堎合には蚘録に䜿甚する文字を制限すれば (Unicode は䜿わず ASCII に制限すれば)、
      "256 * 履歎番号 + 文字" のような感じの index で配列に蚘録すれば良い。
      実際に vim で詊しおみるず "mあ" などぱラヌ (bell) になる。

      マヌクを倧量に蚭定するず配列アクセスが遅くなっおしたうが、
      そんなに倧量のマヌクを蚭定するこずもないだろうからこれは気にしなくおも良い。
      或いは凊理の時間が気になるのであれば
      bash-4.0 以䞊では連想配列を甚いるように実装を切り替えおも良い。

    これは b の実装の方が良いだろう。

      根拠は先ず単玔であるこず。
      たた a が珟実的であるこずは履歎項目に察するアクセスが少ないずいうこずに立脚しおいるが、
      もしそうならば b も同様にアクセスが少なければ問題にならない。
      a が b よりも効率的になるのは或る特定の履歎項目に察しお連続で mark を倧量に呌び出す
      ずいうような堎合しか無いがそのような状況は考えにくい。

    mark ずしお䜿える物にはどの様なものがあるか確認しおおく。

      global A-Z    m で蚭定可胜
      local a-z     m で蚭定可胜
      local 0-9     .viminfo で蚭定する?
                    最埌に蚪れたずきのカヌ゜ル䜍眮ず思えば良さそう。
      local [ ]     m で蚭定可胜。最埌に yank した範囲
      local < >     m で蚭定可胜。最埌にビゞュアルモヌドで遞択した範囲
      local ' `     m で蚭定可胜。最埌のゞャンプ前の䜍眮
                    ゞャンプリストず関係。
      local "       最埌のバッファ内の䜍眮。
      local ^       最埌に挿入モヌドを終了した䜍眮
      local .       最埌に倉曎された䜍眮

    これらの文字の分垃には䞀貫性はない。
    栌玍する時のむンデックスはそもそも密にする意味もないので
    128 (もしくは G0 の 96) をフルに䜿っおよいのではないかずいう気がする。

    取り敢えず mark は実装した。

    * resolved: 問題点: 珟圚の実装では history を load せずに幟぀かコマンドを実行しお行った時に問題が生じる。

      LINENO を蚘録するなどしお察凊するべきなのではないか。
      䜆し、LINENO が増えたからず蚀っお history にそれらが登録されおいるずは限らない。
      ずいうこずは未だ load しおいない時の、history に登録したカりントを ble-edit の方で蚘録するべきではないか。

      うヌん。調べおみるず HISTCONTROL が蚭定されおいない時には、
      _ble_edit_history_count をむンクリメントしおいるが、
      HISTCONTROL が蚭定されおいるずきには ignoredups などによっお、
      history を実行しおも実際には登録されない可胜性があるずいうこずで、
      _ble_edit_history_count はクリアしおいる。

      history を調べおみるず最新の番号は history 1 で取埗するこずができる。
      これを呌び出すのはそんなに倧倉ではないので、実のずころ、
      これを呌び出しお番号を取埗しおも良いのではないかずいう気がする。
      ず思ったら、既に存圚する ble-edit/history/getindex ずいう関数ではこれをやっおいる。

      1 done: 先ず、ble-edit/history/getcount 及び ble-edit/history/add を倉曎しお、
        毎回 history 1 を実行するのではなくお倉曎の可胜性のある操䜜をしたずきに history 1 を実行するようにする。

        ず思っおよく芋たらそのような実装になっおいる。
        寧ろ倉曎があった時にキャッシュをクリアし、そしお getcount における遅延評䟡になっおいる。
        寧ろ珟状の実装の方が優れおいた。1点、ble/util/assign を利甚するように倉曎はした。

      2 done: ble-edit/history/getindex で埗られる倀を䜿甚しお、
        _ble_keymap_vi_mark_local_history を曎新するように再実装する。

      ずいう具合にすれば良い。察応した。
      しかし実際に動かすず history/goto の䞭で呌び出しおいる
      _ble_edit_str.reset で shift が発生しおしたいずれおしたう。
      history/goto における reset では shift が起きない様にするにはどうしたら良いか。

      䌌たような問題ずしお第2のプロンプトに移行する時の reset があった。
      これに぀いおは keymap が vi_cmap である時には shift を行わないずいう方法で察凊した。
      しかしながらもっず本質的な解決方法があるのではないかずいう気がする。

      取り敢えず暫定的な方法を考える。

      a 䞀぀の方法は FUNCNAME 蟺りを芋お ble/history/goto がなければ良しずする方法である。
        しかしこの方法は ble/history/goto の関数名が倉曎されるず䜿えなくなる。
        ずはいい぀぀関数名を倉曎する時には眮換を行うだろうから、
        この関数名が倉曎されおも問題はないように思う。

      b もう䞀぀の方法は ble/history/goto の䞭で定矩されおいる倉数名ずしお特城的なものを䜿い、
        それが定矩されおいる堎合には shift を行わないずいうようにする。
        或いは、敢えおそのための倉数名を ble/history/goto で定矩するずいう手もある。

      c 或いは _ble_edit_str.reset 関数に、倉曎の理由を匕数で枡すようにしお、
        その理由を曎に observer に䌝達するずいう手もある。
        この方法が最も劥圓な方法であるように思われる。

      䞊蚘 c の方法を甚いお実装するこずにした。
      以前の vi_cmap かどうかの刀定も枡された匕数で刀定する様に修正した。
      この方法で実装した所初め動いおいない様な気がしたが、
      改めお詊しおみるず動くようになった。䜕故かは分からないが叀いもので詊しおいたのかもしれない。

    * resolved: 問題点: 曞いおみたけれどやはりこれは遅いような気がする。

      特に . < > [ ] などは垞に蚘録されおいくので䜿い続けお行く皋に
      _ble_keymap_vi_mark_local は肥倧化しおいき、
      文字を入力する床に党おスキャンするこずになるので、重くなっおいく。

      埓っお _ble_keymap_vi_mark_local は垞に「珟圚の履歎項目」の情報を保持するようにしお、
      曎に、履歎項目を切り替える際に _ble_keymap_vi_mark_local を
      _ble_keymap_vi_mark_local_history に退避するなどの凊眮が必芁になる。

      曎に蚀うず各芁玠を line:bytes ずしおいるので、
      これを分解する為の操䜜も銬鹿にはならない気がする。
      別の配列にしお管理するずいう手も考えられるがそうするず bash の実装のせいで遅くなる。
      䞀぀の配列の偶数番目ず奇数番目でそれぞれ情報を栌玍するずいう手も考えられる。
      しかし、基本的には疎な配列なのでそれも分かりにくい。

      →これは䞊蚘問題点の解決ず同時に再実装した。

2017-10-09

  * bash-3.0 local -a arr=() 察策 [#D0525]

    bash-3.0 で local -a arr=() を䜿うず芁玠の単語分割がクォヌト陀去よりも埌で実行されるようだ。
    調べおみるず今の所は芁玠に空癜を含むような堎合に䜿っおいないので問題になっおいないようだが、
    これに぀いおは適宜別の圢匏に曞き換えるなどしお、この曞き方自䜓を远攟するのが安党である。

    - ble.sh/check に远加した。
      実のずころ、この check 甚コマンドを詳现に指定すれば
      local -a name=(...) が䜿える箇所は増えるのであるが、
      耇雑な芏則になっおいるず人間の偎が間違える可胜性が倧きくなるので、
      やはり䞀埋に犁止する方が懞呜であるず思われる。

    - ず思ったがやはり local -a arr=() を䜿えないのは蟛いので、
      check の条件を詳しくするこずで、特定の local -a arr=() に぀いおはそのたた䜿えるようにした。

  * vi-mode (visual block): < > [#D0524]
    振る舞いが違う→実装した。

  * vi-mode: indent の幅を蚭定できるようにするべきなのでは。 [#D0523]

    8 は倧きすぎるので既定で 4 にしお、自分で 2 に指定するなど。
    ずいうかこれは vi-mode 特有の蚭定ずいうよりは党䜓の蚭定でもある気がする。
    党䜓の蚭定に远加するこずにする。
    bleopt_shell_indent などの倉数名が良いだろうか。

    倉曎察象は vi.sh 及び vim-surround.sh の indent 関係の所にある。
    →察応した。

  * vim-surround.sh: xmap S, gS [#D0522]

    S ず gS の振る舞いを調べるず、S は v, C-v に察しおは ys ず同様に働き、
    V に察しおは yS ず同様に働くようだ。

    %%gS はその振る舞い (ys vs yS) を反転させた物になる。%%
    surround.vim を簡単に芋おそう刀断したが実際に読んでみるず分からない。
    :help surround を芋おみるず vgS は vS ず同じで、VgS は VS のむンデントを行わない版で、
    <C-v>gS は末尟拡匵した領域に察しお囲みを適甚するずいうこずの様だ。
    <C-v>gS は Vim script からは末尟拡匵かどうかが分からないために必芁ず曞かれおいるが、
    実は ble.sh vi-mode の枠組みでは自然にこれは察応できおしたうので
    敢えおその様に動䜜させる必芁はなかったりする気がする。
    それでもその様に察応するこずにする。

    その為には先ず yS に察応しなければならない。yS は行指向の動䜜である。
    囲たれる文字列の前埌に改行を挿入しおむンデントするずいう動䜜の様だ。
    因みに空癜を指定するず <left><LF><SP><indent>content<LF><SP><indent><right> ずいう感じになる。
    むンデントがある堎合には空癜を前埌に眮かないのが自然なのではないかず思う。

    実装した。チェックする。

    yS は動いおいる。ySS も動いおいる。xmap S も動いおいる。xmap gS も動いおいる。
    䜆し、䜕れに぀いおも再むンデントには察応しおいない。

    序に cS も実装したらどうか。調べおみるず cs ず殆ど同じで挿入するものが異なるだけだそうだ。
    これは簡単に実装できるず思う。実装した。

  * vi-mode: bug: g? を set-operator rot13 にしおいたが、 [#D0521]
    これは数字が入っおいるので䜿えないのでは?
    →実際にやっおみたら䜿えなくなっおいた。修正する必芁がある。

    ずいうか、これを機に _ble_edit_arg に党お入れるのを止めた方が良い気がする。
    set-operator も operator 蟺りに改名する。
    _ble_edit_arg の圢匏で堎合分けをしおいるが、これは kmap を以お堎合分けするのが良い。
    たた、本圓に omap の時にしか _ble_edit_arg が存圚しないのか確認する必芁がある。

    →オペレヌタの蚘録の方法を䜜り盎した。
      元々今の仕組みはオペレヌタの枠組みの党䜓を知らずに適圓に䜜った物を隙し隙し䜿っおいた物だった。
      今ずなっおは䞀぀の倉数で党おを蚘録するのは蟛いし、
      たた _ble_edit_arg の圢匏が本䜓の ble/widget/ の想定するものず異なる点も良くない。
      _ble_edit_arg は空か数かのどちらかでないず郜合が悪いのだ。
      䜜り盎した。䜙り倧きな倉曎もなく䜜り盎すこずができた。

  * vi-mode (normal mode): C-d で抜けおも良いのでは。 [#D0520]

    そもそも vim では C-d は䜕に割り圓おられおいたのだったろうか。
    →スクロヌル甚のコマンドの様だ。これは滅倚に䜿わないので、
    zsh ず同様に C-d でシェルを抜けるようにしおも良いように思われる。

    ず思ったが、よく考えたら空文字列の時にはそもそもスクロヌルもしようず思わないだろうから、
    空文字列の時に限り抜けるようにしお、それ以倖の時にはスクロヌルずいう様にするこずも可胜のはずである。

  * magic-space: 珟状の実装では空癜を入れおから展開しおいるが、 [#D0519]
    :s/ などが終端しおいない状態でこれを実行するず空癜が䜙分に぀いおしたう。
    →修正した。曎に dirty-range も最小限になるように修正した。

  * vi-mode (insert): @norepeat [#D0518]

    実は norepeat でないコマンドは数える皋しかないのだから、
    それ以倖党おで norepeat を実行するように __before_command__ に曞くほうが懞呜なのでは。

    実装した。動いおいる。これにより @norepeat は改名察象ではなくお削陀察象になった。
    master ぞ merge する盎前に適甚するこずにする。

  * vi-mode (cmap): / ? n N [#D0517]

    * C-c で抜けおも実行されおしたう。キャンセルするべき。
      →これは単にバグだった。盎した。

    䜕もないずきに DEL を抌したずきもキャンセルにする?
    これは詊しおみるず / や ? ではキャンセルになるが、
    surround.vim の < ではキャンセルにならない。
    実装によるずいうこずである。
    だずするず、(surround.vim で > を打぀ず終わりになるこずを含めお、)
    cmap のキヌマップに介入できるようにする仕組みを敎えたい。

    䟋えば cmap/__before_command__ で倖郚関数を呌び出すようにしお、
    その倖郚関数の名前を登録できるようにしおおく。
    __before_command__ で奜きに凊理をしお、
    もし元から蚭定された動䜜をキャンセルするずきには、
    COMMAND= ずしおしたえば良い (ble-decode.sh の偎で次に実行する widget は COMMAND に入れおいる)。
    ずいうかこれは WIDGET に名称を倉曎した方が良い気がする。
    ず思ったが、-cf で通垞のコマンドを呌び出すずきにもこれは䜿っおいる
    曎に、widget を呌び出すずきも zsh の所謂 widget ではなくお、前に ble/widget/ の prefix が぀いおいる。
    やはり COMMAND で良いような気もする。ず思ったが、COMMAND は他の甚途にも䜿われるので、
    埌で䞀括で眮換したいずきなどに䞍䟿である → ず思ったが COMMAND ずいう倉数はこの甚途でしか䜿っおいなかった。

    - 取り敢えず COMMAND はそのたた。__before_command__ で COMMAND= を実行するこずでキャンセルできる。
    - シェル倉数 _ble_keymap_vi_cmap_before_command で async-commandline-mode で呌び出される cmap に介入できるようにした。
    - vim-surround.sh のタグ名入力で > で確定するように修正
    - search / ? で、空文字列で  DEL or C-h するこずでキャンセルするように修正
    - 序に ble-bind -L で . を含む関数名を衚瀺しないように修正


2017-10-07

  * 2017-10-01 vi-mode (visual mode): r s C S R x D X Y p J U u I A ^] [#D0516]

    done: J gJ → これは別項目 #D0540 で凊理
    done: u U r s C S R X D x Y
    done: I A #D0531
    done: p P #D0536
    保留: ^] これは䜕凊で芋たものか䜕故か曞かれおいたが実際察応しなくお良い。
      b4b4r07/zsh-vimode-visual で芋たかず思ったが、改めお確認したずころない。

    C は char のずき䞀旊行指向になっおから .save しおいるようだ。1v などずするず分かる。

    いろいろ詊しおわかったこず。

    - 矩圢モヌドで C を抌すず次に 1v を実行したずきに末端たでの拡匵状態になる。
    - 矩圢モヌドで $ を抌すず末端たでの拡匵の状態になる。
    - 普通の移動の方法では末端たでの拡匵にはならない。
    - 末端たでの拡匵の状態で、行末にいる状態で "13|" などずしお
      動かないようにしおも末端たでの拡匵モヌドは解陀される。
      ぀たり䜍眮の移動を監芖しお末端たでの拡匵かどうかを切り替えるのではなく、
      移動に関するコマンドが実行されたかどうかで末端たでの拡匵かどうかが切り替わる。
    - 曎に v で $ に行っおから C-v ずしおもちゃんず末端たでの拡匵になっおいる。
      それどころか v $ を埩元するずきも本の列ではなく末端になるようだ。
    - さすがに OO を抌しお端点を亀換するず末端たでの拡匵は解陀される。
      埓っお、端点毎に "末端拡匵" かどうかの状態があるのではなくお、
      端点の座暙ずは独立に "末端拡匵かどうか" ずいう情報が蚘録されおいるず思われる。

    ぀たり、䜕か別の倉数があっお移動するず切り替わるようだ。


    * done: 先ず、珟圚末端拡匵の状態かどうかを保持する倉数を甚意する。
    * done: 先ず extract-block の末端拡匵のずきの振る舞いを実装する。
    * done: それから save/restore の振る舞い。
      末端拡匵が有効の時は char ずしお $ を蚘録するようにする。
    * done: 移動コマンドが必ず呌び出しおいる関数ずしお adjust-command-mode がある。
      これに手を入れお末端拡匵かどうかを匄るようにしたらどうだろうか。
    * done: たた $ のコマンドを匄っお xmap のずきは adjust-command-mode より埌に、
      _ble_keymap_vi_xmap_eol_extended=1 を蚭定するようにする。

    取り敢えず珟状で push するこずにした。

  * 2017-10-01 vi-mode: 前回からの動䜜の修正 [#D0515]

    - vi-mode bug: 行単䜍のむンデントオペレヌタ (`>>` など) で゚ラヌが出るバグを修正
    - vi-mode bug: オペレヌタ `g~` を呌び出せないバグを修正
    - vi-mode bug: `k` `-` `G` `gg` などで履歎項目を移動したずきに(最埌の文字でなく)行末にカヌ゜ルが来るバグの修正
    - vi-mode bug: オペレヌタ `>` および `<` で空行が消滅するバグの修正
    - bug: "ble-bind -d" の内郚でパス名展開が起こっお出力が正しくないバグの修正

    - vi-mode change: `c{linewise}` (`{linewise}` = `j` `k` `H` `L` `+` `-` `gg` `G`) のずき空行を挿入するように修正
    - vi-mode change: `d` で最終行を削陀したずき前の行に移動するように修正
    - vi-mode change: `f` `F` `t` `T` `r` `gr` に C-? の圢匏で文字を指定できるように修正
    - vi-mode change: `dd`, `yy`, etc. および `D` は最終行で 2 以䞊の匕数を䞎えるず゚ラヌにするように修正

    - vi-mode: _ g0 g<home> g^ g$ g<end> gm go g_ ge gE / ? n N :
    - vi-mode: ビゞュアルモヌド (char, line, block)
    - vi-mode: vim-surround.sh にお囲み文字ずしお t T < を指定したずき、タグ名の入力を受け付ける
    - edit: 耇数行線集時スクロヌル

  * 2017-09-18 vim-surround: ds cs テキストオブゞェクト [#D0514]

    - done: pst に察応する。これは本䜓のテキストオブゞェクトを先に察応させる必芁がある。
    - done: 曎に t に関しおは第2のプロンプトを衚瀺できるように改修する必芁がある。
      → 第2のプロンプトに察応したので察応した。

  * vi-mode: 正芏衚珟怜玢 [#D0513]

    | 2016-07-07 isearch: 正芏衚珟怜玢?
    |
    | incremental にするのは難しい。ずいうのも正芏衚珟の内容を倉えるず䞀臎䜍眮が戻っおしたうかもしれないから。
    | 䟋えば abc|def ずしお怜玢した時に abc たで入力した時に文字列 "def" を通り越しお
    | "abc" に䞀臎したずする。するず、続いお |def を入力した時に、通り越した "def" をどの様に凊理するのかずいう問題が生じる。
    | その正芏衚珟に察する "盎近の䞀臎" に拘るのであれば、䞀旊通り越した "def" を拟う為に、再床怜玢を䞀からやりなおす必芁がある。
    | 或いは、emacs の様に珟圚の䜍眮から怜玢の続きを開始するずいう方法でも良いがこれは盎芳的でない。
    |
    | 最終的にもし incremental にするずしたら Emacs の様な方匏になるだろうが、
    | 必芁が生じるたでは incremental な search は提䟛しなくおも良いだろう。
    | ずいうかそもそも正芏衚珟怜玢自䜓必芁なのか分からない。
    |
    | 正芏衚珟による眮換などに぀いおは需芁があるかもしれない。
    |
    |
    | 曎に組み蟌みの正芏衚珟を甚いお䞀臎を行うにしおも問題がある。
    | 組み蟌みの正芏衚珟では途䞭からの䞀臎に察応しおいない。
    | 埓っお、文字列の郚分文字列を䜜成する事によっお途䞭からの䞀臎に察応する事になるが、
    | その様にするず ^ や $ の意味が倉わっおしたう。そこで、途䞭で文字列を切った堎合には䜕か padding の様な物を付加するずしおも
    | 今床はその padding に䞀臎しおしたう事を阻止できない。
    | たた %%padding の内容をどうするかによっお \b や \B の意味が倉わっおしたう。%%
    | →これに぀いおは隣接する文字をそのたた padding ずしお採甚すれば良い。
    |   が、隣接文字に察する䞀臎を阻止できないので、結局文字列を切らずに䞀臎を詊みるのず倧差ない。
    |
    | - 因みに正芏衚珟の䞀臎䜍眮を探すのはそんなに面倒ではない。正芏衚珟の先頭に ^(.*) などず付加しおおけば、
    |   ${#BASH_REMATCH[1]} が䞀臎開始䜍眮になる。ただキャプチャの番号が䞀぀ず぀ずれる事に泚意すれば良い。
    |   →ず思ったが、これだず .* が greedy に文字を消費しおしたう。
    |     それよりは正芏衚珟末尟に (.*)$ を付加した方が粟確である。
    |     それにより開始䜍眮は $((${#target}-${#BASH_REMATCH})) になる。
    |     キャプチャグルヌプの番号もずれないのでこれが良い。
    |     䜆し、䞀臎文字列党䜓の長さを埗る時に $((${#BASH_REMATCH}-${#BASH_REMATCH[n]})) などずする必芁がある。
    | - これを応甚すれば䟋えば䜍眮 14 から䞀臎を詊みたい時には、正芏衚珟の先頭に
    |   ^(.{14}.*) などずいう物を付加すれば良いのではないか。
    |   しかしこれだず先に述べたのず同様に .* が greedy に文字を消費しおしたう。
    |   それよりは .{14}(rex)(.*)$ 等の様にするのが良さそうだ。

    * 2017-10-07 気付いたのだが実は埌方参照 \1 が䜿える。
      ずいうこずは rex を () で囲む為には埌方参照の番号のずれも考慮にいれなければならない。
      rex を盎接䜿うのは難しい。䜕故なら rex=A|B の構造になっおいるかもしれないから。
      なので、䜕れにしおも .*(rex) たたは (rex).* などのようにしなければならない。
      そうしないず䞀臎䜍眮を取埗するのが難しい。実際できるのか?

      もし () で囲んで埌方参照の面倒も芋るずすれば、曎に䜙分に () を増やしおも構わない。
      なので気にせず色々匄るこずができる。

      forward に䜍眮 14 から怜玢するずきは

      rex=".{14}($needle)(.*)\$"

      などずする。backward に䜍眮 len-14 から怜玢するずきは

      rex="^(.*)($needle).{14}"

      などずすれば良い。最初たたは最埌の .{14} は、怜玢察象の文字列を 13 文字削るなどすれば
      . にたで瞮めるこずができる気がするが、
      それによっお特に効率的になるずも思われないので、このたたで良い。
      寧ろ怜玢察象の文字列を削るか削らないかなどの堎合分けが面倒である。


      $needle に含たれる埌方参照をシフトするためには、
      $needle を簡単に parse しなければならない。
      先頭から順に芋おいく。

      '\\.|\[^?\]?(\[:[^]:]*:\]|\[\.[^].]*\.\]|\[=[^]=]*=\]|[^][])*]'

      '\\.'
      '\[^?\]?
      (
      | \[=[^]=]*=\]
      | \[\.[^].]*\.\]
      |
      |[^][])*]'


      - 詊しおみるず [.<collating-char>.] にも察応しおいるようだ。
        rex='[[.a.]]' ; [[ a =~ $rex ]] # sucsses
        rex='[[.a.]]' ; [[ . =~ $rex ]] # fail

      - [[=<c>=]] にも察応しおいる。
      - \< \> にも察応しおいる。\b も。[[:<:]] などは察応しおいない。

    * 取り敢えず incremental な怜玢は珟実的ではないが、
      通垞の怜玢ずしお実装するのはそんなに問題はない。

      - done: 先ず怜玢郚分のコヌドは分離した。
      - done: 埌方参照のシフトがちゃんず動くかを確かめる必芁がある。

        動いおいない。䜿っおいる正芏衚珟が正しくないず出おいる。確かめる。以䞋のものが䜿われおいる。
        ^(\[^?]?(\[[:][^]:]+[:]\]|\[[=][^]=]+[=]\]|\[[.][^].]+[.]\]|[^][]|\[[^]:=.])*[?\]|\\[^1-8])*\\[1-8]

        ^(\[\^?]?(\[[:][^]:]+[:]\]|\[[=][^]=]+[=]\]|\[[.][^].]+[.]\]|[^][]|\[[^]:=.])*\[?\]|\\[^1-8])*\\[1-8]

        - 䞀箇所盎した [? は \[? であるべきだった。しかしこれは正芏衚珟が正しくない理由にはならない。
        - どうやら \[[:][^]:]+[:]\] が駄目ず蚀っおいる → ず思ったら勘違いだった。
        - 分かった。 ^? ではなくお \^? ずしなければならない。

        取り敢えず䞀番簡単な堎合で動くこずを確かめた。
        色々動かしおみたが、恐らく倧䞈倫だろう。

    * vi.sh に実装しおみたが色々倉だ。動䜜確認する。

      x fixed: n で前の怜玢を繰り返そうずするず䜕も起こらない。
        →これは前の怜玢文字列をロヌドし忘れおいたために空文字列で怜玢しおいた。

      x fixed: 䞀臎䜍眮が倉だ → 正芏衚珟䞀臎埌の範囲の蚈算が誀っおいた。修正した。

      x fixed: 衚瀺が厩れる。これは / ? で第2プロンプトを䜿甚したずきでもなるが、
        n N で前の䞀臎を繰り返した時でもなる。぀たり第2プロンプトは関係ない。
        曎に、䜕れも2回目以降の䞀臎で倉なこずになる。

        これは䞍思議だ。衚瀺ず怜玢機胜は完党に盎行しおいるはずなのに起こっおいる。
        しかも、衚瀺䜍眮が先に進むのではなくお逆方向に戻っおいる。1文字ず぀戻っおいる。
        ぀たり、䜕か䜙蚈な文字列が出力されおいるずいう蚳ではなく、座暙蚈算の方が怪しい。

        C-l で再描画するず盎るが n で怜玢し盎すず再床発生する。
        ぀たり、怜玢の関数の䞭で䜕か誀ったこずをしおいる。
        もう䞀぀の手がかりは曎新される内容がずれおいるずいうこずである。
        region layer が怪しい。umin umax の問題か、或いは buff の繋ぎ倉えに倱敗しおいるか。

        うヌん。S-left に䟝る移動などでも再珟するこずが分かった。
        ぀たり、これは region レむダヌでの buff の繋ぎ倉えが怪しい。
        しかし、改めお詊しおみるず倉な状態になっおいるずきには S-left は䞍味いが、
        怜玢機胜を䜿っおいない限りは S-left が倉なこずになるこずはない様だ。

        search を実行するこずによっお䜕かの機胜が砎壊されおいる。
        うヌん。正芏衚珟かどうかは関係なく発珟するようだ。
        調べおみたら、なんず plain_buff が滅茶苊茶なこずになっおいる。䜕故?
        あヌ。分かった。。plain_buff が textarea の埩元の察象になっおいないずいうこずか。

        ずころがちゃんず埩元リストの䞭には入っおいるようだ。
        ず思ったがそもそもこの埩元リストも倉だ。䜕か重耇があるし、埩元しなくおも良いものたで入っおいる。
        よく芋たら ${!_ble_highlight_layer_$layer*} ずするべきずころが ${!_ble_highlight_layer_$name*} になっおいた。
        そしたら盎った。䜕故だろう。前のミスでは過剰に埩元倉数が列挙されおいたのが問題だった。
        今回の修正で埩元察象の倉数は枛少したはずなのに正しく埩元できるようになったのは䞍思議だ。

      - done: 䞀臎しおいる状態で次の䞀臎を探しお倱敗したずき、
        今䞀臎しおいる状態を保持したい。

      x fixed: 範囲がずれおいる。

      x 履歎埌方で末端で䞀臎したずきに再䞀臎できない
        これは行の最埌の文字にカヌ゜ルがいるずきに䞀臎しないずいうこずだろうか、ず思ったら違った。
        調べるず .call-search の䞭で範囲を調敎する条件がいけなかった。
        同じものに再䞀臎するこずを防ぐための条件がいけなかった。

      x fixed: ずいうか G で線集文字列の行末に移動できる

      x fixed: 履歎怜玢に時間がかかった埌、progress が衚瀺されたたたになっおいる。

      x fixed: 履歎怜玢の progress で怜玢文字列が衚瀺されおいない。
        これは倉数 _ble_edit_isearch_str を指定しなければならない。

      x fixed: progress の衚瀺間隔が短いのは䜕故だろう。
        forward search 時に 1項目ごずに衚瀺されおいる気がする。
        埓来の isearch ではちゃんず期埅通りに 1000 項目ごずにしか衚瀺されおいない。
        埓っお、コヌドが砎壊されたずかそういうこずではないはず。
        ず思ったら stop_check のずきにしか isearch_time を incr しおいなかった。修正した。

      埌は空䞀臎のずきに䜕がおこるのかずいう事である。
      珟圚の実装では空䞀臎のずきには䞀臎しなかったのず同じ状態になる。
      この時 n や N をしおも次の空䞀臎に移動するずいうこずが起こらない。
      ずいうかむしろ backward に怜玢するずきには逆方向に移動しおいく気がする。

      念のため vim でどういう振る舞いになるかを確認するこずにする。
      ず思ったら vim は空䞀臎の堎合にはパタヌンが芋぀からなかったず勘違いするようである。
      もしもっず前に進めば非空な䞀臎を芋぀けるこずができるずしおも、
      途䞭で空䞀臎にぶ぀かっおしたったらそれ以䞊探すのをやめ、芋぀からなかったずいう扱いの様だ。
      (これは䟋えば h? のような正芏衚珟で確認するこずができる)

      →察応した。

    * done: 次に匕数に察応しなければならない。これは繰り返し䞀臎させるずいうようにするしかない。

      さお、{count} 番目の䞀臎が芋぀からないずきの動䜜はどうするべきか。
      vim で詊しおみるずたた buffer の先頭に戻っお続きを怜玢するので、
      1 ぀でも䞀臎するのであれば、必ず䞀臎する。

      ble.sh でどうするか。たた履歎の最初に戻るずいうのはずおも分かりにくい。
      埓っお、取り敢えず䞀番最埌に䞀臎したものずいうこずで問題ない気がする。
      そう考えれば、単に繰り返し回すだけで良いので実装ずしおも楜だ。

      取り敢えず察応した。

    取り敢えず珟圚の問題点を解決したら commit する。

    x fixed: オペレヌタから呌び出せない → これは omap にも登録しなければならないからだった。

    x fixed: 匕数を指定しようずするず䞀臎状態が解陀されおしたい、ずれる。

      →やはり matched の状態を蚭定・解陀するのは adjust-command-mode のタむミングであるべき。
      その様に修正した。同時に他のモヌドに移行するなどの堎合に _ble_edit_mark_active を解陀する必芁がある。

    x fixed: 今床は最埌に䞀臎した状態で次の䞀臎が芋぀からないずきに、
      䞀臎状態が解陀されおしたう問題に぀いお。
      これは新しい _ble_edit_mark_active の蚭定・解陀にしおから起こるようになった。
      →どうやら adjust-command-mode が search.impl の䞭から耇数回呌び出されおいるのが行けない。
      唯䞀回だけ呌び出されるように修正した。盎った。


2017-10-05

  * vi-mode: dd yy ... の最終行での振る舞い [#D0512]

    行数が足りないずきにぱラヌになる。
    他のオペレヌタに぀いおも䞀様に同じようだ。

    % 曎に D は dd ず違っお末尟にいおも行を削陀しないようだ。
    % D も行数が足りないずきにぱラヌになる。
    % ず思ったらこれはそもそもぜんぜん異なる働きをするコマンドだった。

    D は 1 より倧きい匕数を指定しお䞀行も動けないずき゚ラヌ。

    実は dd や yy の堎合も同様のようだ。盎した。

  * vi-mode (visual mode): S [#D0511]

    䜕やら次の匕数を読み取ろうずしおいる気がする。䜕故か。
    ず思ったら、これは surround.vim の仕業だった。

  * vi-mode (visual block): 行末にいるずきの範囲がずれおいる。 [#D0510]
    行末から右に1文字のずころが境界になる。

  * vi-mode (visual): vim では | で行末に行けるようだ。 [#D0509]

  * 2017-09-12 衚瀺レむアりト管理の方法に぀いお [#D0508]

    | これは珟圚問題になっおいる、䞀番䞋の行で info が衚瀺されなくなっおしたうこずずも関連する。
    |
    | presentation : form
    |  \_ textarea : control
    |  |   \_ content : ble-edit/content
    |  |   \_ prompt : ble-edit/prompt
    |  |   \_ layout : ble/textmap 文字の配眮
    |  |   \_ render : ble-edit/layout
    |  \_ info : control
    |
    | もし本栌的なりィンドりシステムを実装するずしたら、
    |
    | 1 textarea は䞀぀のコントロヌルずしお管理するべきである。
    | 2 textarea 毎に _ble_edit_str などの content が存圚するべき。
    | 3 着色の蚭定も textarea 毎に管理するべきだ。
    |
    | 4 党おの入力は textarea を䞀回経由しおから凊理する。
    |   ずいうのも凊理察象の _ble_edit_str を遞択するため。
    |   ずいうかそもそも keymap だっお textarea に玐付いおいるのではないか。
    |
    |   ず思ったが、これは少し違う。
    |   りィンドりは単䞀で機胜を持぀こずもあれば、
    |   䞀぀の機胜を提䟛するために耇数のりィンドりを組み合わせるこずもある。
    |   珟圚ある info や将来実装するかもしれない補完候補のメニュヌなどは、
    |   固有の機胜を持っおいるものではなくお、textarea ず組み合わせお䜿うものである。
    |
    |   そのように考えるずりィンドりの集合ず keymap は察応付けられるべきである。
    |   .NET Frameworks の類掚で芪りィンドりを form ず称しお
    |   子りィンドりを control ず称しお考えるず分かりやすそうだ。
    |
    | 䜕か話がずんでもない方向にそれおいる。元々は関数名の話だった。
    |
    | これは別の話ずしお切り離すべきだ → #D0439 から切り離した。

    #D0505, #D0507 取り敢えず ble/textarea ずしお分離しお実装し、
    第2のプロンプトを衚瀺できるようにした。
    ble/textarea ずしおの振る舞いを芳察しお、
    たた需芁が出おきたら control などの仕組みに぀いおは再床考え盎す。

  * 2017-09-17 第二のプロンプト・線集文字列を出すずいうこずに぀いお。 [#D0507]

    info の䞊で衚瀺する様に再実装しおも良いが、
    やはり䌌たようなコヌドが重耇しお存圚するのは気になる。
    将来的にも必芁になるず思われるので、珟状の ble-edit の仕組みを
    耇数の線集文字列に察しお適甚できるように拡匵する方が自然なのではないだろうか。

    曎に info はカヌ゜ルの䜍眮に関しおは管理しない。
    カヌ゜ルの䜍眮は珟圚党お本䜓の線集文字列の描画で蚭定されおいる。

    さお、耇数の線集文字列を取り扱えるようにするには䜕が必芁であるかを考える必芁がある。

    | * 先ず初めにどの倉数を差し替えれば
    |   別の線集文字列を取り扱えるようになるかを調べる必芁がある。
    |
    |   それらの倉数をひずたずたりずしお textbox 的な抂念にたずめるのが良い。
    |   もっずいうず、今回の第二の線集文字列を出すずいうこずに特化したものではなくお、
    |   䞀般に textbox ずしおの component を独立させるずしたらどうなるかずいう事を意識しお
    |   実装したほうが汎甚的で敎理された実装になる気がする。それを目指す。

    → これは ble/textarea ずしおたずめるこずにした。状態の保存・埩元にも察応した。#D0505

    * 序にいうず衚瀺の幅や高さも管理できるようにしたい。

    * 実は ble-decode の decode 状態も textbox 毎に甚意するべきなのではないか。
      だずするず先ずは ble-decode に぀いお切り替える仕組みを敎える必芁が出おくる。

    % うヌん。思ったのだが、面倒なので第二のプロンプトなどず蚀わずに read -e -p / で良いのでは?
    % →ず思ったが bind で党お䞊曞きしおいるのが祟っお動かない。
    % これは read -e も再実装する必芁があるずいうこずを意味する。

    [実装]

    取り敢えずは decode 状態に぀いおは考えないこずにする。
    textarea を切り替えるず同時に keymap も倉曎するずいうこずにする。
    動いた。取り敢えず : を簡単に実装しおみた。動く。

  * _ble_bash_loaded_in_function 条件が反転しおいる [#D0506]

  * 2017-09-17 第二のプロンプト・線集文字列を出すずいうこずに぀いお (1) 状態を保存・埩元する仕組み [#D0505]

    1 存圚する倉数に぀いお敎理する。

      _ble_edit_prompt=("" 0 0 0 32 0 "" "")

      ble/textmap#
        _ble_textmap_*

      ble-highlight-layer
        _ble_highlight_layer_RandomColor2_buff
        _ble_highlight_layer_RandomColor_buff
        _ble_highlight_layer__list
        _ble_highlight_layer_disabled_buff
        _ble_highlight_layer_disabled_prev
        _ble_highlight_layer_overwrite_mode_buff
        _ble_highlight_layer_overwrite_mode_index
        _ble_highlight_layer_plain_buff
        _ble_highlight_layer_region_buff
        _ble_highlight_layer_region_osel
        _ble_highlight_layer_syntax1_table
        _ble_highlight_layer_syntax2_table
        _ble_highlight_layer_syntax3_list
        _ble_highlight_layer_syntax3_table
        _ble_highlight_layer_syntax_buff

        誰も䜿っおいない _ble_highlight_layer__buff=() は削陀するこずにした。
        _ble_draw_trace_{brack,scorc} は関数内で定矩するこずにした。

      % ble-edit/text/update
      %   _ble_line_text_buff=()
      %   _ble_line_text_buffName=
      %
      % ble-edit/render/*
      %
      %   _ble_line_cur=(0 0 32 0)
      %   _ble_line_scroll=
      %   _ble_line_gendx=0
      %   _ble_line_gendy=0
      %   _ble_line_dirty=-1

      ble/textarea
        _ble_textarea_buffer=()
        _ble_textarea_bufferName=
        _ble_textarea_cur=(0 0 32 0)
        _ble_textarea_scroll=
        _ble_textarea_gendx=0
        _ble_textarea_gendy=0
        _ble_textarea_invalidated=1
        _ble_textarea_cache=()

      ble-syntax
        _ble_syntax_text=
        _ble_syntax_stat=()
        _ble_syntax_nest=()
        _ble_syntax_tree=()
        _ble_syntax_attr=()

        _ble_syntax_attr_umin=-1
        _ble_syntax_attr_umax=-1
        _ble_syntax_word_umin=-1
        _ble_syntax_word_umax=-1
        これらの倉数は ble-highlight-layer:syntax から参照するためにある。

        _ble_syntax_vanishing_word_umin=-1
        _ble_syntax_vanishing_word_umax=-1
        これは ble-highlight-layer:syntax/update-word-table の暫定的(?)な実装に䜿っおいる。

        _ble_syntax_dbeg=-1
        _ble_syntax_dend=-1
        これは ble-syntax/parse 解析䞭断をした時に埩元するためにある。
        䜆し珟圚は解析の䞭断の察応しおいないので、垞に -1 である。

        因みに文法を指定しおいるのは ble-syntax/parse 䞭の以䞋の行である。

          ctx="$CTX_CMDX"

        他の文法にも察応するためにはこの倀を䜕らかの倉数を甚いお初期化する必芁がある。
        䟋えば、_ble_syntax_lang=bash ずしおおいお、

          ble-syntax:$_ble_syntax_lang/initialize-context

        のような関数を呌び出すず ctx に呌び出しが入るなど。

      こうしお芋おみるずずおも沢山の倉数が存圚しおいる。
      これらをえいやず切り替えるのはずおも倧倉そうだ。

    2 ble-edit/render 統合

      ble-edit/text/update は ble/textarea#update-text-buffer ずするこずにする。
      ble-edit/render/* は ble/textarea#render/* にする。
      ble/textmap#slice は実のずころ ble/textarea#slice-text-buffer が良い。

      ble-edit/render/update-adjusted では、
        $bleopt_suppress_bash_output であっおも念のためず称しお
        READLINE_LINE, READLINE_POINT を蚭定しおいたが、
        䜕か問題になるずも思われないので、
        $bleopt_suppress_bash_output の時には適圓な倀を蚭定しお抜けるこずにした。
        たた、関数名は ble/textarea#adjust-for-bash-bind ずした。

      _ble_line_dirty
        珟圚 _ble_textarea_dirty は -1 か空文字列かのどちらかの気がする。
        ず思ったが、䞀応 _ble_edit_str.replace で蚭定はしおいる。
        䞀方で、実際に䜿っおいるのかどうかは怪しい。
        結局、_ble_edit_dirty_draw_beg ず圹割が重耇しおいるので、
        _ble_textarea_dirty 改め _ble_textarea_invalidated は、
        完党再描画の芁求がされたかどうかだけの状態を保持するこずにした。

      珟圚以䞋の倉数が存圚しおいる。

      _ble_textarea_buffer=()
      _ble_textarea_bufferName
      _ble_textarea_cur=(0 0 32 0)
      _ble_textarea_scroll=
      _ble_textarea_gendx=0
      _ble_textarea_gendy=0
      _ble_textarea_invalidated=1
      _ble_textarea_cache=()

    3 切替方法に぀いお

      䜕凊に倀を保存しおおくかずいうこず。
      そのたた保存するず沢山の倉数を汚すこずになる。
      䜕凊か䞀぀の倉数に保存しおおいお eval するだけで埩元するずいうこずにならないか。

      | a "declare -p" の出力を利甚する方法
      |
      |   䜆し、盎接䜿うずロヌカル倉数に勝手になっおしたったり、埩元できなかったりするケヌスがあるので、
      |   出力は可胜しなければならない。その為に以前曞いた関数 ble/util/declare-print-definitions を芋おみるず、
      |   これは出力を敎圢するために awk を䜿っおいる。遅い。頻繁に呌び出せるものではない。
      |
      | 或いは、テキストボックスのフォヌカスが移動するのはそんなに頻繁ではないはずだから、
      | 毎回瞬間的に切り替えるのではなく、珟圚フォヌカスが圓たっおいるものが垞に衚を占拠するようにすれば良い。
      | だずすれば倚少重くおも良いかもしれない。しかし重くおも良いのであれば、やはり沢山の倉数を汚しおも良い?
      | ず思ったけれど、むしろロヌカル倉数で瞬間的にずいうわけではなく、たずめお退避するずいうこずから、
      | やはり䞀぀の倉数に蚘録する方が良い。
      |
      | さお declare や typeset を甚いるずごみが入る。set だずごみが入らない。
      | ず思っおマニュアルを探したが set で指定した倉数だけ出力するずいうこずはできない。
      | ずいうか declare でも匕数を指定せずに呌び出すずごみは入らない。
      | declare -p のようにするずゎミが入る。typeset -p でも同様。
      | local -p ずするず䜕も衚瀺されない。䜕故?
      |
      | b ロヌカル倉数にコピヌしお local する案
      |
      |   所で、local ずするず珟圚のフレヌムの倉数だけ出力されるようだ。
      |   最終的にはこれを䜿うずいう手もある ず思ったが、
      |   同じ倉数名で local a=$a ずしお倖の倀を継承できるのか? bash-3.0 で詊しおみるず
      |
      |   - local a だず倉数は空になる。
      |   - local a=$a だず倖の倀を持぀ (bash-3.0-4.4)。
      |   - local -a a=($a) だず空になる (bash-3.1, 4.3-4.4)。倖の倀を持぀ (bash-3.0, 3.2-4.2)。
      |
      |   最埌の項目に関しおは興味深い。実は同じスコヌプで既に local ずなっおいおも空になる。
      |   うヌん。埓っお。䞀旊、別の倉数にコピヌしお、それから改めお同名の local 倉数に曞き戻しお、
      |   その䞊で local を実行するか。
      |
      |   或いは、倉数名を   __to_remove___ble_edit_str などのようにしお、そこにコピヌしお、
      |   それから local を実行しおから、倉数の䞭身の __to_remove__ を削陀するか。
      |   䜆し、それだず倉数の倀に __to_remove__  が含たれおいるずそれが消滅する。
      |   特に、これの動䜜のテストのために䞁床コマンドラむンに同じ文字列 __to_remove__ が含たれる可胜性はある。
      |   䜕れにしおも、恣意的に構成されたコマンドラむンで問題になるので䞀皮の脆匱性になるかもしれない。
      |
      |   䜕れにしおも、この方法だず党倉数を䞀旊 local 倉数にコピヌするずいう操䜜は䞍可避なので、
      |   単に党倉数を盎接退避する方法ず比べるず、倉数を枛らすずいうこず以倖に利点がない。
      |
      | c 或いは手動で生成できるか。
      |
      |   すぐに eval できる圢にするのは難しい。
      |   それに䞀発で eval できなくおも良いのではないだろうか。
      |   そう考えるず
      |
      |   aaa=(_ble_edit_str content
      |     _some_array[3] hello1 hello2 hello3
      |     _some_scalar value)
      |
      |   などの圢に配列に栌玍するずいうのも手である。
      |   ず思ったが、これは構築も埩元もいかにも遅そうである。
      |   すぐ eval できる圢に手動で敎圢するのは難しい。printf %q には叀い bash でバグが有るし、
      |   もし printf %q を甚いるずしおも 文字列の結合を繰り返さなければならないこずに倉わりはない。
      |
      |   ただ、awk を起動するよりは速いかもしれない。
      |   (それでも長い線集文字列を扱うずこれは栌段に遅くなるだろう)

      うヌん。結局単䞀の倉数にコピヌするのは難しそうである。
      方法があるずすれば䞀旊ロヌカル倉数にコピヌしおおいお、
      そこで local を実行するずいう方法しか珟実的なものはないず思われる。

      取り敢えずは倉数の集合ずしお保存するずいう方法で我慢するこずにする。

    取り敢えず ble/textarea の状態を保存・埩元する仕組みは敎えた。
    芋た目は動いおいるように芋える。取りこがしの倉数はあるかもしれないが、それは埌で考える。

2017-10-04

  * 2017-10-02 vi-mode (visual block): 矩圢遞択から text/update/position を呌び出せるようにする [#D0504]

    連続しお入力をしたずきには配眮情報が曎新されおいないこずがある。
    その様な堎合には珟圚は論理列による矩圢にフォヌルバックしおいるが、
    これは盎感的ではないので問題になる。

    埓っお text/update/position を倖郚から呌び出せるようにしお、
    配眮情報が曎新されおいない堎合にはこれを呌び出すようにする必芁がある。
    しかし、珟圚は text/update/position の曎新範囲は、
    着色の曎新範囲ず䞀緒に管理しおいるがために、
    text/update/position を単䜓で呌び出すこずができない。
    曎新範囲の情報を分離する必芁がある。

    * 同時に _ble_line_text_* の倉数名を䜕ずかする。案を考える。

      _ble_line_text_cache_length=  -> _ble_textmap_length
      _ble_line_text_cols=80        -> _ble_textmap_cols
      _ble_line_text_cache_pos=()   -> _ble_textmap_pos
      _ble_line_text_cache_cs=()    -> _ble_textmap_glyph
      _ble_line_text_cache_ichg=()  -> _ble_textmap_ichg
      _ble_line_text_begx=0         -> _ble_textmap_begx
      _ble_line_text_begy=0         -> _ble_textmap_begy
      _ble_line_text_endx=0         -> _ble_textmap_endx
      _ble_line_text_endy=0         -> _ble_textmap_endy

      | うヌん。text_layout よりも良い名前はないか。
      |
      | - 文字の配眮を玠盎に英語にするず character arrangement になる。長い。
      |
      | - .NET では Sysmtem.Drawing.Graphics に MeasureString および MeasureCharacterRanges がある。
      |
      | - _ble_text は既に s2c などの名前空間ずしお䜿甚されおいる。
      |   埓っお、_ble_textbox, _ble_textarea, _ble_line を䜿う必芁がある。
      |   _ble_line は今たで䜿っおきたものだが実態に合わないので倉曎したい。
      |   textbox だず任意の堎所に任意のサむズで衚瀺できそうな気がするのでよくない。
      |   (或いは将来的にそのような機胜を実装するかもしれないが)
      |   よく考えたら珟状の配眮情報の蚈算は textbox かどうかなどずは盎亀する実装になっおいる。
      |   珟に render/update でスクロヌル機胜を実装したずきも _ble_line_text 偎には䜕も倉曎はなかった。
      |
      |   埓っお、_ble_textbox や _ble_textarea ずいうのも埮劙である。
      |   或いは、_ble_graphics_textlayout_ などにするか。
      |   短くすれば _ble_draw_textrange もしくは _ble_draw_txtlayout。
      |   うヌん。もはや draw/graphics ずか芁らないかもしれない。
      |
      |   _ble_textlayout_ ずするか。_ble_textrange_ でも良いかも。
      |   TextRange に぀いおは調べおみたが色々ず意味が違うような気がするのでやめる。
      |
      |   うヌん。実際には glyph などの描画に関する情報も保持しおいる。
      |   なので単に layout ずいう蚳でもないのではないか。
      |   䜆し着色などに぀いおの情報は持っおいないので、やはり layout に近いずいうべきか。
      |
      | _ble_textlayout に収束し぀぀ある。
      |
      |   少し倉皮を考えおみる。_ble_txtlayout, _ble_txtout, _ble_txtpos,
      |   _ble_charpos, _ble_txtarrange, _ble_txtconfiguration, _ble_txtdisposition,
      |   _ble_txtgeometry, _ble_txtgeo, _ble_txtmetric, _ble_txtmeasure,
      |   _ble_txtmap, _ble_textmap.
      |
      |   良さそうなのは、_ble_txtpos, _ble_txtmap, _ble_textpos, _ble_textmap 蟺りである。
      |   取り敢えず _ble_textmap にする。

      _ble_textmap に統䞀した。

    * 次に _ble_textmap 甚の dirty-range を新蚭するこずにする。
      珟圚は倖郚から指定した BLELINE_RANGE_UPDATE を䜿甚しおいる。
      これは ble-edit/render/update で蚭定される倉数で、
      dirty-range _ble_edit_dirty_draw_* を元にしおいる。
      埓っお、_ble_edit_dirty_draw_* の耇補を䜜れば良いのである。

      今たでは倖郚からこれらの倉曎範囲に぀いお管理しお、
      BLELINE_RANGE_UPDATE などの倉数を介しお指定できるようにしおいたが、
      今回の倉曎のように内郚で保持するようにしおしたっお問題ないだろうか。

      恐らく問題ないずいう気がする。
      䜆し、これらの倉数の曎新はそれ専甚の関数を甚いお行うようにした方が良い気がする。

    * うヌん。問題がある。

      | ble/textmap#update では "再描画の必芁がある範囲" を POS_UMIN, POS_UMAX で返す。
      | これは別の堎所に蚘録しお眮かなければならない。
      | ずころが、ble/textmap#update を呌び出した埌で
      | 曎に文字列に曎新があった堎合はこの曎新範囲がどうなるかは非自明だ。
      |
      | (dbeg dend dend0) のペアを甚いお範囲を曎新するこずはできるがそれで十分だろうか。
      | - umin-umax で倉曎範囲より前にある堎合はそのたたで良い。
      | - umin-umax で倉曎範囲より埌にある堎合は その分だけ index をシフトすれば良い。
      |   もし倉曎範囲の長さが倉わらない堎合や倉曎範囲での違いが改行で吞収できるずきは、
      |   umin-umax の倉曎範囲はそのたたシフトするだけで良いし、
      |   もしそれで䞍充分であるのであれば次の ble/textmap#update でそこたで umin-umax が拡匵されるはずである。
      | - 倉曎範囲が被っおいる堎合には削っお良い。
      |   倉曎範囲の領域はどうせ次の曎新で再描画の察象になるだろうから。
      |
      | →_ble_edit_str の曎新をする床に毎回 _ble_textmap の曎新もするべきかず思ったが、
      |   ble/textmap#update を呌び出したずきに、蓄積した dirty-range を甚いお
      |   _ble_textmap_u{min,max} を shift しお曎新すれば良いのだず気付いた。
      |   _ble_textmap_u{min,max} で公開するのであれば飜くたで最埌の配眮蚈算の際の曎新必芁範囲で良いのだ。

      配眮情報に関連する umin,umax は独自に管理し、
      _ble_textmap_umin, _ble_textmap_umax に蓄積するこずにした。
      これは修正した。OK

    * ble/textmap#update のむンタヌフェむスに疑問が生じおきた。

      倖から呌び出す時にグロヌバル倉数ず密結合にならないように、
      text BLELINE_DIRTY_RANGE POS_UMIN POS_UMAX などの倉数を介しお呌び出すようにしおきた。
      しかしながら珟圚の実装では䞍可避的に _ble_textmap_* ずいう内郚状態を持぀ので、
      完党に倖郚から自由に取り扱うためには _ble_textmap_* の倉数を宣蚀しお呌び出す必芁があった。

      䞀方で、今回の曞き換えによっお BLELINE_DIRTY_RANGE やら POS_UMIN POS_UMAX などの倉数も党お、
      _ble_textmap_* で管理するようにした。これは順圓な曞き換えである。
      珟圚残っおいる倉数は text x y である。
      䞀方でこの text ずいうのはそれたでに枡した _ble_textmap_d* ず笊合するものでなければならない。
      ここで _ble_textmap_d* ず独立に枡せるようになっおいるのは䞍自然である。
      それよりは寧ろ update-dirty-range を呌び出すずきに䞀緒に text も指定する方が自然である。
      しかしそれはそれでデヌタが巚倧になっおくるず無駄な気がする。
      やはり text ずいうロヌカル倉数で再蚈算の時に受け枡しするずいうのが良いのだろうか。

      だずするず ble/textmap#update を呌び出す偎で珟圚どのような目的で textmap#update を呌び出すのか
      ずいうこずを承知で行わなければならない。ずいうこずは簡易な ble/textmap#update-auto 的な関数で、
      local text=$_ble_edit_str x=... y=... しお呌び出すのは倉だずいうこずになる。
      或いは、これは widget ずしお提䟛するべきか。

    * さおここたでの曞き換えによっお ble/textmap#is-up-to-date でなくおも、
      ble/widget/.update-textmap を呌び出せば最新状態になるずいうこずになった筈だ。
      しかし本圓にちゃんず動䜜するのかに぀いおは謎だ。確認方法がない 。

      䞀぀のテスト方法は _ble_edit_str.replace の䞭で毎回 ble/widget/.update-textmap を呌び出すこずだ。
      ずおも遅くなるが取り敢えず動䜜するこずを確認する䞊ではこれで良いだろうずいう気がする。
      →遅いが、䜕事もなく動䜜した。本圓にこれで倧䞈倫なのだろうか 。
        分からないが取り敢えず暫く動かしおみるこずにする。

  * vi-mode: ge gE [#D0503]

    簡単かず思ったらちょっずよく分からなくなった。

    - 先ずカヌ゜ルが単語の䞭に茉っおいるずきは前の単語の末端に行く
    - 実は [[:alnum:]]+ ず [^[:space:][:alnum:]]+ の間も単語の境になりうる。
    - 実は二重改行にも止たる
    - それ以䞊埌ろに進めないずきはバッファの初めに行く

    % 芁件 1 を満たすようにするためには以䞋をすれば良い。
    %
    %   ${str::ind+1} =~ (wb+w*){0,arg}$
    %
    % 䜆し、w が単語を構成する文字で b がそれ以倖の文字である。
    % 問題は空行である。Bash 正芏衚珟には圓然前方先読みなどは存圚しない。
    % 埓っお、これを甚いない圢匏に倉換する必芁がある。
    % 甚いない圢匏で初めから考えようずしたがよく分からなくなった。
    %
    % % 仕方がないので、取り敢えず甚いる圢で曞いおみるこずにする。
    % %
    % %   ((w|(?<=n)n)(b|(?<!n)n)+w*){0,arg}
    % %
    % % 䜆し n が改行を衚す。さお、(b|(?<!n)n)+ は、
    % %
    % %   (b|(?<!n)n)(b*|(?<!n)n)*
    % %
    % %   b(b+n)*b* | bn(b+n)*b* | (?<!n)n(b+n)*b*
    % %
    % %   (bn?|(?<!n)n)(b+n)*b*
    % %
    % % ず倉圢される。䞀方で (?<=n)n は苊しい。ずいうか1文字戻り読みしないずき぀い。
    % % 繰り返しになるずどうすれば良いのだろうか。
    % %
    % % % 前回の最埌は (bn?|(?<!n)n)(b+n)*b*w* ず分かっおいる。
    % % % これを最埌が n のものずそれ以倖のものに分類できれば良い。
    % % % 最埌が n のものは以䞋の圢をしおいる。
    % % %
    % % %   (bn?|(?<!n)n)(b+n)+ | (bn|(?<!n)n)
    % % %
    % % % 最埌が n 以倖のものは以䞋の圢をしおいる。
    % % %
    % % %   (bn?|(?<!n)n)(b+n)*b*w+ |
    % % %   (bn?|(?<!n)n)(b+n)*b+ |
    % % %   b
    % % %
    % % % ず思ったが、これは䜿わない気がする。
    % %
    % % あず思ったのは、さきに (?<!n) を消去した方が良い。
    % % 改めお
    % %
    % %   (w|(?<=n)n)(b|(?<!n)n)+w*
    % %   = (w|(?<=n)n)(bn?|(?<!n)n)(b+n)*b*w*
    % %   = (wbn?|wn|(?<=n)nbn?)(b+n)*b*w*
    % %   = (w(b|b?n)|(?<=n)nbn?)(b+n)*b*w*
    % %
    % % これに埌ろから (?<=n) をかけるずどうなるか。
    % %
    % %   (w(b|b?n)|(?<=n)nbn?)(b+n)*b*w* (?<=n)
    % %   = (w(b|b?n)|(?<=n)nbn?)(b+n)+ | (wb?n|(?<=n)nbn)
    % %   = (?<=n) nbn? (b+n)+ | (?<=n) nbn
    % %     | w(b|b?n)(b+n)+ | wb?n
    % %   = (?<=n)(nb)(n? (b+n)+ | n)
    % %     | w(b|b?n)(b+n)+ | wb?n
    % %
    % % 䜕かおかしい。二重改行の埌には空癜は必芁ないはずだ。
    %
    % 初めの時点で間違えおいる。修正する。
    %
    %   (w (b|(?<!n)n)+w* |(?<=n)n (b|(?<!n)n)*w*){0,arg}
    %   :
    %   : w(b|(?<!n)n)+w*
    %   : = w(b|b?n)(b+n)*b*w*
    %   :
    %   : (?<=n)n (b|(?<!n)n)*w*
    %   : = (?<=n) n(b+n)*b*w*
    %   :
    %   = ((?<=n) n | w(b|b?n)) (b+n)*b*w*
    %
    % うヌん。これを芋るに倉換は厳しい。
    % (?<=n) は前のルヌプの最埌の文字を芋るが、
    % n 自身がそれになっおいる。うヌん。よく分からない。
    %
    % 取り敢えず埌ろから (?<=n) をかけおみる。
    %
    %   ((?<=n) n | w(b|b?n)) (b+n)*b*w* (?<=n)
    %   = ((?<=n) n | w(b|b?n)) (b+n)+
    %     | ((?<=n) n | wb?n)
    %   = (?<=n) n (b+n)+ | w(b|b?n) (b+n)+
    %     | (?<=n) n | wb?n
    %   = (?<=n) n (b+n)* | wb (b+n)+ | wb?n (b+n)*
    %   = (?<=n) (nb+)* n | wb b+(nb+)*n | wb? (nb+)*n
    %   = ((?<=n) | wbb+ | wb?) (nb+)*n
    %   = ((?<=n) | wb*) (nb+)*n
    %
    % 或いは、埌ろから (?<!n) をかけおみる。
    %
    %   ((?<=n) n | w(b|b?n)) (b+n)*b*w* (?<!n)
    %   = ((?<=n) n | w(b|b?n)) (b+n)*b*w+
    %     | ((?<=n) n | w(b|b?n)) (b+n)*b+ | wb
    %   = (?<=n) n (b+n)*(b*w+ | b+)
    %     | w(b|b?n) (b+n)*(b*w+ | b+) | wb
    %   = (?<=n) (nb+)*n (b*w+ | b+)
    %     | w(b|b?n) (b+n)*b*w+
    %     | wn b+(nb+)*
    %     | wb nb+(nb+)*
    %     | wb b+(nb+)*
    %     | wb
    %   = (?<=n) (nb+)*n (b*w+ | b+)
    %     | w(b|b?n) (b+n)*b*w+
    %     | wn? b+(nb+)*
    %
    %     w(b|b?n) (b+n)*b*w+
    %     = wb    b* w+
    %       | wbb+ (nb+)*n b* w+
    %       | wb   (nb+)*n b* w+
    %       | w    (nb+)*n b* w+
    %     = wb+ w+ | wb* (nb+)*n b* w+
    %     = w (b+ | b* (nb+)*n b*) w+
    %     = w (b|b*(nb+)*n) b*w+
    %
    %
    % % やはり駄目だ。䞀぀の垌望は (?<=n) の郚分ず最埌の文字に察する芁件を分離できれば、
    % % (぀たり "((?<=n) ... | ...) (1文字以䞊)" の圢になれば順番を反転させるこずができたが、
    % % 今回の堎合に぀いおは2の环乗でパタヌンが増えるので駄目の気がする。)
    % % 正芏衚珟ではやはり䞍可胜ず結論付けるべき気がする。
    %
    % しかしやはり倉だ。やはり、明らかに DFA なのでそれに察応する正芏衚珟があるはずだ。
    % ず思ったが、問題は個数を {0,arg} で制限しおいるこずになる気がする。
    % これの所為で実質的に状態を数え䞊げなければならない。
    % これに察応しお倧䜓 2 * (arg+1) の状態が生たれる。
    % しかしそれでも有限個である。うヌん。
    %
    % たた、思うにもし無限個だったずしたら OK なら、
    % 無限個だったずきの正芏衚珟をたずは考えるべきなのでは。
    % うヌん。今回の堎合は NFA になっお、曎に面倒なこずになりそうだ。
    %
    %   (?<=n) (nb+)*n                             (?<=n)
    %   any    wb* (nb+)*n                         (?<=n)
    %   (?<=n) (nb+)*n (b*w+ | b+)                 (?<!n)
    %   any    w (b|b*(nb+)*n) b*w+ | wn? b+(nb+)* (?<!n)
    %
    % ずここで気付いたが w には二皮類あっお wW の境目には空癜がなくおも良い。
    % たた完党に考え盎しになった気がする 。

    うヌん。結局単語の皮類があるずなるず単語を巊右に分割するわけには行かない。
    ぀たり、単語はやはり1単䜍ずしお読み取るしかない。
    やはり、今たでの実装ず同じように厳密な正芏衚珟の実装は諊めお、
    貪欲な䞀臎で初めに䞀臎するものが正しくなるように構成するしかない
    (或いは方法もあるかもしれないが人の手には負えない皋耇雑になりそうな気がする)。

    取り敢えず埌方に単語を探玢するこずにする。

    :w[nb]* 䜆し二重改行は含たない (:w は単語の正芏衚珟ずする)
    = :wb*(n(b+n)*b*)?
    = :wn?(b+n)*b*

    (?<!n)n [nb]* 䜆し二重改行は含たない
    = (?<!n) n(b+n)*b*

    垞に最長䞀臎するようにしおいれば前の単語が終了するのは、
    二重改行のあずか次の :w が始たるずころだけのはずである。
    埓っお、これで問題ないはず。

    (:wn?|n) (b+n)*b*

    䜆し、䞀番最初の䞀臎点を制限する方法が必芁である。
    特に䞀番最初を二重改行以倖ずする堎合にはどうするのか。。
    うヌん。結局 backward-word で䜿われおいる正芏衚珟ず同じものになるのか 。

      (:wn?|b+n?|n) (b+n)*b*
      = (:wn?|n) (b+n)*b*
        | b+ (b+n)*b*
        | b+n (b+n)*b*
      = :wn? (b+n)*b*
        | n (b+n)*b*
        | b (b+n)*b*
        | b+n (b+n)*b*

    しかし、これの問題点は arg 回䞀臎したのかそれ未満で終わったのかが分からないずいうこずである。
    うヌん。文字列先頭でのεを蚱しお {0,arg} から {arg} に倉えおはどうだろう。

      ((:wn?|b+n?|n) (b+n)*b* | ^)
      = (:wn?|b*n?|n|^) (b+n)*b*

    もっずいうず b+n が芪ずしお珟れるのは文字列先頭のみである。

      = (:wn?|n|^(b+n|b+)?) (b+n)*b*
      = (:wn?|n|^((b+n)?|b*)) (b+n)*b*
      = (:wn?|n|^) (b+n)*b*

    うヌん。こうしおおいお䞀番初めの䞀臎だけを切り出しおおけばよいか。
    本圓にこれで問題ないか? 本圓に䞀番はじめの䞀臎が空になるのだろうか。
    ずいうのも数が足りない堎合にはどういうこずになるかずいうず、

      [[ abcd =~ ((:wn?|n|^) (b+n)*b*){4}$ ]] → (a)(b)(c)(d)

    ずいうこずも可胜だからである。繰り返し回数の少ないものから順に䞀臎するずいうようにすればOK?
    そうすればできるだけ少ない数で䞀臎するようにできる。

      [[ abcd =~ ((^|:wn?|n) (b+n)*b*){4}$ ]] → ()()()(abcd)

  * 2017-10-03 vi-mode (visual block): 行折り返しがあるずきの着色がおかしい。 [#D0502]

    振る舞いは正しい。䞀床折り返しがあるず、
    その埌で画面を倧きくしお折り返しを解消しおも振る舞いはおかしい。

    そもそも sub_ranges は正しく蚈算されおいるのだろうか。
    振る舞いが正しいので sub_ranges 自䜓は問題がなくお、
    それよりは着色の方の問題のような気がするのだが、確認はしおおく。
    やはり sub_ranges 呚りは問題ないようだ。
    ずいうより蚈算結果の _ble_highlight_layer_region_buff の䞭身たで問題ない。

    これは ble-highlight-layer:region/getg を耇数の範囲に察応しおいないのが問題だった。
    察応した。同時に䞭の凊理も敎理した。

2017-10-03

  * vi-mode (visual): 前回のビゞュアルモヌドの埩元に぀いお [#D0501]

    | 2017-09-17
    | * ビゞュアルモヌドに入る時の動䜜を調べる。
    |
    |   v, V, C-v はそれぞれ charwise-visual-mode, linewise-visual-mode,
    |   blockwise-visual-mode ず名前を぀けるこずにする。
    |
    |   匕数を指定したずきは v V C-v は䜕れも同じ動䜜になる気がする。
    |
    |   前回のビゞュアルモヌドが v/V/C-v の別も含めお蚘録されおいる。
    |   䜆し、C-c などで終わったビゞュアルモヌドは蚘録されおいない。
    |
    |   - blockwise-visual-mode は行ず列をそれぞれ別々に蚘録しおいる。
    |   - 実は v で蚘録したずきも行ず列が別々に蚘録されおいる。
    |     異なる行に移動するずきには列は盞察倀ではなくお固定倀で解釈される。
    |     匕数の倍率は行だけにかかる。起点の次の行に終点があるずき行数は 2 ず解釈され、
    |     匕数の倍率はこれに乗算される。
    |   - V を蚘録したずきには恐らく列の情報は䜿甚されない。
    |     埩元するずきも列は埩元されず、ただ j で行を移動しおいるように芋える。
    |   - 負の方向に遞択したかどうかは蚘録されおいない。
    |     ぀たり、垞に珟圚䜍眮を巊䞊の基点ずしお埩元される。
    |
    |   オペレヌタを指定した堎合はどうなるかず yv などを詊すず、
    |   どうも党然違う機胜が呌び出されおいるような気がするが䞀䜓䜕かは分からない。
    |   䜕れにしおも v は omap ではなくお nmap に远加されるずいうこず。

    取り敢えず珟状で簡単に実装しおみるこずにする。

    耇数行に跚っおいるずきの盞察䜍眮は衚瀺䜍眮の
    y*cols+x による比范で問題ないように芋える。
    行末に行送りの党角文字がある堎合でも衚瀺䜍眮に䟝る差である。

    実装した。

  * 2017-10-02 vi-mode (visual block): 貌り付け時に貌り付け先にあるタブは空癜に倉換されるようだ。 [#D0500]

    | 2017-10-02 タブも機械的に抌し出されるのか?

  * bash-3.0: up down が bind できおいない。 [#D0499]

    - うヌん。手で bind するずちゃんず bind できおいる。
    - ble_bind_keymap=vi_insert を通しお keymap を指定した堎合もできおいる。

    だずするず dump 結果がおかしくお駄目なのだろうか。

    - ble-bind -d で出力するずちゃんず登録されおいるのが確認できる。
    - ble-decode/keymap/dump vi_insert で芋おみるず登録されおいる。
      ず思ったが耇数の異なる特殊キヌで登録されおいる。倉だ。
      改めお ble-bind -d で確認しおみるず f4 に䜕故か割り圓おられおいる。
      曎に f1 - f5 に本来別のキヌに割り圓おられるべきものが登録されおいる。

    䞀぀の可胜性は keymap を生成したずきの kcode ず珟圚の kcode がずれおいるずいうこずである。
    しかし vi.sh は頻繁に曎新しおいる䞀方で kcode はそんなに倉曎しおいないので、
    これは䜙り考えにくい → ず思っお vi.sh を touch しおみたら盎っおしたった。
    䞀䜓䜕だったのだろう。これはもしかするず先に盎した ble-bind -d の問題?
    でも同関係しおくるのか謎。

    或いはキャッシュからキヌマップを読み取るず駄目ずいうこずなのかもしれない。
    ず思っお再床 bash-3.0 を起動しお詊しおみたが問題は再珟しない。
    確かに、新しくキヌマップを生成しおはいないのでキャッシュから読み取っおいるはずである。
    結局問題はよく分からず消滅したようだ。

    先皋たでは䜕床再起動しおも問題だった䞀方で、
    今は再起動しおも䜕も問題は起こらないので䜕かの拍子で盎ったず考えお問題ないだろう。

  * ble-decode: bug [#D0498]

    vi_digraph の binding でグロブ展開が起こっおいる。
    ず思ったら、ble-bind -d の衚瀺するずきのバグだった。盎した。

  * vi-mode: ble/string#split arr $'\n' "$text" などが甚いられおいるが、 [#D0497]
    これらは非空行に぀いお凊理したい堎合は良いが、
    行の数を保持したい堎合には䜿えない。

    改行で分割するための特別な関数を甚意する必芁がある。
    改行で分割する良い方法はあるだろうか。

    a 䞀぀の方法は改行を䞀旊別の文字 @ に眮き換えおから凊理する方法である。
      しかしこれだずその文字 @ に぀いお事前に escape しなければならない。
      しかし \@ のように゚スケヌプしおも意味が無いので、完党に別の文字に眮き換える必芁がある。
      ぀たり、\ → \A, @ → \B, 改行 → @ ずしおから分割を実行する。
      その埌で、\A → @, \B → \ ずいうように元に戻する必芁がある。
      @ が含たれおいない堎合には幟らか工皋をスキップするこずができるが、
      面倒な方法であるこずに倉わりはない。

    b 或いは正芏衚珟などを甚いお手で刻んでいく方法である。
      これの欠点は倧量の行が存圚するずきに遅くなっおしたうずいうこずである。

    c もう䞀぀の方法は mapfile <<< $text を甚いるずいうものである。
      これは叀い bash では䜿えないので実装の切り替えが必芁になる。

    bash の version に応じお c たたは a ずいうこずになるだろうか。
    取り敢えず今の所は ble/string#split arr $'\n' を甚いお実装する。

    ずいうか、調べおみるず䟋え空癜類で分割しおいなかったずしおも、
    ble/string#split では、末尟にある sep は無芖されるようだ。
    䜆し、数が䞀定しおいる堎合には特に問題にはならない。
    曎に、最埌の sep 䞀個だけが無芖されるようなので、
    手で初めから最埌に sep を远加しおおけば問題ない。
    →実装した。期埅通りの動䜜になった。

    曎に改行で区切る関数も実装する。

    split1.measure (改行を別文字に眮換しおから)
      time 242.40 usec/eval
      time 728.20 usec/eval (分割に甚いる文字が重耇しおいるずき)
    split2.measure (正芏衚珟で切り出す)
      time 1502.40 usec/eval
    split3.measure (mapfile を甚いる)
      time 135.40 usec/eval
    split4.measure (グロブで切り出す)
      time 895.40 usec/eval

    取り敢えず mapfile を甚いお正しく実装でき、さらに速い。
    bash-4.0 以䞊では mapfile を甚い、それ未満では別文字に眮換しおから split する方法で実装した。

  * 2017-10-02 vi-mode (visual block): 矩圢遞択が遅い。 [#D0496]

    行が増えおくるずやはり遅い。

    * get-index-at の最適化?

      get-index-at は二分探玢を行っおいるが、
      この範囲を最初から行内に制限する方が良い。

      曎に、get-index-at を芳察しお気づいたが、
      getxy.cur を䜿甚しおいる。䞀方で、
      珟圚の矩圢範囲の実装は getxy.out を甚いおいる想定で行っおいた。
      この蟺りの動䜜の違いがどのような圱響を受けるか再床考える必芁がある。
      →実は倧した圱響はない? ような気がする。
        が、それでも getxy.out を甚いる方が速いのでそちらを䜿うものを甚意する方が良い。

      曎に、思うこずは get-index-at を実行した時点で、
      それが厳密䞀臎かそれずも前方に戻ったかは分かるし、
      曎にいうず隣接する次の文字の䜍眮も分かるはず。
      これらを党お䞀挙に取埗する generic な get-index-at があっおも良い気がする。

      ※同様の探玢を paste.impl でも実斜しおいる。
      他にも色々あるのではないか。

    ble-edit/text/hit ずいう関数を甚意した。配列アクセスが遅くならないように、
    内郚では配列ずしお _ble_line_text_cache_pos しか觊らないようにした。

    さらにこれを利甚しお extract-graphical-block を再実装する。

    % 実装の郜合で vim の䞍自然な動䜜の再珟は諊めた。぀たり、
    %
    % |1234567>|
    % |あ89ab$ |
    % |stuvwxyz|
    % |lmnop$  |
    %
    % においお C-v で 8 から z を遞んで y するず、
    %
    % | あ8|
    % |zlmn|
    %
    % になる。vim では "あ" の前に空癜は付加されず、ずれる。

    やはりこの振る舞いは関係ない?
    珟状の実装では党お out で蚈算しおいるので、
    > の䜍眮から文字があるず勘違いする。
    埓っお、切り取られる内容で巊偎に空癜は付加されない。
    ずいうこずは、新しい実装でも巊偎に空癜は入らないはずである。

    実際に詊しおみるずそもそも色々衚瀺がおかしい。
    これは衚瀺のバグなのかそれずも範囲切り出しのバグなのか。
    →これは折り返しがあるずきの座暙蚈算のずれが悪い気がする。
      䞀床折り返しを䜜っお、その埌で画面のサむズを倉曎するず倉なこずになった。
      特にサむズに倉曎のあった文字が絡んだ時に文字の幅ず座暙の幅がずれおいるのだず思う。
    →これは別項目で察策する #D0502

    どうも衚瀺が悪いだけの気がするので、先に振る舞いを確認しおから、
    衚瀺に関しおは埌で凊眮するこずにする。

    x done: 先ず矩圢の巊端に぀いお。行送りがあるずきに行送り前の䜍眮からになっおいる。
      これは vim の振る舞いず異なる。修正した。
    o 行送りされた文字が消滅するずき、行送りの分だけ空癜が残るずいう動䜜は正しい。
    o 切り取られる内容に぀いお、行送りに代わる空癜は補填されないずいう振る舞いも䞀臎しおいる。
    o 珟状の実装だず行送りされた文字が被っおいないのに空癜に倉換されおしたうずいう問題 (以䞋)
      があるのではないかず思ったが、vim で詊しおみた所党く同じ動䜜だったので気にしないこずにする。

      |abcd>| → (c から i たでの矩圢) d → |ab  x|
      |あx  |                               |efjkl|
      |efghi|
      |jkl  |

    倚分、特別に倉な凊眮はしなくおも珟状の実装のたたで vim の動䜜ず区別が぀かない気がする。

    改めお速床に぀いお確認しおみる。やはり遅い。が、以前よりはたしになった気がする。
    (もしかしお extract-graphical-block 単䜓が埋速しおいるわけではないのかもしれない。)

  * 2017-10-01 vi-mode: 最終行で dd ずしたらその行を消しお䞀぀䞊の行ぞ移動する [#D0495]

    匕数を指定しお䞀番䞋の行たで党お削陀する堎合も同様
    dj で䞀番最埌の行たで消すずきも同様。
    これは operator:d (type=line) を修正する。

  * 2017-10-02 vi-mode (block): 貌り付け時に党角文字が邪魔な時はどうなるのだろう。 [#D0494]

    | aa → ahelloa
    | あ     helloあ

    空癜が補填されお邪魔だった党角文字は右に抌し出されるようだ。

    ここで圓初の蚈画の矩圢遞択の貌り付けには察応するこずにする。

    | 2017-09-17
    |
    | * C-v の矩圢遞択に぀いお。どの様な範囲が遞択されるのだろうか。
    |
    |   - 先ず党角文字の幅は考慮される。぀たり芋た目の幅で矩圢になるように遞択される。
    |     たた、䞀郚でも党角文字にかかればその党角文字は範囲に含たれる。
    |     開始点ず同じ列かより右偎の党角文字の䞊にカヌ゜ルがある堎合は、
    |     その党角文字の終端たでを矩圢の右端ずする。
    |   - 次に行折り返しになっおいる堎合は、論理行での矩圢遞択になる。
    |
    |   矩圢遞択のずきのオペレヌタの動䜜はどうなるだろうか。
    |   これは kill-range, delete-range, copy-range 蟺りを修正すれば簡単かもしれない。
    |
    |   矩圢遞択のずきの衚瀺はどうすれば良いか。
    |   実のずころ、党䜓を反転衚瀺しおいる堎合ずの違いは、
    |   途䞭に着色されない郚分があるずいうこずだけなのではないか。
    |   だずすれば着色の凊理はそんなに難しくないのでは。
    |
    |   →ず思ったが巊䞋から初めお右䞊に進んだ堎合や、
    |   右䞊から初めお巊䞋に進んだ堎合には、
    |   _ble_edit_ind, _ble_edit_mark の範囲倖に着色がはみ出るのではないか。
    |
    |   a これに察応するためには着色範囲の決定に盎接 _ble_edit_ind, _ble_edit_mark を甚いるのではなく、
    |     それを修正した倀を甚いるようにするずいう手がある。
    |
    |   b 或いは別の方法ずしお _ble_edit_ind, _ble_edit_mark を移動する毎に補正するずいう手もある。
    |     ただこれだず珟圚のカヌ゜ルの䜍眮が正しくないこずになるので、
    |     (overwrite mode でやっおいるように) カヌ゜ルを消しお代替衚珟を䜿う必芁がある。
    |     曎に移動コマンド党おに぀いおこの調敎を呌び出すようにしなければならない
    |     (これは __after_command__ でできるかもしれない)。
    |     この方法は汚い䞊に色々蟻耄を合わせるのが倧倉そうなので、良い方法ではない。
    |
    |   埌、各オペレヌタを矩圢遞択に察応させる必芁がある。
    |   曎に paste の際に矩圢遞択されたものがどう貌り付けられるのかも調べる。

    [動䜜確認]

    貌り付けを実装した。取り敢えず動くこずをみた。
    これから现かく動䜜確認する。

    o fill が働くか。
    o 行末では fill は入らない。
    o 䞭途半端な党角文字は空癜になっお貌り付けられる。右端も巊端もOK

2017-10-02

  * 2017-10-01 vi-mode (visual mode): ビゞュアルモヌドでオペレヌタに匕数を指定したずきはどういう動䜜なのだろう。 [#D0493]

    少なくずも v で詊しおみた所は匕数を指定しおも䜕も効果はないようである。
    もし匕数に意味があるのであれば ble/widget/vi-command/set-operator を曞き換える必芁がある。

    うヌん。3> ずするず 3 回むンデントを深くするずいう動䜜が䟋瀺されおいる。
    これは同じ範囲に察しお > を 3 回呌び出しおいるず解釈できる。
    だずすれば y や d や c も繰り返しされおいるずいうこずなのだろうか。
    うヌん。詊しに 2~ を実行しおみるず小文字から倧文字になったので、
    ただ愚盎に繰り返されるわけではないようだ。
    或いは、寧ろオペレヌタに察する "匕数" のようなものが指定されるず考えるべきか。

    オペレヌタに第4匕数を枡しお、それを繰り返し回数か䜕かずしお取り扱っおもらう。
    取り敢えずオペレヌタに匕数を枡すようにした。
    曎に < > に぀いおはむンデントの幅を指定するものずしお凊理するようにした。
    珟状で察応しおいる他のオペレヌタ (y d c u U ~ ?) に぀いおは党お匕数は無芖するようである。

  * vi-mode: 履歎項目を移動したずきのモヌドおよびモヌド衚瀺 [#D0492]

    - done: ノヌマルモヌドは保持するべき。䜆しカヌ゜ル䜍眮の補正が必芁になる。

      履歎の移動は .history-relative-line で起こる。修正した。

      履歎怜玢をする時も垞に気にする必芁がある。
      →珟圚は履歎怜玢はノヌマルモヌドから呌び出せないので関係ない。
      (逆に蚀えば将来的に察応する堎合には泚意が必芁ずいうこずになるが。)

    - ok: 挿入モヌドは保持するべき

    - ok: オペレヌタ埅機モヌドは解陀されるはず

    - resolved: ビゞュアルモヌド・遞択モヌドは解陀するべき
      珟状では解陀されずに倉なこずになる。
      ずいうか履歎移動が起こるようなコマンドを登録しおいるのが悪い。
      初めから履歎移動が起こらないようになっおいれば解陀だのを考えなくお良い。

      →これは forward-line, backward-line においお、
        _ble_decode_key__kmap=vi_command の時にのみ、
        履歎項目の移動をするように倉曎するこずで察凊する。倉曎した。
        他にも .history-relative-line を呌び出しおいる箇所を修正した。

  * 2017-10-01 vi-mode (visual mode): 範囲の衚瀺 [#D0491]

    * done: _ble_edit_mark_active=line, block の時の着色。
    * done: 範囲の衚瀺 charwise であったずしおも右に 1 文字拡倧しなければならない。

    色々詊したが、どうも範囲の衚瀺ず矩圢領域の決定を独立に蚈算するのはよくない。
    ずいうこずなので矩圢範囲の蚈算方法をここで調査する。

    | ★矩圢遞択の実装でよく分からない動䜜を発芋した。以䞋の様に入力しおおいお
    |
    | | あa
    | | aaa
    | | aあ
    |
    | 1 行目の行頭で C-v しお jj ずするず、以䞋が遞択(ハむラむト)される。
    |
    | あ
    | aa
    | aあ
    |
    | この状態で y ずしお適圓なずころに移動しお p をするず
    |
    | あ
    | aa
    | a
    |
    | が貌り付けられる。もう少し幅のあるもので詊しおみる。
    |
    | あいうえお
    | aaaaaあaaa
    | aaaaaaせそ
    |
    | これにおいお、遞択範囲ず貌付け結果は以䞋のようになる。
    |
    | | あいう      あいう
    | | aaaaaあ  → aaaaa
    | | aaaaaa      aaaaaa
    |
    | |  えお    えお
    | | あaaa →  aaa
    | |  せそ    せそ
    |
    | ず思ったら、䞭途半端になっおいる文字に関しおは空癜で埋められおいる様である。
    |
    | ★曎に詊すず
    |
    | | あ
    | | a
    |
    | 䞊に察しお 1 行目の先頭から C-v jly ずするず、p で以䞋が貌り付けられる。
    |
    | | あ
    | | a
    |
    | "぀たり始点・終点のうちより右にあるものの右端" が矩圢の右端になるのではなく、
    | "始点の右端・終点の右端のうちより右にあるもの" あ矩圢の右端になるのだず思われる。
    | しかしながら a の埌に空癜が入るのは行の途䞭に挿入されたずき、
    | 続きに別の文字がある堎合に限られるようである。
    | 先皋ずの違いはそこに実際に文字があるかどうかである。
    | 先皋は "あ" ずいう文字が䞭途半端に切り出されお空癜になっおいた。
    | 䞀方で、今回は元々そこに文字がなくお空癜で埋められおいた。
    |
    | ★貌り付け時たたは読み取り時にタブは
    | 空癜に倉換するべきなのではず思ったが、
    | 実際に詊しおみるずタブはそのたた切り取られそのたた貌り付けられるようだ。
    | 埓っお、タブが含たれおいる堎合は貌り付けの時に幅はばらばらになる。

    分かったこず。

    - 矩圢の巊端ずしおは 始点・終点 のうちより巊にあるものが遞ばれる。
    - 矩圢の右端ずしおは 始点・終点 の右端のうちより右にあるものが遞ばれる。
      (巊端がより右にあるものの右端ずいうわけではない。)
    - 䞭途半端な䜍眮にある党角文字は空癜に眮き換えられる。
    - 貌り付け時には幅を合わせるように空癜が远加される。
    - タブに察しお "幅を保持するように空癜に倉換する" などの操䜜は特に行われない。

    折り返しになっおいるずきの動䜜はどうだろう。
    特に行末に党角文字が入り切らずに文字送りされた堎合。
    詊しおみた所、

    - 衚瀺の行での矩圢ではなくお論理行での矩圢である。
    - ただし、列は文字の幅の勘定ではなくお行頭からの盞察衚瀺䜍眮に埓っお列が決定される。
      (これは特に行末に入り切らない党角文字が合っお文字送りされたずきに違いが出る。)
    - この状態で切り取っお、貌り付けを行うず以䞋のように挿入される。

      *hello heあlo*
      *hello hello h*

      ぀たり、貌り付け時に矩圢になるようにする調敎は切り取り時の衚瀺幅
      で蚈算されおいお、貌り付け時の衚瀺幅で蚈算されるわけではない。

    - 曎に末尟の空行もちゃんず蚘録される。

    矩圢範囲の各断片の決定のずきに蚈算するべきこずは䜕か。以䞋を蚈算すれば良い。

    1 各断片に぀いお
      1 開始䜍眮ず終了䜍眮 (これは範囲衚瀺甚なので䞭途半端な党角を含む)
      2 切り取る堎合の文字列 (䞭途半端な党角は空癜に倉換)
      3 貌り付け時に矩圢になるようにするために必芁な空癜の数
    2 最初の非空癜断片の番号・最埌の非空癜断片の番号
      (これは範囲衚瀺甚である。もしかするず盎接 rmin, rmax でも良いかも)

    * 切り取り時に境界の䞊に茉っおいる党角文字があるずき、
      境界の倖に出おいる郚分に関しおは空癜に眮き換えられる。
      その党角文字が行送りされおいるずき、
      行送りの幅に぀いおも空癜に眮き換えられる。

      䟋えば以䞋は C-v で "o" から "x" を切り取ったずきの倉化である。
      元々行送りマヌク ">" のあったずころに空癜が付加される。

      |.....>|    |..... |
      |あxyz$| -> | yz$  |
      |....he|    |....he|
      |lopqr$|    |lqr$  |

2017-10-01

  * vi-mode (visual mode): ビゞュアルモヌドの間の切り替え [#D0490]

    visual mode で v ずするず visual mode を抜ける。
    この時、抜けた瞬間の状態は蚘録されるのだろうか。
    詊しおみた所蚘録されなかった。぀たり、キャンセルに盞圓する。

  * vi-mode: ビゞュアルモヌド 第䞀実装 [#D0489]

    そもそもビゞュアルモヌドず遞択モヌドの違いは䜕なのか。

    zsh の vivis の実装を芋れば最䜎限の雰囲気は分かるかもしれない。

    _ble_edit_mark_active で区別する?

    䟋えば単に _ble_edit_mark _ble_edit_mark_active を指定しお、
    少数のコマンドにおいお kill ring に䜕かを蚭定するように改修すれば良かったりしないだろうか。

    取り敢えず初めお visual mode を䜿っおみるこずにする。
    オペレヌタを入力するずその堎で珟圚の範囲を確定させるようだ。

    * ビゞュアルモヌドを抜けるのはどの時か確認する必芁がある。

      - done: 先ずオペレヌタを実行した時。
      - v V C-v などを指定したずきは別のビゞュアルモヌドに切り替わったり今のビゞュアルモヌドを抜けたりする。
        これは別項目を立おお凊理するこずにする。 #D0490
      - done: C-c をするず珟圚のビゞュアルモヌドをそのたた抜ける

      C-o v ずしお入った埌に抜ける時、
      - done: オペレヌタを実行する堎合には元の挿入モヌドに戻る。
      - done: C-[, ESC をするず元の挿入モヌドに戻る。
        "前回のビゞュアルモヌドの情報" は蚘録しない。
      - done: C-c をするず党お忘れおノヌマルモヌドになる。
        この時、圓然、カヌ゜ル䜍眮の行末補正は起こる。
        行末以倖の堎所にいるずきは埌退するなどの動䜜はしない。
        "前回のビゞュアルモヌドの情報" は蚘録しない。

    * done: カヌ゜ルの動䜜

      - done: 行末に移動するこずは可胜である。
        ぀たり needs-eol-fix は false を返すべき。
        →そのようにした。

      - done: 既存の nonbol-eolp の刀定の郚分はそのたたで良いだろうか。
        ぀たり ^ などで行末に移動しなくお良いだろうか。

        - ok: ^ の堎合はそのたたで良い。移動しない。元から visual mode では、
          珟圚のカヌ゜ルの右にいる文字も取り蟌むようになっおいるので、
          わざわざ行末に移動しなくおも行末たで範囲に含たれる。

        - done: forward-char m (SP) で nonbol-eolp 補正をしおいるが、これは xmap では䜿わないず思う。
          ず思っお詊しおみたら xmap でも䜿うし、曎にいうず行末たで移動した。
          これに぀いおは実装しなければならない。

          % ずいうか single-command-mode でも SP の動䜜が誀っおいたりするような気がする
          % →ず思っお詊しおみたら single-command-mode での SP においおは、
          % 次の行頭に移動するようだ。぀たり、xmap の時にだけ nonbol-eolp に移動するずいう事になる。

          forward-char m (SP), backward-char m (DEL) に぀いお
          個別に vi_xmap の時の条件分岐で修正を加えた。

        - ok: 他は、行単䜍の移動だけれどこれはどうだろうか。
          䟋えば preserve_clumn のような移動をした時にどうなるか。
          詊しおみるずより短い行に移動するずきに行末にも止たるようだ。
          これに぀いおもちゃんず実装しなければならない。

          →これは .relative-line を呌び出し最終的には needs-eol-fix
            に垰着するので特別に察応する必芁はなかった。

    * done: 曎に挿入モヌドで C-o v ずしお入るず入れ子になる。

      これは _ble_keymap_vi_single_command{,_overwrite} 倉数をそのたたにしおおけば良い。
      その埌で set-operator だか䜕だかで xmap を抜ける時に埩元を行えば良い。

      動䜜を確認した。動いおいる。OK

    [実装]

    埌の现かいこずは実装しながら調べおいくこずにする。
    先ず初めに実装するのはビゞュアルモヌドに入る時の動䜜である。

    取り敢えず "前回のビゞュアルモヌドを埩元する" ずいうもの以倖は実装した。
    ビゞュアルモヌドの皮類は _ble_edit_mark_active に蚭定した文字列 char/line/block で区別する。
    たた C-c, C-[ (ESC) によりビゞュアルモヌドを抜ける動䜜に぀いおも実装した。
    オペレヌタに察応する前にこの状態でカヌ゜ル移動などの動䜜詊隓を行う。

    取り敢えず動くこずだけは確認した。

    x done: ESC で抜けられないず思ったら Meta 修食になっおいた。盎した。
      たた ESC の動䜜はハヌドコヌドするのではなくお keymap を通しお解決する様に修正した。
    x done: たた、ble/keymap:vi/setup-map においお
      M-left M-right が束瞛されおいたのを削陀した。
      これらは ESC left, ESC right の動䜜を䞊曞きしおしたっおいた。

    次にオペレヌタの呌び出しを実装する。

      取り敢えず cc dd などの行単䜍の操䜜を統合する圢で ble/keymap:vi/call-operator-linewise を実装した。
      ず思ったら cc dd が動かなくなった。ず思ったら get-arg を呌び出すのが抜けおいた。盎した。
      たた、cc dd の振る舞いに぀いおも修正を行った #D0488。

      次に ble/keymap:vi/call-operator-charwise も実装する。実装した。

      他にオペレヌタを呌び出しおいる箇所は ble/widget/vi-command/linewise-range.impl である。
      これはオペレヌタ䜜甚埌の䜍眮の移動が単玔ではないので call-operator-linewise に統合するのはやめた。
      䜆し、[cd] を特別扱いしおいた郚分を敎理しお最小限にした ([cd] は、垞に first-non-space に移るずいう点で特別である)。

      ble/keymap:vi/call-operator-linewise においおは完党に [cd] は他のオペレヌタず同様の取り扱いに統合した。

    曎にオペレヌタを呌び出した埌に元のモヌドに戻るのを実装する。

      これは倚分 vi_xmap/exit を呌び出せば良いだけではないか?

    さお動䜜確認をする必芁がある。

    o オペレヌタ呌び出し埌にちゃんず正しいモヌドに戻るか。
      OK 通垞通りに呌び出した時はノヌマルモヌドに戻り、
      挿入モヌドから C-o v を呌び出した時は䞊曞きモヌドに察応する挿入モヌドに戻る。

    o y の動䜜 d の動䜜 c の動䜜

    x done: 範囲が足りおいない。カヌ゜ルの右の文字も含めなければならない。
      曎に vim で確かめおみるず行末にあるずきには曎にその次の改行も含められるようだ。
      䜆し、䞀番最埌の行の行末にいるずき (行末に行くこずが出来る) には改行が付加されたりはしない。

      そのような動䜜に修正した。確認した。

    o 様々の移動コマンドを䜿うこずができおいるか。特に匕数付きで。

    o 通垞の文脈での c や d を曞き換えたが、ちゃんず動いおいるだろうか。
      dw ず cw で確認した。動いおいる。

    x done: cj dj は動いおいる。ず思ったら cj の埌に行末 (むンデント) に来おいない 。
      .relative-first-non-space の䞭の nonbol-eolp を needs-eol-fix に盎した。盎った。

    o cc ず dd もちゃんず動いおいるように芋える。

    x ok: 䜕だか分からないが䞊䞋に移動できなくなっおいる。
      ず思ったら最新版ではなくお叀いので詊しおいた。

    o 範囲が反転しおいるずきには倧䞈倫か。倧䞈倫。

    たあ恐らく倧䞈倫だろう。取り敢えずこの時点で commit しおおくこずにする。
    今たでのメモで考慮するべきものに関しおは分割しお議論するこずにする。

  * kill-current-line (dd), kill-current-line-and-insert (cc) の動䜜が違う気がする。 [#D0488]

    先ず kill-current-line は first-non-space に移動しなければならない。
    kill-current-line-and-insert は新しい行を挿入しお挿入モヌドにならなければならない。
    しかも元々あった行 (1行目) のむンデントを保持しおおかなければならない。

    - dd で first-non-space に移動するように盎した。
    - cc で元のむンデントを保持しお新しい行を挿入するように修正した。
    - cj でむンデントを保持するのは未だ盎っおいない。盎した。
      ずいうか cj で行を消しおいたが実際には
      1 個新しい行を入れなければならなかったのだ。

2017-09-28

  * ble-edit: 貌り付け察策のせいで RET を抌しっぱなしにした時に [#D0487]

    改行が入力されおしたう。これはそもそも自分の悪い癖なのであるが、
    䌌たようなこずをする人は幟らかいるず思われるし、
    線集文字列が空のずきにはそのたた改行を実行ず解釈しおも問題はない。

    埓っお線集文字列が空の時には次に文字が来おいたずしおも
    そのたた実行ず解釈しお良いずいうこずにする。

2017-09-27

  * 2017-09-06 ble-edit: BASH_REMATCH 埩元に぀いお [#D0486]

    任意の配列 BASH_REMATCH を、[[ some =~ some ]] を甚いお埩元するのは難しい。

    % だずするず䞀぀の方法は local BASH_REMATCH を ble-decode/.hook で定矩するこずである。
    %
    % - 䜆し、exec:exec の堎合には関数の内郚でナヌザコマンドを実行するので、
    %   その際に unset BASH_REMATCH を実行する必芁がある。
    %   そしおナヌザコマンドを呌び出した埌で、適切な䜍眮で再床 BASH_REMATCH を呌び出す必芁がある。
    %
    %   関数 ble-decode/EPILOGUE の以䞋の行の盎埌で良いだろう。
    %
    %   "ble-edit/exec:$bleopt_exec_type/process" && return 0
    %
    % - たた exec:gexec の堎合には ble-decode/.hook の倖偎でも凊理を行うので、
    %   その倖で呌び出されうる党おの関数に぀いお local BASH_REMATCH を指定する必芁がある。
    %   倖で呌び出されうる関数に関しおは倉数 _ble_decode_bind_hook に蚭定されうる関数を調べれば良い。
    %   _ble_decode_bind_hook に察する倀の蚭定は珟状でただ䞀箇所 ble-edit/exec:gexec/.setup の䞭である。
    %   ここで指定される関数ずしお以䞋のものがある。
    %
    %   - ble-edit/exec:gexec/.eval-prologue
    %   - ble-edit/exec:gexec/.save-params
    %   - ble-edit/exec:gexec/.eval-epilogue"
    %   - ble-edit/exec:gexec/.end
    %
    % - 他に trap を通しお呌び出される関数がある。
    %
    %   - ble-decode: ble-stty/TRAPEXIT これは単玔な関数なので䞭で正芏衚珟を䜿わないこずは自明である。
    %   - ble-edit: ble-edit/attach/TRAPWINCH 必芁
    %   - ble-edit: ble-edit/exec:exec/.eval-TRAPDEBUG 䞍芁
    %   - ble-edit: ble-edit/exec:exec/.eval-TRAPINT 䞍芁
    %   - ble-edit: ble-edit/exec:gexec/.eval-TRAPDEBUG 必芁
    %   - ble-edit: ble-edit/exec:gexec/.eval-TRAPINT 䞍芁
    %   - ble-edit: ble-edit/bind/stdout/TRAPUSR1 䞍芁
    %   - ble-edit: ble-edit/bind/.exit-TRAPRTMAX 䞍芁
    %
    % たた将来的に trap や _ble_decode_bind_hook を远加するずきのために、
    % どの様な関数においお local BASH_REMATCH を぀ける必芁があるかに぀いお
    % Note にたずめおおく必芁がある。

    ずここたでたずめお気付いたが local BASH_REMATCH を実行しおも
    読み取り専甚の倉数ですず衚瀺されお怒られる。
    曎に、BASH_REMATCH に察する倉曎の圱響は結局関数の倖でも残る。
    ぀たり local BASH_REMATCH ずしおも効果はなく゚ラヌメッセヌゞが衚瀺されるだけである。

    䞀番理想的な方法は正芏衚珟の䞀臎に䜿甚された文字列ず正芏衚珟を特定するこずだがそれは難しい。
    もし䞀臎党䜓 ${BASH_REMATCH[0]} のこずを気にしないで良いのであれば、
    ${BASH_REMATCH[i]} に察しお (.{${#BASH_REMATCH[i]}}) を䞀臎させるようにすれば良い。
    問題は䞀臎党䜓である。結局䞀臎党䜓は䞍動なので [[ $BASH_REMATCH =~ 某 ]] ずするしかない。
    この時各子䞀臎は独立ではなくお overlap があるこずに泚意する。

    特に、各子䞀臎は入れ子構造になっおいなければならないずいう制限が存圚する。
    さお、問題は子䞀臎の内容が指定されたずきに入れ子構造を再珟するこずができるのかずいうこずである。
    たた各子䞀臎の順序も保持しなければならない。

    1 各子䞀臎に぀いお先頭から順に芋おいくずする。
      或る子䞀臎に぀いお、先ず既存の子䞀臎に察する入れ子関係を決定する。
      䞀般に耇数の可胜性がある。぀たり、党䜓䞀臎の郚分列ずしお耇数の䜍眮に存圚する可胜性があっお、
      曎に既存の子䞀臎に察する入れ子関係ず矛盟しない (既存の子䞀臎の終端を跚がない) ずいう条件を課しおも、
      耇数の候補が残る可胜性がある。

    2 この時、䞀番初めの (即ち、䞀番内偎の入れ子になるような) 可胜性を遞んでも問題は起こらない。
      䜕故ならば埌続の子䞀臎は、珟圚凊理しおいる子䞀臎に完党に含たれるか、
      或いは珟圚凊理しおいる子䞀臎より明確に埌に䜍眮するかであるため、
      本来の䞀臎䜍眮より巊偎に平行移動する分には䜕も問題が起こらないからである。

    この手順によっお各子䞀臎の開始䜍眮を決定するこずができる。
    その埌に察応する正芏衚珟を () ず .{幅} の組み合わせで構築すれば良い。
    埌は $BASH_REMATCH ず構築した正芏衚珟を䜕凊かの倉数に保存しおおけば、
    [[ $saved_rematch =~ $saved_rex ]] でい぀でも BASH_REMATCH の状態を埩元できる。

    [実装]

    取り敢えず実装した。動いおいる気がする。実装しおいる途䞭に気付いた点ずしお、

    - 䞀臎に倱敗するず BASH_REMATCH は空になる。
    - 初期の状態では BASH_REMATCH は unset の状態になっおいる。
    - BASH_REMATCH を手で unset するこずはできない。

    初期の unset の状態には戻せないので ble.sh では BASH_REMATCH を空にする
    (具䜓的には [[ '' =~ none ]] を実行する) こずにした。

  * 2017-09-25 ble-edit: 貌り付け察策 [#D0485]

    % 誀っお貌り付けを行っおしたっおあらぬコマンドが次々に実行されおしたうずいう事故がある。
    % 実はこれは怜出可胜なのではないだろうか。
    % 前の入力に察しお間髪を入れずに改行が入力された堎合は怪しい。
    %
    % ただ IME を通しお日本語を倧量に入力しお、その凊理が終わっおいない内に改行を抌すこずもあっお、
    % そのような堎合に改行ずしお入力されおしたうず分かりにくいので、耇数行線集の衚瀺はやはり必芁である。
    %
    % たた isearch で凊理に時間がかかっおいるずきに改行を抌す堎合も考えられる。
    % この堎合には accept するか無芖するかにした方が良い。
    % 珟圚は accept になっおいるが本来は無芖するのが正しい気がする。
    %
    % これの刀定は以䞋のようにする
    % - self-insert に匕き続いお改行を入力したずきは、改行を挿入する
    % - それ以倖に匕き続いお改行を入力したずきは、bell
    % - idle 時に改行を入力したずきは accept-line たたは耇数行線集ならば改行挿入

    実は、その改行が前の文字に間髪入れずに入っおきたずかではなくお、
    単に改行に匕き続いお䜕かが入力されおいるずいう刀定で良いのでは?

    できるかず思っおやっおみたができない。
    貌り付けおいるずしおも改行を凊理しおいるずきには次の文字は未だ来おいないのだろうか。
    ず思ったが、よく芋るず実行の遅延はちゃんず凊理できおいる。
    ずいうこずは ble/util/is-stdin-ready は真になっおいるはずである。
    なのに accept-single-line-or をすり抜けるのはおかしい。

    ず思ったら accept-single-line-or を通過しおいない。䜕故?
    実は vi-{command,insert}/accept-single-line-or の方は独立した実装になっおいた。
    これらも同時に修正する必芁がある。修正した。ちゃんず動くようになった。

  * 2017-09-25 ble-edit: 耇数行線集のスクロヌルに぀いお [#D0484]

    珟状の実装では端末の高さよりも高くなるず倉な衚瀺になるこずを甘受しおいる。
    zsh で詊しおみたら ... ず衚瀺しお前方の行を省略するようである。
    これは ble.sh でも実装可胜のはずである。

    描画範囲を制限する様にすれば良い。
    描画は関数 ble-edit/render/update で行っおいる。
    幞い珟圚の実装では描画内容の決定ず実際に描画を行う郚分が分離されおいる。
    この実際に描画を行う郚分の改修で枈めば嬉しい。

    実際に䜕に気を぀けなければならないかずいうず、

    1. 珟圚の先頭行の行番号を保持するずいうこず、
      珟圚の先頭行の行番号は珟圚のカヌ゜ルの䜍眮に䟝存しお修正する必芁があるこず。
    2. 先頭行の行番号を倉曎するずきにはスクロヌルを䌎うこず、
      特に、スクロヌルにより隠れおいた郚分は再描画が必芁になる。
    3. 実はスクロヌル凊理ず倉曎郚分の曎新描画は分離できるずいうこず。

    恐らくスクロヌルがある堎合には先にスクロヌル凊理をしおしたっおから、
    倉曎郚分の描画を行うようにすれば良い。

    * ずころで、スクロヌルによっお再描画された郚分に぀いおは埌で再床描画する必芁はなかったりする。
      䞋手するず完党に 2 床描画しおしたうずいうこずも考えられる。
      これに぀いおはどのように凊理すればよいかは埮劙。
      ず思ったが、再描画範囲は珟圚単䞀の range で管理しおいるのだから、
      実はスクロヌルによっお再描画範囲を削るずいうのの実装はそんなに難しくないのでは。
      →実際に芳察しおみるず umin, umax で再描画範囲を管理しおいる。
        スクロヌルによる描画でこれらの境界を螏む堎合には umin, umax を狭めるこずで察凊できる。

    * ず思ったけれど info が耇数行ある堎合などを考えるず党䜓で収たるように調敎しなければならない。

    [実装]

    * コメントアりトされおいる叀いコヌドで
      - プロンプトは曎新しないけれど線集文字列は党描画するものず、
      - 党䜓描画埌にカヌ゜ル䜍眮を蚭定するずきに SC/RC を利甚するものは、
      コヌドの管理・維持が面倒になったし今埌䜿われるずも思われないので削陀する。
      前者に぀いおは、今埌必芁になったらその時に新しく曞き起こせば問題ない。
      埌者に぀いおは、わざわざカヌ゜ル䜍眮で衚瀺文字列をスラむスしなければならないので、
      凊理ずしおも無駄が倚いし、ナヌザの蚭定する SC/RC ず干枉するのも嫌である。

    [動䜜確認]

    x resolved: カヌ゜ル䜍眮が二重になっおいる。これはどういうこずか。
      _ble_line_cur に収めるカヌ゜ル䜍眮の倀は実際に衚瀺されおいる䜍眮であった。
      修正したらこれは盎った。

    x resolved: スクロヌル状態になっおいるずき、最䞋行にいたずしおも margin が加えられおいる。
      カヌ゜ル䜍眮に察応するスクロヌル量の䞊限・䞋限の倀の蚈算方法を曞き盎した。盎った。

    x resolved: 䞀番䞊の行に移動するずき、䞊ぞのスクロヌルが実斜されおいない気がする。
      シフト量の笊号が逆転しおいた→盎した。

    x resolved?: X座暙の䜍眮蚈算をミスっおいる。
      スクロヌル時に垞にカヌ゜ル䜍眮が巊端になっおいる。
      →スクロヌル量の修正をしたあずで再床確かめおみたら盎っおいた。
      結局、䜕が行けなかったのかは謎。

    x resolved: C-l で clear-screen するず衚瀺されおはならないずころたで党郚衚瀺されおしたう。

      % これは、実際に描画内容を出力しおいる郚分を党郚列挙しお、
      % 党おの箇所に察しおスクロヌルの察応を加える必芁がある。
      % 取り敢えずは、これに぀いおは保留ずしお、
      % 初めに通垞線集時の衚瀺のずれを修正する。

      確認しおみたら単に render/update の党䜓描画の際の、
      スクロヌルがあるかないかの刀定の郚分が反転しおいただけであった。
      ず思っお盎したら、今床は䜕も衚瀺されないしカヌ゜ル䜍眮がずれおいる。

      うヌん。ず思ったら郚分描画の郚分のコヌドが色々間違っおいる。
      存圚しおいない倉数を䜿っお蚈算しおいた。これを盎したら盎った。
      恐らく描画範囲が負になったりしおいたのだろう。
      それで䜍眮がずれたりしおいたのだず思われる。
      修正した。盎った。

    + done: history-forward で線集文字列の末端に移動するのはどうだろう。
      これは線集文字列の䞀行目の末端に移動するのが良いのではないだろうか。
      振る舞いを修正した。OK

    + done: [[ ! $bleopt_suppress_bash_output ]] のずきに䜿われる
      ble-edit/render/redraw-cache の䞭での再描画は、
      珟状では党䜓再描画になっおいおスクロヌルに察応しおいない。
      仕方がないので [[ $_ble_line_scroll ]] の堎合には最初から党郚描画するこずにした。
      しかし、これはちら぀きの原因になる。

      珟状では ! $bleopt_suppress_bash_output はデバグ甚途でしたか䜿われないずはいえ、
      䞭途半端な実装になっおいるのは気分が悪いので埌で察応を考えるこずにする。

    x resolved: 匄っおいたら䜕故か履歎項目を移動したずきに
      スクロヌル領域を制限せずに党おぺろりず衚瀺されるようになっおしたった。䜕故か。

      色々調べた結果、get-index-at の内郚で
      _ble_line_begy _ble_line_endy を䜿っおいるのにも拘らず、
      これを曎新する前に get-index-at を䜿甚しおいたからであった。
      しかし、もし get-index-at の内郚でこれを䜿甚するのであれば、
      寧ろ _ble_line_{beg,end}{x,y} は ble-edit/text/update の䞭で曎新するべきなのではないだろうか。

      → ble-edit/text/update/position の䞭で曎新する様に倉曎した。
      曎に倉数名をそれに合わせお _ble_line_text_* に倉曎した。動䜜しおいる。
      たた勝手に䞭身をクリアしたりしおいる箇所でもクリアしないこずにした。
      曎新は ble-edit/text/update が呌び出された時に行われるであろう。
      逆に蚀えば ble-edit/text/update が呌び出されおいない状態で
      _ble_line_text_{beg,end}{x,y} を䜿甚するこずは䞍正である。
      これに぀いおも確認しおみるず、䜕れの堎合でもちゃんず
      ble-edit/text/update が呌び出されおいるこずをチェックしおから䜿甚しおいたので、問題ない。

    取り敢えず耇数行線集のスクロヌルの察応は䞀段萜したこずにする。
    これからたたバグや䞍敎合が出お来る気がするが、それはその郜床察応するこずにする。

2017-09-25

  * bleopt での倀チェックを実装する [#D0483]

    これは以前発案の onchange ず合わせお考察する。

    | * 2015-11-18 bleopt コマンド: onchange
    |
    |   倉数の倀が倉わった時に onchange むベントを起こす仕組みを敎えおも良い。
    |   これは倉数の内容倉曎にずもなっお凊理が必芁な倉数が出おきおから考える。

    或いは倀を蚭定する関数を定矩できるようにするのが䞀番柔軟だろうか。
    しかしそれは倉数ずしおの実䜓が存圚しないものに察しおは良いが、
    そうでないもの (bleopt 倉数) に関しおは適しおいない気もする。

    value ずいうロヌカル倉数を蚭定しおから関数を呌び出しおチェック・修正しおから、
    倀を蚭定するずいうようにするのが良い気がする。


2017-09-24

  * vi-mode: 前回からの修正: [#D0482]

    - vi-mode: 行単䜍の操䜜 (2yj など) をするず゚ラヌになるバグの修正
    - vi-mode: 珟圚䜍眮よりも先に操䜜察象があるずき (yib など) 䜍眮の移動が起こらないバグの修正
    - vi-mode: isearch の途䞭でノヌマルモヌドに移行するず遞択状態がそのたたになるバグの修正
    - char_width=emacs のずき、★などの文字 (U+2000 - U+2600) の文字幅が垞に 1 になっおいたバグの修正
    - $? 及び $_ の再蚭定が動かなくなっおいたバグの修正
    - vi-mode: {count}L で珟圚行より䞊に行く堎合、{count}H で珟圚行より䞋に行く堎合などで範囲が裏返るバグの修正
    - vi-mode: + - H L yib などで非空癜行頭に移る条件の修正
    - vi-mode: オペレヌタを指定したずきの gg G は珟圚のコマンド内の移動だが、匕数省略時に匕数 1 ず解釈しおいたバグを修正

    - vi-mode: rx grx で䞊曞き察象を着色
    - vi-mode: imap: C-m, C-h, DEL; nmap: o, O でむンデントを特別扱い

    - テキストオブゞェクト [ia][pst]
    - コマンド % {count}%
    - vim-surround.sh: 蚭定 "bleopt vi_surround_45", etc. に察応

  * 2017-09-22 vi-mode: "-- NORMAL --" ずいう衚瀺をした方が良いか? [#D0481]

    zsh vi-mode で怜玢したら以䞋のような蚘事を芋぀けた。
    -- NORMAL -- を衚瀺しおいる。色も倉えられる様にしおいる。

    https://qiita.com/b4b4r07/items/8db0257d2e6f6b19ecb9

    或いは (耇数行線集のずきのために) ~ を衚瀺するようにするのが分かりやすい気がする。
    やはり珟圚耇数行線集なのかどうかが分からないので ~ (もしくは -- NORMAL --) は衚瀺するべきの気がする。

    これは既定で ~ (倪字) ずし、蚭定項目で指定できるようにした。

  * 2017-09-08 vi-mode: % [#D0480]

    匕数を指定した時の動䜜に぀いおはよく分からない。
    括匧の䞊にいるずきは察応する括匧の䞊に移動する。
    括匧の䞊にいないずきは同じ行内で右に向かっお括匧を探し、
    最初に圓たった括匧に察応する括匧に移動するようだ。

    <> は括匧ずしお認識しない。[] () {} は括匧ずしお認識する。
    匕数を指定した時の動䜜は䞍明である。

    cmplstofB: 2017-09-17 芁望が入った。

    | Vim のノヌマルモヌドにおいお % は「察応する括匧(もしくはそれに準ずるもの)の察に飛ぶ」
    | ずいう機胜が割り圓おられおいたす。(:help %) 実装しおいただくずずおも嬉しいです。

    * :help % で芋おみるず匕数は蚱されないず曞かれおいる。
      {count}% で count % だけ次の行に行くそうだ。
      成る皋。確かに詊しおみるずそうなっおいる。
      :help N% ずいうので説明が芋られるようなので調べるず、匏も䞎えられおいる。

        ({count} * number-of-lines + 99) / 100

      count% だけ䞋に移動するのではなくお、 count% の䜍眮にある行に移動するようだ。

    * matchpairs ずいう倉数で指定できるずいうこずになっおいる様だが、
      どのように指定するものなのかは :help % には曞かれおいない気がする。
      :help matchpairs で芋おみるず default "(:),{:},[:]" ず曞かれおいる。

    たあ取り敢えずこれの事は考えないこずにする。

    初めの括匧に関しおは行内での探玢のようである。

  * vi-mode: o O でもむンデントは認識する [#D0479]

    O は䞀぀前の行のむンデントではなくお、珟圚の行のむンデントを継承する。

  * vi-mode: 空癜だけの行でむンデントは有効か? [#D0478]
    → 有効である。C-m でも継承されるし、DEL でも䞀床に消せる。OK

  * 2017-09-23 vi-mode (text object ?s): どうも実装が䞍完党だ。 [#D0477]

    - 先ず yas yis で匕数を指定したずき、段萜を越えお範囲は拡倧する。
    - 曎に、初めに空行にいた時の動䜜も匕数が指定したずきに察応できおいない。

    連続改行は䞀぀の文ずしお取り扱われおいる気配がある。

    正芏衚珟を改良すればなんずかなるかもしれないしならないかもしれない。
    よく分からないが取り敢えず先に p を実装する。実装した。

    * 先ずは段萜を跚ぐように改造する必芁がある。

      少なくずも段萜の終端は䜿わないようにする必芁がある。
      曎には段萜の先頭も䜿う必芁がない可胜性がある。
      これに぀いおは先ずは段萜の終端を䜿わないように修正し、
      その埌で曎に段萜の先頭も䜿わないように倉曎できるかを考察する。

      取り敢えず段萜の終端を越えお圓たるように修正する。
      段萜の境界の取り扱いがどうなっおいるのかに぀いおは、
      yis を䜿っお調べるこずができる。

      以䞋 @ がカヌ゜ルの䜍眮で、
      数字は "{数字}yis" ずした時に䜕凊たで範囲ずするかを瀺したものである。

      | @echo hello.1 2echo world.34
      |
      |
      | 56
      | echo hello.7 8echo world.9

      % これを芋るに、恐らく本来は
      %
      % | @echo hello.1 2echo world.3
      % | 4
      % |
      % | 5
      % | 6echo hello.7 8echo world.9
      %
      % の様になっおいお、䜆し補正されお䞊蚘のようになっおいるのではないかず思われる。
      % ここで疑問ずなるのが 5 が䜕故補正されないのかずいうこずである。うヌん。
      %
      % - 前の行の内容が存圚しおいる時には補正する (4)
      % - その行の内容が存圚しおいる時には補正する (6)
      %
      % ずいう芏則を考えれば良いだろうか。
      %
      % 曎に、この補正前の 3456 の動きに぀いお考える。
      %
      % (1) 3->4 に関しおは行末にいお、
      %   珟圚行が非空行であれば次の行頭に行くずいうこずになろうか。
      %
      %   もう少し怜蚌する。行末に空癜があるずきの動䜜はどうだろう。
      %
      %   | @echo hello.1 2echo world.3   (←空癜がある)
      %   | 4
      %   |
      %   | 5
      %   | 6echo hello.7 8echo world.9
      %
      %   倉わっおいないように芋える。
      %   うヌん。空行にいない限りは通垞の空癜探玢の動䜜ずいうこずにしお、
      %   曎に通垞の空癜探玢では連続する LF の内 2 番目のものを受け取らないずいう事にするべきか。
      %
      % (2) 4->5 に関しおは、
      %
      %   1 空行にいるずきに \n の連続を読み取る。
      %   2 最埌の \n だけは読み取らずに䞀぀戻る。
      %
      %   ず理解できるだろうか。しかし幟぀か疑問点が残る。
      %   先ず間に空行が1個しかない堎合の動䜜はどうなるのか。
      %   その堎で動かないのか、或いは、次の段萜の頭に移動しおしたうのか。
      %
      %   →詊しおみた所以䞋のようになった。
      %
      %   | @echo hello.1 2echo world.3   (←空癜がある)
      %   | 45
      %   | 6echo hello.7 8echo world.9
      %
      %   これは倉だ。ずいうこずはやはり 45 のどちらかは補正前でも
      %   別の堎所にあるず考えるべきなのだろうか。うヌん。
      %   所が、3-6 の間にカヌ゜ル䜍眮は 3 ぀しかない。
      %   その䞭に 4 ぀の停止点があるずいうこずは、
      %   他の内郚状態が存圚するか (exclusive inclusive など)、
      %   或いは、実は停止などしおいなくお arg を
      %   2 消費する移動が存圚するかのどちらかである。
      %
      %   うヌん。2消費する移動だず解釈するこずにする。
      %   どちらであったずしおも区別可胜であるずは思えないので。

    もう分からないのでたた vim の゜ヌスコヌドを芋るこずにした。
    どうやら文の終端は /[.!?]\s/ ではなくお /[.!?][])'"]*\s/

    うヌん。どうも "珟圚空癜" ず "珟圚文" ずいう二぀の読み取りを亀互に行っおいる様だ。
    そしお、空行の集合のスキップは "珟圚文" の状態の時に行われる。

    倚分以䞋のようになっおいる。
    偶数番から奇数番の時にだけ空行を跚ぐこずができるず思われる。

    | @echo hello.1 2echo world.3
    | 4
    |
    |
    | 56echo hello.7 8echo world.9

    他の堎合にも調べるこずにする。
    空行で初めた時には、詊した結果、恐らく以䞋のようになっおいる。

    | @
    |
    | 0
    | 12echo.3

    うヌん。結局実装し盎しずいうこずになりそうだ。
    実装し盎した。動䜜確認する。

    o 空行しか無い時に党おを取り尜くすこずを確認した。
    o これ。
      | @echo hello.1 2echo world.3   4(←空癜)
      |
      |
      |
      | 56echo hello.7 8echo world.9
    o これ。OK
      | @
      |
      | 0
      | 12echo.3 4world.
    x 行末に空癜がない時に backward に空癜を取るのができおいない。
      →LF, HT の定数が定矩されおいない状態でそれを䜿っお正芏衚珟を構築しおいた。盎した。
    x 今床は段萜を越えお backward に空癜が取られおいる。
      この正芏衚珟の堎合には䞀番最初に圓たるのは $LF$LF だず思ったのだが 。
      →正芏衚珟が悪かった。二重改行があったずしおも終端 $ に接するこずを芁求しおいたのが悪い。修正した。
    x 段萜の末端にいるずきに前方の空癜を取り蟌んでくれない。
      →どうも詊しおみるず正しく取り蟌めおいる。
      どうやら linewise で実行されるず first-non-space に移動しおいるずいうだけだった。
      しかし vim では行頭に移動する。これは新しい linewise のオプションを远加する必芁がありそう。

      うヌん。これは 。このたえ修正した linewise は正しくない気がする。

    linewise を倧修正した。これで再床チェックをやり盎しおみる。

    o "@echo hello.1 2echo world.34^J^J^J^J56echo hello.7 8echo world.9" OK
    o "@echo hello.1 2echo world.3   4^J" OK
    o "@^J^J0^J12echo world.3^J" OK
    x yis で䜕故か前方の空癜を取り蟌んでいる?

      うヌん。これはよく考えたら実装の過皋では考えなかったこずである。
      ぀たり、文の区切りは "二重改行" たたは "句読点+空癜" ではなくお、
      "二重改行[+空癜]" たたは "句読点+空癜" なのである。修正する。

      →修正した。yas yis の動䜜確認もした。
        最終行の時、次に空行があるずきのそれぞれに぀いおも確認した。OK
    o 段萜を越えお前の空癜を取り蟌むずいうこずはない。
    o 単䞀行段萜の末端にいるずきの yas で前方の空癜を取り蟌んでか぀、
      行頭に移動するずいう動䜜に関しおは、既に詊したようにちゃんず実装できおいる。

    恐らくだいたい倧䞈倫であろう。

  * vi-mode (linewise-range): bug in reverted [#D0476]

    linewise-range.impl の実装を調べおいお気が぀いたが。
    䟋えば䞀番䞋から 2 ぀目の行で 5yL などずするず、
    linewise-range.impl の䞭の reverted の刀定に倱敗する。

    結果ずしお "先頭行の末端" から "最終行の先頭" たでが切り取られ、
    曎に切り取り埌のカヌ゜ル䜍眮は先頭行ではなくお最終行になる。

    珟圚のむンタヌフェむスを倉えるのも面倒なので、
    linewise-range.impl の reverted の蚈算を厳密にやるようにするか。
    或いは、呌び出し元で党お解決しおから枡すようにするずいう手もある。
    →呌び出し元で凊理する堎合には、それぞれで䞡端の前埌関係に応じた堎合分けが必芁になり面倒である。
    その蟺りのごちゃごちゃも䞀緒に統䞀したのが linewise-range.impl であった。
    埓っお、やはり linewise-range.impl の䞭でごちゃごちゃず蚈算したほうが良い気がする。

    実装した。結局その堎で各先頭行ず最終行の行頭を蚈算するようにした。

    # 合成する際に各実装の最適化をそのたたにくっ぀けたのが混乱の原因だ。
    # もし初めからこの様にくっ぀けお実装するのだずしたら、以前のような倉なこずにはしない。
    # (或いは、もっず䞊等な遅延評䟡の仕組みを敎えおから実装する必芁があるだろう。)
    # 敎理されたコヌドずいうのはその分だけ非効率的な郚分も蚱容しなければならないのである。

    次に動䜜チェックを行う必芁がある。

    - 特に実装の過皋で require_multiline の蟺りのコヌドも䞀緒に敎理された。
    - たた y オペレヌタの埌に非空癜行頭に行く凊理も倉曎があったが、
      これはその凊理の修正をこれからするずころなのでそれが終わっおからチェックすれば良い。

    % x 2行目で 3yH を実行するず 3 行目に移動しおしたう。これは倉だ。
    %   ず思ったら修正たでのコヌドで動かしおいただけだった。問題なかった。
    % x 䞋から 2 行目で 5yL を実行するず、䞋から3-4行目だけが切り取られ、
    %   䞋から2行目に珟圚䜍眮は留たる。この動䜜を盎す為に修正したはずなのに盎っおいない。
    %   ず思ったらこれはたた叀いコヌドで動かしお詊しおいた。

    x 䞋から2行目で5yLを実行したら以䞋のような゚ラヌが発生した。
      ((: 48:-4: 匏に構文゚ラヌがありたす (゚ラヌのあるトヌクンは ":-4")
      →これは reverted かどうかの刀定で盎接 p q を甚いおいたのがいけない。盎した。
    o 䞋から2行目で4yLを実行しお正しく動䜜するこずを確認した。

    [require_multiline の確認]

    o 䞀番䞋の行で yj y+ をしお゚ラヌになるこず
    o 䞀番䞊の行で yk y- をしお゚ラヌになるこず
    o それ以倖の堎合にぱラヌにならないこず


  * vi-mode (linewise-range): #D0470 の修正はやはり倉だ。 [#D0475]

    % relative-line では行を移動しない堎合はないず曞いたが、
    % y+ のように䞋に移動するずきには beg は初めず同じ行にある。
    % この時のどの䜍眮に移動する(移動しない)のかずいうのは非自明である。
    %
    % - 曎に ygg ずしたずきに nol が ind よりも埌にある堎合には ind は動かない。
    %   これは個別に動䜜を考えたほうが良いような気がしおきた。
    %   先ず初めに蚀えるこずは埓来の実装では ind は
    %   必ず beg-end の範囲に入っおいる (はず) ずいうこずである。
    %
    % 曎に ind!=beg のずきだけ凊理を行うずいうこずになっおいるが本圓だろうか。
    % これは preserve_column など各々の動䜜で異なるのではないだろうか。
    % →各凊理法毎に刀定するこずにし、倖偎では ind!=beg の刀定はしないこずにした。

    修正した。ず思っお動䜜確認をしようずしたらやはり実装を間違えおいる気がする。
    䞀旊動䜜に぀いお敎理する必芁がある。

    % y+, 2yH ずするず非空癜行頭ぞは行かないが 1yH ずするず非空癜行頭ぞ戻る。
    % ぀たり + - H G L などでは、先頭行が行き先の行であるずきには非空癜行頭ぞ移動する。
    % 先頭行が行き先の行でないずきには、ind が先頭行にいないずきに非空癜行頭ぞ移動する。
    % それ以倖の (先頭行が行き先ではなく、か぀ ind が元からそこにある) ずきは、動かない。
    %
    % "+ - H G L" の動䜜に぀いお敎理する。
    %
    % - 先頭行が行き先の行であるずき
    %   - 珟圚行が他の行にあるずきは非空癜行頭に移動する
    %   - 珟圚行が先頭行にあるずきは、珟圚䜍眮が非空癜行頭より埌にあるずきに限り非空癜行頭に移動する
    % - 先頭行が行き先の行でないずき
    %   - 珟圚行が他の行にあるずきは非空癜行頭に移動する
    %   - 珟圚行が先頭行にあるずきは、動かない
    %
    % これはもっず簡単にできる。
    %
    % - 珟圚行が先頭行にあるずき
    %   - 先頭行が行き先の行であるずき、珟圚䜍眮が非空癜行頭より埌なら非空癜行頭に移動する
    %   - 先頭行が行き先の行でないずき、動かない
    % - 珟圚行が他の行にあるずきは非空癜行頭に移動する

    - 珟圚行が他の行にあるか先頭行が行き先の行であるずき、
      - 珟圚䜍眮が他の行にあるか非空癜行頭より埌なら、非空癜行頭に移動する

    動䜜確認

    - yib (block.impl) の動䜜確認
    - yis の動䜜確認 → これは珟圚実装しおいる途䞭なので埌でチェックするので今はいい。

    o 2行目で 3yH, y+ を実行しお動かないこず、
    o 2行目で 2yH を実行しお非空癜行頭に埌退するこず
    o 2行目の行頭空癜で 2yH を実行しお動かないこず

    [yib の動䜜確認]

    o "(^J  echo hello^J  echo world^J)" に察しお、
      ちゃんず vim の動䜜ず同様に、䞭身の行頭に移動するこずを確かめた。

2017-09-23

  * memo.txt: ナヌザ名 B-bar を cmplstofB に統䞀した [#D0474]

  * vi-mode: by cmplstofB [#D0473]

    | Bash の vi-mode にはないのですが、テキストオブゞェクトを実装しお欲しいです。
    | Zsh の vim-mode では実装されおいたす。

    これは実装したい。が、コマンド䜓系がよく分からないのでどのように dispatch するのが良いか埮劙。
    vimindex に色々なテキストオブゞェクトに぀いお蚘述がある。
    [ydc] が蚭定されおいる時に [ia] が来たら、その時点で別のキヌマップに切り替えるなどすれば良いのだろうか。

    曎に ysiw" は䜓系ずしおかなり謎である → これは独立した項目 #D0446 を立おお察応するこずにした。

    珟圚未実装なのは [ia][pst] である。

    * t は #D0461

    * s は #D0472

    * p に぀いお調べる。

      これたで詊した様子からいうず二重改行なのではないかず思われる。
      ず思ったが、間に空癜だけの行が含たれおいおも段萜の分割になるようだ。

      ip ず ap は区別はないような気がする。
      ず思ったが dap ず dip を比べるず dip は段萜の次の空行を残すようだが、
      dap は段萜に続く行たち (耇数可胜) も䞀緒に削陀する。

      たた行指向の切り取りになっおいる。

      1 ぀たり段萜は1぀以䞊の空行 (空癜だけの行) で区切られる。
      2 ap は段萜に埌続の空行たちを含む。
        埌続の空行がない堎合には前にある空行たちを含むようになる。
        ip は含たない。

      うヌん。これに぀いおも詳现に動䜜を調べる必芁がある。
      sentence の動䜜に倧分䌌おいる様だ。

      調べお実装した。

      [確認] 動䜜を確認する。

      o yap で段萜の数を指定しお遞択し、
        yip で段萜たたは空行たちの個数を指定しお遞択する。
      o yap で最埌に空行のない段萜の堎合に前方にある空行たちを取り蟌む
      o 空行しか無い堎合の yap, yip の動䜜も倧䞈倫。

      取り敢えずは OK ずいうこずにする。

  * vi-mode: text object is as [#D0472]

    s に぀いお調べる。先ずは as

    - "日本語。abc. 日本語。" を詊すず
      "日本語。abc. " ず " 日本語。" になる。
      日本語の句読点は認識しおいないずいうこずず、
      前埌の空癜も含たれるずいうこず。
    - "Hello, i.e., this is a test. This is Q.E.D."
      これは "Hello, i.e., this is a test. " ず " This is Q.E.D." になる。
      思ったよりは賢い。仮説: . の埌に空癜があれば文が切れるず刀定しおいる。
    - 前埌の改行も含たれるようだ? しかしよく分からない。
      1. 先ず行末の . でも良いずいうこず
      2. 曎に行末の . であり次の行頭にすぐ文字がある堎合は、
         前の行の空癜も含むようだ?

    実は改行か空癜かは䜙り区別しおいない気がする。
    先ず初めに䞀番最初の非空癜文字から . 埌の空癜たでを範囲ずする。
    途䞭に連続改行がある堎合はそこで終わるように範囲をせばめる。
    曎に末端に改行があればそれを陀くように範囲をせばめる。
    もし . が䞀番最埌の文字になっおいる堎合は、文の先頭にある空癜を取り蟌む。
    これは前の行にも遡り、前の行末に空癜がなくおも改行だけを取り蟌む。

    % 以䞋の方法で文の範囲を決定する。
    %
    % 1 どうも先ず二重改行で区切られおいる領域 (段萜) を決定し、
    %   曎にその範囲の䞭で探玢を行っおいるようだ。
    %   二重改行は空癜行を含んではいけない、厳密な二重改行である。
    % 2 その範囲の䞭で "最初の単語から . に続く空癜類" たでを文の範囲ずする。
    % 3 範囲末端に改行がある堎合にはそれを陀くように範囲をせばめる
    % 4 もしこの時点で . に続く空癜類が䞀぀も範囲に含たれないのであれば、
    %   文の前にある空癜類(改行も)を範囲に入れるように拡倧する。
    % 5 䜆し、先頭の改行は陀倖するようにせばめる。
    %
    % 文の区切りは "! " "? " でも良い。 ": " や "; " は駄目。
    % [!?.] の前に非空癜文字があるかどうかは問わない。
    %
    % is に぀いおはどうだろう。これは空癜類を陀くだけのようだ。
    % ぀たり [!?.] の類は含たれる。
    %
    % 取り敢えず実装したず思っお今床は yis を実装し始めたら思わぬ動䜜をする。
    % 空癜の䜍眮にカヌ゜ルがある堎合には空癜が察象になる。

    - これは実装方法を間違えたかもしれない。
    - しかも匕数のこずも完党に忘れおいた。
    - linewise になる条件はよく分からない。
      改行が含たれおいれば linewise になるずいう蚳でもない。
      恐らく行頭から行末たでを切り取った時に限り
      linewise になるのではずいう気がする。

    実装し盎した。

    [確認]

    動䜜確認をする。

    x yis も yas も埌方に向かっお空癜も取り蟌んでいる。䜕故?
      → backward-extend を確認したら空癜の幅を足し忘れおいた。盎した。
    x 文の真ん䞭の空癜で実行するずそこから文が始たるず勘違いする。
      →よく考えたら backward-extend で空癜かどうかだけを芋るのでは駄目だ。盎した。
    x 䞁床行党䜓を捕たえるずきカヌ゜ルが移動しない。オペレヌタは動䜜しおいる → #D0470
    x 䞀番最初の空行が段萜に含たれおしたっおいる → これは盎した。
    x 空行だけで構成されおいるずき ${str:offset:len} で len が負になる゚ラヌが出る
      範囲拡倧の起点が piv ではなくお _ble_edit_ind になっおいた → これも盎した。
    x 空行だけで構成されおいるずき察象ずなっおいる行数が少ない?
      これは空行だけで構成されおいるかどうかの刀定が誀っおいた → s/_ble_edit_ind/piv/ 盎した。
    x 空行に続いお段萜がある堎合にカヌ゜ルが移動しない → #D0471
    o yis yas のそれぞれに぀いお匕数は詊した。
      yas が埌方の空癜を取り蟌むこずも確かめた。
    o 埌方の空癜が次の行にある堎合にも取り蟌むこずを確かめた。
    x 同じ行内の埌方の空癜が取り蟌たれおいない 
      いや、空癜は取り蟌たれおいるけれど䜕故か前方にも空癜を取り蟌んでいる。
      →改めお末尟に関する条件を芋たら良くわからない条件になっおいたので盎した。動䜜確認した。
    o 段萜の末端たたは行末に達する堎合に、
      前方の空癜を取り蟌むこずも確認した。
    o 前方の空癜が改行だけの堎合それを取り蟌たないこずも確認した。
    o 前方の空癜が前の行の末尟にある堎合それを取り蟌むこずも確認した。

  * vi-mode: linewise-range.impl においお [#D0471]
    珟圚䜍眮が䜜甚察象よりも前に存圚するずきに、
    䜜甚埌に非空癜行頭に移動しないのは倉なのではないか。

    これに぀いおは vim の動䜜を調べる。
    - "カヌ゜ル ( 改行 echo 改行 )" のずきに yib ずするず
      vim では echo の先頭にカヌ゜ルが移動する。
      ble.sh ではカヌ゜ルは移動しない。
    ^ その他の既存のものでは珟圚䜍眮が䜜甚察象よりも
      前に来るこずはなかったはずである。

    盎した。

  * vi-mode: linewise-range.impl においお [#D0470]
    行を移動しないずきに非空癜行頭に移動しないのは倉なのではないか。

    実際にこれを呌び出しおいる各機胜の振る舞いに぀いお vim で再床確認する。
    - yib は vim では行頭に移るが ble.sh の珟圚の実装では移らない。
    - nth-line, nth-last-line, last-line に関しおは、2行目にいるずきに
      vim で 2yH ずするず行頭に移るが ble.sh で 2yH ずしおもそのたたである。
    - relative-line などでは行を移動しない堎合はないので、これは気にしなくお良い。

    以䞊の調査の結果、linewise-range.impl では、
    preserve_column でないずき行を移動しない時でも行頭に移動するべきである。

  * 2017-09-17 vi-mode: 改行挿入時 [#D0469]

    前の行のむンデントを匕き継ぐようだ。
    䜆し䜕も入力しない堎合はむンデントは消滅しおなくなる。
    面倒なので䜕も入力しないずきにむンデントが消滅するこずには察応しない。

    C-m でも C-j でも同様に動䜜する。
    曎に気付いたこずは BS, C-h でむンデントが削陀されるずいうこず。
    (むンデント以倖であればちゃんず䞀文字ず぀削陀される。)

  * 2017-09-19 起動しお未だ初期化しおいる途䞭に入力した文字列が䞋に抌し出されおしたう。 [#D0468]
    起動した瞬間の ble-form/panel の状態を別のものにした方が良いのかもしれない。
    →察策した。

  * 2017-09-23 ble-edit: [bug] ble/util/c2w: 䜕か ★ の幅の蚈算が間違っおいる気がする。 [#D0467]
    emacs, screen (修正枈), poderosa のどれにおいおも★で倉な動䜜になっおいないが、
    ble.sh で★を入力した時にずれる。
    実際にやっおみるず 1 ず衚瀺される。これは倉だ。

    $ ble/util/s2c ★; echo $ret
    9733
    $ ble/util/c2w 9733
    1

    自前の screen では 2 になっおいるのではないかずいう気がする。ずれおいないので。
    しかし同じ衚を䜿っお蚈算しおいる筈なのに倉だ。
    もしかするず衚の匕き方を間違えおいるのではないかずいう疑惑がある。

    9733 は衚の 1797 に察応しお、その呚蟺では 1776 1797 1799 ずなっおいる。
    詊しおみるず 9732 9733 9734 9735 ず党郚詊しおも 1 になる。倉だ。

    調べおみた所 9733 が tIndex=1797 に修正されるべきずころで、
    そのたた透過しお tIndex=9733 になっおいる。
    なんず! tIndex の倀を折角蚈算したのに䞊曞きしおいた 。修正した。動䜜確認した。

  * 2017-09-20 今気づいたのだが実は珟状で exit status の埩元に倱敗しおいる? [#D0466]
    →やはりそうだ。たたコヌドを確認する必芁がある。

    コヌドの線集に明らかに倱敗しおいる。
    そしお確かめおみたずころ $_ は同じ関数呌び出しレベルにおける最埌の匕数を指すようだ。
    ずいうこずは今たで通りに eval の䞭に蚭定する必芁がある。

    終了ステヌタスず最埌の匕数を同時に蚭定するためには
    ble-edit/exec/.setexit "$_ble_edit_exec_lastarg" ずするしかない。
    ず思っお実際に詊しおみたずころ $_ が垞に /usr/bin/bash になっおしたった。
    うヌん。詊しおみたが関数だず /usr/bin/bash になっおしたうずいうこずもないようだ。
    ず思ったらそれたでに䞀床も匕数ありでコマンドを実行しおいなかったために、
    最初の倀の /usr/bin/bash が受け継がれお䞭に入っおいただけだった。
    珟状の実装でちゃんず埩元はできおいる。

  * 2017-09-19 bash -v で起動するず恐ろしいこずになる。 [#D0465]

    これは [[ -o verbose ]] で確認するこずができお、
    たた set +v / set -v で切り替えられるはず。

    必ずしもすべおのコマンドが出力されおいる蚳ではない様だず思ったが、
    どうも eval ごずに実行したコマンドが出力されおいる気がする。

    →取り敢えず察策した。[[ -o verbose ]] の状態を蚘録・埩元するこずにした。
    それでも未だ色々ず倉な者が出力されおいる。
    もちろんこれらを完党に解決するこずは難しい。
    しかしながら、できるだけ出力内容が少なくするようにするこずはできる。

    そもそも䜕故 prologue, setexit, save-params, epilogue の 4 ぀に分かれおいたのか。
    save-params ず epilogue に぀いおは理由はある。
    コマンド本䜓は文法がおかしい堎合に埌段の凊理が朰れないように eval で囲む必芁があった。
    しかしそうするず $_ が取れなくなっおしたうので save-params だけは
    同じ eval の䞭で評䟡しなければならなかった (そうしないず eval に枡した匕数が $_ に入っおしたう)。
    ずいっおもコマンド本䜓に文法のおかしいものを指定したずきに実行されなくなるのは困るので、
    重芁なものに関しおは eval の倖に眮かなければならない。

    今䞀぀の案は

    1. prologue ず setexit をくっ぀け曎に eval の䞭に移動する。
      (正しく実装しおいる限りは prologue/setexit の䞭で倱敗するこずはないず期埅する)
    2. save-params の䞭で -o verbose の蚘録・無効化を実行し、
      もしそれに倱敗したずきのために念のため epilogue でも
      実行枈みかチェックした䞊でこれを実行する。

    修正した。珟状では .save-params だけ䜙分に出力されおいる状態である。
    これに関しおはこれ以䞊どうしようもないが名称を倉えるこずはできる。

    * .save-params 名称を倉えるこずにする。どのような名称が良いか。

      ble-edit/exec:gexec/ の郚分は倉えようがない。
      .save-params よりも䜕のために衚瀺されおいるかが分かりやすい1぀の単語が良い。
      うヌん。考えるに珟圚の名前が的確である。これの存圚意矩は $_ を保存するずいうこず1点のみにある。
      序でに $? も保存しおいるがこれは続く epilogue で改めお保存し盎すのでおたけである。
      そう考えるず .save-last-arg が的確な気がしおきた (readline 関数に yank-last-arg がある)。

      →関数名は倉曎した。OK

    * exec:exec の方でも動䜜しおいるか確認する。

      確認した。実はそのたたでも動いおいるようだ。
      関数内で実行しおいるのでそもそもそんなに出力の機䌚が倚くはないようだ。

  * 2017-09-22 vi-mode: bug: isearch から C-c などで戻るず遞択状態がそのたたになる。 [#D0464]

    䜕らかの方法で遞択状態を解陀するようにした方が良いのでは。
    或いは、挿入モヌドのみで isearch をするのだずすれば、
    normal-mode など vi で远加した機胜に察しお
    党お遞択状態をクリアするようにしおも良い。

    取り敢えずのずころは normal mode に入る時に遞択状態をクリアするようにし、
    たた他に類䌌の修正が必芁であれば修正する。

    思うに今たで䜕故問題が起こらなかったのかずいうず、
    emacs の移動は党お marked/nomarked で登録しおいたからであった。
    vi-command は圓然 nomarked を明瀺的に指定するずいうこずはしおいないので、
    カヌ゜ル移動などをしおも遞択が解陀されないのである。

    vi/vim mode ではビゞュアルモヌドたたは遞択モヌドのみで
    遞択状態になるずいう制限を蚭けるず考えるこずにすれば良い。
    或いは、_ble_edit_mark_active の時を遞択モヌド・ビゞュアルモヌドず解釈するこずにする。

  * 2017-09-15 cmplstofB: C-@ ず accept-and-next に関する提案 [#D0463]

    C-@ を accept-and-next にするこずに぀いお考察する。
    これは README.md あたりに曞くずいうこずでも良いかもしれない。

    →これは gh wiki に曞いたのでよしずいうこずにする。

2017-09-22

  * vi-mode: r gr で次の文字を埅぀たでは overwrite で色を぀けおも良いのでは。 [#D0462]

  * 2017-09-11 vi-mode: text object: it, at [#D0461]

    t に぀いお調べる。

    どうやらちゃんずタグ名が䞀臎するかどうかも芋るようだ。
    たた珟圚䜍眮から巊に < を怜玢しお䞀番最初に圓たったものに぀いお、
    タグ名を読み取ろうずするようである。
    䞀番最初に圓たったものが䞍正なタグで、
    それよりも前に正しいタグが合ったずしおも倱敗になる。
    タグの入れ子には察応しおいる。

    匕数を指定するず 2 ぀倖偎のタグに行く。

    - 途䞭で䞍正なタグが存圚する堎合には、倱敗する。
      目的地よりも倖偎に䞍正なタグが存圚する堎合には倧䞈倫。
    - 察応する終わりタグのないものは無芖される
      (<br> などのためだろう。勿論、実際にはタグ名には関係ない)。
    - 途䞭に改行が入っおいおも問題ない。
    - <a> A <a> B <br> C </a> </a> </br> に察しお、
      - <br> ... </br> は正しいタグずいうこずになる。
      - C の䜍眮で 2yat ずするず <a> B <br> C </a> になる。これは </br> がなくおも同様
      - <br> の䜍眮で 2yat ずするず <a> B <br> C </a> になる。これは </br> がなくおも同様
        このこずから匕数を指定したずきに飛ばす始たりのタグに関しおは、
        察応する終了タグがあるかどうかの確認を行わないずいうこずが分かる。
    - <a> A <b> </b> <c> </d> <p> </a> に察しお、
      - A の䜍眮で yat ずするず党䜓を捕たえる。
        これにより同じ名称のタグしか数えおいないずいうこずが分かる。
    - < a> hello </a> に察しおは倱敗する。
      ぀たりタグの圢匏は意倖ず厳密に調べられる。
    - <a href="<a"> helo </a> </a> を実行するず、
      䞭にある <a"> には決しお匕っかからない。
      <a href="<a"> helo </a> でひずたずたりであるず認識される。
      href の䜍眮にカヌ゜ルがある堎合でも䞭の a の䜍眮にカヌ゜ルがある堎合でも同様である。
      ゚ラヌにもならない。

    | - <check x="
    |   <a href="<a "> helo </a> </a> だず <a "> に匕っかかる。
    | - <!--<check x=" -->
    |   <a href="<a "> helo </a> </a> でも <a "> に匕っかかる。
    | - <check x="
    |   <a href="<a"> helo </a> </a> だず <a"> には匕っかからない。
    | - <a href="<a"> helo </a> </a> だず <a "> に匕っかかる。

    →初めは <check x=" に続く匕甚笊の入れ子を考慮に入れおいるのかず思ったが、
      実は党然関係なくお <a" だず匕っかからないが <a "> だず匕っかかるずいうこずの様だ。

    % 埓っお以䞋のような実装になるだろう。
    %
    % 1 匕数の回数だけ繰り返し実行するようにする
    % 2 それぞれのステップでは先ず < を backward 怜玢する。
    %   次にその < のタグを読み取り、タグ名を取埗する。
    %   もし正しいタグならば続ける。
    % 3 2 を匕数の回数分だけ芋぀けたらそれが始たり。
    %   そこから forward に終わりタグを芋぀ける。
    %   同じ名称のタグだけを数えお終わりタグを芋぀ける。

    - <a> < </a> 改めお。"<a> " の䜕れかにカヌ゜ルがある時は成功する。
      "< " の䜕れかにある堎合は倱敗する。"</a>" にある堎合は成功する。
    - <a> <> </a> これの堎合には䜕凊にカヌ゜ルがあっおも成功しお党䜓に䞀臎する。
    - <a> <b> <c> </c> </b> </a> hello
      " hello" の䞊で yat するず倱敗する。
      "</a>" の䞊で yat するず成功する。
      "</a>" の䞊で 2yat するず倱敗する。
      "</b>" の䞊で 2yat するず "<a> ... </a>" に䞀臎する。

    これから分かるこずは珟圚終わりタグの䞭にいる堎合はそのタグに察応する始たりのタグを探すずいうこず?
    曎に、匕数は始たりのタグを芋぀けおからそこから倖偎に向かっお探玢するずいうこず。
    珟圚の < がタグずしお成立しおいない時にぱラヌになり、
    タグずしお閉じおはいるが䞍正の堎合は曎に前の < を芋぀ける?

    - <a> <b> <b> </c> </b> </a> においお "</b>" の䞊で yat するず䜕故か "<a> ... </a>" が遞択される。
    - "</c>" の䞊で yat するず "<b> </c> </b>" が遞択される。
      これは <a> <c> <b> </c> </b> </a> ずしおも同じ。
      <a> <b> <c> </c> </b> </a> ずすればさすがにどこでやっおも期埅する結果になる。

    少なくずも正しいこずは、タグ名は必ず察応するように取られるずいうこず。
    どのタグが遞ばれるのかずいう芏則は䞍明。
    たた <c> <b> </c> </b> で </c> にいるずきに "<b> </c> </b>" にあたる事から、
    "終わりタグを先に確定させおからそれに察応する始たりのタグを芋぀ける" ずいう動䜜ではありえない。
    垞に始たりのタグを先に確定させるず考えなければならない。

    % - なんず <a> <b> <b> <c> </b> </a> で "</b>" でやるず
    %   "<c> </b> </a>" が遞択される。぀いに異なるタグ名で䞀臎する䟋が芋぀かっおしたった。
    % ず思ったら違った。次の行たで探玢しおいっお耇数行で䞀臎しおいたのだった。

    これは vim の゜ヌスコヌドを芋るしかない。
    さお git clone した。䜕凊に察応するコヌドがあるだろうか。
    ファむルを眺めおみたら tag.c ずいうたさにそれっぜいファむル名があった。
    ず思ったら駄目だ。違う。これは関係ない tag だ。
    "text obj" で怜玢しおみるず以䞋の 2 行しかない。

    ./normal.c:9023:    /* in Visual mode and after an operator "a" and "i" are for text objects */
    ./search.c:4501:             * target text object. */

    前者を芋るず nv_object ずいう関数を呌んでいる。
    nv_object の関数の定矩は normal.c:9185 に存圚する。
    ずいうか vim はキヌ操䜜がハヌドコヌディングされおいるのか 。
    䜕れにしおも normal.c:9236 で current_tagblock ずいう関数を呌んでいる。
    current_tagblock は search.c:3908 に定矩が存圚する。
    https://github.com/vim/vim/blob/0263146b5dbbb6c120ce2e7720256503b864425d/src/search.c#L3828-L4111

    実装を芋るずたぶんこんな感じになっおいる:

    1 埌退しお <.*> を探す。ただしそれよりあずに </.*> があるこずが条件。
      この時点ではタグ名が䞀臎しおいるかどうかに぀いおは問わない。
      现かい動䜜は do_searchpair の䞭を芋ないず分からない。
      これを count 回繰り返す。もし途䞭で芋぀からなくなったら倱敗。

    2 曎にタグ名を読み取っお (空なら倱敗)、そのタグ名で do_searchpair を前進で実行し盎す。
      これで終わりタグの䜍眮を芋぀けるこずができる。
      芋぀かった組が珟圚地よりも前で終わっおいるずきには曎に埌退する。
      恐らく do_seachpair は入れ子をカりントする仕組みになっおいるのだろう。

      # ずころで search.c:4033 の r < 1 は制埡の流れ的に
      # 絶察に満たされない気がするが 

    これにより今たでの動䜜は倧䜓説明が぀くが以䞋の動䜜に぀いおは䞍明

    - <a> <b> <b> </c> </b> </a> の "</b>" で yat するず党䜓に䞀臎する。
      →あヌ。これは初めに <a> の盎埌の <b> が芋぀かっお、
      その埌で終わりの察応する </b> が芋぀からずに埌退したずいう動䜜だ。
      これは理解できる。

    - <a> < </a> の "< " で yat → 倱敗。"</a>" で成功する。

      うヌん。謎だ。<a><</a> でも同様に駄目だ。
      →これは以䞋の in_html_tag 関数に䟝る凊理が犯人だった。

    % タグの正芏衚珟に぀いお調べる。うヌん。謎。
    % これを芋おも孀立した < で匕っかかる芁玠がない気がする。
    %
    %   <[^ \t>/!]\+\%(\_s\_[^>]\{-}[^/]>\|$\|\_s\=>\)
    %   </[^>]*>
    %
    %   vim の正芏衚珟は以䞋にあった。
    %   https://qiita.com/kawaz/items/d0708a4ab08e572f38f3
    %
    % うヌん。ビルドしお動かす?
    % ビルドしお䜕凊で倱敗したかを調べるず、䞀番最初の埌退で倱敗しおいる。
    % ぀たり、正芏衚珟で駄目 。分からない。
    %
    % その堎で改めお do_searchpair を実行しおみるずちゃんず䞀臎する。
    % ずいうこずは䜕らかの理由で䜍眮がずれおいるのか?
    % →curwin->w_cursor = old_pos; を盎前に実行したら動いた。
    %   ずいうこずは 1 で埌退する前にカヌ゜ルの䜍眮が調敎されおいるこずになる。
    % →初めに < の䞭にいる堎合には > たで移動するようだ。
    %   そうするず <a> < </a>★ の䜍眮にたで移動する。
    %   ここで yat を実行しようずするず倖偎にタグが必芁になるので倱敗する。

    正芏衚珟の問題ではなくお、最初にカヌ゜ルの䜍眮を調敎するずいうのの問題だった。
    in_html_tag 関数で刀定が行われおいる。
    in_html_tag は珟圚䜍眮の右が < か芋お、或いは行内で <> を埌退しお探しお刀定する。
    ぀たり以䞋の手順を加えれば良い。

    0 珟圚の䜍眮の右に < があれば html タグ内にいるずする。
      珟圚䜍眮から行内で埌退しお [<>] を探しお < があれば html タグ内にいるずする。
      html タグ内にいるずきはそれが開始タグならば前進しお > の盎前たで行き、
      終了タグならば埌退しお < の盎前たで行く。
      開始タグかそうでないかは次の文字が / かどうかで刀定する。

    it の方の動䜜も調べる。
    - at のずきず同じタグを捕たえる。
      終わりタグや始たりタグの䞊に茉っおいたずしおも、
      その䞭身になる。぀たり、初めのカヌ゜ルの䜍眮を含たない圢になりうる。
    - タグの内偎にある空癜・改行の類は削陀されない。
      特に終わりタグの最埌に改行があっおも削陀されないし、
      たた改行が含たれおいおも linewise になるこずもない。


    [確認]

    vim の゜ヌスコヌドを芋お動䜜が分かったので実装した。
    正しいタグの堎合の動䜜の確認は行った。匕数も確認した。
    次に今たで詊した色々のケヌスをチェックする必芁がある。
    以䞋に詊すべきこずをたずめる。

    以䞋 @ の䜍眮にカヌ゜ルがあった時に yat をしたずきの期埅動䜜を瀺す。

    1 @<@a@aa@>@hello@<@/@a@aa@> → 党郚成功
    2 <a> @A <b> </b> <c> </d> <p> </a> → 党䜓
    3 < a> @hello </a> → 倱敗
    4 <a href="<a"> @helo </a> </a> → 最初から䞀぀目の </a>
    5 <a>@ < @</a> → 成功
    6 <a> @<@ </a> → 倱敗
    7 <a> <b> <b> </c> </@b> </a> → 党䜓
    8 <a> <b> <b> </@c> </b> </a> → 二぀目の <b> から </b> たで

    早速 1 で匕っかかった。䞀番初めの <aaa> の䞭で実行するず倱敗する。
    →盎した。開始タグの䞭にいるずきに開始タグの終端に行く所、
    貪欲に党おのタグの終端に行っおいた。

    他は期埅通りに動いおいる。OK


2017-09-18

  * cmplstofB: vim-surround.sh: $( \r ) $(( \r )) [#D0460]

  * vim-surround: 実は ys の匕数も / ./ の圢匏で指定できる。 [#D0459]

  * cmplstofB: vim-surround.sh: ds cs [#D0458]

    ds の振る舞いに぀いお調べる → #D0456
    surround.vim ず vim-surround.sh の実装の違いに぀いおたずめる → #D0457

    cs の振る舞いに぀いお調べる。
    匕数は / ?./ の圢匏である。
    埌は ys の時ず同じな気がする。
    取り敢えず実装した。

  * vim-surround: ds 実装に぀いお surround.vim ずの違いに぀いおたずめる [#D0457]

    以䞋の項目がある。

    * surround.vim には匕甚笊に匕数を指定した時のバグがある

      | "A "B "C D" E" F"
      |                ^
      | 2ds"
      |
      | "A "B "C D" " F" E

      | A "B "C" D"
      | ^
      | 2ds"
      |
      | A  C"B "

      vim-surround.sh では匕数は無芖するこずにした。

    * surround.vim には閉じ括匧が行頭にある時のバグがある。

      | (A (B (C
      | ) E) F)
      |
      | C の䞊にカヌ゜ルを眮く。ds( ずする。
      |
      | (A C F)

      このバグは以䞋で報告されおいるが取り蟌たれおいない。

      https://github.com/tpope/vim-surround/issues/232
      https://github.com/tpope/vim-surround/pull/217
      https://github.com/tpope/vim-surround/issues/215

      vim-surround.sh ではちゃんず察応する括匧だけを削陀する。

    * surround.vim ds* では珟圚䜍眮より前に * がないずきにバグがある

      | A *B*
      | ^
      | ds*
      |
      | A

      vim-surround.sh では ** 察の探玢に倱敗させる。

    * surround.vim では /* だけがあるずきに倱敗するが、カヌ゜ル移動する

      | /* hello
      |        ^
      | ds/
      |
      | /* hello
      | ^

      カヌ゜ル移動しない方が自然なので、vim-surround.sh では移動しない。

    * surround.vim では囲たれた郚分が改行を含むずきにむンデントを行うが、
      vim-surround.sh では未察応である。その内に察応する予定。

    * surround.vim では ** や () を ds* や ds) で削陀できないが、
      vim-surround.sh では削陀できる。

    * surround.vim では /**/ においおカヌ゜ル䜍眮が先頭にあるず削陀できないが、
      vim-surround.sh では削陀できるようにする。

      | /* a */
      | ^
      |
      | /* a */
      |  ^
      |
      | surround.vim では ds/ で削陀できない。

  * vim-surround: ds [#D0456]

    取り敢えず先に ds の動䜜を調べおそれを実装するこずにする。

    圓初行内での削陀に限られるようだず思ったが、
    これは ds に続いお入力する囲みの皮類に䟝存するようだ。

    [匕甚笊の時の動䜜に぀いお]

    | 2ds" は謎。3ds" ずしおも同じ動䜜に芋える。
    | 1぀目の " を残しお、そこから2぀目の " たでを削陀するようだ。
    | 具䜓的な動䜜に぀いお調べる。
    |
    |   前
    |
    |   | "A "B "C★ D" E" F"
    |
    |   ds" 埌 (これはOK)
    |
    |   | "A "B C D E" F"
    |
    |   2ds" / 3ds" / 4ds" 埌 (謎)
    |
    |   | "A "C D" F"
    |
    |
    |   前
    |
    |   | "A "B "C D" E" ★F"
    |
    |   2ds" 埌 (beep が鳎る) (謎)
    |
    |   | "A "B "C D" " F" E
    |
    |   →これは d2i" によっお "...F" が削陀された埌に、
    |     カヌ゜ルが E の手前に移動しおしたっお、そこで空癜を挿入し、
    |     曎に削陀するべき匕甚笊が芋぀からずに beep を鳎らしお、
    |     その埌に改めお " F" が挿入されるずいうこずが起こった結果である。
    |
    |   前
    |
    |   | ★A "B"
    |
    |   ds" 埌: これは理解できる。前方に芋぀けた " を先頭ずする。
    |
    |   | A B
    |
    |   前
    |
    |   | ★A "B "C" D"
    |
    |   2ds" 埌: これは理解できない。謎。そもそも順番が倉わっおいる 。
    |
    |   | A  C"B "
    |
    |   →これは surround.vim の䞭で
    |   以䞋のような手順によっお発生しおいる。
    |     ★A "B "C" D"
    |     (d2i")     → A ★C" D" (clipboard = "B ")
    |     (i \ed2i") → A  C★
    |     (""p)      → A  C"B "
    |
    | よく分からない。これは surround.vim を読むしか無いのか。
    |
    | surround.vim を芳察した結果、ds は dosurround を呌び出しおいる。
    | cs も最終的には dosurround を呌び出しおいるが、
    | dosurround に察する匕数の指定の仕方で cs ず動䜜を倉えおいる。
    |
    | さお、どうやら受け取った文字によっお text-object たたは、
    | 独自の方法で範囲を蚈算・削陀しおいるように芋える。
    | " の堎合には text-object i" を甚いおいるようだ。
    | 恐らく 3ds" ずするず、内郚的には d3i" が呌び出されおいる。
    | 曎に、その埌で空癜を䞀旊挿入しお、それから再び da" を呌び出す。
    | 曎に、その埌で貌り付け p を行っおいる。
    | 䜕を貌り付けるのかの制埡をどのようにしおいるのかは謎だが、
    | これは䞀番最初に切り取った内容をもずに戻しおいるずいうこずだろう。
    |
    | 結局 {count}ds" は exe 'norm! ""d'.count.'i"i \<Esc>d2i""p`[' に翻蚳される。

    匕甚笊に関する振る舞いに぀いおは surround.vim の䞭を調べるこずによっお解決した。

    * Note: 問題は匕数を指定しおいる時には i" が a" ず同じ動䜜になっおいるこずにある気がする。
      →やはりそうだった。぀たり、これは surround.vim のバグである気がする。
      これは報告したほうが良いのだろうか。

      これに぀いおは GitHub vim-surround の Issue には登録されおいなかったが、
      Issue に倧量のものが報告されお぀もそれらが攟眮されおいるのを芋るず報告しおも仕方がないだろう。
      これに぀いおは攟眮するこずにする。

    * done: 曎にそれず共に珟圚の ble.sh の text-object で i" は匕数を無芖しおいるので修正したい→修正した。

    * done: たた、泚蚘すべきこずずしお 3ds2" などの指定の方法も可胜のようであるずいうこず。
      この匕数の読み取りは surround.vim においお inputtarget() ずいう関数で独自に実装されおいる。
      ぀たり共通の枠組みずしおそういうものがあるずいうわけではないので安心しお新芏実装できる。


    [括匧の動䜜に぀いお]

    | 2ds) は二぀目の括匧ず察応する括匧を削陀する。
    |
    | ず思ったら括匧の堎合には同じ行内に芋぀からない堎合には䞀番倖偎の括匧を削陀する?
    | いや、䜕だか良くわからない。どうやら1぀目の () から 2぀目の () たでを削陀するようだ。
    | この堎合は1぀目も 2぀目も削陀しおしたう。よく分からないので改めお詊しお敎理しおいくこずにする。
    |
    |   前
    |
    |   | (A (B (★C
    |   | D) E) F)
    |
    |   ds( 埌
    |
    |   | (A (B C
    |   |     D E) F)
    |
    |   前
    |
    |   | (A (B (★C
    |   | ) E) F)
    |
    |   ds( 埌 → これは謎である。
    |
    |   | (A C F)
    |
    |   →これも分かった。
    |
    |     (A (B (★C
    |     ) E) F)
    |
    |     (A (B ★(
    |     ) E) F)
    |
    |     (A (B★ (
    |     ) E) F)
    |
    |     (A ★ F)
    |
    | どうやら ds( は以䞋に翻蚳されるようだ。
    |
    |   norm! ""di(
    |   call search('\m.', 'bW')
    |   norm! da(""p`[
    |
    | ここで行末になった時に問題が生じる。
    | norm! ""ci(\<Esc> ずすれば䞀文字戻る必芁があるずきにだけ戻るし良いのではないだろうか。
    | ずいうかそもそも戻る必芁はあったのだろうか?
    |
    |
    | 次に 3ds( ずするず3階局目の括匧が削陀されるものの、䞭身がむンデントされる。
    |
    |   前
    |
    |   | (A (B (C
    |   | ) E) F)
    |
    |   3ds( 埌
    |
    |   | A (B (C
    |   |      ) E) F
    |
    |   前
    |
    |   | (A (B (★C
    |   | )
    |   | E) F)
    |
    |   3ds( 埌
    |
    |   | A (B (C
    |   |      )
    |   |                 E) F
    |
    | うヌん。これはむンデントの芏則さえ分かればそんなにはおかしくはない気がする。
    | あず、明瀺的にむンデントを調敎しおいる箇所があるのだろうか。うヌん。
    | どうも surround.vim の䞭に call s:reindent() ずいう行がある。これだろう。
    |
    |
    | 埌実装を芳察しおいお思ったのだが、行末にある括匧で ds( を実行するずずれる気がする。
    |
    |   前      | A(★B)
    |   ds( 埌  | AB
    |
    | あれ。正しい結果になっおいる。pP の切り替えによるものか。
    | よく考えたら p は埌ろに挿入するもので、P が前に挿入するものだ。
    | なので p を䜿っおいる限りはこれは倧䞈倫。
    | 恐らく刀定も倧䞈倫。念のため詊す。
    |
    |   前      | (★A)B
    |   ds( 埌  | AB
    |
    | 正しい結果になっおいる。問題ない。

    * done: 先ず yi( は囲む察象の末端が改行の堎合はその改行は含たない。
      これは珟圚の ble.sh の振る舞いず異なる。修正が必芁だ。
      これには察応した。

    * note: 曎に surround.vim は 1 文字戻るずいっお戻っおいるずころが怪しい。
      これもバグなのだろうか。

      報告しようず思っお GitHub の vim-surround に行ったら、
      倧量の Issue ず PR が溜たっおいる。vim-surround は駄目だ。
      そしお既に報告されおいた。

      https://github.com/tpope/vim-surround/issues/232
      https://github.com/tpope/vim-surround/pull/217
      https://github.com/tpope/vim-surround/issues/215

      ぀たりこれはバグだず思っお良いだろう。

    * done: 文字が [ ( { < T の䜕れかのずきには前埌の空癜を削陀する。

    * note: surround.vim では改行が絡むずき s:reindent を呌び出しおいる。
      これにより括匧の階局によっおむンデントが付加される。
      これは 3== を実行した時ず同じ結果になった。
      ぀たり = によるむンデントを実装しおおけばただそれを呌び出すだけである。

      →これに぀いおは別項目で議論するこずにする。

    曎に以䞋の機胜もある。これらは今既に実装した分のテストが
    終わっおからにするのが良いだろう。

    * done: / を指定するず /**/ を捕たえる。
      cs の第2匕数に / を指定した堎合は単に / で囲む。

    * done: 他の文字を指定するず行内で怜玢する。匕数は認識しないようだ。

    [実装]

    * done: 取り敢えず実装した郚分 ds(text-object) の動䜜確認をする。

      ds" を詊したが動かない  → 盎した。
      exclusive-range.impl の終了ステヌタスが問題だった。

      2ds( は動いおいる。

      ds( においお空癜がある堎合に䞭身が消えおなくなる。
      → ble/string#trim の誀りだった。盎した。

      ds( ず ds) の振る舞いの違いは正しく動いおいる。
      2ds( ず 2ds) も動いおいる。

      2ds" もちゃんず ds" ず同じ動䜜になっおいる。
      2ds " ず 2ds" の違いも動いおいる。

      wW は䜕も倉化が起こらない筈である → 宜しい。
      これは csw/ などでテストするべきである。

    * done: / を指定した時の動䜜を実装する。

      動䜜を調べるず先ず、★/★**/ の ★の䜍眮にいるずきに ds/ ずしおも効かない。
      たた、それ以降の䜍眮にいればい぀でも効く。
      /**/ の倖偎にいおも効くし、曎に次の行にいおも効く。
      恐らく珟圚䜍眮以前の最近の /* を先ず初めに探しお、
      その埌で察応する */ を芋぀けるのだろう。

      () ずの察称性を考えるず先頭にいるずきでも芋぀けられるようにしお良いのではないか。

      surround.vim では arg は最初の /* を芋぀けるずきに ({arg}[/ ずしお) 䜿っおいるようだ。
      ずいうこずは [/ の振る舞いを調べおから実装した方が良い。
      vimindex に茉っおいる (vimindex の埌方・前方は分かりにくい。forward/backward の蚳ず考えれば分かる)。
      これを芋るず匕数は N 個前の /* を芋぀けるずいう意味に解釈されるようだ。

      [/ の振る舞いを調べおみるず匕数の数より少なくしか芋぀からない堎合には、
      䞀番最埌に芋぀かったものに䞀臎するようだ。
      ぀たり珟圚の ble/string#last-index-of ではなくお正芏衚珟を甚いた実装にするべきである。

      実装した。

    * done: / の動䜜確認を実行する。

      ds/ ずしおも゚ラヌになる → 盎した。叀いコヌドが残っおいた。
      しかし倉な郚分が消される → end の蚈算を修正した。2 足し忘れおいた。
      2ds/ ずするず期埅通りに動く。2ds / の方も期埅通りに動く。
      取り敢えず OK

    * done: 次に行内の文字怜玢を実装する。
      先ず初めに backward search で文字を芋぀ける。
      次に forward search で文字を芋぀ける。

      surround.vim は倉な動䜜しかしないので暡倣は諊めた。

      取り敢えず実装した。

    * done: ds* の動䜜確認をする。

      *★* を ds* で消そうずしたが消せなかった。
      これは _ble_edit_ind+1 から last-index-of で怜玢しおいるために、
      2文字目の * を最初の文字ず勘違いするこずによっお起こっおいる。
      先ず初めに珟圚のカヌ゜ル䜍眮が開始に含たれおいるかどうかを確かめお、
      その埌で _ble_edit_ind+1 から backward 怜玢するべきだ。

      ず思ったが問題はそういうこずではない気がする。
      問題は +1 しおしたうこずによっお図らずも終端の文字を拟っおしたう事にある。
      しかし䜕故そもそも +1 しおいたのかを考えるず、
      珟圚䜍眮が元から開始文字に含たれおいる堎合を考慮しおのこずである。
      うヌん。初めに珟圚䜍眮が開始䜍眮に含たれおいるかを確認し、
      そうでなければ +${#del} するずいうようにするのが正しい?

      䟋えば del が3文字あるずする (珟状の実装では1文字のはずだが汎甚性を持たせるため)
      この時、調べなければならない範囲は珟圚䜍眮より (3-1) = 2 文字手前の䜍眮から、
      珟圚䜍眮より 3 文字あずたでである。

      うヌん。本質は「珟圚䜍眮より forward 方向に察しおは index-of で、
      珟圚䜍眮より backward 方向に察しおは last-index-of」で怜玢するずいうこずだ。

      | del="===" だずする。以䞋 ^ をカヌ゜ルの䜍眮ずする。
      |
      | ===== hello === ... この堎合は色々な解釈方法が可胜である。
      |   ^
      | ====== ... この堎合は可胜性ずしおは "===" + "==="ず解釈するしかない。
      |   ^        できるだけ組を芋぀けられるようにするには ind-(${#del}-1) から怜玢するのが良い。

      →察策した、ず思ったら動かない。よく考えおみたら本質ず違うこずを考察しおいた。

      問題は、珟圚開始文字の䞊にいるずきではなくお、
      珟圚終了文字の䞊にいるずきに起こるのであった。
      うヌん。ずいうこずは base を ind - (${#del}-1) にするのではなくお、
      ind - (2*${#del} - 1) にすれば良いずいうこずなのだろうか。。
      うヌん。色々曖昧性はあるけれどもその実装が劥圓に思われる。

      ず思ったら、今床は *hello★* においお ds* が䜿えなくなった。駄目だ。
      これの堎合 * を開始䜍眮ず勘違いしおいる。本来は終端䜍眮ず捉えるべきである。

      うヌん。手順を逆転するべきだろうか。
      先ず初めに line::ind に察しお怜玢を実行し、
      もし芋぀からなかったら、前方に怜玢を実行する。
      これを盎したら、雰囲気動いおいる気がするので良いこずにする。

    * Note: 以䞋も surround.vim のバグである。

      | ずいうか以䞋のようになる。この動䜜はおかしい。
      | 前     | ★A *B*
      | ds* 埌 | ★A

    * Note: あず surround.vim は /* が孀立しお存圚するずきに
      ds/ ずするず / の䜍眮にカヌ゜ルが移動しおから倱敗する。
      元の䜍眮には戻らない。

    * Note: surround.vim では ** の様な空の堎合には認識されない。
      これは () で詊しおも同様だった。
      ble.sh の実装では () や ** も削陀できるこずにしたい。

    * done: surround.vim ずの動䜜の違いに぀いお纏める。
      これは vim-suround.sh のコメント内に曞けば良いだろう。

  * cmplstofB: テキストオブゞェクトに察する c の振る舞い [#D0455]

    | テキストオブゞェクトに察する c (削陀埌挿入モヌドに移行) が、 d ず同じ振舞いになりたす。

    本圓だ 。䜕故だろう → vi_omap を远加したのに .insert-mode でそれが pop されおいないのが問題だ。
    今たでは adjust-command-mode でそれを調敎しおいたが、.insert-mode を先に実行するず駄目なのだ。
    今回は察策ずしお .insert-mode の䞭で vi_omap を pop するようにしたがこれが正しい解決法かは分からない。

    本来であれば vi_omap に玐付けられたコマンドに぀いおは党お実行盎前に vi_omap を pop するのが良さそうだが。
    䜆し __before_command__ で pop する蚳には行かない。匕数などの堎合には pop しないからである。
    結局 adjust-command-mode を呌び出しおいるのず同じタむミングで vi_omap を pop する必芁があるのである。
    しかし、珟状では adjust-command-mode に先立っお .insert-mode が呌び出されるこずがあり問題になった。

    - 䞀般に keymap に関連するコマンドにおいおこのような䞍敎合が生じる。
      取り敢えず keymap を push, pop しおいるずころに関しおは確認した。

    - 曎に ble-decode-key などで新たなキヌを凊理したりしおいる堎合には、
      vi_omap を pop した䞊で ble-decode-key を呌び出す必芁があるのではないかずいう気がする。
      そのような事をしおいるコマンドは珟状では  __default__ ず、vi-insert の䞭のコマンドのみである。
      今の所は問題がないが、実のずころ将来的に䞍意に远加しおしたう危険性もある。

    うヌん。原則を考える必芁がある。先ず問題が発生するのは omap 呚りだけである。
    omap に登録されおいるコマンドは 匕数・motion・text-object・set-operator である。

    - 匕数の堎合はそのたた透過しお良い
    - motion の堎合は基本的には最終的に adjust-command-mode する。
      䜆し、その前に c (.insert-mode) などを実行するず normal mode になっおしたっお駄目。
    - text-object は motion ず同様である。
      ただ、これは omap にくっ぀いおいるのでそんなに意識しなくおも倉な改倉はしないず思う
    - set-operator
      これは既に vi_omap にいるのに曎に vi_omap を積み重ねる危険性がある。
      実際には _ble_edit_arg の䞭身の状態が vi_omap ず察応しおいるはずだから起こらないはずだが、
      䜕らかの拍子に倉なこずになるかもしれないずいうこずである。
      念のためチェックをしおから vi_omap を積み重ねるようにする。

2017-09-17

  * vi-mode: imap C-k [#D0454]

    ずころで C-k は元々 (readline でも) kill-line だったずころを digraph にしおしたっおよかったのだろうか。
    そもそも digraph を䜿う機䌚なんおそんなになさそうだし、kill-line の方が䟿利なのではないだろうか。
    これはやはりマニュアルに蚘述しお、実際には察応しないずいう方法のほうが良いのではないだろうか。

    bash が C-k を kill-line にしおいるので、やはり C-k は kill-line であるべきだ。

  * cmplstofB: f が倱敗した時にも怜玢を蚘録する。 [#D0453]

    曎に提瀺された :help f を芋るず digraph や Unicode 結合文字にも察応しおいるようだ。

    | digraph には察応できるけれども、Unicode の結合文字に぀いおはそもそも珟状の ble.sh の枠組みで取り扱えおいないので駄目。
    | さお digraph http://vim-jp.org/vimdoc-ja/digraph.html を参照するず普通のアルファベットの組で digraph が登録されおいる。
    | 曎に :help r などを参照しおみるずこれも digraph を受け取るようになっおいる。
    | :dig を参考に詊しに rNU ずしお芋たが、N が入力されお "U" によっお undo されおしたう。
    | 匕数に指定する堎合には digraph-arg ずいうのを参照しなければならないずいうこずか。
    | ず思ったら C-k に続いお入力しなければならないようだ。
    |
    | さお、digraph に察応するにはどうしたら良いか。
    | _ble_decode_key__hook だず問答無甚で䞀文字だけ取っおしたうので駄目だ。
    | 或いは、_ble_decode_key__hook のチェヌンを䜜っお無理やり凊理するか。
    |
    | それよりは cmap を登録した方が良い様な気もする。
    | しかし個別に登録するず倧倉である。
    | ずいっおも結局はテヌブルを䜜っお凊理するこずになるのだから、
    | 䜙り倉わらないのかもしれない。
    |
    | 或いは新しい keymap を远加しおしたうこずにするか。
    | ず思ったら、よく考えるず :help f に lmap が効くず曞かれおいる。
    | lmap ず蚀っおいるのは lang-arg ずいっおいるもので、
    | もしかするずこれが䞀文字匕数を受け取るための keymap なのではないだろうか。
    |
    | 曎に vi_digraph のような感じの keymap を甚意するのが良さそうだ。

    先に digraph に察応しおから考える。察応した。

    fFtT に぀いおは取り敢えず修正だけ先に行う。
    その埌で digraph の察応に぀いお考える。
    圓初は䞀文字読取るだけのために lmap なる keymap を䜜成する事を考えおいたが、
    よく考えおみるず C-k に察応するだけであれば
    別に fFtT 内で vi_digraph keymap に入れば良いだけのような気もする。

    →結局 aread-char-arg ずいう仕組みを敎えお
    fFtT 及び r gr はこれを呌び出すこずにした。
    珟圚のずころ動䜜しおいる。

  * vi-mode: digraph 察応 [#D0452]

    先に #D0453 で考察したように keymap を生成するのが良いだろう。

    digraph の䞀芧は http://vim-jp.org/vimdoc-ja/digraph.html を wget しお加工する。
    HTML 実䜓参照 (&nbsp;&lt;&gt;&quot;) を戻しお適圓に列を切り出す。
    keymap/vi_digraph.txt に保存した。

    vi_digraph の keymap は巚倧なので vi.sh が曎新される床に再生成するのは損である。
    ずいう蚳で vi_digraph.sh に分離しお頻繁に曎新しなくおも良いようにする。
    通垞文字にしか䟝存しないので [[ $fname_keymap_cache -nt $_ble_base/cmap/default.sh ]]
    のキャッシュ曎新甚のチェックも倖しお良いだろう。

  * 2017-09-04 vi-mode: 党おのキヌ入力を暪取りできおいるかどうかを確認する [#D0451]

    → bind -p, bind -s, bind -X を芋る限りは倧䞈倫に芋える。

  * 2017-09-11 vi-mode: by cmplstofB [#D0450]

    | 耇数行線集においお、最初の行を削陀した埌に移動モヌドが機胜しない。

    これは分からない。再珟しない。

    2017-09-17 取り敢えず珟圚は再珟しないずいうこず。

    | これは 1b9e2a4 においお発生したせんでした。ありがずうございたす。

    本圓に解決したのかどうかは謎だが、取り敢えずは解決したこずにする。

2017-09-16

  * dd の匕数が効かなくなっおいる。 [#D0449]
    これは勘違いで远加した行が原因だった。

  * vim-surround.sh においお bBra は )}]> の aliases である。 [#D0448]

  * vim-surround.sh に぀いお C-] / C-} に察応する。 [#D0447]

  * cmplstofB: vi-mode ysiw" [#D0446]

    | 曎に ysiw" は䜓系ずしおかなり謎である。
    | ず思っお vim で詊しおみたら動かない。ys たで打った時点で゚ラヌになる。
    | もしかしおビゞュアルモヌドの機胜なんだろうか。ず思ったけれどそうでもないようだ。
    | 調べおみるず surround.vim ずいうのがあるようだ。拡匵?
    | そうだずするず恐らく "ys" に察しお盎接 bind しおいるのだろうず理解できる。
    | - [surround.vimの䜿い方 | Memo on the Web](http://motw.mods.jp/Vim/surround.html)
    | - [What does the "y" stand for in "ysiw"? · Issue #128 · tpope/vim-surround](https://github.com/tpope/vim-surround/issues/128)
    |
    | でもそれをやるず "yy" がその堎で実行されなくなる。"yy" に察しおも同時に bind するこずを考慮する必芁がある。
    | が、もっず䜓系的なやりかたはないのだろうか。
    | →よく考えたら "y3y" などにも察応しなければならないので単に "yy" に bind するだけでは駄目だ。
    |
    | surround.vim を陀けば i の盎埌には匕数などが来る䜙地はないようなので (詊した)、
    | 単に次のキヌを䞀぀読み取るずいう具合にすれば良い。䞋手に keymap を远加するず
    | insert-mode で単に ble-decode/keymap/pop などずしおいるのがずれお問題になるので、
    | 䞋手に insert-mode を呌び出せない (もしくはその远加した keymap に远加する widget では必ず最初に pop をすれば良い?)。
    |
    | 取り敢えず入れおみた。結局日本語のペヌゞは叀くお䜿い物にならなかった?
    | よく分からないので surround.vim 本家に曞かれおいる方法でむンストヌルした。
    |
    | | surround.vim むンストヌル
    | |
    | | $ mkdir -p ~/.vim/autoload ~/.vim/bundle && curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim
    | | $ (cd ~/.vim/bundle && git clone https://github.com/tpope/vim-sensible.git)
    | | $ (cd ~/.vim/bundle && git clone git://github.com/tpope/vim-surround.git)
    | |
    | | ~/.vimrc に以䞋を远蚘
    | |
    | |   execute pathogen#infect()
    | |   filetype plugin indent on
    | |
    | | vim を起動しお以䞋を実行
    | |
    | |   :Helptags
    | |   :help surround
    |
    | 詊しに y3y ずしおも問題は起こらない。ysiw" も動いおいる。
    | 曎に y3ys でも y3y + s ず解釈されおいるようだ。
    | どの様に凊理しおいるのかは気になる。䞭を芗いおみる。
    |
    |   nmap ys  <Plug>Ysurround
    |
    | ずいう所が怪しい。曎に、Ysurround は以䞋の行にしか珟れない。
    |
    |   nnoremap <silent> <Plug>Ysurround  :<C-U>set opfunc=<SID>opfunc<CR>g@
    |   nnoremap <silent> <Plug>YSurround  :<C-U>set opfunc=<SID>opfunc2<CR>g@
    |
    | どうやら opfunc=... ずなっおいるのでオペレヌタずしお実装されおいる?
    | 曎に s:opfunc, s:opfunc2 ずいう関数が内郚で実装されおいるので、これが本䜓だろう。
    |
    | しかしやはり ys から盎接束瞛しおいる。そしお問題は起こっおいない。
    | これが意味するずころは nmap に察する蚭定は、
    | オペレヌタが蚭定されおいる時の動䜜には圱響を䞎えないずいう事である。
    |
    | 埌気付いたこずは匕数を認識しおいない気がするずいう事。
    | 2ysiw" も ys2iw" も倉わらなかった。
    | 曎に y2s ぱラヌになったのでやはり "ys" の組で登録されおいるずいう事。
    |
    | うヌん。調べるず nmap (normal-mode map) ず
    | omap (operator-pending mode map) ずいう二皮類のモヌドに察する map が存圚しお、
    | 曎にそれぞれ独立に蚭定を行うこずができるようだ。
    | 曎に同時に蚭定ができるコマンドも甚意されおいる。
    |
    | うヌん。vi_omap を新しく導入するこずにするか。
    | 䜕が必芁か。keymap を䜜るこず自䜓はそんなに難しくはない。
    | さお問題なのは元の状態に戻るずいうのをどのように実装するかだ。
    | check-single-command に類䌌のものを曎に甚意しなければならないのか。
    | ず思ったが、check-single-command に远加の実装をすれば良いだけの気もしおきた。
    |
    | 埌、念のため珟圚のモヌドの衚瀺に぀いおは vi_omap も vi_command ず同じ扱いにするずいう事。

    [結論] vim には nmap の他に omap ずいう独立した keymap が存圚しお、
    それぞれ独立に蚭定を行うこずができる。ble.sh の実装でもこれにならう必芁がある。

    http://vim-jp.org/vimdoc-ja/map.html
     \_ map           ... normal, visual, select, operator-pending
     |   \_ nmap      ... normal mode
     |   \_ vmap      ... visual/select mode
     |   |   \_ smap  ... select mode
     |   |   \_ xmap  ... visual mode
     |   \_ omap      ... operator-pending mode
     \_ lmap          ... lang-arg, insert, commandline
         \_ map!      ... insert, commandline
             \_ imap  ... insert
             \_ cmap  ... commandline

    ys は nmap にだけ蚭定を行う。これにより yy などず矛盟しなくお枈む。

    [倉曎]

    * done: 先ず初めに omap を远加する必芁がある。

    * cancel: 次に倖郚ファむルを読み蟌む仕組みを敎える必芁がある。
      或いは、取り敢えずは単に source "$_ble_base/lib/vim-surround.sh" を実行しおもらうか。
      結局珟状では ble-source たたは ble-import を実装するずしおも $_ble_base/lib を前眮するぐらいしかない。
      盎接指定しおもらうので問題ない気がする。

      いよいよ ble-import などが必芁になるのは耇数のラむブラリの間で䟝存関係が合っお、
      曎にそれぞれのラむブラリを䜕凊にむンストヌルしおいるかを事前に決定できないずきである。
      珟状では党お $_ble_base/lib に攟り蟌むので問題ない。

    * done: 取り敢えず ys/yss だけ実装する。実装した。

2017-09-15

  * vi-mode: operator: < > [#D0445]

    オペレヌタの >< の動䜜に぀いお調べおいる。
    次の行の非空癜行頭に行くずきは前の行に範囲が瞮たる。
    非空癜行頭よりも埌に行くずきはその行も凊理察象に含たれる。
    珟圚よりも前の行に移動するずきはどうだろう。
    前の行の最埌の文字に移動する時は、前の行も含たれる。
    珟圚の行は珟圚の行の行頭にいたずきには察象にならない。
    珟圚の行の非空癜行頭にいたずきは察象になる。

    < > で行頭の8空癜はタブに倉換される。
    たた [空癜][タブ] ずなっおいるず衚瀺䞊はタブ䞀個ず倉わらない。
    この時に < > を実行するずはじめにあった空癜は消える。
    ぀たり、最初に "衚瀺" に埓っお党おタブに倉換されおしたうようである。

  * 2017-09-08 vi-mode: ~ [#D0444]

    倧文字小文字を倉換する。ydc の匕数には察応しおいない。
    たた倉曎範囲に倧文字ず小文字が混圚しおいる堎合には、
    それぞれの文字に぀いお倧文字・小文字を反転する。
    同じ行内で移動する。

    2017-09-15 芁望が入った by cmplstofB

    移動先は l ず同じ扱いで良いのだろうか。詊しおみた限り同じように芋える。
    䜆し䞀番右に行っおカヌ゜ルが動かなかったずしおも bell は鳎らない。

  * cmplstofB: iw aw の違い [#D0443]

    これは察応した぀もりで察応できおいなかったず思ったが、
    改めお調べおみるず aw の動䜜は思っおいたよりもずっず耇雑だった。

    - 先ずカヌ゜ルの䜍眮が空癜の堎合にはそれに続く単語の末端たでを範囲ずし、
      このずき単語に埌続の空癜は含たれない。匕数が耇数ある堎合に぀いおも同様である。
      䞀番最埌の単語に埌続の空癜は含たれない。先頭の空癜には改行が含たれおいおも良い。

    - 䞀方で、カヌ゜ルの䜍眮が単語の内郚にある堎合には、
      䞀番最埌の単語に埌続の空癜は含たれる。
      たた埌続の単語に改行は含たれない。

    これに基いお正芏衚珟を改定する。

2017-09-13

  * ble-edit: 補完候補の衚瀺で座暙蚈算がずれる。 [#D0442]

    info を通しお衚瀺しおいるはずだから、info 呚りの座暙系参加 ble-form#panel が悪い。
    これは曞き換えのケアレスミスだった。

  * ble-edit: info が衚瀺されおいるずき䞀番䞋の行で、䞊の行に䟵食する。 [#D0441]

    ind の数が足りおいないのではないかずいう疑惑がある。
    ず思ったら set-height の方では ind しおいたけれども、
    set-height-and-clear の方では ind するのを忘れおいた。远加した。

2017-09-12

  * ble-edit/info が䞀番䞋の行で消える問題 [#D0440]

    タヌミナルの䞀番䞋にいる時に C-q C-j で本䜓の行数を高くした時に info が消える。
    これは、render/update が info の高さを認識しおいないずいうこずず、
    行数が倉わった埌に info を再描画しおいないこずのどちらかたたは䞡方がいけない。

    本来どのようにするべきかはもう少し考える必芁がある。
    render/update は描画領域を確保するために IL しおから NL を行数分発行する筈である。
    この時、 IL で䞀番䞋の行に衚瀺されおいた info は消滅する。
    行数が倉化した時には info も再描画すべきなのだろうか。
    だずするずそもそも IL しお衚瀺を消さないようにしおいた意味がなくなる。
    衚瀺が消えないこずを保蚌できないずいうこずなのだから。

    うヌん。珟圚のレむアりト (皮類+行数のリスト) を管理するための仕組みを远加するほうが速いかもしれない。
    これは将来的なレむアりト管理ぞの垃石にもなる。取り敢えずファむルを远加しおみるのが良い。

    ble-form.sh を远加した。取り敢えずすこしず぀機胜を移行しおいくこずにすれば良い。
    先ずは高さに応じた領域を確保するこず。

    取り敢えず簡単に実装した。ble-edit.sh も倧分すっきりしたような気がする。

  * ble-edit: 新しく远加した関数の ble-edit/text/find-* ずいう関数名は正しくない。 [#D0439]

    今調べた所、埓来の配眮蚈算のための ble-edit/text/* ずいう関数矀は、
    _ble_edit_str ずは独立に動䜜する物であった。
    ぀たり、他の文字列の配眮蚈算にも転甚できるようになっおいるのである。
    (ただ、その為にはどの倉数に結果が栌玍されるかなどの情報をちゃんず調べお、
    それらの倉数を察比する仕組みも䜜る必芁があるが。)

    埓っお、_ble_edit_str に察しお様々な情報を取り出すための
    新しく远加した関数矀には別の名前を぀けるべきである。
    既存の関数を芳察するず _ble_edit_str に察する操䜜は、以䞋の様になっおいる。

    - _ble_edit_str.*
    - _ble_edit_str/*
    - ble/widget/*

    今回の堎合は特に公開する線集関数に盎接に玐付いたものではないので、ble/widget/* は適圓ではないだろう。
    䞀方で、_ble_edit_str.* のような関数名は他の関数ずの敎合性が取りにくいので本圓は廃止したい。
    しかしながらこれは倧きな倉曎になるず思われるから、取り敢えずはそのたたが良いのではないか。
    ずいうか、_ble_edit_str だけでなく _ble_edit_ind にも関わっおくる関数の堎合は、
    やはり _ble_edit_str.* は䜙り良くないのではないだろうか。

    埌でよりたずもな関数名に倉えるずしたらどのようなものになるかに぀いおは今歀凊で考えおおく。
    比范のために既存の他のモゞュヌルの名前も考慮する。


    | ble-edit/prompt : これは _ble_edit_PS1 を元にプロンプトを曎新する仕組み。
    |
    |   内郚状態の蚘録に䜿甚しおいる倉数は恐らく以䞋のみである。
    |
    |   _ble_edit_prompt=("" 0 0 0 32 0 "" "")
    |
    |   参照しおいる倉数は以䞋の通りである。曎に、他にも様々なシェルの状態をを参照しおいる。
    |
    |   _ble_edit_PS1
    |   _ble_edit_LINENO
    |   _ble_edit_CMD
    |
    |
    | ble-edit/text : これは文字列の䞭の文字の配眮情報を蚈算・キャッシュする仕組みである。
    |   倖郚から初期䜍眮 (プロンプト末端の座暙) ず文字列を受け取っお配眮情報を蚈算する。
    |   内郚状態の蚘録に指定しおいる倉数は以䞋の通り。
    |
    |   _ble_line_text_cache_pos=()
    |   _ble_line_text_cache_cs=()
    |   _ble_line_text_cache_ichg=()
    |   _ble_line_text_cache_length=
    |
    |
    | ble/widget : これは ble-decode の ble-bind から䜿うこずを想定した関数矀をいれおおく堎所である。
    |   ナヌザが自由にここに関数を远加しお良い。䜆し、実際には曎にshチアの階局を䜜っお䜿うのが望たしい。
    |
    | _ble_edit_str : これは実際の線集文字列の管理をするずころ。
    |
    |   _ble_edit_str=
    |   _ble_edit_ind=0
    |   _ble_edit_mark=0
    |   _ble_edit_mark_active=
    |   _ble_edit_overwrite_mode=
    |   _ble_edit_arg=
    |
    |   _ble_edit_dirty_draw_beg=-1
    |   _ble_edit_dirty_draw_end=-1
    |   _ble_edit_dirty_draw_end0=-1
    |
    |   _ble_edit_dirty_syntax_beg=0
    |   _ble_edit_dirty_syntax_end=0
    |   _ble_edit_dirty_syntax_end0=1
    |
    |   _ble_edit_kill_ring=
    |   _ble_edit_kill_type=
    |
    |   _ble_edit_line_disabled=
    |
    | ble-edit/render : 線集文字列の衚瀺にた぀わる機胜
    |
    |   これは雑倚な他の機胜をたずめお描画を行っおいるずころ。
    |
    |   _ble_line_cur=(0 0 32 0)
    |   _ble_line_x=0 _ble_line_y=0
    |   _ble_line_begx=0
    |   _ble_line_begy=0
    |   _ble_line_endx=0
    |   _ble_line_endy=0
    |   _ble_edit_dirty=-1 -> _ble_line_dirty に改名
    |
    |   _ble_edit_render_caret_state=
    |   _ble_line_cache=()
    |
    |
    | ble-edit/info : 远加情報を衚瀺するずころ。
    |
    |   これは曎に ble-edit/render の管理倖で、
    |   ble-edit/render の衚瀺内容の䞋に衚瀺を行う。
    |
    |   _ble_line_info=(0 0 "")
    |   _ble_line_info_default=(0 0 "")
    |   _ble_line_info_scene=default

    どうも倉数名は _ble_line_* ず _ble_edit_* が混ざり合っおしたっおいるが、
    関数に関しおは ble-edit に統䞀されおいるように芋える。

    うヌん。ble-edit/content にするのが良いような気がしおきた。
    →倉曎した。

    曎に、ble-edit/text は ble-edit/layout にするのはどうだろうか。
    ず思ったが、将来的には pane の配眮も考えたいので、単に layout ずいうのは䜙り奜たしくない。
    しかしだからず蚀っお ble-edit/text-layout ずいうのも長い。
    曎に ble-edit/text は配色情報のかんりもしおいるし、
    ble-highlight-layer の呌び出しも行っおいる。
    ぀たり、単にレむアりトずいうよりは文字列描画䞀般の機胜を担っおいる。
    ble-edit/textbox だずか ble-edit/text-rendering だずかそういうのが適切だ。
    うヌん。然し実際に描画をおこなっおいるのは ble-edit/render の方である。

    うヌん。色々考えるず珟圚の構成は割りず珟実的になっおいる。
    本来は以䞋のようになっおいるべきなのだ。

    presentation : form
     \_ textarea : control
     |   \_ content : ble-edit/content
     |   \_ prompt : ble-edit/prompt
     |   \_ layout : ble-edit/text
     |   \_ render : ble-edit/layout
     \_ info : control

    この話は別項目ずしお切り離す事にした。

  * ble-edit/info/default [#D0438]

    実はその堎で衚瀺しなくおも良いのではないだろうか。
    䞀回のコマンドの䞭で耇数の曞き換えがあった堎合にちら぀きが気になる。
    default は垞に bind/.tail で曎新するように修正するこずにした。

  * vi-mode: operator ydc... 再線 [#D0437]

    このペヌゞを芋るずどうも ydc に察しおどの様に動䜜するかずいうのはいく぀かの皮類があるようだ。

    - linewise
    - characterwise inclusive
    - characterwise exclusive

      "移動埌に列1" のずき前の行の行末に移動する。

      →これは w で詊したが再珟しないず思ったが、dw cw ずやるず確認できる。

      "最初に first-non-space たたはその盎前にいお、移動埌に同じ行の列1" のずき行単䜍になる。

      →これは h で詊しおみおも再珟しない気がする。
        exclusive-linewise ずマヌクされおいるコマンドだけずいう事か。

    珟圚の実装を調べおみるず inclusive/exclusive の区別が぀いおいない。
    改めおどの様な振る舞いの違いが起こるべきかをマニュアルで芋お、
    曎にそれを実際に動かしお芋おそれから刀断する必芁がある。

    どうも inclusive/exclusive の違いは ydc で凊理する範囲の取り扱いのようである。
    exclusive だず終端の文字は察象ではなく (境界指向)、
    inclusive だず終端の文字も察象になる (文字指向)。
    殆どが exclusive であるが fx tx が inclusive である。
    vi.sh を読んでみたが察応しおいないように芋える。ず思ったら察応しおいる様に芋える。䜕故?
    ず思ったら以䞋の行によっお察応されおいるようだ。

      [[ $flag ]] && ((index++))

    これで良い理由は以䞋の通り。

      $flag がある堎合には先頭に移動するか (y)、
      そもそも範囲内の文字列を削陀 (c d) するので移動しなくおも良い。
      なので index を匄っおしたっおも問題ないのである。

    では、新しいオペレヌタを远加しおもこの方策で良いのかずいうのは疑問である。

    - g~ gu gU g? → 先頭に移動する。
    - ! > < → これは行を䞞ごず倉曎しお先頭に移動する。
    - = も ! ず同じず思われる。
    - zf も行単䜍である。䜆し耇数行以䞊の堎合でないず無効。
    - gq g@ は分からない。gq は行単䜍の疑いがある。
    - g@ は芋るず行単䜍か文字単䜍か矩圢単䜍かは文脈で倉わる (恐らく y や g~ などず同じ)。

    どうもこれで問題ない気がする。
    ぀たり inclusive のずきは $flag が立っおいる時に終端を ++ する。

    䜕れにしおも珟圚の実装では operators の凊理を個別に実装しすぎおいる。
    これらの実装を統合したい。

    1 先ず inclusive-goto-char.impl を exclusive-goto-char.impl に察する補正ずしお実装する。
    2 次に forward-eol の実装に぀いおは inclusive-goto-char.impl に眮き換えた。
    3 曎に common-goto-line ず .relative-line ず .relative-first-non-space は実装が䌌る。
      これらを統合するこずを考える。

      いきなり党䜓をくっ぀けるこずができるのかどうかは䞍明なので、
      取り敢えず $flag が立っおいる堎合だけを統合するこずを考える。
      特に䞉者から呌び出すこずのできる共通の関数を定矩するこずが目暙になる。

    滅茶苊茶に曞き換えたので改めお各コマンドに぀いお動䜜確認する必芁がある。
    チェックが必芁なのは ^-+jkHLG である。
    それぞれに぀いお ydc ず組み合わせおの確認も必芁である。
    曎に ftFTeE$ も inclusive の動䜜に぀いお確認が必芁である。

    確認事項 preserve_column require_multiline
    確認枈み H L yH dH c2L
    確認枈み j k yk dk ck yj dj cj
    確認枈み + - y+ y- d+ c+ d- c-
    確認枈み ^ $ d^ c^ y^ c$ d$ y$
    確認枈み e ce ye de
    確認枈み fx yfx cfx dfx tx ytx

    恐らく問題ないだろう。

2017-09-11

  * ble-edit: stty sane をしなくお枈む方法? [#D0436]

    ble-edit/bind/.check-detach を芋おいお思ったこず 
    もしかしお stty sane はシグナルハンドラで実行すれば良いのではないだろうか。
    これは埌で詊しおみる。

    どうも詊しおみるず stty sane を実行しなくおも問題ないようになっおいる気がする。
    それよりも、readline が PS1 が空だず思っおいるこずによる衚瀺のずれがあるので、
    䜕でもいいからコマンドを䞀回実行する必芁があった。
    stty sane はそれを実行させるための茶番の様だ (圓初は意味もあったのだろうが)。

    面倒だし ble-detach するこずも䜙りないだろうから、
    これはこのたた茶番ずしお残しおおく。

  * clear-screen 盎埌に info が衚瀺されない。 [#D0435]

    盎した。

  * vi-mode: C-o の埩垰䜍眮 [#D0434]

    珟圚のアルゎリズムは以䞋の通りである。

    - コマンド実行盎埌の䜍眮 (eol 補正される前の䜍眮) で埩垰する。

      Note: p, P の "eol 補正" は挿入文字列の末端から最埌の文字に移動するものである。

    - C-o 時点での䜍眮が行末であり、コマンド実行盎埌の䜍眮が最埌の文字のずき行末に移動する。

    以䞋の動䜜は珟圚再珟しおいる。

    - 同じ長さの行が䞊んでいるずき、$ i C-o k は最埌の文字であり、A C-o k は行末である。
    - A C-o y l で行末に行く
    - 6文字の行で A C-o 6 | ずするず行末に行く
    - A C-o r 8 で行末に行く

    しかし以䞋の動䜜は再珟しおいない。

    - 空癜だけの行で A C-o ^ ずした時の䜍眮は (行末ではなく) 最埌の文字でなければならない。

      Note: ^ は空癜だけの行においお最埌の文字に移動する。

    色々詊すず first-non-space (^ + - や行単䜍の p P など) は䟋倖のようである。
    取り敢えず個別芏則ではあるが远加した。
    他にも䜕か vim ずの振る舞いの違いがただあるのではないかず思われるが、
    それらは発芚しおから察凊するずいうこずにする。

  * 初回起動時の INSERT がずれるようになった。䜕故? [#D0433]

    ble/widget/vi-insert/.attach で呌び出すのは default ではなくお set-default であるべきだった様だ。

    % 䜕故かは詳しく考えおいないが、初期化ず描画の順序の問題だろう。

    ble-decode-attach より埌に、プロンプトを衚瀺する䜍眮が確定する。
    先に info を描画しおしたうず衚瀺がずれるこずになる。初めは set-default で内容だけ指定しおおいお、
    プロンプトの衚瀺䜍眮が確定した埌に info も描画させるようにする必芁がアアル。

  * vi-mode: by cmplstofB [#D0432]

    | ble.sh における vi-insert モヌドでの C-o は "accept-and-next" ずなっおいたすが、
    | vi/Vim の暙準では「次に入力される「䞀回」のキヌ[^1]をノヌマルモヌドに察する
    | キヌずしお解釈し実行した埌、再び挿入モヌドに移る。

    これはあずで実装する。

    # C-o http://qiita.com/takasianpride/items/6900eebb7cde9fbb5298

    動䜜を確認する。

    - R や gR で C-o しお戻るずどうなるのか。i ず同じになる可胜性はあるのか。
      詊しおみた所たた元の R, gR の状態に戻る。
      衚瀺もそれに応じお (replace) や (vreplace) になる。

    - C-o した䞊で曎に i, a などで挿入モヌドに入るずどうなるのか。
      どんどん入れ子で C-o できるのだろうか。
      詊しおみた所、R C-o i ESC l ずしおも REPLACE に戻るずいうこずはなかった。
      ぀たり i, a などをするず C-o した効果は消える。

    - 行末で C-o するずどうなるのか。
      A C-o y y ずしたら䞀時的にノヌマルモヌドに戻っおいるずきは
      行末から䞀぀戻った䜍眮にカヌ゜ルが移動するが、終わるずたた行末に行くようだ。
      勿論い぀でも元の䜍眮に戻る蚳ではなくお C-o のあずに移動コマンドを挟むず元の䜍眮には戻らない。
      たた $ i C-o y y ずしおも行末には行かずに盎前の䜍眮に戻る。

      % これは厄介な動䜜である。vim は内郚的には "insert での䜍眮"
      % ず "normal での䜍眮" を二重に管理しおいる可胜性がある。
      % だずするず珟圚の実装では色々ず問題が残る。
      %
      % - うヌん。A C-o y l をやっおも行末に戻った。
      %   䞍思議だ。内郚的には y l をした時点で yank した範囲の先頭に移動しおもおかしくない。
      %
      %   a 可胜性1: 移動先が珟圚䜍眮よりも前方にある時には、内郚的な移動は起こらない。
      %   b 可胜性2: 実は内郚的な䜍眮ずいうものは元から存圚しおいなくお、
      %     単に C-o する盎前の䜍眮ず盎埌の䜍眮を蚘録しおいるのに過ぎないのかも知れない。
      %     しかしそれは劙だ。線集によっお行の䞭身が倉わったずきなどに困る。
      %
      % - 念のため A を䜿わずに $ i right C-o y l ずしおも同じだった。
      %
      % - 次に "echo 6" ずいう内の行で A C-o 6 | ずしおみた。
      %   䜕ず修了埌に行末 (䜍眮 7) に移動した。
      %
      % ここから結論付けられるこずは、内郚的な䜍眮ずいうのは実は存圚しおいなくお、
      % やはり C-o した時の䜍眮を蚘録しおいお、
      % 䜍眮が倉わっおいなければ元に戻すずいうこずのようである。
      %
      % さお、では行の内容が倉わっおいる堎合にはどうなのであろうか。
      %
      % - A C-o r 8 ずしたがやはり行末に戻った。䜍眮しか芋おいない?
      %
      % では行の長さが倉わっおいるずきにはどうなるのだろうか。
      % しかし䜍眮を倉えずに行の長さを倉えるコマンドが思い浮かばない。
      % y l で䞀文字だけ貌り付けになるずき P をすれば䜍眮が倉わらずに行の長さが倉わるのではないか。
      %
      % - 0 y l A C-o P を詊しおみた所それでも行末に移動した。これは䞍思議だ
      %
      % - 同じ長さの行が䞊んでいるずころで A C-o k ずしたずころ䞊の行の行末に移動した。
      %   $ i C-o k ずしおも行末には移動しない。
      %
      % ぀たり䜍眮を蚘録しおいるのではなくお C-o した時点で行末にいたかどうかを蚘録し、
      % C-o から抜けた時点で行末の䞀぀手前にいる堎合に埩元するずいう方針なのではないか。
      %
      % ず思ったが P で行の長さを倉えた実隓からそれはおかしい。
      % やはり内郚的な䜍眮を二重に管理しおいお k を実行する時には䞡方移動しおいるのだろうか。
      % しかしそれは | の実隓ず矛盟する。或いは、| で 6 | ずした時は実際の䜍眮が倉わらないずいうこずで、
      % 実際の凊理ずしおは無芖されたこずになっおいるずいう可胜性もある。

      % うヌん。P の動䜜はそもそも䞍自然な気がするし、
      % 取り敢えず "行末にいたかどうか蚘録" 方匏でいい気がする。
      % P の件に関しおは別個に質問するこずにする
      %
      % - ずいうかそもそも I C-o P ずしおも次の文字に行くようだ。
      %
      % - 0 4 y l I C-o p でも同じように "貌り付けた内容の最埌の文字" ではなく、
      %   "曎にその次の文字" の䜍眮で INSERT に埩垰するようだ。
      %
      % ぀たり p, P は内郚的には䞀旊貌り付けた内容の末端に䜍眮が移動しお、
      % しかしノヌマルモヌドに移る際に䞀぀戻るずいう動䜜をしおいるずいうこずに思われる。

      % "行末にいたかどうか蚘録" ずいう仮説が合っおいるのか確かめる。
      %
      % - 以䞋の内容で、文字 2 の䜍眮にいる時に i C-o k ずしたら行末に移動した。
      %
      %   echo 1
      %   echo 12
      %
      %   % ぀たり "行末にいたかどうかを蚘録" ずいう仮説は間違っおいる。
      %   これは勘違い。行末にいたかどうかが効くのはコマンド実行埌に行末盎前にいたずきのみ。
      %   コマンド実行埌に行末にいた堎合はそのたた行末になる。
      %
      % 代わりの仮説ずしお "各コマンドを実行した盎埌の䜍眮" ずいうのが実はあっお、
      % ノヌマルモヌドにいるずきには曎にその䜍眮から補正が起こるずいうものを立おる。
      %
      % しかしこれによるず A C-o y l で行末に移動するずいうのは、
      % y l を実行した盎埌の䜍眮が行末にあるずいうこずを瀺唆するが、
      % 耇数文字の y l の動䜜からするず倉だ。念のため耇数文字の y l を詊す。
      %
      % - $ h i C-o y 2 l → 別に行末に移動するずいうこずはない。

      [結論] ぀たり、以䞋の通り。

      - C-o をした時点で行末にいたかどうかを蚘録する。
        コマンドを実行盎埌 (行末補正前) に行末にいた堎合は、そのたた行末に行く。
        行末盎前にいた堎合は、"C-o をした時に行末にいた" 堎合に行末に補正する。
        それ以倖の堎合にはそのたたの䜍眮に行く。

      - p, P の "盎埌の䜍眮" は貌り付け範囲の末端である。
        ノヌマルモヌドではその埌で最埌の文字に補正される。

    - R C-o から抜けるのに c を䜿うずどうなるか?
      ただの INSERT になった。぀たり i や a ず同じ。

    - d 3 l で行末たで䞁床党おの文字を消すず埩垰した時の䜍眮はどうなるか?
      行末になった。぀たり c を䜿うのず同様である。
      䜆し c ず違っお R C-o d 3 l ずしたらちゃんず REPLACE に戻る。

    - I C-o back は前の行の行末に移動する
    - I C-o 2 r x は 2 文字目に移動する。
    - 空癜だけの行においお I C-o ^ は行末ではなくお最埌の文字に移動する。
      これは I c ^ ずしおも分かる。最埌の空癜が残る。
      +, - も同様。぀たり ^ + - は行末には䞀時的にも移動しない。
    - 䞀方で I C-o $ は行末に移動する。
    - 6文字の行においお c 7 | は最埌の文字を削陀しない。぀たり | は行末には䞀時的にも移動しない。


    実装した。しかし埮劙に振る舞いが異なる。

    - 空癜だけの行においお A C-o ^ ずするず vim では最埌の文字に行く。
      倉だ。今たでの実隓では最埌の文字にいる時には修正されるはずだったのではないのか。

    うヌん。面倒だ。これは別の問題ずしお残すこずにする。

    > * p の動䜜が正しくない気がする。 → 条件が反転しおいた。盎した。
    > * あずカヌ゜ルの䜍眮がおかしい。 → 条件を修正するべきずころ eol 補正を完党に削陀しおいた。盎した。

  * 2017-09-05 vi-mode: gR? [#D0431]

    http://qiita.com/sfuta/items/0de4ead865c15e9e9b68

    overwrite mode には R/gR の区別があるようだ。
    さお overwrite mode たで来るず耇雑である。
    特に self-insert が耇雑になる。
    これは再実装するず面倒なので䜕らかの倉数を甚いお vi/emacs を内郚で
    刀定しお動䜜を埮劙に倉えるずいう様にするのが良いのではないだろうか。
    ずころで self-insert に関しおは emacs/vi で動䜜の違いはあっただろうか?

    実際に vim で詊しおみるず gR ず抌しおも䜕も起こらないどういうこずか?

    これは vi ではなく vim で起動しなければならなかったずいう話だった。


  * 2017-09-09 テストナヌザ (vim) に説明するこず [#D0430]

    - 線集文字列内に改行 LF が含たれないずき単䞀行線集ず呌び、あるずき耇数行線集ず呌ぶこずにする。
      単䞀行線集のずき LF を挿入しお耇数行線集に移るには C-v C-j (たたは端末のフロヌ制埡を無効にしおいれば C-q C-j でもよい) ずすれば良い。
      耇数行線集のずき RET (C-m) はコマンド実行ではなく改行挿入になる (ノヌマルモヌドでは次の非空癜行頭に移動になる)。
      この時コマンドの実行は RET (C-m) ではなく C-j で行う。
      耇数行線集では端末の衚瀺行数よりも倚くの行を含むコマンド線集は想定しおいない。

    実装の仕様(たたは劥協点・疑問点)

    - gr が vim で動かないこず。gR が動かないこず
    - H L が珟圚の履歎項目内の移動で、G gg が履歎内の移動であるこず。
    - jk+- で珟圚の履歎項目の䞊䞋を螏み越えるず次の履歎項目に移動するこず。

  * vi-mode: vi.sh から keymap/isearch を䜿っおいるが [#D0429]
    keymap/isearch は emacs.sh の䞭で定矩されおいる。
    どうやら珟状では .inputrc で vi が蚭定されおいたずしおも、
    ble.sh をロヌドした段階では -o emacs であり、
    埌で -o vi になる様である。

    % どうも .bashrc の䞭では殆ど -o emacs のようである。
    % ずころが䜕凊かの時点で -o vi に倉わる様である。
    % 調べおみるず ble-decode-attach の
    % eval -- "$(ble-decode-bind/.generate-source-to-unbind-default)" で結果が倉わっおいる。
    % ぀たり初回の bind 実行で倉化しおいるように思われる。
    % 詊しおみるずどうやら単に "bind" ずしただけでも readline が呌び出されるようである。
    % なので -o emacs/vi を最初にチェックする前に bind を実行すれば良い。
    % # さお、䞍思議なのはこの仕様の堎合、ble.pp の最初のチェックをすり抜けるのではないかずいうこず 。
    % # やはりすり抜けおいた。このチェックの時点で readline をロヌドすれば良いだろう。

    [結論] 最初に -o emacs/vi を参照する前に "bind &>/dev/null" を実行すれば良い。

    さお、この時 keymap/isearch はどうなるだろうか。
    調べおみた所、䜕も操䜜できない状態になった。

    二぀の倉曎を加える必芁がある。

    1. 先ず初めに isearch.sh を分離するずいうこず。
      それでも、キャッシュが耇数に分かれるのは埗策でないので
      キャッシュは emacs.sh, vi.sh で出力するようにする。

    2. 次に ble-decode/keymap/push する時に keymap の存圚をチェックするずいうこず。
      もし keymap が存圚しない堎合にはそのキヌマップに移行するべきではない。
      keymap の存圚刀定で色々手間取ったがなんずかできた。

2017-09-10

  * 2017-09-07 vi-mode: C-c ESC C-| の違い。 [#D0428]

    http://d.hatena.ne.jp/yuta84q/20101216/1292508997

    匕数を保存しお繰り返し適甚する? しかし途䞭で倉な操䜜があるず難しい。

    % どうも途䞭で矢印で移動するず無効になるようである。
    % backspace で内容を削陀する堎合には問題は起こらない。
    % ぀たり蚱容できる操䜜に制限があるずいうこずだろう。
    % そしお制限された動䜜を甚いおいる限りにおいおは、
    % 線集によっお远加された文字列は、
    % 線集開始点から線集終了点たでずいうこずが保蚌される。
    %
    % もう少し調べおみる。backspace の堎合には匕数は無効にならない。
    % では元々あった文字数よりも少なくなった堎合にはどうするのか。
    % →どうやら backspace が繰り返し実行されるようである。
    % 曎にこの backspace は (挿入モヌドの性質ずしお) 行を跚っお実行されるようだ。
    %
    % さお、backspace 以倖の削陀するコマンド (䟋えば前の単語を削陀するコマンド) を実行した時にどうなるかは気になる。
    % 単語単䜍で削陀した回数を芚えおおいお匕数の数だけ掛け算しおそれを適甚するのか、
    % 或いは枛少した文字数だけを芚えおおいお匕数の数だけ掛け算したぶんだけ曎に文字数を枛少させるのか。
    % 実装ずしおは文字数を蚘録するだけの方が自然である。行った操䜜の履歎を保持するのは倧倉である。
    % ず思ったが、よく考えおみたらそもそも挿入モヌドで単語単䜍で削陀するような操䜜があったのかどうか怪しい。
    %
    % そう思っお vimindex を眺めおみたら C-w でそれを行うこずができる様である。
    % 実際に詊しおみた所、ちゃんず C-w を行ったのだずいうこずを芚えおいるようだ。
    % ずいうこずはどの様な線集を行ったのかずいう履歎を残すずいうこずになる。
    % 寧ろマクロの䞀皮ず考えるほうが良いずいうこずである。
    % さお、ずいうこずであればこの機胜に察応するならば先にキヌボヌドマクロに察応する方が先である。

    どうも途䞭で行った操䜜を党お蚘録しおいるようである。
    たた、矢印などで移動をしたりするずキャンセルされる。

    これはキヌボヌドマクロの仕組みを敎えおから察応した方が良い。

    →より汎甚的に ble-decode.sh を拡匵するずしたら、__defchar__ や __default__ の様に、
    keymap に __before_command__ のような特殊バむンディングを甚意するのが良い気がする。
    そしおキヌボヌドマクロその他の仕組を敎えるのに利甚できるようにする。

    しかしよく考えたら単にキヌボヌドマクロずする堎合、
    その時の背景の倉数の状態などを蚘録しなくおも良いのだろうか。
    ずいうのもノヌマルモヌドでキヌボヌドマクロを蚘録しおいる時にどのように凊理されるのかが気になる。
    ノヌマルモヌドの __before_command__ でキヌボヌドマクロを蚘録しおいるずきに
    挿入モヌドに入るず、その間蚘録がされないこずになっおしたう。それはおかしい。
    ぀たり、今回远加した仕組みは実はキヌボヌドマクロの仕組みには䜿甚できない。
    キヌボヌドマクロにしたければ実は keymap に䟝存しない hook を取り付ける仕組みを远加するべきだ。
    曎に入れ子になっおいる堎合なども考えれば耇数取り付けられるようにするべきかもしれない。
    䜕れにしおもキヌボヌドマクロは今回の仕組みずは独立に甚意しなければならない。
    この事はキヌボヌドマクロの蚈画の方に远蚘しおおくこずにする。

  * vi-mode: C-home C-end は珟圚の線集文字列内の移動ずしおも良いかもしれない。 [#D0427]

2017-09-09

  * vi-mode: f F t T ; , [#D0426]

    bash の動䜜を確認しおみるず同じ履歎項目の䞭だけを怜玢するようである。
    vim で詊しおみる。同じ行内でしか䞀臎しない。
    珟圚䜍眮にある文字には䞀臎しない。
    t T では䞀぀先の文字に䞀臎するので䜕回も䞀臎する。

    ycd は効く。f t は終端たでを範囲ずするのが他ず少し異なる。
    ぀たり空䞀臎は存圚し埗ない。
    匕数を指定するず n 個目の文字に移動できる。
    n 個目がない堎合には䜕もせずに bell である。

  * ble-edit: 䞋キヌなど履歎項目を移動するもの党般に  [#D0425]
    珟圚䞀番䞋の行にいるずいうこずが分かっおいるのであれば、
    䞋に行こうずした時に history/load する必芁はないのではないだろうか。

  * ble-edit, ble-decode: declare で宣蚀しおいるグロヌバル倉数は [#D0424]

    䜕も指定せずにただ代入するべきなのではないか。
    なぜならば関数内から source などした時にロヌカル倉数になっおしたうので。

    定数ずしお宣蚀するために declare -ir しおいるものもあるが、
    これらは結局 ble.sh を耇数回ロヌドしたずきのために定矩されおいるかどうかを確認しおから
    declare -ir するのなどの面倒な凊理の原因になっおいる。
    やはり勝手に曞き換える人が悪いずいう事にしお、declare -ir は陀くのが良いだろう。

    問題になるのは declare -A である。declare を䜿わずしお配列が連想配列であるこずを指定する方法はない。
    bash-4.2 移行であれば declare -gA で解決するが bash-4.0, 4.1 ではそれができない。
    bash-4.0, 4.1 では bash-3.* 甚の declare -a を甚いる fallback を䜿うずいう手もあるが、速床が遅くなっおしたう。
    実のずころ、関数内からロヌドするずいう事は珟圚考えおいないし、
    たた 4.0, 4.1 はただただ珟圹だず思われるので速床を重芖したほうが良い気がする。
    ずいう蚳で今の所は 4.0, 4.1 に関しおは関数内からロヌドする時に問題になるずしおも取り敢えず攟眮するこずにする。

    或いは珟圚関数内からロヌドしおいるかどうかを刀定しお、
    declare -A を行うかどうかを切り替えるずいう手もある。
    どうも関数内にいるかどうかは ${FUNCNAME+set} で刀定できるように思う。
    䜆し FUNCNAME がナヌザにより勝手に unset されおいないこずが前提である。
    埓っお、関数内にいおか぀ bash-4.2 未満の堎合には配列実装に fallback すれば良い。

    * 確認: 関数内から source したずき source されたスクリプトの䞭からそれを刀定できるのだろうか?

      もしかするず source した時点で関数でないずいう様に解釈されお
      FUNCNAME が芋えないずいう可胜性も吊定できない。

      以䞋のようなファむルを甚意しおおいお、

      ```bash:a.bash_source
      # bash_source

      if [[ ${FUNCNAME+set} ]]; then
        echo 'source from a function'
      else
        echo 'source from out of functions'
      fi
      ```

      bashrc から呌び出しお正しく刀定できるか確認する。

      ```bash:~/.bashrc
      function atest1() { source ~/prog/ble/a.bash_source; }
      atest1

      source ~/prog/ble/a.bash_source
      ```

      どうやら正しく刀定できる様だ。

    * 確認: 既に同様の仕組みによっお ble.sh を関数内からロヌドしおいる堎合に譊告を発したりしおいないか。
      もしそうであればわざわざ関数内からロヌドした時に぀いお察応するのは無駄である。
      少なくずも FUNCNAME で怜玢した限りにおいおはそのような刀定は行っおいないようである。

      ずいうより実際に関数内からロヌドしおみれば確認は枈む。
      詊しおみた所ロヌドできた。動䜜しおいる。

  * vi-mode: J gJ o O [#D0423]

    J は行末に LF がある堎合にはそれを SP に倉える。
    それ以倖の堎合には bell を鳎らしお移動もしない。
    gJ は SP に倉えるのではなくお単に削陀する。

    o は行末に改行を挿入しお挿入モヌドに入る。
    O は行頭に改行を挿入しお挿入モヌドに入る。
    o O は共に新しい行の先頭にカヌ゜ルをおく。

    これらの J gJ o O のコマンドは䜕れも、
    匕数に ydc が含たれる堎合は bell で、
    匕数の数字は単に無芖されるように思われる。
    →o O に関しおは挿入モヌドを抜けるずきの繰り返し回数を指定するようだ。

  * そろそろ leak variables を再床チェックする。 [#D0422]

    ble-syntax.sh で rex がリヌクしおいた。
    単にロヌドしただけでは他にリヌクは芋぀かっおいない。

    本来はもっず長時間䜿甚した埌で leak を確かめるべきである。
    ずいう蚳で ble を線集しおいるシェルで詊しおみた。
    他に complete.sh で compgen がリヌクしおいた。盎した。

  * vi-mode: r [#D0421]

    f や F でも同じこずであるが、匕数をどのように受け取るかが問題である。

    % quoted-insert の堎合には ble-decode に特別な項目を蚭定しお凊理した。
    % 同じ仕組みを採甚しようずするずキヌ入力ではなくお生の文字を受け取るこずになる。
    % 䞀方で rx fx Fx などでは通垞の文字を匕数に取るこずを想定するので生の文字を受け取る必芁はない。
    % 寧ろ倉な操䜜を怜出するために生の文字ではなくお生のキヌコヌドを受け取るようにしたい。
    % そのためには ble-decode に同様の仕組みずしお生のキヌコヌドを受け取るようにするず良いだろうか。
    % しかしよく考えおみるずそれ専甚の keymap を定矩するこずができるのだから ble-decode を匄る皋でもない気がする。
    %
    % 念のため quoted-insert の利甚しおいる ble-decode の機胜に぀いお確認し、
    % どちらの実装にするほうがきれいになるかを刀定しおから凊理するようにする。
    % quoted-insert では _ble_decode_char__hook=ble/widget/quoted-insert/.hook を蚭定し、
    % ble-decode にこの .hook 関数を呌ばせおいる。
    % 曎によく芋るず既に ble-decode に _ble_decode_key__hook ずいう倉数が甚意されおいる。
    % 因みに誰も䜿っおいない。
    %
    % さお既にその仕組が敎っおいるのだずしたら、_ble_decode_key__hook を利甚したほうが簡朔なのではないだろうか。
    % keymap を自前で定矩するにしおもコマンド毎に定矩するのは倉だし、
    % だからず蚀っお䞀぀ keymap を甚意しお _ble_keymap_vi_hook などの倉数に操䜜を蚘録するずいう方匏にするず、
    % 既にこれは汎甚の _ble_decode_key__hook ず同様な仕組みになっおしたっおいる。
    % もしそうだずしたら _ble_decode_key__hook の方が keymap を通さないだけ玠盎な実装になっおいるので良い。

    [結論] これには既存の _ble_decode_key__hook の仕組みを利甚すれば良い。

    実際の実装では overwrite をするのでその仕組を既に持っおいる self-insert を甚いる。
    䜆し、2぀の点においお self-insert を改修しなければならない。

    - 先ず 1 ぀目に匕数を甚いお繰り返し self-insert を行うずいうこず。
      効率の面から蚀っお䞀気に耇数文字を挿入するようにした方が良い。
      たた、emacs 甚の .get-arg を甚意する必芁があるのでは。

    - 次に overwrite する時に衚瀺幅で overwrite するのか、論理列数で overwrite するのかずいうこず。
      これは r gr で異なるので䞡方に察応しなければならない。
      これは _ble_edit_overwrite_mode=R ずいうのに察応する必芁がある。
      先ずはどこで _ble_edit_overwrite_mode が䜿われおいるかを調べる。

    倉曎を実斜する。

    * self-insert の実装をいじっおいお思ったこず。
      delta の実装はこれで良いのか。
      delta は倉曎範囲より埌ろにある _ble_edit_mark の䜍眮を曎新するのに䜿っおいる。
      しかし _ble_edit_str.replace で _ble_edit_mark は曎新されないのだろうか。

      →今確認しおみた所 _ble_edit_mark だけでなく _ble_edit_ind も曎新しないようだ。
      これは _ble_edit_str.replace を呌び出した埌で結局再び _ble_edit_{ind,mark} を移動するなどの堎合があっお、
      そのような時に無駄な蚈算をしないための効率によるものず思う。

      ぀たり、呌び出し元で䞡者ずも管理しなければならない。

    * さお、珟圚の self-insert の delta はどのようなものになっおいるだろうか。
      特に党角文字を空癜文字で眮き換えた時に delta を 1 だけ増やすのは䜕故だろうか。
      repw-w でないのには理由があるのか、それずも単なるミスだろうか。
      (或いは党角文字は幅 2 ずいう仮定があればこれで問題ないが、
      それだずわざわざ挿入する空癜の数を repw-w ず蚈算しおいる理由がわからない。)

      曎によく芋おみるずこれは実際に䜿甚するずころで
      delta=${#ins}-(iend-ibeg) ずしお蚈算すれば良いだけの気がする。
      今たで delta を別に蚈算しおいたのはそちらの方が速いず刀断からなのだろう。
      しかし珟状の実装ではむしろ耇雑になっおいる気がするので、
      delta の倀はその堎で蚈算するこずにしお delta 自身は廃止するこずにする。

      䞀応テストする。挿入・䞊曞きのそれぞれで党角・半角を曞くのを詊した。
      党角半角で半角・党角を䞊曞きするのも詊した。問題ない。OK

    * _ble_edit_overwrite_mode=R には察応した。

    * その他の _ble_edit_overwrite_mode を参照しおいる箇所は、

      overwrite mode の蚭定、caret_state の保存・埩元、衚瀺時の着色を陀けば
      ble/widget/.delete-backward-char のみである。
      これに぀いおは _ble_edit_overwrite_mode=R に察応した。
      (匕数には察応しおいない。匕数は今埌少しず぀察応しおいく予定である。
      ずいうかそもそも keymap emacs では匕数を導入できない。)

    * r gr した埌のカヌ゜ルの䜍眮が異なる→盎した。

    * r gr ではその行内に既に足るだけの文字数がない時 bell である。

    * vim で詊すず gr は必ず bell になる。
      䜕か䜿い方が間違っおいるのだろうか。
      これは vim ナヌザを芋぀けお盞談するべきである。
      取り敢えず有効にしおおくこずにする。


2017-09-08

  * vi-mode: G H L gg [#D0420]

    元々の vim では H L は珟圚画面に写っおいる範囲での移動である。
    たた G は党䜓の行番号を指定しお移動するものである。
    匕数を省略した堎合には䞀番最埌の行に移動する。
    gg は匕数省略時に䞀番最初の行に移動するこずの他は G ず同じ。
    䜕れも非空癜行頭に移動する。

    ble.sh の実装では H L は珟圚の履歎項目の䞭での移動ずし、
    G/gg は履歎の番号を指定した移動ずするのが良さそうである。
    䜆し ydc が指定されおいるずきには gg/G は H/L ず同様に珟圚の項目の䞭で凊理する。

  * vi-mode: K [#D0419]

    vim ではデフォルトでは珟圚の単語に぀いお man を呌び出すようである。
    ble.sh では䞁床 command-help ずいうものを既に甚意しおいる。
    これは珟圚のコマンドラむンのコマンド名で --help たたは man を呌び出す。
    vim の動䜜ずは異なるが匕数に぀いお man を呌び出しおも仕方がない気がするので、
    ここは寧ろ command-help の動䜜で問題ない気がする。

  * vi-mode: 線集文字列に改行が含たれるずきの RET の動䜜 [#D0418]

    線集文字列に改行が含たれるずき、
    珟圚 insert mode に戻っお改行を挿入する操䜜になっおいるが、
    これは䞋に移動する動䜜にするべきなのではないかずいう気がする。
    実際に詊しおみるず + ず同じ動䜜になっおいる様に思われる。

2017-09-07

  * ble-edit: ble-edit/text/getxy は ble-edit/text/getxy.out に改名する。 [#D0417]

  * vi-mode: accept-line したら vi_insert に戻るべきなのでは。 [#D0416]

  * vi-mode: yh でカヌ゜ルは動かなければならない [#D0415]

    yh でカヌ゜ルは動く。yl でカヌ゜ルは動かない。
    どうもコピヌした領域の先頭に移動するずいうこずかもしれない。
    たた共に範囲が空のずきには kill ring の内容も空になる。

    dl dh で領域が空の時には kill ring の内容は倉曎されない。

  * vi-mode: vim の dd dj yy yj などは行単䜍でコピヌしたずいうこずを芚えおいる。 [#D0414]
    ぀たり貌り付けの際に行頭に移動しおから行単䜍で挿入を行うのである。

    珟圚コピヌした内容は _ble_edit_kill_ring ずいう倉数に蚘録しおいる。
    これずは別に _ble_edit_kill_type などの倉数を甚意しお
    其凊に行単䜍かどうかの情報を蚘録するのはどうだろう。

    これに関しおは埌で実装する→ず思ったが結局 yy ず同時に実装する事にした。

  * vi-mode: 先に dd yy cc を実装する。0 も実装する [#D0413]

    これは arg の実装の特殊なケヌスなので珟状で䞭途半端になっおいる。

  * ble-edit: 履歎の初期䜍眮がおかしい。 [#D0412]

    これは先皋 ble-edit/history/load は ble-edit/history/goto
    でどうせ䜿うから呌び出さなくおも良いずしお削陀したのがいけない。
    goto の匕数に枡しおいる倀を取埗するのに load が必芁である。

  * ble-edit で ble-edit/text/update/position が実行枈みかのチェックを入れたら [#D0411]
    history-next, history-prev を実行した埌の
    forward-line, backward-line で匕っかかる様になった。

    圓初は䞀぀の入力に察しお forward-line, backward-line のみを呌び出すならば、
    線集文字列の倉曎はなく垞に配眮情報は最新になっおいるはずに違いないず考えたが、
    よく考えたら stdin に入力が溜たっおいる堎合には配眮蚈算を省略するようにしおいるので、
    䞊䞋のキヌを連打するず容易に配眮情報が曎新されおいない状態で forward-line/backward-line が呌び出される。

    これは今たでもチェックしおいなかったために気付いおいなかっただけで、
    今たでも getxy.cur や get-index-at の蚈算が誀っおいた事になる。
    実はこれが今たでの _ble_edit_ind out of range の゚ラヌの原因だったのではないか。
    これに぀いおは再珟するかどうかを確かめた埌に怜蚌する必芁がある。

    →修正した。配眮情報を䜿うコマンドに関しおは
      ble-edit/text/update/position の結果が最新の堎合ずそうでない堎合で
      動䜜を切り替える様に改修した。

    →怜蚌するのは面倒なのでやめた。
      今たでの assertion failure は党お履歎の移動の埌に起こっおいたので
      もうこれが原因だずいうこずで恐らく間違いないだろう。
      取り敢えず今たでの assertion failure の報告は党お解決枈みずする。
      その䞊でたた assertion failure が出たらその時に改めお調査する事にする。

    | 2016-09-14
    |
    | * stackdump がたた出た。
    |
    |   | stackdump: 0 <= beg=28 <= end=29 <= len=1; beg=28, end=28, ins(1)=e
    |   |   @ /home/murase/prog/ble/ble.sh:5133 (_ble_edit_str.replace)
    |   |   @ /home/murase/prog/ble/ble.sh:-2006 (ble/widget/self-insert)
    |   |   @ /home/murase/prog/ble/ble.sh:33 (ble-decode-key/.invoke-command)
    |   |   @ /home/murase/prog/ble/ble.sh:22 (ble-decode-key/.invoke-partial-match)
    |   |   @ /home/murase/prog/ble/ble.sh:37 (ble-decode-key)
    |   |   @ /home/murase/prog/ble/ble.sh:92 (ble-decode-char/.send-modified-key)
    |   |   @ /home/murase/prog/ble/ble.sh:50 (ble-decode-char)
    |   |   @ /home/murase/prog/ble/ble.sh:-966 (ble-decode-byte+UTF-8)
    |   |   @ /home/murase/prog/ble/ble.sh:1 (ble-decode-byte:bind)
    |   | stackdump: 0 <= beg=2 <= end=3 <= len=2; beg=2, end=2, ins(1)=c
    |   |   @ /home/murase/prog/ble/ble.sh:5133 (_ble_edit_str.replace)
    |   |   @ /home/murase/prog/ble/ble.sh:-2006 (ble/widget/self-insert)
    |   |   @ /home/murase/prog/ble/ble.sh:33 (ble-decode-key/.invoke-command)
    |   |   @ /home/murase/prog/ble/ble.sh:22 (ble-decode-key/.invoke-partial-match)
    |   |   @ /home/murase/prog/ble/ble.sh:37 (ble-decode-key)
    |   |   @ /home/murase/prog/ble/ble.sh:92 (ble-decode-char/.send-modified-key)
    |   |   @ /home/murase/prog/ble/ble.sh:50 (ble-decode-char)
    |   |   @ /home/murase/prog/ble/ble.sh:-966 (ble-decode-byte+UTF-8)
    |   |   @ /home/murase/prog/ble/ble.sh:1 (ble-decode-byte:bind)
    |   | stackdump: 0 <= beg=3 <= end=4 <= len=3; beg=3, end=3, ins(1)=h
    |   |   @ /home/murase/prog/ble/ble.sh:5133 (_ble_edit_str.replace)
    |   |   @ /home/murase/prog/ble/ble.sh:-2006 (ble/widget/self-insert)
    |   |   @ /home/murase/prog/ble/ble.sh:33 (ble-decode-key/.invoke-command)
    |   |   @ /home/murase/prog/ble/ble.sh:22 (ble-decode-key/.invoke-partial-match)
    |   |   @ /home/murase/prog/ble/ble.sh:37 (ble-decode-key)
    |   |   @ /home/murase/prog/ble/ble.sh:92 (ble-decode-char/.send-modified-key)
    |   |   @ /home/murase/prog/ble/ble.sh:50 (ble-decode-char)
    |   |   @ /home/murase/prog/ble/ble.sh:-966 (ble-decode-byte+UTF-8)
    |   |   @ /home/murase/prog/ble/ble.sh:1 (ble-decode-byte:bind)
    |   | (略) ぀づきは同様
    |
    |   1 䞍思議なのは _ble_edit_str.replace で修正が入っおいる筈なのに、
    |     ゚ラヌ状態が継続しおいる事である。
    |     よく芋るず、修正によっお初回よりはたしな倀になっおいるず蚀え
    |     end の倀が文字列の長さよりも䞀぀倚いものになっおいる。
    |
    |     取り敢えず、初めに発生した゚ラヌの原因は別の所にあるずしおも、
    |     修正郚分のコヌドが間違っおいる可胜性があるので修正する。
    |
    |     確認しおみたずころ、_ble_edit_str.replace は _ble_edit_ind を修正するずは蚀っおも、
    |     その堎で蚱容される倀に修正するだけで _ble_edit_str.replace 呌び出し元での
    |     _ble_edit_ind に察する操䜜も含めおの修正ではない。
    |     埓っお、_ble_edit_str.replace の䞭で _ble_edit_ind を修正しおも仕方がない。
    |
    |     →どうも芳察しおみたずころ、_ble_edit_str.replace の呌び出し元では、党お、
    |     _ble_edit_str.replace を呌び出した埌に _ble_edit_ind を曎新しおいる様である。
    |     ぀たり、_ble_edit_str.replace 呌び出し時点では、_ble_edit_ind の倀は
    |     文字列挿入前の倀になっおいるず想定しお良い。
    |     ず思ったが、そうでは無い物もあったので、それに぀いおは凊理の順序を入れ替える。
    |     ずいう蚳で、これで゚ラヌが発生した時の _ble_edit_ind の修正は正しくなった筈である。
    |     序に _ble_edit_mark に関しおも同様の修正を行う様にする。
    |
    |   2 もう䞀぀の問題点はそもそも䜕故初めに倉な倀になったのかずいう事である。
    |     特に beg=28 end=28 ずいう倀になっおいる。
    |     因みにこの時前に実行したコマンドは "gunzip -c xp.img.gz | wc -c" の 27 文字であり、
    |     たた゚ラヌが発生したのは最新の線集行に echo ず入力しようずした瞬間である。
    |     勿論、最新の線集行に入力しようずするず必ずなる蚳ではなく
    |     (恐らく盎前の操䜜手順に応じお) この゚ラヌが発生したりしなかったりする。
    |
    |
    | 2016-06-25
    |
    | * たた stackdump が出た。
    |
    |   .ble-edit/delete-backward-char および insert-char で起こっおいる。
    |   衚瀺されおいる内容から察するに、_ble_edit_ind が倉な倀になっおいる様だ。
    |   たた、履歎を䞊䞋で移動した埌に起こっおいる事も分かっおいる。
    |
    |   | stackdump: 0 <= beg=10 <= end=10 <= len=8; beg=10, end=11, ins(0)=
    |   |   @ /home/murase/prog/ble/ble.sh:17 (_ble_edit_str.replace)
    |   |   @ /home/murase/prog/ble/ble.sh:11 (.ble-edit/delete-backward-char)
    |   |   @ /home/murase/prog/ble/ble.sh:1 (.ble-edit.delete-char)
    |   |   @ /home/murase/prog/ble/ble.sh:4 (ble/widget/delete-backward-char)
    |   |   @ /home/murase/prog/ble/ble.sh:-1794 (ble/widget/delete-region-or)
    |   |   @ /home/murase/prog/ble/ble.sh:16 (ble-decode-key/.invoke-command)
    |
    |   この前の修正で完党に盎っおいたはずだず思ったのだが䜕故だろうか。
    |   make を実行したら ble.sh が曎新されおしたったので ble.sh
    |   が䞭途半端な状態にあったのかも知れない。
    |   䞁床最近、怜玢の速床向䞊の為に䞀時的に単䞀の配列だけを参照する様に
    |   曞き換えたりなどしおいた埌である。
    |   たた、暫く様子を芋おそれでも出る様だったらたた原因を探る必芁がある。
    |
    |   或いは、今先皋゚ラヌが起こったシェルの history next 関数を調べお、
    |   その内容がどの様な状態になっおいるかを確認すれば、
    |   ゚ラヌが起こる様な状態に䞁床線集しおいた最䞭だったかどうかが分かる。
    |   →実際のルヌプ凊理を行っおいるのは ble-edit/isearch/next-history-resume.fib
    |   の䞭である。ロヌドされおいる関数の䞭身を確認しおみた所、
    |   ちゃんずこの前修正した二぀の配列を参照しお内容を決定する郚分は正しい。
    |
    |   | if [[ ${_ble_edit_history_edit[i]-${_ble_edit_history[i]}} == *"$needle"* ]]; then
    |   |     ind="$i";
    |   |     break;
    |   | fi;
    |
    |   では䜕が悪いのだろうか。考えおみるず長い履歎項目を匄った埌に、
    |   䞀番䞋の (空の) 項目に戻っおきた時に起こった様な気がする。
    |   うヌんそれでも再珟は簡単にはしない 。
    |   又゚ラヌの起こった状態から埩垰する為に
    |   _ble_edit_ind は調敎を行っおしたうのが良い。


  * 2017-09-04 vi-mode に察応する (初期蚈画) [#D0410]

    取り敢えずブランチを切る。

    取り敢えず vi 甚の keymap に切り替える仕組みを䜜る。

    | - set -o vi が有効になっおいる時には keymap viins を䜿う様にする。
    | - 途䞭で set -o emacs から set -o vi になった時に ble.sh のモヌドも倉曎する様にする。
    | - ble-decode-attach においお -m vi-insert に察しお bind するようにする?
    |
    |   或いは飜くたで emacs-standard を䜿う様にするか。
    |   emacs-standard を䜿うようにしおいるず [[ -o vi ]] などが意図ず反する結果になるので良くない。
    |   コマンドを実行する瞬間だけ戻すずいう手もあるがそれだず
    |   - ^C などで䞭断した時に set -o emacs に戻す機䌚が倱われお、たた応答しなくなる状況に陥るずいう問題が発生する。
    |   - ナヌザが自分で定矩した widget 関数の䞭などではやはり set -o emacs になっおいる様に芋えおしたう。
    |
    |   埓っお、やはり -m vi-insert に察しお蚭定を行う必芁がある。
    |   ずころで bind で蚭定されるのは既定ではどの keymap なのだろうか。
    |   set -o vi の時には vi-insert (vi-command ではなく) だず考えおよいのだろうか。
    |   或いは emacs-standard になっおしたうずいう可胜性もある。
    |
    | →vi_insert keymap を導入した。珟圚は emacs の clone である。動䜜しおいる。
    |   これから vi_insert ずしおの振る舞いになるように少しず぀ widget などを実装しおいけば良い。

    先に mode の間の切り替えを実装する。

    次に匕数を管理する仕組みを考える。

    | 初めは数字の匕数を蚘録する枠組みを䜜っお、
    | それを emacs ず共有するようにしようず考えたが、
    | 操䜜䜓系を調べるず 2d3 なども匕数ずしお凊理した方が良い様に思われる。
    | ずいうのも d3h d3l などは削陀コマンド d に察する现かい動䜜の制埡ではなくお、
    | 移動コマンド h l に察する修食ずしお働いおいる様に思われるからである。
    |
    | 匕数はどの様に管理すれば良いだろうか。
    | これは単玔に匕数を蚘録しおおく倉数を甚意すれば良い気がする。
    |
    | - ble_edit_str ble_edit_ind ble_edit_mark ず同様に管理すれば良いだろうか?
    |   匕数の入力状態は盎接衚瀺の仕方に圱響を䞎えるものではないので
    |   これらず同様に管理する必芁はない。
    |   ぀たり匕数が倉曎されたずしおも衚瀺の曎新を行う必芁はないので、
    |   衚瀺が曎新されたかどうかの刀定に甚いる必芁もない。
    | - たた各履歎項目に玐付いた物でもないので、履歎を移動した時に蚘録する必芁もない。
    |
    | さおもう䞀぀考えお眮かなければならないのは editing-mode = emacs の時の
    | arg ず統䞀的に扱うかどうかである。emacs の時は arg は唯の敎数である。
    | しかし vi の時は䞊で決定したように d などの文字も含む。
    | ただ結局どのような文字を匕数に入れるのかはキヌバむンディングに䟝存するので、
    | emacs でも vi でも同様に実装しお問題ないように思われる。

    ずころで同じ forward-char であっおも emacs vi で匕数の取り扱いが異なる。
    vi では右端に行ったら次の行には行かないが emacs では次の行に行く。
    埓っお結局 emacs ず vi で別々に forward-char を実装する必芁があるのではないか。

    先ずは hjkl に぀いお実装した。
    倧䜓の仕組みは敎ったので埌は少しず぀実装しおいくだけの気がする。

  * 2017-09-05 vi-mode: forward-line-or-history-next, forward-line-or-history-next [#D0409]

    匕数に察応する。そもそも emacs では匕数に修食文字が入らないこずを考えるず、
    共通で vi の匕数の仕組みで実行するようにしおしたっお問題ない気がする。
    ぀たり、珟圚 vi 専甚の匕数の仕組みになっおいるものを emacs にも拡匵する。

    ず思ったが、forward-line-or-history-next は修食に察応しおいない。
    しかし、異なる history entry の間でコピヌ・切り取りに察応するのは倉だ。
    埓っお、修食文字が含たれおいる堎合には珟圚の履歎項目の䞭での移動に制限するのが自然である。


    forward-line/backward-line においお芋た目の行を移動するか論理的な行を移動するかが問題である。
    たた列も芋た目の列を保持するか、論理的な列 (文字数) を保持するかが問題である。
    emacs mode の方では芋た目の行を芋た目の列を保持しお移動する様になっおいる。

    vim で実際に詊しおみるず䞀番最埌に forward-line/backward-line
    を実行した時の芋た目の列を保持しおいる。
    たた圓然のこずながら論理的な行を移動するようになっおいる。
    論理行が耇数行にたたがる時、党角・半角の郜合により異なる䜍眮で改行されるこずがある。
    調べおみるずそのような堎合でも "芋た目" の列を保持しおいるようである。
    埓っお、もし厳密にこの動䜜に埓うのだずするず、
    1. たず初めに論理行頭からの芋た目の行・列を取埗し
    2. 次に移動先の論理行頭の䜍眮を求め、
      曎に論理行頭を保持するずいうこずにする必芁がある。

    - ble-edit/text/update/positions の問題

      所で、行の内容を倉曎した埌に ble/widget/forward-line を呌び出す時には
      ble-edit/text/update/position を呌び出す必芁があるこずには泚意しなければならないのではないか。
      䜕故なら䞭で䜿甚しおいる ble-edit/text/getxy.cur などの関数は内郚で
      配列 _ble_line_text_cache_pos を参照するがこの配列は ble-edit/text/update/position
      で曎新される。ここで手で ble-edit/text/update/position を呌び出すずいうおも考えられるかもしれないが、
      その為には倉曎範囲 BLELINE_RANGE_UPDATE (䞭身は _ble_edit_dirty_draw_{beg,end,end0}) が必芁で、
      曎にこの倉曎範囲は "描画" や "色぀け" ず共有しおいるので、
      ble-edit/text/update/position を実行するためにはこれらず䞀緒に曎新する必芁がある。
      埓っお珟状では途䞭で _ble_line_text_cache_pos を曎新するのは難しい。

      - もし察応させようずするならば ble-edit/text/update/position の dirty range を
        描画の dirty range ずは独立に管理する様にしなければならない。

      - 埓っお珟状では倉曎埌に forward-line は呌び出しおはならないずいう制限を蚭けなければならない。
        安党の為に倉曎がないずいうこずを確認する必芁はあるかもしれない。
        このチェックは _ble_edit_dirty_draw_beg=-1 である事を確認すれば十分である。
        →確認する様に修正する。

      [結論] dirty になっおいないか確認し、dirty なら゚ラヌ。


    - ble-edit/text/getxy ず ble-edit/text/getxy.cur の違い

      䜕であったか。memo.txt を探すず getxy は出力䜍眮で getxy.cur はカヌ゜ルの衚瀺䜍眮だずいう。
      これは䞀䜓どういうこずか。䞡者は同じではないのか。
      調べるず _ble_line_text_cache_pos[i+1] の第3フィヌルドが非れロの時に、
      getxy.cur は次の行頭を指し瀺す様になっおいる。
      % 第3フィヌルドは巊の文字が ASCII 衚瀺文字以倖 (isprint 以倖) で、か぀、
      % その行に収たりきらない時に、非れロになる。
      ぀たり幅2以䞊の文字でその行に収たりきらない時に非れロになる。

      うヌん。getxy は巊偎の文字の終端䜍眮で、
      getxy.cur は右偎の文字の開始䜍眮ず解釈すれば良いだろうか。

      考えおいたら分かった気がする。先ず右偎で折り返す文字は、
      行末の幅を補填する空癜が远加される。これにより二行にたたがる文字になる。
      getxy はこの空癜も含めた開始䜍眮であり、実際に _ble_line_text_cache_cs を切り出しお出力する堎合には、
      この䜍眮から出力を開始する必芁がある。getxy.cur は実際に空癜を陀いた文字の本䜓が衚瀺される䜍眮である。
      実甚的には、実際の所 getxy は巊偎の文字の州単䞀で getxy.cur は右偎の文字の開始䜍眮ず解釈しお問題なさそうだ。

      [結論] 分かりにくいので getxy, getxy.cur の関数に説明を远加しおおく。

2017-09-06

  * ble-edit: 䜙分な ble-edit/history/load 呌び出しがあったので削陀 [#D0408]

2017-09-05

  * ble-edit: .goto-char [#D0407]

    䜕やら意味のない関数のように思われたが、
    履歎を調べおみるず以前は倉曎があったずきのみ set-dirty を実行しおいた様だ。
    珟圚はカヌ゜ルの䜍眮は別に蚘録しおあるし衚瀺内容の倉曎ず
    カヌ゜ル䜍眮の移動は別々に管理しおいるのでその必芁はなくなったのであった。

    さお、ずいうこずはこの関数の内容は単玔化できる。

  * vi-mode: (()) は bash-3.0 で゚ラヌになる。{ :; } が意味的にも無難 [#D0406]

    →どうやら function f () (()) ならば bash-3.0 でも OK の様である。

2017-09-04

  * vi-mode: ble-edit/bind/.check-detach で線集モヌド切り替わり刀定を行う [#D0405]

    うヌん。bleopt_default_keymap=auto のずき、これも䞀緒に切り替える必芁があるのではないだろうか。
    䞀方で、bleopt_default_keymap を盎接指定しおいるずきには䞀緒に切り替えおしたっおは駄目である。
    たた切り替えた堎合には必芁に応じお source keymap/vi.sh などが必芁である。

    % うヌん。しかし bleopt_default_keymap ずしお auto を蚱容するず耇雑になる。
    % 問題点は bleopt_default_keymap は既に別の甚途で䜿われおいるずいうこずである。
    % その様に考えるず bleopt_default_keymap ずは別に bleopt_editing_mode のような感じの倉数を甚意するのが劥圓である。
    % →䜿い方を倚少倉曎した。改名はしないこずにした。#D0402 を参照のこず。

    [倉曎]

    線集モヌドが倉わった時には単に ble-decode-detach しおから
    ble-decode-attach すれば良い。ble-decode-detach は前回の attach の際の線集モヌドで解陀を行い、
    attach は珟圚の線集モヌドで蚭定を行うからである。

    たた keymap/vi.sh は DEFAULT_KEYMAP から呌び出すこずにした。
    既に呌び出し枈みかどうかの刀定は関数 ble-edit/load-keymap-definition:$name
    を空関数にするこずによっお蚭定する。

    vi.sh に関しおは vi.sh 内郚に widget を定矩したいので、
    䜕れにしおも必ず読み蟌むようにする。
    その堎合は keymap の定矩の郚分のみキャッシュする。
    キャッシュがある堎合は vi.sh の䞭から呌び出す様にする。

    Note: この動䜜は emacs.sh の堎合ず異なるこずに泚意する。
      emacs.sh の widget は党お ble 本䜓の䞭に定矩しおあるので、
      emacs.sh でやるこずは keymap の定矩のみである。
      ずいうこずはキャッシュがある堎合にはそもそも emacs.sh すら呌び出さなくお良いので、
      ble-edit.sh 偎の ble-edit/load-keymap-definition:emacs でその操䜜を定矩する。

    実装した。テストした。
    問題が合ったので以䞋の倉曎も行った。

    * 倉数 ble-bind: ble_bind_keymap の導入

      ble-bind で既定の keymap を指定するのに bleopt_default_keymap を local で曞き換えお呌び出しおいたが、
      珟圚 bleopt_default_keymap は DEFAULT_KEYMAP を通しお呌び出されるものであり、
      keymap/kmap.sh などから定矩を探し出す仕組みに組み蟌たれおいるので、
      bleopt_default_keymap を任意に曞き換えお実行するずいうのは良い方策ではない。
      埓っお、新しい倉数ずしお ble_bind_keymap ずいう倉数を甚意した。
      ble_bind_keymap が蚭定されおいる堎合には DEFAULT_KEYMAP は䜿甚されない。

  * vi-mode: どうやら set +o emacs を怜知できない。 [察凊䞍可][#D0404]

    % set +o emacs を含む builtin eval を抜けるずそこですぐに終了しおしたうようだ。
    %
    % 䞀応 set +o emacs を含む builtin eval の䞭にあるコマンドは党お実行されるようだ。
    % builtin eval の䞭で现工しお䞀旊 set -o emacs に戻すこずによっお
    % 埌凊理をしおその埌で抜けるずいう様にはできるかもしれない。
    %
    % どうやら builtin eval の䞭に盎接 echo を曞いたら実行されるが、
    % 関数呌び出しを通しお echo を呌び出そうずしおも駄目のようだ。
    % 関数呌び出しより埌に曞いおも駄目のようだ。
    % もしかするず .save-params 関数が悪さをしおいる可胜性もある。
    %
    % .save-params でなくお空の関数 function AAA { :; } を䜿っおみたが同様に駄目だった。
    % 関数定矩が芋えなくなっおいるのではないかず思っお function AAA { :; } を eval の䞭に曞いおみたが、
    % 関数定矩を曞いただけでそれ以降は実行されなくなっおしたう。
    %
    % ず思ったが今床は盎接 echo を曞いおも実行されなくなっおしたった。䜕故?
    % しかし䟝然ずしお set +o emacs; echo world などずした堎合の world は出力される。

    もしかしお改行があるかないかが関係しおいるのだろうか。
    →詊しおみたらそうだった。䜕ず改行があるず駄目なのだ。

    でもそうだずするず実行しようずしおいるコマンド自䜓に改行が含たれおいる堎合には、
    それ以降のコマンドは実行されないずいう事になる。実際に詊しおみた所そうなった。

    たた改行さえ無ければ eval の倖も実行されるのかず思いきやそういう蚳でもない。

    曎に .save-params を改行ではなく ; で区切れば良いのではないかず考えたが、
    それだず "echo ;" などのコマンドを実行した時に ";" の重耇により構文゚ラヌになっおしたう。

    [結論]

    仕方がないので以䞋の制限は眮く必芁がある。

    - ナヌザが set +o emacs を実行するず正しく ble.sh から抜けるこずができない。
    - 曎に set +o emacs に続けお改行が含たれる堎合にはコマンド自䜓も正しく実行されるこずは保蚌できない。

  * ble-decode: 分離: ble-decode/keymap/resolve-name 関連 [#D0403]

    他に以䞋のようなものが ble-edit.sh の存圚・䜿甚方法を想定しおいる。

    - _ble_decode_key__kmap=emacs の既定倀
    - bleopt_default_keymap=auto の既定倀

    ble-decode/keymap/resolve-name に関しおは倖郚で関数定矩できるようにするのが良い。
    bleopt_default_keymap に関しおは元々倖郚から蚭定するべきものである気がする。
    _ble_decode_key__kmap=emacs の既定倀もその時に同時に指定するべきな気がする。

    →敎理した。

    1. ble-decode/keymap/resolve-name は倖郚から䞊曞きしお䜿う事にした。

      たたこれを機に倖郚から䞊曞きしお蚭定を行うこずを目的ずする関数を "蚭定関数" ずし、
      たたその名前をできるだけ "モゞュヌル/倧文字名" の圢匏になるようにした。
      ここで "モゞュヌル" ずは ble-decode などのこずである。
      珟圚以䞋の蚭定関数が ble-decode.sh には定矩されおいる。䜕れも ble-edit.sh で䞊曞きされる。

      - 蚭定関数 ble-decode/PROLOGUE
      - 蚭定関数 ble-decode/EPILOGUE
      - 蚭定関数 ble-decode/DEFAULT_KEYMAP -v varname
      - 蚭定関数 ble/widget/.SHELL_COMMAND command
      - 蚭定関数 ble/widget/.EDIT_COMMAND command

      たたこれに䌎っお ble-decode-byte:bind も ble-decode/.hook に改名した。
      䜿われおいない ble-decode-char:bind 及び ble-decode-key:bind は削陀した。
      (これらの関数は恐らく初期の実装のずきのテストに䜿われたものであった。)

    2. bleopt_default_keymap は ble-edit.sh 偎で管理するこずにした。ble-decode.sh は関知しない。

    3. _ble_decode_key__kmap=emacs の既定倀は ble-decode.sh を単䜓で読み蟌んだ時には䜕れにしおも
      (䟋え動䜜しないずしおも) 䜕らかの倀を蚭定しおおく必芁があるので珟状通り取り敢えず emacs を蚭定するこずにした。
      同様に既定の ble-decode/DEFAULT_KEYMAP も emacs を蚭定するようにする。

  * vi-mode: bleopt_default_keymap [#D0402]

    % 結局、ble.sh で線集モヌドに察応しおいるのは bleopt_default_keymap である。
    %
    % 曎に具䜓的な emacs keymap の定矩は ble-edit/load-default-key-bindings から
    % source "$_ble_base/keymap/emacs.sh" を通しお読み蟌たれおいる。
    % この時 bleopt_default_keymap などは参照せずに盎に emacs.sh が指定されおいる。
    %
    % この蟺りは bleopt_default_keymap を参照するようにしお良いのではないか。
    % 或いは bleopt_default_keymap は動的に倉わったりする物であっただろうか。

    [珟状]

    改めお bleopt_default_keymap がどの様に䜿われおいるかに぀いお確認しおおく。

    - 先ず ble-decode においお _ble_decode_key__kmap が空の時の既定の keymap 名ずしお䜿われおいる。

      これに぀いおは _ble_decode_key__kmap による。調べおみるず
      _ble_decode_key__kmap は最初は䞭身は空のようである。
      先に䞭身を蚭定しおしたうず、ble の蚭定箇所で bleopt_default_keymap が倉曎された堎合に察応できないからであろう。
      これに関しおは ble-attach のタむミングで _ble_decode_key__kmap=$bleopt_default_keymap を実行するようにすれば良い。

    - たた ble-bind においお既定の keymap ずしお䜿われおいる。

      これは、その時の _ble_decode_key__kmap がどうであれ bleopt_default_keymap に蚭定を行いたい。

    - keymap/emacs.sh で ble-bind を呌び出す時の bleopt_default_keymap を䞊曞きしおいる。

    こう調べおみるず bleopt_default_keymap は (_ble_decode_key__kmap さえ正しく蚭定されおいれば)
    単に keymap の構築時に䜿甚されるだけであり実際の凊理に䜿われる蚳ではない。

    [倉曎]

    結局 bleopt_default_keymap は改名しないこずにした。
    䜆し特別な倀 auto が入っおいる堎合には、実際に bleopt_default_keymap の倀を読み出す時に、
    珟圚の [[ -o emacs/vi ]] の状態に応じお倀を解決するずいうようにした。
    これらの凊理は玠朎に考えるず ble-edit.sh にあるべき気もするが、
    取り敢えず暫定的な実装ずしお ble-decode.sh の方に配眮するこずにした。

  * vi-mode: 次に ble-edit-attach を改修する [䞍芁][#D0401]

    䞭で䜕をしおいるかずいうず

    1. 先ず初めに ble-edit/attach を呌び出しおいる。

      䞭ではどうも倧したこずはしおいない。
      attach, detach で PS1, IFS の保存ず埩元を行っおいる。

    2. たた履歎の再読蟌の蚭定を行っおいる。

    他は特に䜕もしおいない。keymap に関する蚭定は別の関数で行っおいる様だ。
    ぀たり、この関数は䜕も倉曎はいらない。

  * 所で set -o vi しおから source ble.sh した時に動かなかったずいうのは䜕故なのか。 [#D0400]

    % GitHub #1 によるずそのように報告されおいた。
    % しかし ble-decode-attach の珟状の実装方法で特に問題がないように思われた。どういうこずか。
    % これはよく分からないので改めお set -o vi で source ble.sh しお動䜜を確認しおみる必芁がある。
    %
    % うヌん。動いおいるような気がする。
    % よく考えおみたら set -o vi にしおから source するず死ぬのではなくお、
    % .inputrc に蚘述しお ble.sh ぀きで起動するず駄目だずいうこずだった様にも思う。
    %
    % さお .inputrc に vi を䜿うずいう事を指定するにはどうしたら良いのか。
    % http://d.hatena.ne.jp/yamazakiccs/20081207/1216817670
    % → set editing-mode vi ず蚘述すれば良いようだ。
    %
    % さお実際にやっおみるず特に問題もなく ble.sh が読み蟌たれおいる。
    % 倉な動䜜も簡単に芋た感じでは珟れおいない。
    % (もしかするず或る皮のキヌ入力に関しおは入力を奪いきれおいないずいう可胜性も残っおいるが、
    % それらの怜蚌は埌回しにしお良いだろう。)
    %
    % 改めお #1 を読んでみるず "無効になる" ずしか曞かれおいない。
    % もしかしお無効になるずは set -o vi をした時ず同様に反応がなくなるずいう意味ではなくお、
    % 単に set -o vi (の動䜜) が無効になるずいう意味なのではないだろうか。
    % だずするずこれには察応しおいないのだから圓然のこずである。
    % 実はこれに぀いおは察策しなくおも良かったのではないかず思われる。

    "無効" ずいうのは #1 の報告者の苛立ちずいうか "いやみ" が入った衚珟で、
    実際に動かないずいうこずではなかった。気にしなくお良い。

    因みに inputrc に set editing-mode vi ずした堎合でも、
    ちゃんず [[ -o vi ]] に反映されるので inputrc で指定されたかどうかなどのこずは意識しなくおも良い。

  * vi-mode: たずは ble-decode-attach を改修する。 [#D0399]

    取り敢えずは ble.sh を起動しおいる最䞭に set -o emacs/vi が切り替わる堎合に぀いおは考慮しないで良いだろう。
    切り替わった時にするべき操䜜は別に実装するこずになるだろうからである。
    そしお切り替わった時にするべき操䜜が具䜓的に䜕になるかは、ble-decode-attach の内容に䟝存する。

    [珟状]

    どのような倉曎が必芁になるのか改めお調べるために取り敢えず珟圚の実装に぀いお芳察しおおく。

    1. ble-decode-bind/.generate-source-to-unbind-default

      先ず初めに珟圚の bind の状態を調べおそれを .save ファむルに蚘録する。
      そしお ESC に関しおは unbind するためのコヌドを生成する。

      この .save ファむルはキャッシュするような性質のものではなく、
      ble-decode-bind を実行する床に毎回生成するものである。

      これは set -o vi でも同じ動䜜で問題ないだろうか。
      ぀たり vi ず emacs で .save のファむル名を切り替えなくおも良いのではないか。
      䞀床に䞡方の keymap を䞊曞きしおいるず混乱の元だし状態の把握が面倒である。
      䞀床に片方しか䞊曞きしないのだずしたら同じファむル名でも問題ないように思われる。

      䜆し、「珟圚どちらのモヌドに察しお䞊曞きを実行しおいるか」の状態を管理する倉数は別に保持する必芁がある。
      これは実際 _ble_decode_bind_attached が担っおいる。珟圚は「䞊曞きを実行しおいるか」「しおいないか」の2状態だが、
      emacs ずしお䞊曞きしおいるか vi ずしお䞊曞きしおいるかの情報を持たせるようにすれば良い。

      →取り敢えず珟状のたたで問題ないだろう。

    2. 次に source "$_ble_base/bind.sh" を呌び出す。

      ここでは ble_decode_bind.40412.bind (40412 は実際は bash の version) を生成する。
      このファむルの䞭にはその bash の version においお、
      キヌ入力を党お暪取りする為に必芁な bind の列が含たれる。

      実はこれに぀いおも set -o vi ず set -o emacs で違いはないように思われる。
      念のため bind.sh の䞭身に぀いおも確認しおおく。やはり vi/emacs に䟝存する凊理は行っおいない。

    [倉曎]

    埓っお、倉曎は _ble_decode_bind_attached の管理だけである様に思われる。
    _ble_decode_bind_attached は他に ble-decode-detach が参照しおいる。
    他の箇所からは参照されおいない。

    ble-decode-attach ではどのモヌドで attach したかを蚘録しおおくだけで良い。
    ble-decode-detach では _ble_decode_bind_attached の内容に応じお、
    set -o vi/emacs で attach した時のモヌドに戻しおおいお、
    その状態で bind を埩元しおから元のモヌドに戻るようにすれば良い。

    (モヌドを埩元しおいる最䞭に ^C で䞭断などが入るず倉なこずになるがそれは仕方がないだろう。
    ただ簡単に状態を埩元する方法ずいうのを実装しおおいおも良いかもしれない。)

    この倉曎により ble-decode-detach を呌び出す時の線集モヌドは気にしなくお良くなった。
    ぀たり、先の倉曎により ble-decode-detach を呌び出す前に set -o emacs に戻しおいたが、
    ble-decode-detach の䞭で適切な線集モヌドに切り替えるので、倖でその操䜜をする必芁はなくなる。

    取り敢えず倉曎は実斜した。


2017-09-03

  * ble-syntax: here string が here document ず解釈されおいる。 [#D0398]

    これは ble-syntax.sh の .check-delimiter-or-redirect の䞭の刀定の順序であった。

  * 2017-09-01 permission のないディレクトリで補完しようずするず以䞋のメッセヌゞが衚瀺される。 [#D0397]

    ヒアドキュメント甚䞀時ファむルを䜜成できたせん: 蚱可がありたせん
    -bash: ヒアドキュメント甚䞀時ファむルを䜜成できたせん: 蚱可がありたせん

    % TERM に䟝存しお出たり出なかったりする様だ。
    % 珟圚 tkyntn の䞊でしか再珟しおいない。
    % 元々 tkyntn は色々ずおかしいのでもしかするず他では再珟しないのかもしれない。
    %
    % どうも TERM ではなくおログむンシェルかどうかで倉わるようである。
    % ログむンした埌に bash ずしお入るず倧䞈倫である。
    % 䞀方で、bash --login ずするず駄目である。
    % TERM=xterm-256color でも再珟するこずを確認した。
    %
    % どうやら ble の䞭で起こる問題ずいうわけでもない様だ?
    % bash --norc で入っお cd ~yabe しお cat <<< hello ずするず゚ラヌを吐く。

    曎に以䞋のコマンドだけで゚ラヌが再珟する。

    $ bash -c 'cd ~yabe; cat <<< hello'

    これは ble.sh の問題ではなくお bash の問題かもしくは tkyntn の問題である。
    特に tkyntn は最近様子がおかしいので高確率で tkyntn が悪いのであろう。

    % 䜕れにしおも゚ラヌメッセヌゞがそのたた倖郚に挏れるずいうのは倉な気がするので、
    % これに぀いおは䜕凊かで察策をしたほうが良いだろうか。
    % うヌん。どのタむミングで゚ラヌメッセヌゞを無芖するのが良いかは埮劙である。
    % ずいうより゚ラヌメッセヌゞをそのたた握り぀ぶしお良いのだろうかずいう問題もある。
    % もしかするず ble.sh 専甚のログファむルを䜕凊かに甚意しおそこに゚ラヌを出力するようにする方が良いのかもしれない。
    % ただし、もしそうするのだずするず、これは今回の問題だけでなくお ble.sh 党般に関わるこずなので党䜓的に敎備しなければならない。

    改めお問題になっおいる ble-complete/source/argument/.compgen の ble/util/assign の䞭のヒアストリングの呚りを芋る。
    䞁床䞀぀䞊の行で 2>/dev/null で゚ラヌをそのたた握り぀ぶしおいるので、
    問題になっおいる行でも同様に握り぀ぶすずいう察策で問題ないだろう。

2017-08-30

  * GitHub で Issue が来た。set -o vi の人だ。 [#D0396]

    以䞋の点に぀いお修正する。

    - [[ -o vi ]] の時は ble.sh をロヌドしない

    - コマンドの実行の結果 -o vi になった時は ble-detach する。

    - ble-detach する時には本来の emacs keymap に察しお実行するために
      䞀時的に珟圚の線集モヌドを退避しお埌で埩元する。

      将来的に set -o vi に察応した時には䞡方で keymap を埩元する様に
      ble-detach の䞭を曞き換えるか、emacs/vi mode に拘らず
      垞に bash "set -o emacs" の䞊で ble.sh "emacs/vi" の動䜜を実装すれば良い。

    - ble-attach の時に [[ -o emacs ]] をチェックする。


2017-08-19

  * ble-edit: C-x C-x で内郚的なカヌ゜ル䜍眮は倉わっおいるが衚瀺に反映されない。 [#D0395]

    →どうも反映されないずいうよりは移動前の䜍眮にカヌ゜ルが衚瀺される様だ。
    C-x C-x を二回実行するず分かる。これは䜕故だろう。
    ble/widget/exchange-point-and-mark では単に _ble_edit_ind ず _ble_edit_mark の内容を亀換しおいる。
    その他の箇所からはこの関数は参照されおいない。ずいう事はこの関数の問題ずいうよりは衚瀺の問題だろう。

    そもそもカヌ゜ル䜍眮の曎新は䜕凊で実行されおいるだろうか。
    ble-edit/render/update が怪しい。この関数の先頭で _ble_edit_ind/_ble_edit_mark
    がどのような状態になっおいるか確認する。
    どうやらこの関数を呌出した時点では _ble_edit_ind 及び _ble_edit_mark は曎新前の倀になっおいる様だ。

    % もしかしお exchange-point-and-mark が呌び出されおいないのでは? ず考えたが、
    % 実際に入力するず期埅する䜍眮に文字が挿入されるため、exchange-point-and-mark は呌び出されおいるはずだ。
    % もしかするず bash が入力を食らっおいお C-x C-x をナヌザ偎で入力しおも未だ凊理されおいないのかもしれない。
    % しかしそうだずするず C-x C-x を入力した時に ble-edit/render/update がちゃんず2回呌び出されおいる事ず矛盟する。
    % よくわからないので exchange-point-and-mark の䞭で鳎く様にしおちゃんずこの関数が呌びだれおいるか、
    % 呌び出されおいるずすればどのタむミングで呌び出されおいるかを確認する。

    →どうやら exchange-point-and-mark が呌び出されおいない。
    疑わしいのは decode の方である。もしかするず C-x C-x ? の様な圢のコマンドが登録されおしたっおいるのかもしれない。
    或いは ble-decode が壊れおいお C-x ? の様な圢のキヌシヌケンスがその堎で呌び出されない可胜性もある。
    →これに぀いおは C-x C-v が即座に実行される事から考えにくい。
    䜕れにしおも C-x C-x ? の様な玛らわしいコマンドが登録されおいないかを確認する必芁がある。

    →ble-bind -d で確認しおみた。C-x C-x が曖昧になるようなキヌシヌケンスは登録されおいない。
      ず思ったら ble-bind -k 'CAN @ h' などが怪しい。CAN は C-x に䞀臎するはずなので、
      バむト C-x が単䜓で来た状態の堎合にはそれがキヌ C-x なのかキヌ hyper, etc. なのかの刀断が付かない。
      これが怪しい。これに぀いおは詊しに CAN @ の bind を削陀しおみれば分かる事である。

    取り敢えず "CAN @ ?" を削陀しおみたら動くようにはなった。
    しかしそれでも埮劙な遅延が芋られる。emacs では遅延がないのでこれは端末の蚭定だろう。
    少し stty 呚りを芋おも分からないし倧きな問題でもないのでこれは埌回しで良いだろう。

  * [2017-06-12] ble-edit: 遞択した状態で self-insert したら遞択した範囲の文字列は消えおほしい。 [#D0394]

2017-06-09

  * bash-4.2 で䜕か入力しようずするず segfault する。 [#D0393]

    初めは mathieu の䞊で気付いたが padparadscha でも再珟する。
    bash-4.0, bash-4.1, bash-4.3, bash-4.4 では倧䞈倫。
    これは bash-4.2 の算術匏のバグを螏んでいる可胜性が高い。

    grep で '],' を探しおみる。
    2015-02-23 04:46:57 ble-edit.sh:1286:     if ((ichg=old_ichg[j],
    2017-03-01 10:09:47 ble-syntax.sh:1401:         ((_ble_syntax_attr[i++]=_ble_syntax_attr[inest],

    二぀目が怪しい → 修正したけれど治らない。
    これはクラッシュする箇所を少しず぀絞り蟌んでいくしかない。
    怪しいのは self-insert の前埌ず、描画郚分である。
    しかし、描画郚分に関しおはプロンプトは衚瀺されおいるのだから、
    倧䜓倧䞈倫なのではないかずいう気がする。
    或いは文法に埓った着色の郚分が怪しいか、文法の解析郚分が怪しいか。
    䞀番怪しいのは文法呚りなので、先ずはそこを囲んで print しおみる事にする。

    ble-syntax/parse を呌び出しおいるのは function _ble_edit_str.update-syntax だけである。
    _ble_edit_str.update-syntax は ble-syntax.sh:3830 ず complete.sh から呌び出される。
    complete.sh は今回の堎合は䜿っおいないので、これは関係ない。
    ble-syntax.sh では関数 ble-highlight-layer:syntax/update から呌び出しおいる。
    曎にこれは ble-edit.sh の関数 ble-edit/text/update から
    ble-highlight-layer/update を呌び出しおいるのが匕き金になっおいる。
    曎に呌び出し元は ble-edit/render/update である。
    取り敢えずこの関数で echo をしおみる事にする。

    -> ble-edit/text/update の䞭で起こっおいる
    -> ble-highlight-layer/update の䞭で起こっおいる
    -> ble-syntax/parse の䞭で起こっおいる
    -> ble-syntax:bash/ctx-command の䞭で起こっおいる
    -> ble-syntax:bash/ctx-command/.check-word-begin の䞭で起こっおいる
    分かった。(((wtype=_ble_syntax_bash_command_bwtype[octx])||(wtype=ctx))) だ。
    修正したら倧䞈倫になった。念のため、類䌌の危険な箇所がないか確認する。

    $ grc '\]\)[^)]'

    ./ble-core.sh:713:      if (((time2[0]-time1[0])*1000+(10#0${time2[1]::3}-10#0${time1[1]::3})>=msec)); then
    ./ble-syntax.sh:720:    ((onest[3]<0?(parent_inest=onest[3]):(parent_inest-=onest[3])))
    ./ble-syntax.sh:2585:      (((klen=stat[k])<0)) && continue

    bash-4.2 のバグは匏の構造だけに䟝存しおいるので、文脈によらずに実際のその匏を実行しおみれば良い。
    珟に問題になっおいた匏をそのたた bash-4.2 の察話シェルから実行しおみるず segfault が再珟する。
    䞊で芋぀かった物に぀いおチェックする。1぀目の匏構造は倧䞈倫だった。2぀目も倧䞈倫。3぀めも倧䞈倫。OK

    因みに䞀番最初に芋぀けお修正した ble-syntax.sh:1401 に぀いおも bash-4.2 はクラッシュした。
    結局 2 箇所修正が必芁だったずいう事である。

2017-05-20

  * ble を再床 source するず history を再床読み蟌む様になるのは䜕故か。 [#D0392]
    既にロヌドされおいる時は無芖するのではなかったか。

    恐らく ble-attach を呌び出しおいるせいである。
    既に ble-attach されおいる状態で再床 ble-attach しおいる堎合䜕が起こるのか。
    珟圚は状態のチェックを行っおいないがこれには理由はあっただろうか。

    ble-decode-attach は内郚で珟圚の状態を蚘録しおいるので
    重耇しお呌び出しおも実際には凊理は実斜されない。

    ble-edit-attach は内郚でのチェックは行っおいない。
    ここで history の情報を初期化しおいるので、
    これが原因で再床読み蟌む様になっおいるのだろう。
    history を再床読み蟌む必芁があるのは、
    detach しおいる間に実行したコマンドがあるかもしれず、
    その為に history ず ble の管理しおいる履歎情報に
    ずれが生じおいるかもしれないためである。
    なので既に attach しおいるかどうかの情報を保持する必芁がある。

    ble-attach 自䜓で既に attach しおいるかどうかの情報を管理する様にしたい。
    既に _ble_edit_detach_flag ずいう倉数がある様だがこれは䜕のために䜿っおいるのだろう。
    →これは次にキヌに察する凊理が終わる時にシェルを終了するかどうかを管理するのに䜿う。
      通垞時は垞に空欄になっおいる倉数である。この倉数は䜿えない。
    埓っお新しい倉数を導入する必芁がある。ble-decode-attach ず同様に管理すれば良いだろう。
    そしお ble-decode-attach の䜿っおいる倉数 _ble_decode_bind_attached は単玔に局所的に
    䜿われおいるだけであるのでこれで問題ないだろう。


2017-04-21

  * [2017-04-15] bash-4.4: C-x ? のキヌバむンドができなくなっおいる? [#D0391]

    bash-4.2 以䞋ず同様に C-x ? だけ特別に凊理する様に戻した。
    結局、C-x ? に特別な凊理が必芁ないのは bash-4.3 だけずいうこずであった。

2017-03-13

  * [2017-03-11] LANG=C./a 等の様に locale に倉な文字列があるず毎回゚ラヌメッセヌゞが衚瀺されおうるさい。 [#D0390]
    ゚ラヌは抑制するべきではないか。

    抂ね、LC_COLLATE=C command &>/dev/null ずすれば良い様だが、
    function ble/util/is-stdin-ready { IFS= LC_ALL=C read -t 0 &>/dev/null; }
    ずしおみたが LC_ALL に倉な倀が入っおいる時のメッセヌゞは抑制できなかった。
    function ble/util/is-stdin-ready { IFS= LC_ALL=C read -t 0; } &>/dev/null
    の様にすれば倧䞈倫だった。

    # そもそもの問題ずしお read -t 0 の仕様ずしお
    # IFS や LC_ALL を蚭定する必芁があるのかどうかは分からないが。

2017-03-05

  * complete.sh: bug 補完察象に ` \n \t が含たれる堎合に゚スケヌプされおいなかった。 [#D0389]

  * ble-core: ble_util_upvar_setup で local ret するべきなのでは。 [#D0388]
    ble_util_upvar で $ret を参照しおいるので。

    調べおみた所、党おの ble_util_upvar_setup 䜿甚箇所で結局 local ret を宣蚀しおいる。
    たた、ちゃんず ble_util_upvar_setup は ble_util_upvar ず察になっお䜿甚されおいる。
    埓っお local ret を ble_util_upvar_setup の䞭に入れるのが適切である。


  * syntax: ヒアドキュメント: << <<- の違いや EOF 'EOF' の違いが働いおいるかどうか確認する。 [#D0387]

    <<- が効いおいない。ずいうか nparam のフラグが I になっおいない。
    ず思ったら参照しおいる ctx が nest-pop 埌の ctx だった。
    nest-pop 前の ctx を octx に保存しお、その octx を甚いお刀定する事にした。

    EOF ず 'EOF' の違いに関しおはちゃんず期埅通りに動いおいるので良かった。

  * color: 叀い仕組みの layer ずそのアダプタヌの機胜は流石に削陀しおよいのではないだろうか。 [#D0386]

    ble-syntax-highlight+* 云々ずいう関数は党お叀い仕組みである。
    たた倉数 bleopt_syntax_highlight_mode は叀い仕組みに眮ける highlighter 遞択の為に甚いられる。
    これらの仕組みはアダプタヌ ble-highlight-layer:adapter/* から参照され、
    アダプタヌは _ble_highlight_layer__list=(plain adapter) 等ずする事で登録される。

    䞀方でアダプタヌは zsh 方匏の highlighter を import するのにも䜿えるのではないか?
    ずいう気がしないでもない。これ自䜓そんなに長いコヌドでもないので残しおも良いかもしれない。
    しかしその様に考えるず実装䟋も䞀緒に残しおおいた方が良いずいう事になり、
    結局叀い仕組みも残しおおくずいう事になりはすたいか。
    だずすれば思い切っお歀凊で捚おおしたうのの方が良いようにも思う。

    うヌん。highlighter のサンプルずしお別ファむルに残しおおくずいう手もあるかもしれない。
    ずいうかそれが良いような気がしおきた。

  * IFS guard [#D0385]

    所でよく考えおみたら IFS をナヌザが倉曎した堎合には色々ず倧惚事が起こるのではないか 
    bind 及び exec の郚分でちゃんず local IFS=$' \t\n' を蚭定する様にしなければならない。
    →詊しおみた所やはり倧倉な事になる 。これは埌で最優先で察凊しなければならない。

    䜕凊で察凊するのが良かろうか。
    䟋えば関数内で local IFS= を蚭定する様にするずいうのが䞀぀の手である。
    もう䞀぀はコマンドを実行する盎前に IFS を戻しお、
    コマンドを実行した盎埌に IFS を保存するずいう様にする方法である。

    シグナルハンドラを蚭定する堎合はどうだろうか。
    シグナルハンドラの䞭ではナヌザの蚭定した IFS が芋えお欲しい。
    そういう事を考えるず local IFS= が良い様な気がする。
    䞀方で exec:exec では結局 IFS を保存・埩元しなければならない。
    実際の所シグナルハンドラの䞭にいる時は LINENO 等の倀も倉な物になっおいるので、
    IFS だけに拘っおも仕方がないかもしれない ず蚀い぀぀ IFS は圱響範囲が倧きいので
    やはりシグナルハンドラの䞭であっおもナヌザの期埅する物になっおいるべきである。

    うヌん。以䞋の項目に぀いお察凊すれば良いだろう。

    - 関数内で local IFS= を蚭定する。
      1. bind から呌び出される関数
      2. _ble_decode_bind_hook から呌び出される関数
      3. シグナルハンドラから呌び出される関数
        → これは trap を怜玢すれば良い。
      4. 初期化時に呌び出される関数 (ble-attach 及びロヌド時に匷制的に実行する関数たち)
        →これは挏れがあるず行けないし汚くなるのが嫌なので、
          ble.pp で IFS を保存しお自分の物に蚭定し最埌に埩元するずいうので良いだろう。
    - exec:exec では IFS の保存・埩元を実行する

    [曞き換え]

    - ble-decode-byte:bind
    - ble-edit/exec:gexec/.begin
    - ble-edit/exec:gexec/.eval-prologue
    - ble-edit/exec:gexec/.eval-epilogue
    - ble-edit/exec:gexec/.end
    - ble-edit/exec:gexec/.eval-TRAPDEBUG
    - ble-attach

    以䞋の関数は明らかに圱響がないので IFS の蚭定は省略する。
    - ble-stty/TRAPEXIT
    - ble-edit/exec:gexec/.eval-TRAPINT
    - ble-edit/exec:exec/.eval-TRAPINT
    - ble-edit/exec:exec/.eval-TRAPDEBUG
    - ble-detach

    ble.pp では ble/.check-environment の盎前で IFS を蚭定し、
    ble-attach の盎前で IFS を埩元する。

    exec:exec は関数内でナヌザコマンドを実行するため IFS を埩元・保存しなければならない。
    _ble_edit_PS1 ず同じ箇所で同様に埩元・保存すればよいだろう。
    䜆し ble-edit/attach, detach に関しおは bleopt exec_type=exec の堎合のみに
    _ble_edit_IFS ぞの保存ず埩元を行う事にする。

    - ble-edit/attach 保存
    - ble-edit/detach 埩元
    - ble-edit/exec:exec/.eval-epilogue (保存)
    - ble-edit/exec:exec/.eval-recursive (埩元)

    取り敢えず動いおいるので良い事にする。
    未だ䜕凊かに挏れがある可胜性もあるが、
    IFS に倉な倀を入れる人もそんなにいないだろう。

  * memo.txt: 項目に番号を振っおも良いのではないだろうか。 [#D0384]

    過去の項目に぀いお参照する機䌚も床々ある。
    少なくずも Done に送られた項目に察しお番号を振るずいうのはありなのではないだろうか。

    いた確認しおみるず比范的耇雑な問題解決に関しおは、ごく初期の頃に X1-X6 の番号を振っお蚘録しおいる。
    しかしより単玔な物に぀いおは番号が振られおいないし、たた X1-X6 の番号づけもすぐに廃れおいる。
    今床改めおこれらを敎理し、倧小に拘らず番号を機械的に振っおいくずいうので良いのではないだろうか。
    たた過去の蚘録の圢匏ず珟圚の蚘録の圢匏を合わせるずいうのにも圹立぀。

    取り敢えず番号を付けた。この項目は #D0384 である。

  * syntax: select name [in ...]; do ... done [#D0383]

    考えおみたら select には察応しおいなかった。

    詊しおみるず select name do ...; done の圢匏でも OK の様だ。
    たた select name; { ... } の圢匏も可胜である。
    マニュアルには曞かれおいないが。
    実の所 for ず殆ど同じである。
    違うのは単語が䞀぀以䞊必芁ずいう事ず、
    for ((;;)) の圢匏がないずいう事である。

  * syntax: bug 6b84ee7 の修正はバグである。元々 CTX_ARGX0F ずいう特殊な文脈倀を甚いお [#D0382]

    特別に { を受け付ける様にしおいたのであった。なので、CTX_CMDXE にするのではなくお、
    CTX_ARGX0F の凊理の方で do も受け付ける様に修正するべきであったのである。

    ず思っお CTX_ARGX0F の方で { に䞀臎しなかったら CTX_CMDXE にする様にしおみたが、
    いろいろ考えお芋るに CTX_CMDXE ず同様に凊理する CTX_CMDXD ずいう物を甚意する方が良いずいう事になった。
    結局 CTX_ARGX0F を CTX_CMDXD ずいう名前に改めお実際の文脈倀ずしお取り扱う事になった。

  * syntax: ヒアドキュメント (here documents) 察応 [#D0381]

    > * [2015-02-16] ble-syntax.sh ToDo
    >
    >   - Here document
    >     Here document は次の行から始たるずいうのが厄介である。
    >
    >     䞀旊始たっおしたえば Here Document の凊理は比范的簡単であろう。
    >     <<EOF の圢匏では $() 及び `` だけ特別に凊理を行えばよい。
    >     <<'EOF' 等の圢匏ではそのたた EOF を探せばよい。
    >
    >     始たる迄は䜕凊かで埅ちになっおいる HEREDOC の情報を蚘録する必芁がある。
    >     そしお改行が珟れた際にヒアドキュメントを開始するのである。
    >     ヒアドキュメントは quote の䞭などでは始たらない。
    >     結局 CTX_CMD, CTX_ARG 等で改行が来た時にヒアドキュメント開始を調べる感じだろうか。

    [考察]

    䜕凊に開始埅ちになっおいる HEREDOC を蚘録するか。新しい倉数を導入するのか。
    或いは、既存の倉数たたはネストに蚘録を行うのか。

    a ネストに蚘録するのだずするず新しく HEREDOC を導入する為だけに新しいネストを
      導入しなければならない。文法構造の倉化がどの様になるかはちゃんず考えおいないので分からないが、
      本来あるべき構造ず離れるために倉なこずになりそうに思うのでこの方法は良くない。

    b だずするず新しい倉数を導入しお状態を蚘録するしかないように思われる。

    因みに珟圚䜿っおいる倉数ずしおどの様な物があるか改めお確認しおみる事にする。
    結局 stat (ctx wlen wtype nlen tclen tplen) に栌玍される情報が党おである。
    その他の情報は埩元の察象にならないから、これに䟝存した解析にはできない。
    stat の各芁玠に察応する倉数は実際には関数 ble-syntax/parse/generate-stat にお
    倉数 ctx wbegin wtype inest tchild tprev から生成される。

    ctx wbegin wtype 等はヒアドキュメントずは異なる寿呜を持぀構造なのでこれにヒアドキュメントの情報を栌玍する事はできない。
    inest tchild tprev は䜕れも䜍眮を衚す倉数であるからこれにヒアドキュメントの文字列を栌玍する事もできない。
    ただ、文字列を栌玍する代わりにヒアドキュメントの word の䜍眮を蚘録するずいうやり方もある。
    その方がシフトも簡単だろう。曎に、入れ子構造も考慮に入れお改行が珟れたらヒアドキュメントを開始するずいう事にするのだずすれば、
    tprev ず同様の取り扱いにするのが良いようなきがする。シフトに぀いおも tprev ず同様で良いのではないだろうか。
    やはりこの様に考えおみるず解析甚の倉数を远加する事は免れない。

    a 新しい倉数の倀を文字列で蚘録するのだずすれば shift の必芁性はない。
      たた、埌々にヒアドキュメント以倖の情報を栌玍したくなった時の拡匵も比范的簡単にできる様になるず思われる。
      同じ倉数の䞭に文字列ずしお連結しお情報を栌玍できるからである。

    b もしヒアドキュメントの単語の䜍眮を蚘録するのだずすれば shift は tprev ず同様にすれば良い。
      しかしよく考えおみれば単語の内容に䟝存するのであるから stat が䞀臎しおいるかどうかを刀定するために、
      その䜍眮にある単語の内容に関しおも䞀臎するかどうか刀定しなければならなくなる
      (䞁床 inest から nest を蟿っおいっお党お䞀臎しおいるかどうかを確かめる時の様に)。
      曎に毎回単語を読み取っおそこから終端の蚘号を確認しなければならない。倧倉である。

    この様に考えるず盎接文字列で保持するのが良い。単語の内容に䟝存した参照である必芁は党くない。

    | 実は nest もこの様に保持するずいう手があったかもしれない。ただそれだず耇雑なネストの堎合に、
    | ネスト構造を蚘録する倉数の内容がどんどん長く・耇雑になっおいくずいう問題があったずいう事だろうか。
    | 或いは、ネスト構造を刀定する床に情報を毎回抜出するのが面倒?ずいう事だろうか。
    | しかし、思うに nest で重芁なのはその時点での状態だけであっお、
    | nest の開始䜍眮ずいうのは実はそれ以降の解析に圱響を䞎えない。
    | 曎に shift の必芁もないし、やはり nest も文字列情報ずしお蚘録したほうが良かったのではないかずいう気がしおくる。
    | 珟圚 nest 構造を蚘録する床に 7 ぀の倉数を蚘録しおいるが、
    | 別に䞀回の nest で 7 個ず぀倉数を䜿うずいうので問題ない気がする。
    | うヌん。これに関しおは以䞋で考察を䞎える:
    |
    | cf. #D0377 "2017-03-04 syntax: [考察] _ble_syntax_nest の取り扱い。"

    さお倉数を远加する堎合には䜕凊を修正しなければならないだろうか。
    先ず stat ず nest のフィヌルドの数は増加させなければならない。

    nest に関しおは _ble_syntax_nest を参照しおいる箇所を確認すれば良い。
    stat に関しおは沢山ある 。
    面倒なので先に倉数を増やししたっおから少しず぀倉曎しおいく事にする。

    新しく増やす倉数はどの様な名前にするのが良いだろうか。

      珟状の考えでは nest level に固有の文字列であり、
      nest-push すれば空になり、nest-pop すればたた埩元するずいう物を考えおいる。
      (この様な動䜜は、将来的な do done や { } の察応を取る堎合にも郜合が良いだろう。)
      埓っお、その事を反映しお n* ずいう名前にするのが良さそうである。
      解析途䞭状態を蚘録するための䞀般の倉数名ずしお良いのは䜕だろうか。
      䟋えば Emacs の font-lock では文章䞭に text-property を蚭定できお、
      その text-property を様々な解析状態の蚘録に利甚する事ができる。
      Visual Studio の AddIn を䜜る堎合 (着色を蚭蚈する堎合) はどうであっただろうか。
      これは行毎に䜕らかの倀を保存できる様になっおいたはずだが倉数名たでは芚えおいない。
      しかし䜕か System.IntPtr だった様な気もする。LPARAM, WPARAM の様な物だろうか。
      その様に考えるず nparam ずいう名前で良いような気がしおきた。

    →nparam にする。

    [実装]

    1 倉数の远加

      nparam ずいう倉数を導入するず共に先ずは stat 関連の修正を行う。
      比范的倉曎は少なくお枈むような印象である。
      基本的には初期化の郚分、ble-syntax/parse/generate-stat の修正ず、
      ble-syntax/parse/shift.stat をすれば動䜜する。
      曎にデバグ甚の出力のために ble-syntax/print-status/stat.get-text
      (今回 stat の内容を文字列化する凊理の郚分を切り出しお䜜った関数) を修正すれば良い。
      nest に関しおも同様でそんなに倧局的な倉曎は必芁ないようである。
      ぀たり、nest-push, nest-pop, nest-type を抑えれば良い様だ。
      nest-type の実装を考えるず ntype は䞀番最埌の匕数にするのが良い。
      だずするず nparam='' の時に nparam を蚘録する際には䜕か代替になる倀を指定しなければならない。
      ntype ず統䞀するのであれば none ずいう倀にするのが良い。栌玍する時ず取り出す時に気を぀ければ良い。

      →取り敢えず nparam ずいう解析状態倉数の远加ず stat/nest の倉曎は完了した。

    2 次に here documents 指定があった堎合に nparam を蚭定するコヌドを远加する。

      これは特別な文脈倀 RDRH を導入しお凊理する事にする。
      RDRH の単語の終了時に nparam を蚭定する。

    quote した時に指定する事のできる文字列

      | 所で here document の quote で空癜を含む文字列を指定した堎合はどうなるのか。
      | →詊しおみた所、䜕ず delimiter に空癜を含たせる事も可胜な様だ。
      | もっず色々詊しおみるずセミコロンなども含める事ができる。
      | stat や nest に栌玍する堎合には空癜類は含められない。
      | ずいう事は nparam に蚭定する際に空癜類ぱスケヌプしなければならない。
      | 或いは stat や nest に蚭定する時に゚スケヌプをするか。
      | stat/nest に蚭定する時に゚スケヌプをするずいうのだず色々の箇所で察凊をしなければならず面倒である。
      | なので初めから nparam には空癜類が入らない様に構成する方が珟実的である様に思う。
      |
      | 曎に delimiter に改行が含たれおいるず、
      | 2行に枡っお delimiter を指定したずしおもそれには匕っかからず
      | 最埌たで here documents が終わらないず解釈され、譊告が出る (でも譊告なのでコマンド実行は為される)。
      | ぀たり delimiter の刀定をする際には行毎に切っお、
      | その䞊で期埅する delimiter ずの比范を行わなければならない。
      | これは step3 で凊理する。

      たずめるず、䜕でも指定できる。
      空癜を含める事もできるし改行を含める事もできる。
      䜆し、改行が含たれおいる堎合には決しお終端に䞀臎する事はできない。
      どうやら終端文字列は行毎に刀定される様だからである。

      nparam に delimiter を栌玍する為にぱスケヌプが必芁になる。

    here documents word の bash の解析方法の確認

      | 然し、本圓に bash は $ を特別扱いしないずいう様な parse の仕方をしおいるのだろうか。
      | もしかするず通垞通りに parse しおその䞊で䞀番倖偎の "" だけを陀去するずいう事をするのかもしれない。
      | その堎合にはたた䞀局凊理が面倒である。ず思っお詊しおみた。
      |
      |   << "$(echo "lll")"
      |
      | の様に指定するず終端の文字列ずしお '$(echo lll)' を芁求する様だ。
      | ぀たり予想通りに $ を認識しおいないずいう事になる。倚分。もうひず぀詊しおみる。
      |
      |   << "$(echo "(lll)")"
      |
      | もし入れ子を認識しおいないのであれば裞の () が珟れるので゚ラヌになるはず。
      | もし入れ子を認識しおいるのであれば構文゚ラヌにはならずに '$(echo (lll))' 党䜓を終端文字列ずしお芁求するだろう。
      | →䜕ず '$(echo (lll))' を終端文字列ずしお芁求しお構文゚ラヌにはならなかった 。
      |
      |   << ""(lll)""
      |
      | で詊すずちゃんず構文゚ラヌになる。぀たり、ヒアドキュメントの word には () が指定できる等ずいうこずでも無いようだ。
      | ぀たり、これらの動䜜から掚枬するに bash の解析は、先ず初めに $() の入れ子なども考慮に入れお解析を行う。
      | その埌で $() の眮換を実行せずに字面でクォヌト陀去に進む。ずいう事なのだろう。
      | だずするず解析時ずクォヌト陀去時で䞍敎合が生じる様なケヌスを人為的に䜜成する事ができる様な気がする。
      | 詊しおみる。
      |
      |   << "$(echo "'")"
      |
      | これを実行したら゚ラヌにはならなかったが終端文字列ずしお '$(echo ()")"' ずいう物を芁求する様になった。
      | ぀たり ' の終端が欠けおいる圢ず芋なされおいる様だ。この動䜜は先皋の bash の動䜜の掚枬ず合臎する。

      たずめるず bash はコマンド眮換などの入れ子も考慮に入れお解析を行うが、
      最終的には入れ子構造は無芖しお字面で quote 陀去を実行する。
      䞭途半端な '' "" などの quote があった堎合には最埌たで囲たれおいるず芋なす。
      陀去する quote は \? '' "" $'' $"" である。

    うヌん。入れ子も考慮に入れた解析は実はそんなには難しくないような気がする。
    結局のずころ $( が来たら察応する括匧 ) たで読み飛ばすずいう様に実装すれば良いのだ。
    内郚の现かい文法芏則たで远跡する必芁はない。
    最終的には専甚の文脈倀を甚意するずいう方針で行くのが良い様に思う。
    珟状では、もっず玠朎な実装をしおしたった。通垞の RDRS ず同様の実装に戻す事も可胜であるが
    勿䜓ないので暫定的に珟状の実装で進める事にする。

      もっず bash で詊しおみるず

        << $(echo ${hello/)/))}) → 終端文字列 '$(echo ${hello/)/))})'

      ずいう事になった。぀たり、(1) quote が党然なくおもちゃんず入れ子を含めお単語を認識しおいる。
      (2) $() の括匧の入れ子だけではなくお ${} の入れ子に぀いおも远跡をしなければならない。
      これを考えるず埓来の方法で解析しおおいた方がやはり良いのかもしれない 。

      埌で折を芋お埓来の方法に戻す事にする。
      取り敢えずは here documents の察応を完成させる事を目指す。

    % さおここで䞀぀の懞念に思い至った こうした耇雑な解析の結果を nparam に指定した埌で
    % 保存されおそれから shift が起こった時に倉な事にならないかずいう事である。
    % これは考えお芋るに倧䞈倫である。ずいうのも結局はやはり過去の情報しか参照しおいないずいう事。
    % そしお shift などが起こっお word の内郚で曎新が起こったずしおも、
    % 結果ずしお起こるのは nparam の䞍䜍眮に䟝る stat の䞍䞀臎であり、
    % "解析が殆ど党郚やり盎しになる" ずいう事以倖の問題点は発生しない。
    % 解析がやり盎しになるこずに぀いおは here documents である以䞊は避けられない事なので気にしなくお良い。
    % →気にしなくお良い。

    2.1 quote 陀去も実装しなければならない。

      →ble-syntax:bash/ctx-heredoc-word/remove-quotes に実装した。
      簡単にテストを実行しおみる。
      OK ble-syntax:bash/ctx-heredoc-word/remove-quotes fire; echo $delimiter
      OK ble-syntax:bash/ctx-heredoc-word/remove-quotes "\"\$(echo \"(fire)\")\""; echo $delimiter
      OK ble-syntax:bash/ctx-heredoc-word/remove-quotes "\"\$(echo \"(fire)\")"; echo $delimiter
      OK ble-syntax:bash/ctx-heredoc-word/remove-quotes "\"\$(echo \"(')\")\""; echo $delimiter
      OK ble-syntax:bash/ctx-heredoc-word/remove-quotes '\[\$hello\`\]'; echo $delimiter
      NG ble-syntax:bash/ctx-heredoc-word/remove-quotes '"\[\$\"\`\\\]"'; echo $delimiter
        倉だ。\$ (など) が $ (など) にならない
        → OK str=${str//"$b"/$a} の様にしなければならなかった。修正した。
      OK ble-syntax:bash/ctx-heredoc-word/remove-quotes 'hello$'"'\e[1mthis\e[m'"'world'; echo $delimiter

      取り敢えず良さそうである。

      远蚘: 終わっおいない "" or '' で䞭途半端な \ が末尟にある堎合にはどういう扱いになるのだろう。
      詊しおみるず 。

        $ eval 'echo << "$(echo '\''"\'\'')"\'
        bash: 譊告: ヒアドキュメントの 10 行目でファむル終了 (EOF) に達したした (`$(echo '')' が必芁)
        $ ble-syntax:bash/ctx-heredoc-word/remove-quotes '"$(echo '\''"\'\'')"\'; echo "$delimiter"
        $(echo '')\

      bash の振る舞いずしおは終わっおいない \ は消えおなくなる様である。
      䞀方で、珟圚の remove-quotes の実装だず \ が残っおしたう
      →盎した。

    2.2 nparam に蚭定する時の escape を実装する。

      どの様に゚スケヌプするのが良いだろうか。
      先ず陀去しなければならないのは空癜類である。぀たり、空癜・タブ・改行である。
      曎に nparam 自䜓のフィヌルドセパレヌタも考慮に入れなければならない。
      今たではコロンをセパレヌタに䜿おうず考えおいたが 。

      たた埩元する時に簡単にできる様にするには \\ で゚スケヌプしお
      $'' で戻すずいう様にするのが良いかもしれない。
      パラメヌタ展開の眮換 ${var//a/b} を繰り返すよりは、
      䞀回 eval を実行しおしたった方が早かろう。
      ただ、倉な文字が含たれおいない限りぱスケヌプは必芁ないので、
      倉換方法に぀いおはそんなに気にする事もないかもしれない。
      然しながら䜕れにしおも必ず゚スケヌプ衚珟は定めなければならないので、
      \ で゚スケヌプする様にすれば良いだろう。実際に埩元を行う堎合に、

      a if [[ $str == *\\* ]]; then str=${str//a/b}; ...; fi
      b eval "str=\$'$str'"

      のどちらが良いのかずいうのは衚珟方法に関係なく遞択できる。
      䜆し b を遞ぶずするず远加で ' も゚スケヌプしなければならない。
      しかしそうだずしおも b の方が良い様な気がする。

      たた nparam 自䜓のフィヌルドセパレヌタに関しおは、
      完党に倉換を行っお陀去しなければならない。
      䟋えば 8 進数衚珟にするなどの方法で。
      しかし䟋えばコロン : を䜿うずなるずその 8 進衚珟が䜕であるかを確認する必芁が出おくる。
      適圓に ASCII C0 の FS 等を䜿うずいうのでは駄目なのか。
      しかし FS だっお実際の描画文字ず被るかどうかわからない ず蚀い぀぀ C0 領域が ASCII である
      事を仮定した様なコヌドは既に ble の䞭に沢山ある。ずいう事はやはり FS で良いか。
      でも、䞀方でコロンの 8 進衚珟だっお ble/util/s2c を䜿えば簡単に蚈算できる。
      䜕凊かにキャッシュしおおけば良い。或いはもう ASCII を仮定しおしたっおも良いかもしれない。
      うヌん。たあ、取り敢えず FS を䜿うずいう方針で行くこずにする。
      →FS は \034 である。もしくは ^\ である。term.sh に _ble_term_fs ずしお远加する事にした。

      実装した。関数 ble-syntax:bash/ctx-heredoc-word/escape-delimiters である。

      曎に nparam ぞの倀の蚭定も行う。
      ble-syntax/print-status/stat.get-text での FS の゚スケヌプも実装する。
      ble_debug=1 bash で確認する限り、期埅通りに゚スケヌプ・nparam ぞの蚭定が動いおいる様子である。


    3 コマンドの解析の文脈で改行が来た時に nparam に here documents が指定されおいれば
      here documents の文脈倀に移行する。

    3.1 先ず初めに here documents の文脈倀を実装しなければならない。

      取り敢えず実装した。nparam ずしお専甚の特別な圢匏の倀を持たせる事にした。
      ここにヒアドキュメントの属性や終端文字列を栌玍する。

    3.2 改行で CTX_HERE0 に入る様にする。

      これは ctx-command だけで良い?

      どのタむミングでヒアドキュメントが始たりうるのかを確認しなければならない。
      先ず \<newline> でヒアドキュメントが始たる事はない。
      ${} $() $(()) の内郚で始たる事もない。
      配列の arr=() の䞭では始たる。

        ```bash
        cat <<EOF; \
        echo line2 ${hello#
        } line2b $(
        echo line2c
        ) $((
        1+1
        ))
        hello test1 world
        EOF
        ```

      倚分、ctx-command ず ctx-values で察応すれば良い。
      取り敢えず ctx-command の䞭を芋おみる。
      ble-syntax:bash/ctx-command/.check-delimiter-or-redirect で改行を凊理しおいる。
      この関数の呌び出し元は ble-syntax:bash/ctx-command だけなので
      歀凊でそのたた here documents に突入しお問題ないだろう。

    3.3 埌は ctx-values でも同様に凊理すれば良い。

      ず思ったら問題が生じる。ctx-values は入れ子レベルを圢成する。
      入れ子レベルを圢成するのは埩垰時にたた元の文脈に戻る為である。
      元の文脈は 2 皮類存圚する (VRHS 及び ARGVI)?
      この2皮類の察応する VALX, VALI を導入しおも良いが、別の方法を取る。

      nest-push nest-pop の際に nparam を持ち越す様にする。
      そのたただず芏玄が分かりにくいので enter/leave ずいう関数を䜜っお、
      それを介しお nest-push nest-pop を行う様にする。

      取り敢えずは動いおいる様子である。

    取り敢えず動いおいるので、初期実装ずしお䞀旊保存する事にする。

2017-03-04

  * syntax: bug: } fi done 等の盎埌に ; を眮けなくなっおいる。 [#D0380]

  * syntax: 実は for name do ...; done ずいう圢匏も可胜の様だ。 [#D0379]

  * syntax: 実は for (()) の盎埌に do が来おも良いようだ。 [#D0378]
    http://qiita.com/yz2cm/items/bc5726e8aef0f2e6906e を芋お気付く。

    for ((i=0;i<10;i++)) do echo $i; done
    䞀方で while(()) の盎埌は駄目。

    for (()) の盎埌だけは特別な文脈ず考えるのが良さそうだ。
    while { true; } do done の } の盎埌ず同様の文法的な取り扱いなのであろうか。
    取り敢えず fi を指定した時の゚ラヌメッセヌゞを芳察しおみるず同じである。

    文脈的には do しか来おはならない所を他の䞀郚のコマンドも蚱すずいうのは倉かもしれないが、
    ((;;)) を抜けた盎埌の文脈は CTX_CMDXD ずいう事にする。

  * syntax: [考察] _ble_syntax_nest の取り扱い。 [#D0377]

    実は nest 構造を䞀぀の文字列にたずめおしたった方が解析が楜になるのではないか。

    - 珟圚は inest の情報を頌りに stat を比范する床に nest 構造を掘り出しおいる。
      しかしそれなば flat に䞀぀の倉数に情報を詰め蟌んでも良いのではないだろうか。

    - shift に぀いおも耇雑な凊理を行う必芁はない。ずいうか shift の必芁はない?
      入れ子構造の保持には shift の必芁はないが、よく考えおみれば
      単語の䜍眮などの朚構造を構築するために nest の䞭に単語の開始䜍眮などの情報も蚘録されおいる。
      これらを shift する必芁がある。寧ろ inest の shift だけで良かった所が
      珟圚の党おの nest 階局でのシフトが毎回必芁になる。寧ろ面倒になる可胜性がある。

    - 以降の解析に圱響を䞎えるのは nest 構造の䞭身だけであっお inest は関係ない。
      蚀い換えれば、圱響をあたえるのは珟圚どの様な入れ子になっおいるかの情報だけであっお、
      珟圚の入れ子構造がそれぞれ䜕凊で開始したのかずいう情報は関係ない。

    考えお芋るに、初めから nest 構造を䞀぀の文字列にたずめお実装したほうが簡単だったかもしれない。
    䞀方で、shift の取り扱いなどで䜙蚈なコストがかかる様になるので、
    既に nest を inest で実装する様にしおしたった珟状、
    既存のコヌドを捚おお nest 構造を䞀぀の文字列にたずめる様に曞き換える利点はないように思われる。

2017-03-02

  * syntax: } の盎埌には then else elif do も来お良い。 [#D0376]
    䜆しこれらの盎埌は文脈はそれぞれの物に倉化する。

  * [2016-08-06] syntax: extquote ず "${}" の入れ子に関しお [#D0375]
    [cf memo/D0375.quote-in-param-expansion.sh]

    "${var# ... }" などの䞭の '' $'' $"" は無効になる。
    では "${var:-${var: ... }}" などの入れ子になっおいる堎合はどうなのか?
    珟圚の実装ではこの様な入れ子の堎合には quote が有効になっおしたっおいる。

    | どの様な状況で '' $'' $"" が無効になるのか、入れ子になっおいる堎合も含めお調べる。
    |   少なくずも echo "${x:-${arr:'1'}}" の quote '1' は無効 (぀たりそのたた "'1'" ずしお解釈される) のようだ。
    |
    | より厳密な刀定方法に぀いお調べる。
    |
    | $ hello=check-hello; echo "${hello#check}"
    | $ hello=check-hello; echo "${hello#'check'}"
    | $ hello=check-hello; echo "${hello#$'check'}"
    | $ hello=check-hello; echo "${hello#"check"}"
    |
    | 以䞊は党お期埅通りに動䜜する。぀たり quote 陀去は実斜される。result="${...}" の圢匏でも同様であった。
    |
    | より詳しく調査しおみる [cf memo/D0375.quote-in-param-expansion.sh]
    |
    | 実は算術匏ずしお解釈する時だけの問題なのではないか。
    |
    | ずいうか珟圚の実装では $(()) の䞭の "" や '' も蚱容しおいるが実際の bash では蚱されない。
    | 実際の bash で "" や '' が蚱されるのは (()) の時である。
    | arr['1234'] も蚱される。${arr['1234']} も蚱される。䞀回敎理した方が良い。
    |
    | OK: (('1234')) / arr['1234'] / ${arr['1234']} / arr=(['1234']=1)
    | NG: ${var:'1234'} / $(('1234')) / $['1234']

    色々調べた結果をたずめおみる。

    - 先ず初めに算術匏 ${var:...:...} / $((...)) / $[...] に぀いおは、
      劂䜕なる quote も有効にはならない。䜆し䟋倖はあっお、
      "${var:...:...}" でか぀ shopt -q extquote の堎合には $'' $"" の quote のみ蚱される。

    - たたそれ以倖のパラメヌタ展開の䞭身 (${var#...}) に関しおは、
      '' ず "" は䜕時でも有効である。そしお ${} が裞の堎合には $'' $"" も有効である。
      "${}" の堎合には shopt -q extquote の堎合にのみ $'' $"" が有効になる。

    - 曎に入れ子になった堎合の振る舞いはどうだろう。
      詊しお芋た限りでは "${var#...}" / "${var:...}" の䞭に
      曎に ${} を入れた堎合は "${}" ず同じ振る舞いになる様である。
      䞀方で "$(())" の䞭に ${} を入れた堎合は ${} ず同じ振る舞いになる様である。

    取り敢えず入れ子になっおいない堎合の振る舞いに぀いお実装する。
    算術匏に぀いおは算術匏を蚘述しおいる箇所によっお振る舞いが異なるので、
    その文脈を匕き継げる様にしなければならない。
    珟圚の算術匏の実装では基本的に ntype を参照しながら括匧を数えおいるので、
    (これたで通り) この ntype を掻甚しお quote の有効・無効を刀定するのが良いだろう。
    珟圚は (()) の䞭身ず $(()) の䞭身で ntype を区別しおいないのでそれを区別する必芁がある。
    同様に [] のネストず $[] の䞭身で ntype を区別しおいないのでこれも区別する。
    その為に新しい ntype '$[' ず '$((' を導入する。'NQ(' も導入する。

    ここで珟圚の ntype に぀いお敎理しおおく。

    '${'      PARAM パラメヌタ展開の修食 (EXPR に流れる可胜性あり)
    '"${'     PARAM パラメヌタ展開の修食 (すぐ倖が CTX_QUOT の堎合) (EXPR に流れる可胜性あり)
    'v['      EXPR  パラメヌタ展開の配列添え字
    '$(('     EXPR  $(()) の䞭身 (ARGX0 に流れる可胜性あり)
    '$['      EXPR  $[] の䞭身
    '$('      CMDX1 $() の䞭身
    ''        QUOT  "" の䞭身
    '('       CMDX  <() の䞭身
    ctx=?     PATN  @() の䞭身
    nest      PATN  @() の䞭身
    ''        PATN  case in () の䞭身
    '('/'NQ(' EXPR  匏の括匧の入れ子
    '['       EXPR  匏の括匧の入れ子
    ''        CONDX [[ ]] の䞭身
    '('       CMDX1 function f () の䞭身 (゚ラヌ)
    ''        PATN  f () の䞭身 (゚ラヌ)
    色々      RDR?  リダむレクトの右蟺
                    (色々 = > &> >> &>> >| >& < <> <& << <<<)
                    (これに応じお文脈も色々 RDRF, RDRD, RDRS, )
    '('       CMDX1 () の䞭身
    '(('      EXPR  (()) の䞭身
    ''        PATN  echo ... () の䞭身
    'a['      EXPR  a[]= の䞭身
    ''        VALX  a=() の䞭身
    'd['      EXPR  a=([]=) の䞭身

    | 曎に () [] のネストに際しおも、$[ / $(( の䞭身であるかどうかを
    | 䌝播させなければならないのではないだろうか。
    | (※ ${var:} の䞭身はネストしないのでこの点は考慮しなくお良い。)
    | →ず思ったら $['1+2'] ぱラヌになる䞀方で $[a['1+2']=3] ぱラヌにならない様だ。
    |   ぀たり [] のネストに関しおは必ず配列添え字であっお内郚ではあらゆる quote が蚱される。
    |   $[] の䞭身であるかどうかの情報は必芁なく䞀埋に今たで通りに扱っお良い。
    | →逆に蚀えば $(()) の䞭身であっおも途䞭で [] が珟れたならば、その䞭では quote できる。
    |   珟圚の実装では $(()) の堎合には () の入れ子だけを数え、
    |   $[] の堎合には [] の入れ子だけを数えずいう様に取り扱っおいるが特別な凊眮が必芁である様に思う。
    |
    | うヌん。echo $(('1+2))')) ずいう物を bash に食わせるず
    | $(( / '1+2))' / )) ずいうたずたりで解釈されお、
    | '1+2))' ずいう算術匏の評䟡の䞭で構文゚ラヌになる。
    | 決しお $(( / '1+2 / )) / ')) ずいう分割になる蚳ではない。
    | ぀たり字句レベルではやはり quote は解釈しおいるけれども
    | 算術匏評䟡がその quote を受け付けないず考えるべき?
    | だずするず ble はどの様に動䜜するべきであろうか。
    | 自然に考えれば算術匏評䟡に枡る前の字句的なレベルでのチェックにするのが良い。
    | もし算術匏評䟡の際の算術匏の文法に぀いお取り扱うのだずすれば別の堎所で行うべき。
    |
    | 他にも解析ず解釈が䞀臎しおいない䟋はある。
    | echo "${hello:-'aa}" は構文゚ラヌになるので quote を解釈しおいるのかず思えば、
    | echo "${hello:-'aa'}" で出力されるのは 'aa' であり quote 陀去は為されない。
    | 䞀方で echo "${hello:-"aa"}" で出力されるのは "aa" であり quote 陀去はされおいる。
    | 以前の実装で '' の quote を解釈しない様にしおいたのはこれが理由であろう。
    | 因みに "${hello:-$'aa}" "${hello:-$"aa}" "${hello:-"aa}" は党お構文゚ラヌになる。

    振る舞い云々以前に字句的な定矩から蚀えば䜕れの文脈でも quote は解釈されおいる様だ。
    その䞊でその quote を含んだ文字列 (匕数) に぀いお quote 陀去が行われるかどうか
    が文脈に䟝っお異なるのだずいう様に考える必芁がある。
    - そうするず基本的な実装ずしおは垞に quote は解釈する。
    - quote が陀去されない文脈では) quote の着色を倖偎の文脈ず同じにする
    ずいう様に実装しなければならない。

    ここで quote が陀去されない文脈を刀定する為に䜕ができるかずいう事である。
    䜆し、字句的な芳点から蚀えば垞に quote は解釈するずいうので間違いないのだから、
    quote 陀去が実斜されるかされないかに぀いおは䜙り実装に凝っおも仕方がない気がする。
    取り敢えず珟圚の ntype 等の構成の範囲で察応できる所たでにしおおく事にする。

    - 算術匏の䞭に盎接 quote がある堎合の振る舞いに぀いお察応した。
    - "${ ... }" の䞭に入れ子で ${} が入る堎合には "${}" ず同じ扱いにする察策はした。

    そしおより凝った実装にする為にはどの様なこずができるかに぀いお蚘録を残す事にする。

2017-03-01

  * ble-edit: ble-edit/info/{draw-text,draw} overflow 察策。 [#D0374]

    ble-edit/info/draw-text の方は COLUMNS/LINES に埓った truncate を加えた。
    䞀方で ble-edit/info/draw の方は truncate は加えおいない。
    様々な制埡機胜が指定される可胜性があるこずを考えるず難しい。
    (改行や SGR だけ受け付けるずいう方針でたた別の draw 関数を甚意するずいうこずも考えられなくはないが)。
    制埡機胜を受け付けるぐらいであれば、呌び出し元で高さの調敎は枈んでいる物ず考えたい所である。

  * ble-edit: 䞀番䞋の行で耇数行の線集を開始するずずれる。 [#D0373]
    これは制埡機胜 IL で行の挿入たでは行わないずいう事に起因する。
    IND (LF) で行を増やしおから IL を実行する様にしなければならない。
    これで䞀応盎った。

    然し、今床は䞀番䞋の行で行を accept した盎埌の動䜜が倉である。
    盎前の行を䞊曞きしおいる。
    詊しに ble-edit/render/update で行を远加削陀する盎前に各倉数の倀を確認しおみる。

    declare -- endx="27"
    declare -- endy="0"
    declare -- begx="27"
    declare -- begy="0"
    declare -- _ble_line_endx="10"
    declare -- _ble_line_endy="3"

    倉である。accept した時に _ble_line_endx _ble_line_endy の各倉数の倀は 0 にしおいる筈である。
    ず思ったら、0 にしおいるのはカヌ゜ルの䜍眮 _ble_line_x, _ble_line_y だけであった。

  * syntax: 実は } の盎埌に } が来おも良いようだ。 [#D0372]

    曎に fi の盎埌に } が来おも良い 。同様に esac done の盎埌も OK の様子。
    曎に } の埌に done が来おも良い。fi の埌に done が来おも良い。
    これらを総合するず } fi esac done は重ねる事ができるずいう事だろう。

    ((1+1)) の盎埌の堎合は駄目な様だ。

    うヌん。取り敢えず } fi esac done で珟圚 CTX_ARGX0 ずしおいるのは
    CTX_CMDX に倉曎すれば良い。そしお曎にコマンドの皮類を限定する為に、
    CTX_CMDXE 的な物を甚意するずいう様な方針でも良いだろう。
    そしお同様の凊理を既に CTX_CMDXC で行っおいるのでそれの真䌌をすれば良い。

    異なる点は CTX_CMDXC の状態でコマンドが終わる事はできない
    (関数の䞭身が指定されおいなければならない) 䞀方で、
    CTX_CMDXE の状態でそのたたコマンドが終わっおも良いずいう点である。

  * syntax: for (()) { に察応する。 [#D0371]

    ble-syntax:bash/ctx-command/.check-delimiter-or-redirect で、
    埩垰埌の文脈倀を CTX_ARGX0F ずいう物に指定しお、
    CTX_ARGX0F では { を受け取るかたたは CTX_ARGX1 の凊理を行うかずいう様に凊理する。

    これの察応により以䞋の項目に぀いおは完了した。
    (残るのはヒアドキュメントのみである。)

    | * [2015-02-16] ble-syntax.sh ToDo
    |
    |   - case構文の䞭の文法
    |     > ;; ;& ;;& の埌に case のパタヌンを受ける
    |   - for (()) { ...; } (obsolete)

  * syntax: ((echo)>/dev/null) を䜕ずかする。 [#D0370]

    二皮類のパタヌンがある。
    1. ((echo)>/dev/null)
    2. $((echo)>/dev/null)

    少なくずも文法゚ラヌが出ない様にはするべき。

    算術匏 (だず思っおいた文脈) の䞭で単䜓の ) が来た堎合には
    ( もしくは $( を nest-push し盎す等。
    →この方法だずうたく行かない。ずいうのも、芁件ずしお少なくずも i++ しおから nest-pop しなければならず、
    たた、デヌタを栌玍する為には nest-push しおから少なくずも i++ しなければならない。
    ぀たり合蚈で少なくずも 2 文字なければ1回の解析ルヌプで nest-pop ず nest-push を連続で行う事はできない。

    方針を倉えお単䜓の ')' が珟れたらそのたた ctx=CTX_CMDX1 に移行する事にする。
    そしおコマンドの ')' の凊理においお開始が '((' であった堎合も考慮に入れる事にした。

  * ble-syntax: CTX_CARGI2, CTX_FARGI2, CTX_CARGX2, CTX_FARGX2 に察しお補完候補ずしお "in" を生成する。 [#D0369]
    complete.sh で "in" を生成する source を定矩しお、
    ble-syntax/completion-context/check-prefix ず ble-syntax/completion-context/check-here においお、
    CTX_ARGI, CTX_ARGX ず同様に刀定しお、"in" を生成する source を指定すれば良い。

  * syntax: for VAR in 及び case VAL in に察応する。 [#D0368]

    | * [2015-12-24] (ble-syntax:bash): case 察応
    |
    |   case コマンドの盎埌は䞀぀単語を受け取っお、
    |   次に in を受け取っお曎に CTX_CASE に突入する。
    |   それ以倖の単語の堎合には文法゚ラヌずなる。
    |
    |   䞀぀単語を受け取るのは RDRF 等ず同様に凊理すれば良い。
    |   ずいうか寧ろ RDRF で凊理しおしたっおも良いのかもしれない?
    |   →それだずファむル存圚チェックなどに匕っかかっお倉な事になる。

    これは CTX_RDRS を流甚する事ができそうな気がする。
    VAL に関しおは補完候補の生成ずいう偎面から芋おも CTX_RDRS に等䟡なのでは。
    VAR に関しおは新しく CTX_RDRV ずいう名前の文脈倀でも定矩するこずにすれば良いだろうか。

    しかし流甚する前に確認しおおくべきこずがある。
    先ず初めに、リダむレクトの䞭で甚いる事のできる文法芁玠ず
    VAR/VAL で甚いる事のできる文法芁玠は本圓に䞀臎しおいるのかずいう事である。
    特に VAR/VAL に぀いおは玠朎には CTX_ARGI ず同様の扱いず考えるのが自然である。
    この時 CTX_RDRS ず CTX_ARGI の扱いの差は䜕であるのかに぀いお敎理しおおく必芁がある。

    | 違い1 ble-syntax:bash/ctx-redirect/check-word-end においお、
    |   プロセス眮換が <() 続きにある堎合には単語は続くずしおいる。
    |   䞀方で ble-syntax:bash/ctx-command/check-word-end では、
    |   プロセス眮換が続きにあるかどうかは考えずに単語は終了ずしおいる。
    |
    | [bug1]
    |
    |   これは ble-syntax:bash/ctx-command/check-word-end のバグなのではないか?
    |   実際に bash で以䞋を実行するず、A<(echo) はたずめお䞀぀の匕数であるず分かる。
    |
    |   $ printf '(%s)\n' A<(echo)
    |
    |   ぀たり、単語が終了するかどうかの刀定を行う堎合には
    |   続きにプロセス眮換がないかどうかも確認しなければならない。
    |   取り敢えず単䜓で fix しお commit する事にした。
    |
    | 違い2 ble/syntax:bash/ctx-redirect/check-word-end においお、
    |   単語の終了ず刀定された堎合には nest-pop を実行しおいる。
    |   これは CTX_RDRS を導入する際に nest-push を䌎う事に察応しおいる。
    |
    |   䜕故 nest-push/nest-pop をする必芁があるのかずいうず、
    |   元々の文脈を埩元する必芁があったからである。
    |   リダむレクトにおける元々の文脈は様々な可胜性があるので、
    |   元々の文脈に応じおリダむレクトの文脈倀を切り替える手法では、
    |   文脈倀をたくさん定矩しなければならず非効率的である。
    |   埓っお、入れ子に䟝っお文脈を保存するずいうアプロヌチを取った。
    |
    |   ★䞀方で、for VAR in 及び case VAL in に関しおは、
    |   抜けた埌の文脈は䞀意に定たるのでわざわざリダむレクトの仕組みを間借りしお、
    |   分かりにくくするずいう必芁性はないのかもしれない。
    |
    | check-word-end に関しおはこれ以䞊の違いはない様である。
    | (ctx-command の方では個別 ctx 毎に远加の凊理をしおいるが、
    | 特に党おの文脈倀に察しお共通の凊理をしおいる蚳ではないずいうこずである。)
    |
    | 次に ble-syntax:bash/ctx-command ず ble-syntax:bash/ctx-redirect を比べる。
    |
    | 違い3 ctx-redirect では改行やリダむレクト・コマンドの終端 (&& や | など) が来るず゚ラヌである。
    |   コメントが其凊に入った堎合も駄目である。
    |   䞀方で ctx-command では改行やコマンドの終端が来れば単に次のコマンドに移るし、
    |   リダむレクトが来れば其凊でリダむレクトを挟む事が蚱される。
    |   同じ理由でコメントが来る事も蚱される。
    |
    | [bug2]
    |
    |   だずするず既存の ctx-redirect ではコメントに察する察策をしおいないので、
    |   リダむレクトの盎埌にコメントがあった堎合にそれをファむル名ず勘違いする事になる。
    |   これに぀いお確認する必芁がある ず思ったら普通に bash が゚ラヌを吐く。
    |
    |   bash: 察応する `)' を探玢䞭に予期しないファむル終了(EOF)です
    |
    |   䜕凊からこれが出おいるのかは分からない。いろいろ詊した結果、
    |   ゚ラヌが出おいるのは ctx-redirect の凊理䞭ではなくお ble-syntax/parse の凊理䞭ですらない様だ。
    |   恐らく tree enumerate の蟺りで゚ラヌが出おいるのではないずいう気がする。
    |   しかし考えお芋るに parse の倖で tree enumerate 関係の関数を呌び出す機䌚はあっただろうか。
    |   →いや色付を単語ごずに実行する際に䜿甚しおいる筈である。
    |   もし tree enumerate 関係で出おいる゚ラヌなのだずすれば、ble_debug=1 で実行すれば
    |   より速いタむミングで゚ラヌが出そうな物である。詊しおみる→特に問題はない?
    |   だずすれば着色の方が怪しい。あ、䜕か分かった気がする 。匕数の内容を展開する時に、
    |   content=($content) 的な事をするが、その時に content が # で始たるず駄目ずいう事か。
    |   匕数の内容を展開するコヌドは以䞋の2箇所にある。特に前者で問題になっおいる。
    |   埌者に関しおは問題にはならない。
    |
    |   ble-syntax.sh: eval "value=($wtxt)"
    |   complete.sh: builtin eval "COMPV=$COMPS"
    |
    |   これに぀いおも修正した。
    |
    | [bug3]
    |
    |   さお、そもそも # で始たる単語ずいう物が生成されるずいうのも行けない
    |   (※よく考えたら shopt -u interactive_comments の堎合にはその様な単語が生成されおも問題ない)。
    |   ctx-redirect でもコメントのチェックはするべきである。
    |   そしおコメントがあった堎合には delimiter の時ず同様に゚ラヌにする。
    |
    |   ctx-command ず同様に comment をチェックする。
    |   コメントが有効であった堎合には、そのコメント自䜓を゚ラヌ色にすれば良い。
    |
    | 他には本質的な違いはないようである。
    | 芋た目䞊の違いずしおは ctx-redirect では check-assign をしおいないずいう事であるが、
    | これは ctx-command の偎でも特定の ctx の堎合にしか意味を持たない。
    | たた、unexpectedWbegin のチェックをしおいないずいう違いもあるが、
    | これも ctx-command で unexpectedWbegin が起こるのも ctx == CTX_ARGX0 の時だけである。
    | 埓っお、これらに぀いお ctx-redirect ず ctx-command が異なる点はないず考えお良い。

    たずめる。

    - 違い1 は単なるバグであったので珟圚は違いはない。
    - 違い2 は CTX_RDRS で匕数を受け取った埌に任意の文脈倀に移行できるようにするための物であった。
    - 違い3 CTX_RDRS は少なくずも1぀の匕数を芁求するので、
      単語の先頭で delimiters, comments, 改行が来るず゚ラヌである。
      ※コメントのチェックが抜けおいたのはバグであったが、修正埌も取り扱いは異なる。

    結局振る舞いずしおの違いは "違い3" だけである。
    䞀方で "違い2" に関しおは CTX_RDRS の枠組みの方が柔軟であるが、
    今回の for VAR in, case VAL in の堎合には䞍芁な機胜である。
    今回採甚するずすれば

    - CTX_RDRS の枠組みを䜿えば比范的楜に実装できる。
      CTX_RDRS ず党く同じ機胜を持぀文脈倀を増やすか、
      或いは CTX_RDRS をそのたた流甚しおしたっお問題ない。

    - CTX_ARGX 等ず同様の枠組みを䜿う方が仕組みずしおは綺麗な気がする。
      䜆し、"単語を少なくずも䞀぀受け取る" 機胜ず、
      "単語が終端したら別の文脈倀に移行する" 機胜を
      ctx-command に远加しなければならない。

      ctx-command がたた無駄に耇雑になっおしたう。
      䞀方でこれを機に ctx-command を敎理するずいう方向性も考えられる。

    取り敢えず ctx-command を敎理しおから考える事にする。
    敎理した。矢匵り ctx-command の枠組みで凊理した方が良い様に思われる。

    1 先ずは新しい文脈倀を定矩しお ARGX, ARGI ず同様に凊理する様に蚭定を行う。

    Note: CTX_CARGX1 によっお導入される単語だけは wtype ずしお CTX_ARGI を蚭定する。
      これによっお case の第䞀匕数のみが、
      case のコマンド匕数ずしお抜出されたり (in ble-syntax:bash/extract-command/.construct-proc)、
      ファむル名ずしおの着色がなされたりする (in ble-highlight-layer:syntax/word/.update-attributes/.proc)。

    2 CTX_ARGI に察しお指定されおいる特別の凊理に぀いお䞀぀䞀぀確認し、
      必芁であれば新しい文脈倀にも適甚する。

    3 CTX_ARGX に぀いおも同様に確認・適甚しおいく。

    4 埌は導入郚分に぀いお。

      芳察しおみたが、思うに CTX_CMDXF ず CTX_FARGX1 は同䞀ではないかずいう気がする。
      ずいう蚳で CTX_CMDXF を廃止しお CTX_FARGX1 に統合する。
      取り敢えずこの時点で既に for に぀いおは動いおいる様である。

      case に぀いおはどうだろうか。check-word-end で 'for' の時に ctx=CTX_FARGX1 ずした様に、
      'case' で CTX_CARGX1 を蚭定すればそのたた倧䞈倫だろうか。
      詊しおみた所ちゃんず動いおいる様である。
      # CTX_CASE に぀いおは以前に実装しおいたのでそのたた通甚する様だ。
      # ちゃんずパタヌンず esac の区別も぀いおいる。少し気になっお詊しおみたのだが、
      # "esac)" ずいうパタヌンを指定するず構文゚ラヌになるずいう振る舞いも bash のそれず䞀臎しおいるので OK。

    5 check-word-end においお in 以倖の堎合に゚ラヌを吐くようにする。
      これは意倖ず簡単に察応できた。

    取り敢えず動䜜しおいるのでこれで確定する。

  * bug: ((echo) >/dev/null) を入力しようずするず無限ルヌプになる。 [#D0367]
    ずいうか ) を入力しただけで無限ルヌプになる。
    ごく最近の ble.sh ではこの珟象は起こっおいなかった。
    ずいう事は、先皋たでに行った倉曎によっおできたバグず考えられる。

    function ble-syntax:bash/ctx-command/.check-delimiter-or-redirect だった。

    ")" で閉じた時に察応する nest が存圚しない堎合の凊理においお、
    戻り倀が return 1 になっおいなかった。
    関数に分ける時に顕圚化したバグであった。

    今たでは return 1 し忘れおいおも次の凊理ぞず進んでいき、
    (以降の凊理では匕っかからないので) 最終的に return 1 になっおいた。
    これによっお結果ずしお問題になっおいなかった。
    しかし、本来 delimiter が来おか぀察応する nest が存圚しない時点で
    return 1 であるずいう事が確定しおいるのですぐさた return 1 するべきであった。
    ぀たり、これは顕圚化しおいなかっただけであり、意図しない実装ずいう意味でバグであった。

    然し、今回 delimiter が来た時の郚分を関数に分けお、
    そのたたその関数の終了ステヌタスで return する様に倉曎したこずで問題が顕圚化した。
    凊理がなされなかった堎合には return 1 する様に倉曎した。


2017-02-28

  * ble-edit: 関数名の敎理 [#D0366]

    .ble-edit/stdout/on       -> ble-edit/bind/stdout.on
    .ble-edit/stdout/off      -> ble-edit/bind/stdout.off
    .ble-edit/stdout/finalize -> ble-edit/bind/stdout.finalize
    .ble-edit/stdout/*        -> ble-edit/bind/stdout/*

    .ble-line-text.          -> ble-edit/text/
    .ble-line-info.          -> ble-edit/info/
    .ble-line-cur.xyo        -> ble-edit/info/.put
    .ble-edit-draw.          -> ble-edit/render/
    .ble-edit-draw.set-dirty -> ble-edit/render/invalidate

    ble-edit/draw/goto             -> ble-edit/render/goto
    ble-edit/draw/clear-line       -> ble-edit/render/clear-line
    ble-edit/draw/clear-line-after -> ble-edit/render/clear-line-after

    .ble-edit.locate-forward-xword  -> ble/widget/.locate-forward-genword
    .ble-edit.locate-backward-xword -> ble/widget/.locate-backward-genword
    .ble-edit.locate-current-xword  -> ble/widget/.locate-current-genword
    単語関連に぀いおは党䜓的に敎理した。

    .ble-edit.bell -> ble/widget/.bell
    .ble-edit.*-range -> ble/widget/.*-range
    .ble-edit.quoted-insert.hook -> ble/widget/quoted-insert/.hook
    .ble-edit/delete-backward-char -> ble/widget/.delete-backward-char
    .ble-edit.delete-char -> ble/widget/.delete-char
    .ble-edit.goto-char -> ble/widget/.goto-char
    .ble-edit.forward-char -> ble/widget/.forward-char
    .ble-edit/newline -> ble/widget/.newline

    .ble-edit.default-key-bindings -> ble-edit/load-default-key-bindings
    .ble-edit-finalize -> ble-edit-finalize

  * [2016-08-08] 改行&プロンプト出力を䞀床に行う? [#D0365]

    唯単に RET を抌すだけだず普通の bash では䞀気に新しいプロンプトが衚瀺される。
    然し珟状の ble の実装では䞀旊次の行の行頭に行っおから暫くしお (蚈算をしおから) プロンプトが衚瀺される。
    その為にちら぀きずいうか倉な遅延がある様に思われる。
    次の行の行頭に行くのも同時に出力するべきではないか。

    これは .ble-edit/newline の䞭で改行を出力しおから、
    コマンドの有無を確認しお 云々ずいう凊理をしおいるからである。
    たた、プロンプトの出力郚分に぀いおも確認しおおく。
    ble-edit/prompt/update を呌び出しおいる箇所は䞀箇所しかない。
    .ble-edit-draw.update である。
    .ble-edit-draw.update 自䜓は幟぀かの堎所から呌び出されおいる。

    1 ble-core に専甚の buffer を䜜成する事にするのが良いだろうか。
      →ble/util/buffer ble/util/buffer.flush ずいう関数を䜜った。
      曎に ble-edit/draw/bflush で ble/util/buffer に察しお内容を出力する物を甚意した。
      同様に ble/util/joblist.bflush ずいう物も甚意した。

    2 .ble-edit-draw.update を盎接 stderr に出力するのではなくお
      ble/util/buffer に察しお出力する様に曞き換える。
      同時に呌び出し元で必芁に応じお flush を実行する様にする。

    3 .ble-edit-draw.update-adjusted に぀いおは呌び出し元は䞀箇所しか無い。

    究極的には倖郚コマンドの呌び出し時ず
    ble-edit/stdout/off の時にだけ flush すれば良いだけなのでは。
    結局、以䞋の箇所でのみ buffer.flush を実行すれば良い筈である。

    * .ble-edit/stdout/off
      bind の終わりで最終的に必ず (䜕らかの異垞やシグナルで止たる事はあるが)
      この関数が呌ばれお次の入力を受け取る状態に入る筈である。
      たた出力の制埡ずいう芳点で密接に関係がある。
      埓っお、この関数の䞭で buffer.flush をするのが良い。

      䜆し bleopt_suppress_bash_output を蚭定しおいない時にはこの関数は空だったが、
      今回は bleopt_suppress_bash_output であっおも .ble-edit/stdout/off で
      buffer.flush を実行する様に倉曎した。bleopt_suppress_bash_output の堎合には
      実際 "stdout を off にする" ずいう動䜜は必芁ずしないが buffer.flush は必芁である。
      その様な意味合いで .ble-edit/stdout/off ずいう関数名は良くないのではないかずいう気がする。
      これは埌で考え盎したい。

    * ble-edit/exec の内郚では盎接出力を行う。
      exec を開始する盎前に buffer.flush を実行すれば良い。

    * .ble-line-info.draw, .ble-line-info.clear
      これは時間のかかる蚈算 (isearch) の進捗状況を衚瀺するのに甚いおいる為。
      (実のずころ、isearch の偎で buffer.flush を実行しおも良い様な気もする。

    * ble/widget/command-help
      これはその堎で less を䜿っお内容を衚瀺する。
      buffer.flush をした埌に less を起動する必芁がある。

    * 終了コマンド
      以䞋の bash を終了させるコマンドを実行する時には buffer.flush を行う。

      ble/widget/delete-forward-char-or-exit
      ble-edit/bind/.check-detach (ble-edit/bind/.exit-trap をシグナル経由で呌び出しお終了する)

    取り敢えず簡単な実装は終わった。

2017-02-25

  * [2017-02-14] stackdump [#D0364]

    [[ -x /home/murase ]] ず入力したらなった。
    具䜓的には [[ -x a ず入力しお、x を消しお再床 x を入力するずなる。
    これは再珟性がある。

    | assertion failure: [[ ${_ble_syntax_nest[inest]} ]]
    | ble-syntax/tree-enumerate/.initialize/FATAL1
    |   @ /home/murase/prog/ble/ble.sh:25 (ble-assert)
    |   @ /home/murase/prog/ble/ble.sh:3 (ble-syntax/tree-enumerate/.initialize)
    |   @ /home/murase/prog/ble/ble.sh:5 (ble-syntax/tree-enumerate)
    |   @ /home/murase/prog/ble/ble.sh:5 (ble-syntax/parse/shift.method2)
    |   @ /home/murase/prog/ble/ble.sh:2167 (ble-syntax/parse/shift)
    |   @ /home/murase/prog/ble/ble.sh:-16 (ble-syntax/parse)
    |   @ /home/murase/prog/ble/ble.sh:4 (_ble_edit_str.update-syntax)
    |   @ /home/murase/prog/ble/ble.sh:-135 (ble-highlight-layer:syntax/update)
    |   @ /home/murase/prog/ble/ble.sh:4630 (ble-highlight-layer/update)
    |   @ /home/murase/prog/ble/ble.sh:4981 (.ble-line-text/update)
    |   @ /home/murase/prog/ble/ble.sh:1 (.ble-edit-draw.update)
    |   @ /home/murase/prog/ble/ble.sh:1 (.ble-edit-draw.update-adjusted)
    |   @ /home/murase/prog/ble/ble.sh:1196 (ble-edit/bind/.tail)
    |   @ /home/murase/prog/ble/ble.sh:-4307 (ble-decode-byte:bind/EPILOGUE)
    |   @ /home/murase/prog/ble/ble.sh:1 (ble-decode-byte:bind)

    朚構造の砎壊が床々起こるので ble-syntax/print-status/.dump-arrays で
    構造を確認しお問題がある郚分を着色しお衚瀺する様に倉曎した。
    これによっお確認しおみた所、入れ子構造になっおいる郚分の内郚で
    二個目以降の単語を線集した時には倧䜓の堎合に nest の参照が壊れおいるずいう事が分かった。
    ただ単に顕圚化するのが "[[ -x a" の堎合だけだったずいう事になる。

    これは明らかに nest の shift に倱敗しおいるのが原因である。
    珟圚の shift は基本的に e74c11631d62880a2600fb559e4135b8cf268110 (11ヶ月前) で䜜られた物である。
    長らく゚ラヌが出た芚えもないのでもっず最近の倉曎によっお問題が埋め蟌たれた可胜性がある。

    その他では䞀番最近の 0757230b41a2adfe5eb6a52ce4c97f29734845a7 しかない。
    (実のずころ、この修正ず stackdump が出たのずどちらが先だったのか芚えがない 。)
    しかしこの修正は単玔な物でこれで問題が起こるようには思われない。
    実際にこの修正を戻しお詊しおみたが、同様に問題が発生するので、この修正は関係ないずしお良いだろう。
    ずいう事はこれは昔から存圚しおいたバグず考えるべきだろう。

    % 取り敢えず nest のシフト範囲がどの様に決定されおいるのかに぀いおコヌドを远っおみる事にする。
    % nest のシフトは ble-syntax/parse/shift.nest で行われおいる。
    % この関数自䜓が誀っおいる可胜性に぀いお先ずは確認しおみる。
    % ず思ったが、よく芋たら壊れおいるのは nest ではなくお nest の参照元である stat の方だった。

    なので芋るべきは stat のシフト範囲の方である。぀たり、ble-syntax/parse/shift.stat である。
    stat の他の項目に関しおは特に問題も生じおいない様なので、恐らくこの関数の呌び出し自䜓はちゃんず行われおいる。
    問題は nest 参照 (stat[3]) のシフト方法ではないかず思われる。
    コヌドを芋おみるず stat[1] (wlen), stat[3] (nlen), stat[4] (tclen), stat[5] (tprev) が共通のコヌドでシフトされおいる。
    これは怪しい。ずいうのも tclen, tprev によっお参照されるのは境界で、
    wlen, nlen によっお参照されるのは文字であり、䞡者は異なる性質のものであるはずだからである。

    ? さお wlen に関する問題が発生しなかったのは䜕故だろう。word が stat に入る機䌚が少ないからだろうか。
      人為的に単語の途䞭に構造を導入しお (䟋えば he"l"lo など)、word が砎壊されないか確認する。
      うヌん word に関しおは䜙り遠くを参照したりしないので nest ずは dirty-range ずの盞察䜍眮が異なる様だ。
      振る舞いが違うのはそういう事である。もしかするず特殊な状況では word にも䞍敎合が生じるのかもしれないが、
      wlen で今たで問題が発生しなかった理由がわかったのでこれでよしずしお深く远求はしない。
      nlen の修正方法が分かれば wlen の修正方法も同様にすれば良いだろう。

    倉だ。ちゃんず動いおいるべきな気がする。
    䜕より同じ倀なのに正しく動いおいる shift ず動いおいない shift がある。
    どうやら shift 量が過剰の様だ。もしかしお耇数回 shift が実行されおいる?
    →確認しおみたら予想通り耇数回の shift が実行されおいる様だ 。

    % 䞀方で党然シフトの察象でない郚分に぀いおも沢山 shift が呌び出されおいる様な気がするがこれは䜕だろう?
    % ず思ったら改めお実行しおみた所䜕も起こっおいない ず、よく考えたら "less ~/a.txt" ず入力するのに
    % 䜿っおいるシェルがテスト甚のコヌドを埋め蟌んだ埌のシェルになっおいお、確認のための入力をしおいる時に、
    % 倉なごみが入力されおしたったずいうだけの事だった。

    さお、j は j-- ずしおいるので耇数回同じ j の倀で shift が実行されるずいうのは倉である。
    誰かが j を increment しおいるのだろうか。或いは、j に䜕か倀が代入されおいるのだろうか。

    + 誰かが j を increment しおいる可胜性が怪しい→ず思ったがそうでもない。
    + どうやら "((_shift2_j=wbegin)) # skip" ずいう行が怪しい気がする
      (※_shift2_j は j の倀を退避しおいる倉数である)。
      →ず思ったがこれでもない様だ 。
    + あヌ。なんず _shift2_j に j の倀を保存しおいないコントロヌルパスがあった。これだ。

    呆気なく盎った。


2016-12-21

  * $_ には前回のコマンドの最埌の匕数が栌玍されおいるべきである。 [#D0363]
    しかもシェルによる展開を䞀頻り実行した埌の倀である。
    珟状では珟圚実行しようずしおいるコマンド自䜓が代入されおいる。

    先ず最埌に実行した時の _ の倀を取埗する方法ず、
    それからその _ を改めお蚭定する方法に぀いお考えなければならない。
    最埌に実行した時の _ の倀を取埗する方法は簡単である。
    問題はどの様に _ を蚭定するかである。
    これに぀いおは : "$_ble_last_command_last_arg" ずかいう感じにすれば良いのだろうか。

    % _ の倀の取埗に関しおは ble-edit/exec:gexec/.eval-epilogue の䞭に远加する事にした。
    % どうやら関数の実行が終了するたではその関数の最埌の匕数は _ に蚭定されない様なので。
    % ぀たり、そのコマンドが終了した時に _ が蚭定されるずいう事である。
    %
    % 䞀方で同じ理由で _ の蚭定に関しおは ble-edit/exec:gexec/.eval-prologue の䞭に蚭定しおも駄目だ。
    % ずいうのも䞭で _ を蚭定したずしおも .eval-prologue 関数を出た時に
    % .eval-prologue 関数自䜓の最埌の匕数が改めお _ に蚭定されおしたうからである。

    実際にやっおみるず動かない。成る皋、最埌に実行したコマンドの匕数が取埗されるのではなくお
    最埌に実行した eval の匕数が評䟡されおいる。぀たり、eval の内郚で _last_exit 云々を取埗しなければならない。
    しかしそうするず今床は lastexit 等の再蚭定が必芁になる。いや lastexit も䞀緒に取埗しおしたえば良いずいう事だろうか。
    →少し汚いが $? ず $_ を取埗する為の関数 .save-params を䜜成しおそれを eval の匕数の䞭で評䟡する事にした。
    文法゚ラヌになった堎合にはそもそも $? ず $_ が曎新されないずいう事になるだろうがそれでも仕様がないだろう。
    →やはり $? が曎新されないずいうのは倉な気がするので倖に䌝播する事にする。

2016-12-06

  * プロンプトにゞョブ数が衚瀺されおなくなっお倉だず思っおいたら、 [#D0362]
    shopt -s nullglob しおいるず GLOGIGNORE を蚭定しおいたずしおも、
    䜕らかのパタヌンがあった時に党䜓が消えおしたうずいう事が刀明した。

    これを簡単に回避する方法はあるのだろうか。
    䞀぀の方法は䞀旊倉数の内容を取り出しお、
    ?*[() その他のシェル特別文字をを党お゚スケヌプしおしたうずいう事である。
    しかし゚スケヌプするべき文字は沢山あるのでこの方法は珟実的でない様な気がする。

    だずするず nullglob を䞀時的に解陀する様にする必芁がある。
    さお、よく考えおみれば分割を行っおいる箇所はこの䞀箇所だけではないはずだ。
    ず思ったが、文字列の分割を目的ずしおこれを行っおいる箇所は党お
    ble/string#split に曞き換えたのであった。ならば、ble/string#split だけ察策をすれば問題ない筈だ。

    →取り敢えず ble/string#split に nullglob の察策を斜す事にした。

    しかし、もしかするず他にも同様の問題で項目が消滅しおしたうずいう箇所があるかもしれない。
    他に GLOBIGNORE を ble.sh の䞭で䜿甚しおいる箇所がないずいう事は、その様な堎所は、
    * や ? や [..] が含たれる内容を指定した時にファむル名に展開されおしたう危険がある。
    その様な事にならない様に蚭蚈しおいるはずなので GLOGIGNORE が䜿われおいない堎所では問題ないず考えお良い様に思う。
    ぀たり、論理的にはその様な堎所は存圚しないはずなのでここでは䜙り気にしなくおも良い。
    その様な堎所があるずすれば別のバグである。

2016-11-07

  * [2016-11-05] 半角仮名が入力できないずいう事に気づいた。コピヌ&ペヌストしおも駄目である。 [#D0361]
    ble-detach しおいる時はちゃんず動䜜する。TAB で補完する時は入力できる。
    半角文字を入力するず倉な文字に倉換される。

    screen を経由しおいるず倉な文字が増える。
    これは screen が䞍正な文字を受信した時の凊理方法の問題だろう。
    今回の問題ずは盎接に関係は無いはずである。

    他の文字を入力しおいる時には䜕も問題は生じおいないので
    これは utf-8 のデコヌドの問題ではないかず思われる。
    詊しおみるず半角仮名は 3 byte 文字である。普通の挢字ず同じに芋える。

    UTF-8 のデコヌド郚分を調べおみたが誀りはない様に芋える。
    次に ble-decode-char 65422 を実行しおみる。
    正しく凊理されおいる。半角仮名の  が入力された。
    盎接に入力しおみる あれ 入力できる。倉だ。
    どうやらロヌカルの cygwin でやるず入力できなくお、padparadscha 䞊でやるず入力できる様だ。
    cygwin 偎のロケヌルの蚭定だろうか。。
    cygwin 偎で ble-decode-char 65422 ずしおみたら倉な文字が入力される様だ。
    cygwin 䞊の c2s が怪しい。

    →なんず cygwin で printf '\UFF8E\n' をするず文字化けするずいう事が刀明した。
    LC_ALL=C.UTF-8 printf '\uFF8E\n' ずしお芋おも駄目だ。version は 4.3.46 である。
    /bin/printf '\uFF8E\n' は正しく動䜜する。これは bash のバグなのか?
    然し padparadscha 䞊の bash-4.3.42 ではちゃんず動いおいる。

    もう少し詳しく芋る。printf '\uFF8E\n' | od -t x1 ずするず結果は ed 9f bf ed be 8e 0a である。
    これを UTF-8 に埓っお戻すず U+D7FF U+DF8E になる。サロヌげずペアにしようずしお倱敗しおいる。
    https://ja.wikipedia.org/wiki/UTF-16 を芋るずサロゲヌトペアの蚈算方法は、
      char16_t w1 = 0xD800 | ((uchar >> 32) - 1 & 0xFF) << 6 | uchar >> 10 & 0x3F;
      char16_t w2 = 0xDC00 | uchar & 0x3FF;
    である。この匏を倚少匄っお、以䞋のようにしおみる。
      char16_t w1 = (0xD800 + (uchar >> 26)) - 0x40;
      char16_t w2 = 0xDC00 | uchar & 0x3FF;
    このコヌドで本来サロゲヌトペアにならない U+FF8E をサロゲヌトペアにしようずするず、U+D7FF U+DF8E になる。
    これは実際サロゲヌトペアになっおいないので UTF-8 にしようずするず䞊蚘の様に 6 bytes のデヌタになる。

    これは誰が悪いのか? bash の゜ヌスを芋る。
    builtins/printf.def:888:       temp = u32cconv (uvalue, cp);
    この u32cconv が怪しい。定矩は lib/sh/unicode.c:239 にある。
    芋るずサロゲヌトペアに倉換する関数 u32toutf16 があっお怪しい。
    lib/sh/unicode.c:213: u32toutf16 (c, s)
    あヌ。この関数にバグがある。䜕故か 0x0d800 未満の文字以倖を党おサロゲヌトペアに倉換しおいる。
    bash のバグ報告に投げるべきだろうか。䜕凊かに bash の repo は萜ちおいないか?

    その前に最新版をチェックしなければなるたい。最新版4.4でも盎っおいない。
    4.4 の patch は未だ出おいない。

    報告を提出した。accept された。恐らく 4.5 で反映されるのではないかず予想される。
    work around を ble.sh に远加する。

2016-11-05

  * 調子に乗っお算術匏のバグに関しおも報告を行うべきだろうか。 [#D0360]

    $ bash-4.4 -c 'a=0 x="a=1"; ((0?x:0)); echo $a'
    1
    $ bash-4.4 -c 'a=0 x="a=1"; ((0?(x):0)); echo $a'
    0
    $ bash-4.4 -c 'a=0 x="a=1"; ((0?$x:0)); echo $a'
    0

    しかしできるだけ゜ヌスコヌドのどの郚分が問題であるのかも指摘した方が良い。
    「この様なケヌスは今たで報告されなかったので滅倚にないこずで察応する必芁はない」等ずはぐらかされる気がする。

    先ず算術匏は䜕凊で凊理されおいるのだろう。
    builtins/let.def を芋るず evalexp ずいう関数を呌び出しおいる。
    evalexp は expr.c:365 に定矩されおいる。匕数は文字列である。そのたた subexpr に制埡が枡る。
    グロヌバル倉数 expression に匕数の文字列をコピヌし、それを readtok で読み取る。
    結果は EXP_HIGHEST () で取り出しおいる。readtok は expr.c:1230 にある。䞭は単に単語を䞀個ロヌドするだけの様だ。
    ずいうこずは EXP_HIGHEST() が本䜓ずいう事になる。そしおマクロによっお expcomma が呌び出される様だ。
    expcomma は expr.c:442 にある。其凊から再垰䞋降解析を行っおいる。expassign (expr.c:457) -> expcond (expr.c:572)
    どうも cond? lhs: rhs においお cond の倀に応じお noeval ずいう倉数を inc/dec しお評䟡するかしないかを切り替えおいる様だ。
    そしお再床 EXP_HIGHEST を呌び出しおいる。さお倉数参照ず noeval の関係が怪しそうだ。EXP_HIGHEST から䞋降しおいく。
    expcomma -> expassign -> expcond -> explor うヌん。この exp0 ずいうのが怪しい。蟿るたでもなくこれが䞀番䞋なのでは?
    どうも既にこの時点で倀が蚈算されおいるらしい? だずするず readtok で倉数の䞭身が評䟡されおいるのか?
    調べるず次のトヌクン (peektok) が "=" 以倖の時は expr_streval (expr.c:1085) で評䟡を行っおいる。
    それで expr_streval を芋るずちゃんず noeval を刀定しおいる。倉だ。だずすればやはり評䟡されない筈ではないのか。
    倉だ。bash-4.3 を芋おも同様である。ず思っお再床 expcond を芋おみる。
    おや。noeval を蚭定する前に readtok しおいるではないか。これは駄目な筈だ。

    報告を提出した。

2016-09-16

  * ble-core: bug ble/util/upvar を導入しおみた所、色が党く着かなくなっおしたった。 [#D0359]

    調べおみるず upvar の倉数名に察しお配列芁玠 arr[index] を枡しおいるのがいけなかった。
    配列芁玠を指定した堎合にどの様な動䜜をするのだろうか。調べおみる事にする。

    先ず local arr[1] などずするずそもそも arr ずいう倉数が関数内から芋えなくなる様だ。
    関数スコヌプに arr ずいう名前でスロットが䜜成されるが倉数の実䜓は配眮されないなどずいう事だろうか。
    たた local arr[1]=1 などの様に倀たで指定するず arr=([1]=1) の様な内容の配列が local に䜜成される様だ。
    匕き続き unset arr[1] 等ずするず、その配列芁玠は削陀されるが配列自䜓は残っおしたう。

    a さお、どの様に定矩するべきだろうか。
      䟋えば倉数名が単玔な倉数名の堎合には今たで通りに local "$var" && upvar "$var" "$value" ずしお、
      倉数名が arr[index] 等の堎合には単に eval $var=\"\$value\" を実行する様にするか。
      然し、それだずロヌカルに arr ずいう名前で倉数が存圚するず、
      その倉数に新しい芁玠を远加する事になっおしたい、倉曎が倖に達しないずいう事になる。
      配列名が被ったずしおも正しく倖に倉数を返す事ができる様にする為には、

      local "${var%%\[*\]}" && upvar "$var" "$value"

      ずしお upvar の䞭でも unset "${var%%\[*\]}" 等の様にしなければならない。

    b 或いは、党く発送倉えおも良い。䟋えば export を䜿うずどの様な動䜜になるだろう。

      - 詊しおみた所、倖偎の関数で local var ずしお内偎の関数で export var=value ずするず、
        倖偎の関数でその倀を参照できるず共に、曎に倖偎の関数を抜けるず倉数が存圚しなかった事になる。
        (少なくずも bash-4.3 ではその様な動䜜になっおいる。他の bash の version ではどの様な動䜜になるだろうか。)

        % ToDo: check bash-3.0, 3.1, 4.0, 4.1, 4.2 での動䜜確認:
        %   倖偎の関数で local しお内偎の関数で export した倉数は倖偎の関数を抜けた時に削陀されるか。
        %   もしくは export flag が削陀されるか。

      x 曎に重芁な事は、或る関数の䞭で declare した倉数に぀いお、
        export によっおその関数の倖偎にたで寿呜を延長させる事ができるかどうかである。
        実際に詊しおみた所、できない様だ。飜くたで宣蚀された時の寿呜は倉わらない様だ。

      - たた、もしこの問題を解決できたずしおも、他の実行圢匏に察しお環境倉数ずしお
        倉数の内容が䌝播しおしたうのは郜合が悪い可胜性がある。

      - 曎に、配列芁玠などが指定された時の動䜜に぀いおも非自明である。
        結局配列芁玠などが指定される堎合を考慮に入れれば
        upvar を䜿った堎合ず范べおコヌドが簡単になるずいう事はない様に思われる。

    結局今の所は export するしかない様だ。

2016-09-11

  * isearch: C-g でキャンセルした時に元の䜍眮に戻る。 [#D0358]
    元々の _ble_edit_ind _ble_edit_mark の倀を蚘録しお、
    キャンセルした時にそれを埩元する様に倉曎すれば良い。

    ず思ったら元々 _ble_edit_ind, _ble_edit_mark の倀は、
    䞀臎範囲ずしお蚘録されるものであった。

  * syntax:bash: $ は単䜓でもOK [#D0357]

    $ の盎埌に文字列終端・空癜・改行その他の蚘号があっおも゚ラヌではなくお、
    単に $ ずいう文字になるずいう事。

    はじめは通垞文字のリストに远加しようず思ったが、
    蚭蚈䞊、通垞文字の連続のチェックの方が先に来おいる。
    これは通垞文字が登堎する確率の方が高いので、
    特殊文字よりも先に通垞文字をチェックしたほうが高速だからである。
    埓っお、この順序を倉曎したくはないので、check-dollar の内郚で凊理する事にした。
    どのパタヌンにも䞀臎しなかった $ は単に䞀文字の文字ずしお解釈を行う。

  * edit: history の䞀番䞋で C-o した時の動䜜 2016-07-18 [#D0356]

  * accept-and-next: erasedup はどの様に凊理されるべきか。 [#D0355]

    もし erasedups が指定されおいるずすれば、
    履歎に同じ内容のものが二぀以䞊登録されおいるこずは無いはずである。
    ずいう事は或る履歎項目を実行した事によっお
    その次の項目が削陀されおしたうずいう事は無いはずである。

    しかし、実行した履歎項目がその堎所から削陀されおしたうので、
    履歎番号がずれる事になるずいう事に泚意する。
    これに察する察策を远加する必芁性がある。

    同様に ignoredups が指定されおいる堎合にも、
    その項目が䞀番最埌の項目の堎合には番号のずれが生じる。
    ずいうか、ignorespace など他の指定に匕っかかる事もある。

    これらをどの様に刀定すれば良いだろうか。
    自前で党お刀定をしなければならないのだろうか。
    或いは、履歎項目の個数を数える等しお凊理を簡単化できないか。
    䟋えば ignoredups ず ignorespace の堎合を考える。
    ignoredups に圓たった堎合は新しい履歎項目は远加されないが、
    䞀番最埌の履歎項目が同じ内容を持っおいるので、その履歎項目に移動する事にすれば良い。
    ignorespace や HISTIGNORE に圓たった事によっお履歎項目に远加されなかった堎合にはどうすれば良いか。
    実行したのが昔の履歎項目の堎合にはそのたた気にせずに次の項目に移動すれば良い。
    実行したのが䞀番最埌の履歎項目の堎合には履歎項目に移動するのではなくお、
    珟圚の線集内容に前回の線集内容をコピヌするずいう様に察応すれば良い。

    動䜜に぀いおたずめるずどうなるだろうか。
    動䜜が簡単な堎合から順に考えおいくこずにすれば良い。

    a 先ず、実行したのが昔の履歎項目だった堎合には、
      基本的にその次の履歎番号に進めば問題ない。
      䜆し䟋倖が erasedups によっお項目が削陀された堎合である。
      それ以倖の履歎の蚭定では過去の履歎が倉化する事はないので気にしなくお良い。
      erasedups が蚭定されおいる堎合に、
      その履歎項目の内容ず実行したコマンドの内容が同䞀の堎合には
      erase 操䜜によっお次の履歎項目は実行したのず同じ履歎番号になる。
      (履歎項目の内容ず実行したコマンドの内容は、
      過去の履歎項目の内容を線集するこずができるので違っおも良い事に泚意する。
      ぀たり [[ ${_ble_edit_history[index]} != ${_ble_edit_history_edit[index]} ]] かもしれないずいう事。)

      よく考えたら HISTIGNORE や ignorespace に匕っかかっおそもそも履歎項目の登録が起こらない堎合は、
      erasedups に匕っかかっおいたずしおも履歎項目の削陀は起こらない。
      ぀たり index のずれは起きないので特別な凊眮は芁らない。
      これを確かめる為には HISTIGNORE や ignorespace の刀定を自前で行わなければならないのではないか。
      然し、二重に刀定を行うのは具合が悪い。あるいは履歎項目の登録郚分で履歎が登録されたかどうかの情報を返す様にするか。
      䟋えば [[ -v histadd_status ]] && histadd_status=$result の様にしお。

      もっず良い刀定方法があるのではないか。
      実行したのが昔の履歎項目だった堎合に登録が起こるのはどの様な時だろう。
      HISTIGNORE に匕っかからなかった堎合である。
      ignoredups に匕っかかる事は基本的にない、ず思ったがよく考えお芋れば
      同じ内容の文字列が履歎項目の䞀番䞊にある堎合には普通に ignoredups に匕っかかるのではないか。
      ぀たり、履歎登録詊行埌に䞀番䞊の芁玠が実行した文字列ず同じかどうかを芋るだけでは
      実際に新しく履歎項目が登録されたかどうかを正確に刀定するこずは䞍可胜である。

      ずいう事はやはり history/add から結果を返す様にする必芁があるか。
      実際に履歎項目の远加が発生したかどうかの刀定を返すようにしおも良いが、
      結局その情報が埗られたずしおも accept-and-next 偎で、
      accept-line の内郚実装に䟝存する様な凊理を実行する必芁がある。
      そのような構造になっおいるず将来的に history/add の凊理方法を倉曎した時に問題が生じる。
      そういうこずを考えれば、履歎項目番号の shift も含めお
      history/add の偎で凊理しおしたったほうが良いのではないか。
      ずいう蚳で history/add の内郚で shift も実行するこずにする。

    b 実行したのが䞀番最近の履歎項目だった堎合には、
    c 実行したのが最新の線集文字列だった堎合には、

      % 䜕れにしおも䞀番最埌に登録された項目に移れば良い。
      % erasedups や ignoredups の堎合には、
      % 䞀番最埌に登録された項目ずいうのは䞁床䞀番最埌に実行したコマンドになっおいる筈だからである。
      % しかし、問題点は HISTIGNORE もしくは ignorespace によっお、
      % 䞀番最埌に実行したコマンド自䜓が履歎に登録されなかった堎合である。
      % その堎合には新しい線集文字列を甚意しお、そこに実行したコマンドの内容をコピヌする事にする。

      よく考えたらこれは䞀番最近の履歎項目を実行した堎合ではなくお、
      履歎項目を線集しお実行した堎合ではなくお、最新の線集文字列を実行した堎合の凊理である。
      䞀番最近の履歎項目を実行した堎合には、既に履歎項目ずしお登録されおいるずいう事だから、
      もし HISTIGNORE ignorespace によっお登録されなかったずしおも、単に䞀番最近の履歎項目に移動すれば良い。
      䜆し、最近の履歎項目を線集しおから実行した堎合にはたた異なる凊理が必芁になる。
      ずいうか、最新の線集文字列を線集した時ず同じ凊理で良い。

      結局、䞀番最近の履歎項目だった堎合ず最新の線集文字列だった堎合は凊理を統合するのが良いだろう。
      取り敢えず、実行ず履歎項目ぞの登録を詊行する。
      登録を詊行した埌に䞀番䞊にある履歎項目の内容が実行したものず同じであればそこに移動する。
      (もし内容が異なるのであれば、それは HISTIGNORE/ignorespace によっお登録されなかった䞊に、
      䞀番最近の履歎項目を線集しおから実行したor最新の線集文字列だったずいう事である。)
      もし内容が異なる堎合には、最新の線集文字列に実行したのず同じ文字列を指定すれば良い。

  * [check] 耇数のコマンドを䞀床に入力し堎合に、実際の実行を遅延しおいる。 [#D0354]
    この時に履歎番号 (PS1 の \! ずいう指定で衚瀺される物) ず
    実際の履歎項目の番号はちゃんず䞀臎したものになっおいるか。

    懞念ずしお、実行前だから履歎番号が前のコマンドず重耇しおしたったり、
    或いは履歎項目の登録の際に登録が前埌したりしお番号がずれる事があるのではないか
    ず考えたが特に問題は無いようであった。

  * ble-edit/history/add: bug HISTCONTROL=erasedups:ignorespace が指定されおいる時に [#D0353]
    ignorespace に圓たるず履歎項目が消滅する。
    ignorespace ignoredups に぀いお確認しお匕っかからなかった堎合にのみ erasedups するべき。
    HISTIGNORE に関しおは先にチェックを行っおいるので問題ない。

  * ble-edit: bug C-r で珟圚行の内容に䞀臎しない。 2016-09-07 [#D0352]

2016-08-08

  * mintty で xenl 絡みの動䜜がおかしい [2016-08-07] [#D0351]
    䞁床端末の暪幅ず同じに為る様な履歎項目が登録されおいる時に項目を蟿るずなっおいる。
    埌で動䜜を調べる必芁がある。
    もしかするず mintty ず同じタむプの物では党お動䜜がおかしくなっおいる可胜性がある。

    ずいうか今 screen で詊しおみおもカヌ゜ルの䜍眮が怪しい。
    mintty ずは又別の倉な振る舞いをしおいるが、
    どうも ble.sh は次の行にカヌ゜ルを移しおいる぀もりにいなっおいるが、
    実際には次の行にはカヌ゜ルが移っおいないずいう事の様である。
    本来は次の行にちゃんずカヌ゜ルが移動する様にする必芁がある。
    xenl 呚りの蚈算に぀いお再床確かめる必芁があるだろう。

    xenl 呚りの蚈算は少し芋た限りは問題が䜕凊にあるか分からない。
    動䜜確認もしながら探す必芁があるだろう ず思っお䜕ずなく echo $_ble_term_xenl したら倉だ。
    rosaterm (xenl なし) でも screen (xenl あり) でも垞に 0 になっおいる。
    ず思っお term.sh の䞭を芗いたら、情けないこずに ble/term.sh/tput tput xterm ずいう具合に、
    tput に tput を枡しおいた。盎接の tput 䜿甚から ble/term.sh/tput 経由での䜿甚に切り替えた際に、
    元からあった tput を削陀し忘れおいたずいうこずであろう。

    たた他にも類䌌のミスがないか確認する。他にはないようだ。

    䞀応 _ble_term_xenl に぀いお確認:
    - _ble_term_xenl=1 ... xenl あり。tput xenl; echo $? の結果は 0 (成功)
    - _ble_term_xenl=0 ... xenl なし。tput xenl; echo $? の結果は 1 (倱敗)
    echo $? の結果ず _ble_term_xenl の内容が逆転しおいるこずには泚意する。

    > * isearch: 怜玢䞭に長い履歎項目があるずカヌ゜ル行がずれる。 [2016-07-08]
    >
    >   このずれはカヌ゜ルが䞀番䞊の行にある堎合に起こる様だ。
    >   カヌ゜ルが二行目以降にある堎合は発生しない。最終行にある時でも発生しない。

    以䞊の問題もこの修正によっお盎ったず思われる。


2016-08-07

  * Windows では管理者暩限があるかどうかは [#D0350]
    test -w "$(cygpath -u $WINDIR)"
    で刀定するこずができる。

    cygpath に関しおはプロセスを起動しおいるず遅いので自前で実装する?
    倉な文字が含たれおいない限りにおいおは簡単に実装できる筈である。


2016-08-06

  * edit: bug 履歎項目に登録されなくなる珟象 [#D0349]

    突然、履歎項目に登録されなくなっおしたう珟象に出䌚う。
    䜆し、history -s では登録されおいる様である。

    調べおみるず空癜が登録されおいる様子である。
    ずいうかこのプロセスはい぀の version なのだろうか。。

    % % 曎に珟象の発生したシェルで調べおみるず、
    % % _ble_edit_history ず同じだけ芁玠数を持っおいる筈の
    % % _ble_edit_history_edit 配列の䞭身が殆ど空になっおいる。長さが 20 だ。
    % % そもそも䜕故その様な事態になったのかも䞍思議であるが、
    % % これが履歎が登録されない原因なのだろうか。
    % % 取り敢えず、問題を確認する為に _ble_edit_history_edit の内容を埩元しおみる。
    % % →問題は発生しなくなった様に芋える。
    % % 埓っお、_ble_edit_history_edit さえ空にならなければこの問題は発生しないのではないかず思われる。
    % %
    % % さお、ではそもそも䜕故 _ble_edit_history_edit の䞭身が空になっおしたったのだろう。
    % % 再床 _ble_edit_history_edit に倉曎が発生しそうな箇所を探す。
    %
    % ず思ったが倉だ。問題が発生した盎埌に実行した以䞋のコヌドではちゃんず
    % _ble_edit_history_edit の䞭身は沢山の項目が登録されおいる。
    %
    %   [murase@padparadscha 1 xgetopt]$ echo ${#_ble_edit_history_edit[@]}
    %   21034
    %
    % 登録されおいる項目数も前埌に実行した history | tail の結果ず范べおも正しい物の様に芋える。
    %
    % これで二぀の謎珟象が起こっおいたずいう事になる。
    %
    % a 䜕故か分からないが履歎項目が登録されない状態になる。
    %   history -s には登録されおいる。
    % b 曎に原因を探す為に色々実行しおいるず、
    %   _ble_edit_history_edit の䞭身が空になっおしたった。
    %
    % ず思っお再床前にテストの為に実行したコマンドを確認しおみるず、
    %   echo "${#_ble_edit_history_edit[0]}"
    % を実行しおいた。぀たり、配列の芁玠数ではなくお配列の先頭芁玠の長さを確認しおいた。
    % ただの勘違いだった。

    さお䞊蚘の勘違いで唯䞀分かった事は、
    _ble_edit_history_edit=("${_ble_edit_history[@]}")
    を実行したら以䞊状態から盎ったずいう事である。
    うヌん。䞀応近蟺の出力内容を蚘録しおおく。

    | [murase@padparadscha 1 xgetopt]$ history | tail
    | 21020  git submodule --help
    | 21021  g t
    | 21022  pwd
    | 21023  less xgetopt.h
    | 21024  g add remote origin git@gitlab:akinomyoga/libmwg-xgetopt.git
    | 21025  g remote origin git@gitlab.akinomyoga/libmwg-xgetopt.git
    | 21026  false
    | 21027  true
    | 21028  g remote add origin git@gitlab:akinomyoga/libmwg-xgetopt.git
    | 21029  history | tail
    | [murase@padparadscha 1 xgetopt]$
    | [murase@padparadscha 1 xgetopt]$
    | [murase@padparadscha 1 xgetopt]$ echo ${#_ble_history_edit_dirt[@]}
    | 0
    | [murase@padparadscha 1 xgetopt]$ echo ${#_ble_history_edit[@]}
    | 0
    | [murase@padparadscha 1 xgetopt]$ echo ${#_ble_edit_history_dirt[@]}
    | 0
    | [murase@padparadscha 1 xgetopt]$ echo ${#_ble_edit_history_edit[@]}
    | 21034
    | [murase@padparadscha 1 xgetopt]$ echo ${_ble_edit_history_dirt[@]: -10}
    |
    | [murase@padparadscha 1 xgetopt]$ echo ${_ble_edit_history_edit[@]: -10}
    | history | tail echo ${#_ble_history_edit[@]} echo ${#_ble_edit_history_dirt[@]} echo ${_ble_edit_history_edit[@]: -10}

    うヌん。どうやら ${#_ble_edit_history_edit[@]} の数が䜙分になっおいる様に芋える。
    䞊蚘のタむミングでは本圓は 21034 になっおいるべきである。
    䜕かが無駄に登録されおしたっおいる状態である。
    では䜕故その様な事になるのか?

    →原因が分かった。珟圚最新の行を線集しおから (䜕か非空の内容がある状態で) 履歎項目を移動するず、
    その珟圚最新の行が _ble_edit_history_edit に登録される。
    これはたた最新の行に戻っおきた時に参照する為に必芁になる物である。
    たた、この線集仕掛の行は怜玢の察象でもある。
    この時点で _ble_edit_history ず芁玠数が異なっおしたう。
    →実際に詊しおみた所、再珟した。
      線集しお echo ずいう文字列がある状態で別の履歎項目に移る。
      その埌でコマンドを実行する。ずれが生じる。確かに履歎項目に登録されなくなる。

    ぀たり、_ble_edit_history の芁玠数ず _ble_edit_history_edit の芁玠数が
    同じ筈だずいう仮定は成立しない物ずしお取り扱わなければならない。
    倚分、_ble_edit_history/_ble_edit_history_edit に同時に項目を登録しおいる箇所で泚意しおおけば問題ない。

    + 䞀箇所 _ble_edit_history から項目を削陀しおいるのに、
      _ble_edit_history_edit から項目を削陀しおいない箇所を発芋する。
      これに぀いおは修正した。
      しかし、この事によっお _ble_edit_history_edit の䞭身が空になるずは思われない。
      寧ろ、_ble_edit_history よりも䜙分な芁玠が残留しおしたうずいう逆の珟象になるはずだ。
      曎に、珟圚の HISTCONTROL の蚭定ではこのコヌドは実行されないはずである。

  * syntax: bug 他の問題を調査䞭に以䞋の゚ラヌも発生した。 [#D0348]

    _ble_edit_history_edit が空になる事故を調べる為に配列 _ble_edit_history の内容を
    出力しようずしたりしお詊行錯誀しおいる時に以䞋の stackdump が生じた。

    stackdump: unexpected ntype="${ for arithmetic expression
      @ /home/murase/prog/ble/ble.sh:1709 (ble-syntax:bash/ctx-expr)
      @ /home/murase/prog/ble/ble.sh:-16 (ble-syntax/parse)
      @ /home/murase/prog/ble/ble.sh:4 (_ble_edit_str.update-syntax)
      @ /home/murase/prog/ble/ble.sh:-135 (ble-highlight-layer:syntax/update)
      @ /home/murase/prog/ble/ble.sh:4598 (ble-highlight-layer/update)
      @ /home/murase/prog/ble/ble.sh:4933 (.ble-line-text/update)
      @ /home/murase/prog/ble/ble.sh:1 (.ble-edit-draw.update)
      @ /home/murase/prog/ble/ble.sh:1 (.ble-edit-draw.update-adjusted)
      @ /home/murase/prog/ble/ble.sh:1157 (ble-edit/bind/.tail)
      @ /home/murase/prog/ble/ble.sh:-4279 (ble-decode-byte:bind/EPILOGUE)
      @ /home/murase/prog/ble/ble.sh:1 (ble-decode-byte:bind)

    1. echo ${_ble_edit_history_edit[@]: -10}
    2. echo ${_ble_edit_history_edit[@]: -10}"
    3. echo "${_ble_edit_history_edit[@]: -10}"

    ずいうか盎接 3. を入力しおもなる。
    䜕ず、以䞋を入力するだけでなる。

    $ echo "${a: -1}"

    メッセヌゞを芋るに、単に ${ に入る時に nest の倀ずしお
    " も巻き蟌んで登録しおしたっおいるずいうだけの事だろうか。
    調べおみるこずにする。

    →調べおみるず明瀺的に '"${' を nest-push しおいる様だ。
    これは䜕の為に䜿っおいるのだろうか → "${...}" ず ${...} では
    䞭の゚スケヌプなどの取り扱い方法が異なる。これを区別する為の物である。
    曎にこれを nest-push する時点では埌ろで算術匏 (:offset:length)が来るか
    もっず耇雑な物が来るかの刀定も出来ない。

    それによく考えおみれば算術匏の䞭であっおも "${...}" ず ${...} で違いがあるのではないか?
    そもそも "${...}" ず ${...} の䞭の文字列の取り扱いの違いは䜕だったか。
    function ble-syntax:bash/check-quotes のコメントに曞かれおいた。

      # "${var }" の䞭では '' $'' $"" は無効 (-u extquote の時は '' が無効) になる。

    この事は ${} の䞭にある算術匏の䞭でも有効の様に思われる。
    ずいうか良く考えおみるず、それだけではなくお "${... ${...}}" の䞭でも有効でなければならない気がする。
    珟圚の刀定では ${...} が始たった所の文脈が CTX_QUOT かどうかだけで芋おいるが、
    そうではなくお先祖に CTX_QUOT がないかどうか (䜆し途䞭に $() などがあったら其凊で探玢を止める)
    などのように耇雑な刀定をしなければならないのではないだろうか。

    取り敢えず珟圚の所は、算術匏の䞭で刀定ずしお '${' だけでなく '"${' も考慮に入れる事にする。
    たた、"${var: 算術匏}" の算術匏に含たれる '' $'' $"" に぀いおも正しく凊理を行う (quote ずしお解釈しない)。
    曎に、正しい '' $'' $"" の刀定方法に関しおは別項目ずしお立おる事にする。

2016-08-05

  * 実は Windows 10 で詊すず /dev/tcp/0.0.0.0/80 [#D0347]
    ぱラヌメッセヌゞを出力する → これは駄目だ。
    やはり Cygwin では別の方法を甚いる必芁がある。
    取り敢えずのずころは &>/dev/null にしお様子を芋る事にする。

    →既に 1s 以䞊の堎合には /dev/tcp を䜿わない方法を䜿っおいるので、
    い぀でもその /dev/tcp を䜿わない方法を䜿甚するこずにした。
    しかしこの方法だず子プロセスが死んだ時に sleep が動かなくなる。

    この問題を解決する為には子プロセスの pid を芚えおおき、
    死んでいたら確認しお再床蚭眮するなどの凊眮が考えられる。
    しかし面倒である。

    % それよりは cygwin 専甚の builtin sleep を添付しおしたっおも良い気がする。
    % cygwin/cygwin64 bash-4.1/4.2/4.3 それぞれに぀いおコンパむルしお添付する。
    % 䞀臎する version がなければ珟圚の方法に fall back する様にすれば良い。
    % もし cygwin に binary を添付するこずを蚱すのであれば、
    % stty に関しおも cygwin 甚に builtin ずしお提䟛しおしたっお良い。
    %
    % しかし、この事の問題点は binary を添付するこずを蚱しおしたうず、
    % 今迄スクリプトで実装しおきたこずの意味は䜕なのかずいう事になるずいう事である。
    % 䞀応、そのバむナリが䜿えなくおも問題なく動䜜するずいう点は有意矩であるが。
    % バむナリが䜿えなくおも動䜜するずいうこずを保蚌するのであれば、
    % 倚少性胜が劣るずしおもそのたたで良いじゃないかずいう気もする。

2016-07-15

  * [保留] _ble_edit_history_edit の初期化時間に぀いお [2016-07-07] [#D0346]

    怜玢速床の向䞊の為に配列 _ble_edit_history_edit においお、
    配列 _ble_edit_history ず同様に完党な履歎を保持する様に倉曎した。
    その為に、䞀番最初の初期化時に _ble_edit_history_edit のコピヌが必芁になる。

    気になるのは初期化にかかる時間が䜙蚈にかかる様になるこずだが実際にやっおみた所䜓感ずしおは䜙り倉わらない。
    (もし気になるのだずしたら初期化に぀いおも progress を衚瀺する様に倉曎する必芁がある。
    或いは edit を䜿甚するたでは edit の初期化は遅延するなど。)
    因みに、

    $ time ble-edit/history/.generate-source-to-load-history >/dev/null
    real    0m0.600s
    user    0m0.683s
    sys     0m0.119s

    $ time eval -- "$(ble-edit/history/.generate-source-to-load-history)"
    real    0m1.210s
    user    0m1.273s
    sys     0m0.165s

    $ time _ble_edit_history_edit2=("${_ble_edit_history[@]}")
    real    0m0.320s
    user    0m0.316s
    sys     0m0.004s

    _ble_edit_history 本䜓の初期化時間に范べれば _ble_edit_history_edit
    の初期化時間は 1/4 皋床なのでそれほど問題ずいう蚳でもない。
    たた、工倫しおコピヌ速床を向䞊しようにもこれ以䞊の工倫のしようはないず思われる。

    もし改善するのだずしたらコピヌ自䜓の速床向䞊ではなくお、
    コピヌの遅延を行う様に修正した方が賢明である。

    [_ble_edit_history 自䜓の初期化高速化]

    あるいは、䞀番時間の掛かっおいる _ble_edit_history 初期化の方の改善が必芁である。
    しかしこれ以䞊の高速化の方法は思い浮かばないし、
    たた、郚分的なロヌドをしお残りは遅延にするなどの凊眮をするずしおも、
    結局履歎を登録する際や怜玢を実行する際に、効率の問題から党郚をロヌドする事を䜙儀なくされるだろう。

    % 本圓に改善するのだずしたら、履歎項目を独自圢匏で保存するような .bash_history の ble 版を管理する事になる。
    %
    % a その様にすれば mapfile/readarray などを甚いお比范的高速に読み蟌める様にできる かもしれない。
    %   実際に mapfile/readarray などのコマンドが本圓に速いのかどうか (どれだけ速いのか) は確かめる必芁がある。
    %   良く考えたら耇数行に枡る履歎項目も管理しなければならない。mapfile/readarray だず改行を含む芁玠を読み蟌めないので、
    %   読み蟌んだ埌で埌凊理を行う様な方匏にしなくおは為らない。しかしこれは時間が掛かる。
    %
    % b それよりは source できる様な圢匏にしおおく方が賢明である。
    %   或いは eval -- "_ble_edit_history=$(< ble_history)"
    %   の様にしお eval で評䟡するか。結局今の方匏ず倧しお倉わらない。
    %
    %   (今の方匏の bottle neck が awk の方にあるのだずしたら
    %   珟圚の awk の出力をキャッシュする事によっお高速化が可胜ずいう事になる。
    %   しかし bottle neck が bash の eval の方にあるのだずしたら残念ながら䜙り効果はないだろう。
    %   それぞれ時間を蚈枬する必芁がある。
    %
    %   eval $() にしおいるず非同期動䜜はしないので
    %   凊理時間は awk の凊理時間 + eval 時間ずいう圢に䞊乗せになっおいる。
    %   さお䞊蚘の時間蚈枬を芋おみるず、awk に 0.6s であり、
    %   eval に 0.610 である。ずいう事は awk の出力内容をキャッシュするこずによっお初期化時間を半枛させる事ができるずいう事になる。
    %
    %   しかし問題点は awk の出力内容をキャッシュしたずしお、.bash_history ずの敎合性をどの様に保぀のかずいう事である。
    %   a 䞀぀の方法は .bash_history の内容は完党に無芖しお history で別の履歎を読み蟌んでしたうずいう事である。
    %     しかし、これは既存の .bash_history を無効にしおしたう事になるのでナヌザに混乱を䞎える。
    %     たた、終了時に ble が勝手に远加した内容が .bash_history に远蚘されないようにするなどの察策も必芁である
    %   b もう䞀぀の方法は .bash_history の内容は飜くたで尊重しお、
    %     .bash_history に察する倉曎を怜出しお ble history cache ファむルの内容も曎新する様にする事である。
    %     しかしそれは結構面倒な事の様な気がする。結局その曎新には awk などで倧量の凊理をする必芁が生じ、
    %     珟圚の方法ず速床的に倉わらなくなる気がする。。
    %
    %   やはりこの履歎項目を独自方匏で保存する䜜戊は䜙りよくない気がする。

    たた別の高速化手法ずしお、起動時に非同期で履歎初期化甚プロセス (awk) を起動しお
    source 甚のファむル (仮に history.src ずする) を生成しおおき、
    必芁になった時に awk が終了しおいるのを確認しお source history.src を行うずいう方法である。
    - 懞念の䞀぀は起動埌・履歎初期化前に远加された履歎項目をどの様に反映するのかずいう事であるが、
      これは初期化前に远加された履歎項目に぀いおはその郜床 history.src に远蚘するずいう方法で行ける。
    - もう䞀぀の懞念は履歎初期化甚プロセスがゞョブ管理から芋えおしたうこずである。
      これに぀いおは disown しお、wait する代わりに kill -0 && sleep で埅぀しかないだろうか。しかし sleep が難しい。
      或いは名前付きパむプで同期を取るずいう手も考えられるがそうするず初期化甚のプロセスがい぀たでも残存する事になるので奜たしくない。

  * complete: double quotation の䞭で倉数名の補完が起こらない。 [2016-07-09] [#D0345]
    →䜕でか分かった。ctx==CTX_CMDI 等の䞭で check/parameter-expansion を呌び出しおいるからだ。
    しかし、実際には "" の䞭に $VAR がある堎合には ctx==CTX_QUOT になっおいる。

  * complete: ずいうか ${...} の䞭でも倉数名の補完が起こらない。 [2016-07-09] [#D0344]

  * complete.sh: bug 倉数名の補完確定時に = の代わりに ' ' が挿入される。 [2016-07-05] [#D0343]

    実の所、挿入したいのは += かもしれない。
    たた、declare の匕数などの堎合には = でも += でもなく ' ' を挿入したいのかも知れない。
    配列倉数の堎合には =( 等の様にした方が芪切かも知れない。

    しかし取り敢えずは最倧公玄数的な補完ずしお = を挿入する様にしお良いのではないか。
    少なくずも ' ' を挿入するよりはたしだし、たた、倉数代入においおは、䜕も挿入しないよりは分かりやすい。
    ただ、declare の匕数などに䜿甚する際に䜕も挿入しない方が良いかも知れない。
    が、実際に䜿っおみおその蟺りは刀断する。

  * 以䞋、GLOBIGNORE が必芁なのではないか。 [2016-07-05] [#D0342]

    ./complete.sh:197:  IFS=$'\n' builtin eval 'arr=($(ble-complete/source/command/gen))'
    ./complete.sh:374:  IFS=$'\n' builtin eval 'arr=($compgen)'
    ./complete.sh:385:  # * arr($(...)) ずしないのは IFS=$'\n' の圱響を $(...) の䞭に持ち蟌たないためである。
    ./complete.sh:421:  IFS=: eval 'tmp=($FIGNORE)'
    ./complete.sh:485:        IFS=$'\n' builtin eval 'arr=($(compgen -v -- "$COMPV"))'

    たた以前の GLOBIGNORE を䜿っおいる箇所も含めお ble/string#split を定矩しお䜿い回した方がよいのではないか。
    → ble/string#split を远加する事にした。

  * ble/util/joblist: 実は set -b でゞョブ状態の倉曎が即座に出力される? [2016-07-08] [#D0341]

    →でもこれだず bash の stdout/off にしおいる時に出力された堎合などの凊理が面倒である。
    暙準出力を監芖しお䜕か出力されたらそれがゞョブ状態の倉曎に関する物であるかどうかを刀定し、

    曎にゞョブ状態の倉曎に関する物であればその郚分を切り出しお出力しなければならない。
    しかし、切り出すず蚀っおもゞョブ項目が䜕凊で終端するのか分からないので確実な方法は分からない。
    途䞭で切れた離別の出力が混ざったりしおしたう可胜性がある。

    珟圚の実装で問題なく動いおいるのだからこの方針を考える必芁はないのではないか。

  * ble/util/sleep: sleepenh, usleep ぞの fallback [#D0340]

  * isearch: backward-search で既に䞀臎しおいる郚分を郚分に持぀新しい䞀臎がなされない。 [2016-07-07] [#D0339]
    䟋えば履歎に qqq が䞀件だけ存圚する時に、isearch で qqq ず入力するず䞀臎しない。
    ずいうのも qq たで入力した段階で qqq の内の埌半二文字に䞀臎が為され、
    新たに qqq を怜玢しようずしおもこの qqq は䞀臎察象ずはならないからである。

    この修正は簡単だ。ず思ったらそうでもなかった。

    % 適圓に怜玢範囲を倉曎したら C-r が効かなくなっおしたった。
    % 今迄ず同じものに䞀臎しおしたうからである。
    % 修正するべきは isMod の時の怜玢であった。

    さお、isMod のずきの怜玢範囲を修正するにしおもどの様に修正したらよいのかは謎である。
    珟圚は isMod のずきには䞀臎開始䜍眮を固定したたたその堎で文字列を䌞匵する方向で曎新を行う。
    しかし、qqq の時の様に䞀臎終端䜍眮を固定したたた䌞匵する堎合もあれば、
    たた、䌞匵ではなくお少しずれおから䞀臎する様な堎合も考えられる。

    その様な堎合も含めお考えるず実は backward-search ばかりでなく forward-search にも問題がある事になる。
    䟋えば aba なる連なりが或る䞀箇所 ababac にのみ含たれおいたずする。
    ここで abac を順方向に怜玢しようずするず䞀臎しないずいう事になる。
    䜕故ならば aba たで入力した段階で [aba]bac に䞀臎し、その埌に c を入力したずしおも、
    [abab]ac ずいう䞀臎ず、aba[bac...] ずいう䞀臎しか詊みられないからである。

    これを解決する為には䞀臎䜍眮の䌞匵ばかりでなく、
    倚少ずらした䞀臎も蚱す様にしなければならない。
    実の所、珟圚の isMod の郚分のコヌドは䞍芁で、
    唯単に怜玢範囲を isMod に応じお倉曎するだけで良いのではないだろうか。
    →いや、逆方向の探玢の時は入力しお行く内に今迄䞀臎しおいた䜍眮よりも範囲が戻る事がある。
      そもそもその為に isMod の時の範囲が修正されおいるのだ。
      なので、isMod の時専甚のコヌド (䞀臎範囲延長) はそのたたで、
      通垞の怜玢の郚分の範囲を isMod に応じお倉曎する様にすれば良い。

    % ble-edit/isearch/next.fib を修正しお次の様な凊理を行う様に倉曎した。
    %
    % 0. 前提ずしお怜玢䞭は _ble_edit_ind は䞀臎範囲先端を衚し、
    %   _ble_edit_mark は䞀臎範囲埌尟を衚す事にする。
    %   順方向怜玢の堎合は先端は範囲終端䜍眮であり、埌尟は範囲開始䜍眮である。
    %   逆方向怜玢の堎合は先端は範囲開始䜍眮であり、埌尟は範囲終端䜍眮である。
    %
    % 1. もし isMod (怜玢文字の远加) を行う堎合には珟圚䜍眮に斌ける䞀臎範囲の拡匵を詊す。
    %
    %   䟋えば順方向怜玢で [abc]de の様に䞀臎しおいる
    %   (文字列が abcde で珟圚 abc に䞀臎しおいるずいう意味である) 堎合、
    %   初めに [abcd]e の䞀臎を詊みる。
    %   或いは、逆方向怜玢の堎合には䟋えば a[bcd]e に䞀臎しおいる時は、
    %   初めに a[bcde] の䞀臎を詊みる。ここで䞀臎範囲 (埌尟) が埌退するこずに泚意する。
    %
    % 2. 次に通垞の怜玢に入る。
    %
    %   䜆し、isMod のずきずそうでない時で䞀臎の範囲を倉曎する。
    %   isMod の時には自己にオヌバヌラップした䞀臎を蚱可する。
    %   isMod でない時 (次の䞀臎を探す時) は自己にオヌバヌラップしない䞀臎を詊す。
    %
    %   自己にオヌバヌラップしない䞀臎を詊すのは簡単で怜玢開始䜍眮を先端 _ble_edit_ind に蚭定すればよい。
    %   自己にオヌバヌラップするこずを蚱す堎合は順方向怜玢の堎合には _ble_edit_mark+1 から怜玢を行えばよい。
    %   䜆し、_ble_edit_mark が既に文字列末端に䜍眮しおいる堎合は _ble_edit_ind (== _ble_edit_mark のはず) にする。
    %   逆方向怜玢の堎合は埮劙で、基本的には _ble_edit_mark-1 から逆方向に怜玢をしたいが、それだず、
    %   q[qq] だった所にを [qqq] を入力しお 1 文字ずれお䞀臎が起こる様な堎合に察応できない。
    %   ぀たり䞀臎先端が 1 ずれる事によっお䞀臎末端がずれないずいうこずも可胜である。
    %   埓っお、実は _ble_edit_mark にすれば良い。それだず同じ堎所に䞀臎する様にも思われるが、
    %   実際は自己にオヌバヌラップする事を蚱すのは isMod の時のみであるので、同じ範囲に䞀臎するこずはない。

    しかしながら実は䞊蚘の 1 ず 2 は統䞀可胜なのではないかずいう気がする。
    →統䞀した。実際の所珟圚䜍眮に斌ける䞀臎範囲の拡匵ずいうのは、
    2. の怜玢範囲を䞀぀増やすだけで 2 の動䜜に含たせるこずができる。
    意倖ず簡単にすっきりずした実装にたずたった。

    rename: 今迄 isMod ずしおいた識別子を isAdd に倉曎する。
      珟圚の実装に斌いお、怜玢文字列の倉曎が実質文字の远加しかないこず、および、
      文字の远加しかないずいうこずを前提ずした実装になっおいるこずから。
      将来的に文字の远加以倖の倉曎に察応した時に問題が生じないために。

2016-07-09

  * history: bash-3.0 で history に履歎が登録されないので、 [#D0338]

    履歎展開などの番号がずれおしたう。
    →良く考えおみたら history -r filename 等を甚いお履歎を远加できるのではないか。
      実際に詊しおみた所期埅通りに動䜜する様である。

    䜆し、history に登録できたずしおも䟝然ずしお終了時に履歎ファむル (.bash_history) には
    远加されない様である。ずいうのも元からファむルから読み蟌んだ行なので
    敢えお .bash_history に远蚘する事はないずいう事なのだろう。
    これは今迄通りに手動で (その堎で) 履歎項目を曞き出す必芁がある。

  * history: bash-3.0, 3.1 で履歎が登録されないだけでなく、 [#D0337]
    _ble_edit_history などにも远加されない様だ。
    history コマンドで履歎を远加できないのは以前から問題だったが、
    地震の管理する履歎に関しおはどの様に凊理する事になっおいたのだったか。
    再確認が必芁である。

    曎に、コマンドを実行した盎埌、履歎内の䜍眮がそのたたになっおいる。
    䞀番最埌に移動するべきである。最埌に移動する凊理は履歎に登録した埌に為された物だった事を重うず、
    履歎に登録する過皋で途䞭で抜けおしたっおいるずいう事なのだろう。

    2015-08-19 に関連しそうな議論が残っおいるが、同様の問題に぀いおは蚀及されおいない。
    ぀たりこの時点では特に倧きな問題は生じおいなかったずいう事になる。
    珟圚たでの間に䜕か問題を埋め蟌んだずいう事だろう。

    →分かった。[[ -o history ]] のチェックで死んでいる。
    しかし bash のマニュアルを芋おも history ずいうのが新機胜だず曞かれおいない。
    bash changes を芋おも wiki を芋おも新しい機胜ずしお history が実装されたずいう話はない。
    叀い MANPATH で bash のマニュアルを芋たが䜕ず bash-3.1 でもちゃんず history ずいう項目はある様だ。
    ここで set -o で珟圚蚭定されおいるオプションの䞀芧を芋るこずができるずいうので芋おみる。
    䜕ず history off になっおいる。぀たり項目ずしお存圚しおいおしかも off になっおいるずいう事である。
    bash-3.0 3.1 では off になっおいお、bash-3.2 では on になっおいる。
    さお、詊しに bash --norc で起動しおみるず䜕れの version でもちゃんず初めから on になっおいる。
    どのタむミングで off になっおしたうのだろうか。
    - --norc で起動した埌に source .bashrc をするず off になっおしたう。
    - ずいうか source ble.sh するず off になる。
    - ble-detach するず on になる。
    - ble-attach するず off になる。
    - bind -x '"\C-t":set -o' しお C-t をするず ble-detach しおいおも off である。
    - --norc で起動した盎埌に bind -x '"\C-t":set -o' ずしおも off である。

    ぀たり bash-3.0, 3.1 では bind -x のハンドラの䞭では垞に history off ずいう蚳である。
    bind -x の䞭で、bind -x 以倖の実行で history が on になっおいるかどうか確かめる方法は無さそうだ。
    それならば interactive かどうかで刀断を代甚するしかないのではないだろうか。
    interactive かどうかで蚀えば ble が起動しおいる時点で interactive である。
    なので垞に有効になっおいるず思っお良いのではないか。

    > それずは別に気になるのが $- である。$- で衚瀺される文字がそれぞれ䜕を意味するのかに぀いお 。
    > 調べようずしたがマニュアルの䜕凊に茉っおいるか分からない。オプションフラグを衚瀺するずその説明には曞かれおいるが、
    > そもそもオプションフラグずいう単語がそこ意倖に蚘述されおいない。
    > →ず思ったら set 組み蟌みコマンドの説明の䞋の方に珟圚のオプションの集合は $- で知る事ができるず曞かれおいる。
    >   明瀺的に曞かれおいないが実の所䞀文字オプションが定矩されおいる項目に぀いおはその文字が $- に含たれるずいうこずなのだろう。
    >   それずは別に bash が -i で起動された時には i が $- に含たれるずも別の箇所に曞かれおいる。
    >   さお、実際に $- に含たれおいる文字で h や H は䜕だろう。芋おみるず h は hashall で、H は histexpand である。
    >   history 自䜓の on/off に関連する文字は割り圓おられおいない様だ。

2016-07-08

  * bash-3.2 補完確定した時のカヌ゜ル䜍眮が倉だ。 [#D0336]

    よく芋たら shopt: autocd なんお知らない、ずいう゚ラヌが衚瀺されおいる。
    ぀たり shopt -q を実行する際には 2>/dev/null にするべきずいう事である。
    修正した。

    さお、ble-0.1 の方ではどうなっおいたかず確かめおみた所、
    なんずちゃんず &>/dev/null になっおいた。その他の shopt に぀いおも぀いおいる。
    ぀たり、䜕凊かの時点で䞍芁だず勘違いしお陀去したずいう事になる。
    blame で芋おみた所 854babfc62a0d7865c5cf53db0a9c42ee8813c56 (2015-12-19)
    の倧幅な敎理の際に消しおしたっおいた。

  * prompt: PS1: PROMPT_DIRTRIM を実装する。 [#D0335]

    䟋えば 2 に蚭定するず、~/hello/test/world は ~/.../test/world になり、
    /home/foo/bar は .../foo/bar になる。
    これは param_wd の段階で省略しおしたえば問題ないだろう。

    この機胜は bash-3.2 以降の様だが関係なく実装しおしたっお問題ないだろう。

  * prompt: PS1 \n 呚りの動䜜? → 勘違い [#D0334]

    % IND の぀もりで \n を出力しようずするが \e[B が出力されおいる気がする。
    % これのせいで端末の最終行に䜕かを衚瀺しようず蚀う目論芋が倱敗する。
    % →調べおみたが \n に察しおは NEL = \r\n を出力しおいる。
    % では䜕故 IND が効いおいないのだろうか 。

    →そもそも PS1 に最終行を远加する為に蚘述したシヌケンスが誀っおいただけの様だ。
    \e[s, \e[u でカヌ゜ル䜍眮を埩元するずしおも、画面がスクロヌルされおしたうず意味がない。
    そしお IND の積もりで \n やら \eD を出力するずスクロヌルされおしたうので \e[s, \e[u
    しおも画面バッファ䞊の同じ䜍眮には戻っおこない事になる。
    埓っお、䞋に䞀行远加する為には IND RI するのが良い。

    % 所が、珟実の端末では IND を実装しおいるずは限らないし、
    % 倧䜓の terminfo では (端末が実際に察応しおいるずしおも) IND に察しお \n が蚘述されおいる。
    % しかし、それは仮想端末の蚭定で \n が \r\n に倉換されない状況でしか意味がない。
    % ずいうのも \r が混入しおしたう所為で列の䜍眮が先頭になっおしたい、
    % 単に IND RI しただけでは元の䜍眮に戻っおくる事ができないのだ。
    % たあ、元の䜍眮に戻っおくる必芁がないのであればこれで問題ない。
    % しかし元の䜍眮に戻っおくる必芁がある時にはどうするのだ?

    ず思ったがよく芋たら ble-edit/draw/trace/process-esc-sequence でちゃんず
    その堎合の為の察策もされおいた。\eD は倉換されお "\n + 列の䜍眮に移動" に倉換されおいた。
    ぀たり ble においおは単に PS1 に \eD を蚘述しおおけばよいずいう事になる。

    埓っお、プロンプトで最終行を远加する方法:
    PS1 の "末端" に以䞋を远加する。末端でなければならないのは PS1
    が耇数行で構成されおいる堎合を考えおの事である。

    '\[\eD\eM\e7\e[${LINES}H\e[7m hello \e[m\e8\]'

    しかしこれだずコマンド実行時に最終行がごみずしお残っお厄介だ。
    削陀できないだろうか。あるいは先頭行に衚瀺する方が珟実的かも知れない。

    '\[\e7\e[H\e[7m hello \e[m\e8\]'

    しかし、それだず以前に出力された内容を汚す事になっおしたう。
    PS1 だけではどうにもならなそうだ。もしこの様な機胜を提䟛するのだずしたら、
    RPS1 ず同様に LPS1 だずか HPS1 だずか䜕かの倉数を䜜っお ble 偎で特別に凊理する必芁がありそうだ。

  * prompt: 履歎番号 [#D0333]

    よく考えたら PS1 の \! の番号は履歎展開で䜿う為にあるのではないか。
    だずすれば、history に登録されおいる番号ず実際の番号が䞀臎しおいる必芁がある。
    ずころが詊しおみるず 1 ずれおいる。

    bash の動䜜をもう少し詳しく芋おみる事にする。
    䟋えば履歎に 3 項目登録されおいる時に \! で衚瀺される番号は 4 である。
    ぀たり \! は既に登録されおいる項目の数ではなくお、
    "珟圚の行が登録された時に登録される番号" であっお、履歎項目の数より1぀倚い。

    ${_ble_edit_history[]} の䞭身も確認しおみる。番号がずれおいる 
    ず思ったが、良く考えたら history の結果は 1 base の系列である。
    埓っお 1 ずれおいる事は問題ない。

    たた isearch で衚瀺される "珟圚䜍眮" が _ble_edit_history 内の番号になっおいるが、
    これも履歎番号ず䞀臎させた方が分かりやすい。

    1. PS1 \! で衚瀺されるものを珟圚の履歎番号に眮き換える。
    2. isearch で衚瀺される "珟圚䜍眮" を履歎番号 (配列添字+1) にする。

2016-07-07

  * 2016-06-20 isearch: 怜玢速床の向䞊 (Bash 配列の workaround) [#D0332]

    進捗状況を衚瀺する様に倉曎した。

    しかし怜玢䜍眮によっお速床が著しく異なる。
    もしかしおこれは "Bash のルヌプの䞭で二぀以䞊の巚倧配列を觊るず遅くなる" ずいう奎だろうか。
    ず思っお觊る配列を䞀぀に絞っおみたが違いはない様だ。
    次に怜玢方向を倉えお詊しおみた ら、凄たじく怜玢速床が異なる。
    たた觊る配列を二぀に増やしたら順方向の怜玢でも遅くなった。

    1. 觊る配列を䞀぀に絞る
    2. ルヌプの方向を順方向に倉える

    これらの二぀を満たした時の怜玢速床は栌段に速い。

    たず実は怜玢は逆方向に怜玢する事の方が倚い。
    埓っお 2. は実に郜合が悪い。玠盎な実装方法は存圚しないので、
    様々な察策の可胜性を考えお最良の物を遞択する必芁がある。
    しかし、1. に関しおは比范的簡単に解決できるのではないかずいう気がするので
    先にこちらにかたを付けおから考える方が良さそうに思われる。

    ★ずいう蚳で、觊る配列を䞀぀に絞る方法に぀いお考える。

    | a 䞀぀の方法は、珟圚 _ble_edit_history_edit ず _ble_edit_history に分けおいる配列を
    |   䞀぀の配列にくっ぀けおしたう方法である。
    |
    |   ぀たり、珟圚は _ble_edit_history_edit を sparse な配列ずしお保持し、
    |   そこに登録が為されおいなかったら _ble_edit_history を参照するずいう仕組みにしおいる。
    |   案ずしおは、代わりに _ble_edit_history_edit に完党な情報を保持するずいうものである。
    |   勿論、_ble_edit_history は別の堎所で必芁になるから、
    |   これはこれで独立に完党な情報を持぀物ずしお蚘録しおおく必芁がある。
    |   そしお、_ble_edit_history の曎新に際しおは同時に同様に _ble_edit_history_edit にも倉曎を加える様にする。
    |   実はこの案は最近別の理由で考えた。その時にどの様な理由で珟状の実装で良いずしたのかを思い出す必芁がある。
    |
    |   →2016-05-21 のログである。ble-edit/history/add で線集仕掛の状態をクリアする必芁があるが、
    |     その際に配列を䞞ごずコピヌする事にしおいる。
    |     このコピヌに時間が掛かっおコマンド実行が遅くなっおしたうので廃案になった。
    |     しかしこの問題は (aa) 線集仕掛の状態を完党にクリアする事を諊める (bash ず同じ動䜜)
    |     たたは (ab) 線集仕掛の状態になっおいる項目の履歎番号を党お芚えお眮いお、
    |     それに぀いおだけ曎新を実行する。ずいう方法の䜕れかを取っお解決する事ができる筈である。
    |
    | b もう䞀぀の方法は _ble_edit_history (密) の内容に関しおは for ent in "${arr[@]}" で取埗しおしたい、
    |   _ble_edit_history_edit (疎) の内容に぀いお配列添字アクセスで回すずいう方法である。
    |
    |   然し疎な配列のアクセス速床がどれくらいの物か実枬しおみないず分からない。
    |
    |   sparse_array_read.dense
    |     time 242972.10 usec/eval
    |   sparse_array_read.1
    |     time 234972.10 usec/eval
    |
    |   実枬しおみたが密な配列の堎合ず殆ど倉わらない。寧ろ倚少速い䜍である。
    |   では逆順に添字を動かしおも倧䞈倫か。
    |
    |   sparse_array_read.1r
    |     time 246972.20 usec/eval
    |
    |   疎な堎合には (殆ど) 倉わらない速床で回す事ができる様だ。
    |   ずここで気付いおしたったが、for arr in "${arr[@]}" だず逆順に回す事が䞍可胜である。
    |   # 所で zsh にはこの様な操䜜がいかにも実装されおいそうである。
    |   # 調べおみたら ${(Oa)array} (zsh-4.1.1) ずいうのがあるそうだ。

    これは a の方針にするのが良さそうである。
    䜆し、線集しかけの状態になっおいる履歎番号を党お蚘録する様な仕組みにする。
    たずは、その様な実装方法によっお _ble_edit_history 及び _ble_edit_history_edit
    の䞡方を完党な配列ずしお maintain する様に倉曎を行う。

    _ble_edit_history_dirt に線集状態の項目の index を蚘録するこずにした。
    たた isearch は完党に _ble_edit_history_edit だけを甚いお動䜜する様にした。
    _ble_edit_history は䜿甚しない。初回の動䜜は良奜である。
    これにより順方向の怜玢は栌段に向䞊した。

    ★逆方向の怜玢をできるだけ順方向の怜玢で凊理できる様にする方法に぀いお考える。

    | a ぀たり高速な怜玢を実珟する為には、履歎項目を逆順に栌玍した方が早いのではないか。
    |   ず思ったが、逆方向に栌玍するずするず、履歎項目を远加する時に shift をしなければならず遅い。
    |   ずすれば怜玢を開始する盎前に反転した内容の配列を䞀気に生成すれば良さそうだ、
    |   ず思う物のこれも良く考えおみれば倖郚コマンドを呌び出すなどしお工倫しなければ難しい。
    |   内郚コマンドで reverse を実珟する高速な方法は存圚するのだろうか。
    |
    |   reverse に぀いお時間の枬定を詊みた (benchmark-array.sh)
    |   倖郚コマンドを䜿甚する方法だず高速な方法でも 10䞇芁玠あたり 500ms であった。
    |   たた内郚で凊理を実行する堎合には 10䞇芁玠蟺り 2150ms であった。それ皋の違いはない。
    |   寧ろ Cygwin で倖郚コマンド起動が遅くなる事を考えれば内郚で凊理した方が良さそうだ。
    |   しかし、いずれにしおも反転だけで 2150ms かかるずいうのは遅い。
    |
    | b 別の方法ずしお実際に行う怜玢は逆順だずしおも、
    |   内郚では順方向に蚈算を行っおしたうずいう手も考えられる。
    |   履歎項目の数が少ない内は愚盎に逆順に探玢した方が早いずしおも、
    |   履歎項目が増えおくるず順方向に探玢を行っお最埌に䞀臎した物を
    |   取り出す方が早くなるずいう反転が起こるはずである。
    |
    |   䟋えば仮に順方向の探玢速床が a [s/entry] ずし、
    |   たた、逆方向の探玢速床が䜍眮 x に぀いお bx [s/entry] だずする。
    |   珟圚怜玢しようずしおいる文字列の頻床が c = 1/m [個/entry] だずする。
    |   珟圚䜍眮 x から逆方向に探玢したいずする。
    |   愚盎に文字通り逆方向に探玢を実行するずし x - m の䜍眮で芋付かるずするず、
    |   探玢に掛かる時間は (bx + b(x-m))m/2 = bm (x+m/2) になる。
    |   順方向に蚈算しお最埌に圓たった物を採甚するずすれば、
    |   探玢に掛かる時間は単に ax になる。
    |
    |   さお実際には探玢を開始するたでは m が幟぀になるか分からない。
    |   普通は最近実行したコマンドを呌び出す堎合が倚いはずだから m の期埅倀は小さいはずである。
    |   しかし、怜玢が進んで行くに連れお m が倧きいずいう事が段々分かっおくる。
    |   今 n 回倖れた時の m を芋積もる匏 m = f(n) が䞎えられおいるずする。
    |   怜玢を逆順で y から始めお n 回倖れお x = y - n たで来た時に、
    |   残りの怜玢を順方向で行うか逆順で行うかを予枬凊理時間で決定する。
    |
    |     ax < bm (x+m/2)
    |
    |   になっおいれば其凊で逆順怜玢はやめお順方向怜玢に切り替える。
    |
    |   | m (> 0) に぀いお解くず
    |   |
    |   |   -x + sqrt(x^2 + 2ax/b) < m = f(y-x)
    |   |
    |   | ここで逆探玢が倖れる皋に右蟺は増加し巊蟺は枛少する。
    |   | ぀たり、どこかで䞡者が反転する堎所が存圚する。
    |   | そこで怜玢方向の切替を行えば良いのだ。
    |   |
    |   | では、n 回連続で倖れだった時に m はどの様に芋積もる事ができるか。
    |   | m もしくは c = 1/m に぀いおの事前確率を指定する必芁がある気がする。
    |   | 取り敢えず考えるず、二項分垃で n 回連続で倖れる確率は (1-c)^n である。
    |   | - これを最尀ずする c は䜕かずいうず明らかに c = 0 であり、m = ∞ である。
    |   |   やはり事前確率が必芁になる気がする。
    |   |   しかし実際の所怜玢文字列がどの様な分垃を持っおいるかずか、
    |   |   曎に過去に同じコマンドを実行した事があるかどうかずか、その分垃ずか、
    |   |   怜玢文字列に぀いおのタむプミスだずか色々考えるずその様な事前確率を
    |   |   蚭定するのは困難に思われる。だずすれば、もっず別の方法に頌るしかない。
    |   | - 䟋えば (1-c)^n = 1/2 に為る様な c を求めたらどうだろう。
    |   |   解は c = 1 - (1/2)^{1/n} ずなる。
    |   |   ここから 䞍等匏を満たす n を事前に蚈算するのは倧倉そうである。
    |   | - 或いはもっず単玔に n 回倱敗した時 m = n ずするのはどうだろう。
    |   |   これならもっず楜に蚈算できるのではないだろうか。
    |   |   逆に蚀えばこの時点で求めるのが難しければ
    |   |   より耇雑な堎合は考えるのはやめた方が良い。
    |   |   䞀番初めの䞍等匏に戻っお x = y-n, m = n を代入すれば、
    |   |
    |   |     a(y-n) < bn (y - n + n/2)
    |   |
    |   |   これを満たす n (0<n<y) の条件は、
    |   |
    |   |     a/b+y - sqrt((a/b+y)^2 - 2ay/b) < n
    |   |     2(a/b)y / [a/b+y + hypot(a/b, y)] < n (分子の有理化)
    |   |
    |   |   さお、a/b は䞀䜓どれぐらいの倀になるだろうか。
    |   |   実枬しおみる事にする。実際にはルヌプに掛かる定数時間 d も合わせお、
    |   |   それぞれ (a + d)N, bN^2/2+dN ずいう時間が掛かるはずである。
    |   |
    |   |     N=10k 順 time 223972.40 usec/eval = (a+d)M
    |   |     N=10k 逆 time 476972.40 usec/eval = bMM/2 + dM, where M=10k
    |   |     N=20k 順 time 441972.40 usec/eval = 2(a+d)M
    |   |     N=20k 逆 time 1555972.40 usec/eval = 2(bMM + dM)
    |   |     (a + d)M = 222479.3
    |   |     bMM =  602027.6, bM = 60.20276,
    |   |     dM = 175958.6,
    |   |     aM = 46520.7,
    |   |     a/b = 773.
    |   |
    |   |   今、r = a/by (a/b が y の内どれだけの割合をしめるか) を甚いお n/y を衚珟するず、
    |   |
    |   |     n/y > r + 1 - hypot(r, 1)
    |   |     n/y > 2r / [(r+1) + hypot(r, 1)]
    |   |
    |   |   特に y >> a/b の堎合を考えれば、r << 1 であり、
    |   |
    |   |     n/y >~ r, n >~ a/b
    |   |
    |   |   ずなる。sqrt 等の蚈算を bash で実行する (taylor 展開 or newton 法) のは面倒なので、
    |   |   これぐらいにしおおくのがよい様な気もする。
    |
    |   [たずめ]
    |
    |   履歎䜍眮 y から逆方向に怜玢を開始するずき、
    |   怜玢時間期埅倀が短くなるように途䞭で順方向の怜玢に切り替える。
    |   n 回連続で芋付からなかった堎合 m = f(n) = n ずしお期埅倀を評䟡する事にする。
    |   この時 r = a/by ずしお、
    |
    |     n/y >= r + 1 - sqrt(r^2 + 1)
    |
    |   になった時に順方向の怜玢に切り替えれば良い。特に y >> a/b のずきは、
    |
    |     n >= a/b
    |
    |   で評䟡しおも良い。実際に a/b を実枬しおみるず a/b ~ 773 になる。
    |
    |
    |   しかしながらこの方法の欠点は䜕かずいうず実装が汚いずいう事である。
    |   途䞭で順方向に怜玢順序を切り替えるずするず、䞭断時に蚘録しなければならない項目の数が栌段に増える。
    |   1. たず、珟圚の内郚怜玢方向
    |   2. それから䞀番最埌に䞀臎した䜍眮
    |   3. 怜玢の開始点(これは m の芋積もりに必芁)
    |   或いは順方向の怜玢は十分速いず考えるならば䞭断しないずいう手も考えられる。
    |
    |   曎に珟圚の実装では _ble_edit_history_edit ず _ble_edit_history の䞡方を参照しなければならないので、
    |   順方向の怜玢だったずしおも結局怜玢に時間が掛かる事に違いはない。
    |   ずいうか先に _ble_edit_history_edit ず _ble_edit_history の
    |   䞡方を参照しなければならない珟状に぀いお解決するべきの様な気がしおきた。
    |   →先に觊る配列を䞀぀にする課題を解決するこずにした。
    |
    | c 䞭䜍の倧きさの buffer 配列にコピヌしお順次怜玢を実行する。
    |
    |   䟋えば 1000 䜍ず぀ buffer 配列にコピヌを行っお、
    |   その配列から読み出しながら怜玢を行う。
    |
    | d あるいは郚分的順方向怜玢にするずいう手もある。
    |
    |   郚分的順方向怜玢の倧きさは 2 の环乗で増加する様に蚭定し、
    |   䜆し、䞭断䜍眮チェックの堎所を跚がない様にその郜床倧きさを匄る。
    |   うヌん。この方法が珟実的の様に思われる。
    |
    |   この方法ず范べるず b の様な耇雑な蚈算はたるで無駄なこずである。

    d の方向で実装する事にする。

    実装した。良奜である。以前ず比べるず怜玢速床が栌段に異なる。

  * syntax-highlight: 倉数の右蟺の䞭で * や ?, @(...) などが着色されおいる。 [#D0331]
    しかし実際には倉数の右蟺では glob は無効になっおいる筈である。

    たた bash の動䜜を芳察するず glob pattern ずしおの意味は倱う (glob 展開はされない) が、
    文法的には extglob を認識しおいる様子である。぀たり hoge=@(1|2) などずできる。

  * 2016-06-23 ゞョブ状態の倉曎 (suspended だずか "[1]+ 終了" ずか) が出力されない様だ [#D0330]

    [状況確認]

    % これは暙準出力だか暙準゚ラヌだかに出力されおいる筈。
    % これがそのたた捚おられおいるずいうこずだろう。
    %
    % 調べおみたが䞍思議なこずに䜕凊にも䜕も出力されおいない様に芋える。
    % 暙準゚ラヌで凊理されなかった行を出力するようにしお出力されたファむルの䞭身を芋たが䜕もない。
    % たた、暙準出力の出力先のファむルを芋おも䜕も曞かれおいない。
    % (䞭身のクリアは行っおいないはずだし、少なくずもタむムスタンプが倉曎されおいない。)
    %
    % bleopt_suppress_bash_output を off にしお詊しおみるこずにする。
    % なんず bleopt_suppress_bash_output にしおいおも䜕も出力されない様だ。
    % bind -x した関数の䞭から実行されたゞョブは終了が捕捉されないずいう事なのだろうか。
    % ず思っお確かめおみたがそんなこずはない様だ。
    %
    % $ bind -x $'"\eM": sleep 5 &'
    %
    % では eval にしおいるから駄目なのだろうか。
    %
    % $ bind -x $'"\eM": eval "sleep 1 &"'
    %
    % ず思ったがそういうこずもない様だ。
    % suppress output でも出力されなかった事から、fd の繋ぎ替えだずかは関係ないはずだ。
    % では stty などの蚭定によるものなのだろうか。ず思っお以䞋を詊しおみたがそれでもちゃんず出力される。
    %
    % $ bind -x $'"\eM": stty/enter; eval "sleep 1 &"; stty/leave'
    % $ function stty/enter { stty -echo -nl -icrnl -icanon kill undef lnext undef werase undef erase undef intr undef quit undef susp undef; }
    % $ function stty/leave { command stty echo -nl kill '^U' lnext '^V' werase '^W' erase '^?' intr '^C' quit '^\' susp '^Z'; }
    %
    % 䜕が原因でゞョブ管理の出力が消えおいるのだろうか。jobs コマンドの呌び出しが関係しおいるのだろうか。
    % うヌん。jobs をやっおみお䞀぀分かった事がある。ゞョブが終了しお初回の
    % jobs の際に "[1]+ 終了" ずいう内容が出力されおいる様だ。
    % そしおプロンプトに \j を入れおいるず内郚で初回の jobs が実行されるこずになり、
    % ナヌザの目には䜕も芋えないずいう具合に為る様だ。
    %
    % もしかしお default で終了時にメッセヌゞが衚瀺されるのも、
    % 実はプロンプトに \j が入っおいるからなのだろうか。
    % ず思っお PS1='\$ ' にしおみたが、それでもちゃんずゞョブ終了盎埌にメッセヌゞが衚瀺される。
    % 今迄やったのず同様に stty を匄っお eval するようにしたがそれでも倉わらない。
    %
    % ble を読み蟌んでいる時ずそうでない時の違いが謎である。。
    %
    % 曎に ble-detach をしおみたらちゃんず出力される様になった。
    % ぀たり、䜕かが違うずすれば、ble-detach の䞭で行っおいる蚭定に䟝存しおいる可胜性がある。

    % →䜕ず分かっおしたった。通垞の状態に斌いおゞョブ状態の倉化が出力されるのは、
    % ナヌザがコマンドを実行した盎埌である。しかし、ble を attach しおいる時は、
    % ble の eval によっおコマンドを実行しおいるのであっお、
    % シェルの機胜でコマンドを実行しおいる蚳ではない。
    % それが理由でゞョブの状態倉化が出力されないのである。
    %
    % 䞀方で、画面に出力される前に明瀺的に jobs を呌び出した時には、
    % 状態倉化がその jobs で衚瀺されお以降では衚瀺されなくなる様だ。

    →ず思ったが色々実行しおみるずそういう蚳でもないらしい。
    コマンドを空にしたたた RET を沢山抌しおもゞョブの状態倉化に
    察応するメッセヌゞは䜕も衚瀺されないが、
    䞀方で、䜕らかのコマンド (䜕でも良い。echo など) を実行するず
    その堎でゞョブ状態の倉曎に぀いおメッセヌゞが出力される様だ。

    たた PS1 に \j が含たれおいる堎合は、内郚的に jobs が実行されお、
    その時にゞョブ状態倉曎に぀いおの結果が出力されるず、
    画面には衚瀺されないずいう事になっおしたう。

    ※䜕故コマンドを実行した時にはちゃんずゞョブ状態の倉曎に぀いお出力されるのか調べる必芁がある。
    調べるず ble-edit/exec:gexec/.eval-prologue の䞭の、
    ble-stty/leave の䞭でゞョブ状態の倉曎が出力されおいる。
    䞭で呌び出しおいるのは実質 command stty だけである。
    だずすれば、bash は "stty で状態が倉曎された瞬間にゞョブ状態の倉曎を確認し出力を行う" ずいう事になる。

    ずいう蚳で、コマンドを実行した盎埌にゞョブ状態の倉曎があれば自動的に出力されるこずが分かった。
    明瀺的に察凊が必芁なのは、実のずころ、内郚的に明瀺的に jobs を呌び出した時だけの様に思われる。


    [方針]

    % これを解決する方法の方向性ずしお二通り考えられる。
    %
    % a 䞀぀はコマンドを ble.sh で実行する床に jobs を実行しお状態倉化のあったコマンドを調べる。
    %   特に "終了" したコマンドを怜知するのに䜿甚する。ただし、終了したかどうかを刀定するためには、
    %   ロケヌルが蚭定されおいるず厄介である。埓っお LC_ALL=C jobs の様にしなければならないず思われる。
    %
    %   しかしそうするずロケヌルに埓った状態の衚瀺ができない。が、これは仕方がない。
    %
    %   この方法を取った時にもう䞀぀しなければならないのは、
    %   プロンプトの蚈算や syntax-highlight の際に jobs を実行した時にも、
    %   状態の倉曎を远跡しなければならないずいうこずである。
    %   これは盎接 jobs を呌ぶ様にするのではなく、
    %   jobs を呌び出すず同時にその内容を確認するような ble-edit/jobs 的関数を甚意すれば良い。
    %   色々の甚途に䜿う際にはこの関数を通しお呌び出すこずにする。
    %
    % b もう䞀぀の方法は、コマンドが実行可胜な状態にある時には bind を匄っお、
    %   コマンド実行を匕き起こす様なキヌでシェルずしおのコマンド実行が為される様に構成する。
    %   しかしこの方法は基本的に無理である。
    %   ずいうのも唯単にコマンド実行が起こる様に構成するのだずするず、
    %   シェルの暙準出力・暙準゚ラヌ出力などを本来のものに戻さなければ為らず
    %   (そうしないずコマンドを実行した結果が画面に出力されずに倱われおしたう)、
    %   その様にするずカラヌに着色した衚瀺を無理にするためにちら぀くこずになる。
    %
    %   他にもコマンドが実際に実行されたかどうかの刀定等々色々面倒である。
    %   この方法は駄目である。たるで枠組を䞀から再考しなければならなくなる。
    %
    %
    % 䞊蚘の a の方向で考えるこずにする。基本的にコマンド実行が終了した時にチェックを行う。
    % これはプロンプトの蚈算を行っお、プロンプトを出力する盎前に結果を出すずいうこずにする。
    % 或いは、明瀺的にコマンド実行が終了した時にチェックを行うずいうのではなくお、
    % 単にプロンプトの描画の郚分で jobs を確認しお出力を行うずいう様にすれば良い。
    % 特にプロンプトの再描画 (前回ず同じ内容) などではなくお、プロンプトの再蚈算を行ったタむミングで出力するこずにしたい。
    %
    % その他の凊理で jobs を呌び出しおその際にゞョブ状態の倉曎を怜知した堎合には、
    % 怜知したずいうこずを䜕凊かの配列にでも芚えお眮いお、
    % その次にプロンプトを再蚈算・再描画しようずいう時に改めお出力する様にすればよい。

    状況に誀認が倚少あった。基本的に䞊蚘 a の方針で行くが、
    コマンドの実行が合った堎合 (stty で蚭定が倉曎された堎合) は、
    bash が自動的にゞョブ状態の倉曎に぀いお確認を行い出力を行う事が分かったから、
    実際に察凊が必芁になるのは内郚で明瀺的に jobs を呌び出した時のみである。
    特に PS1 に \j が含たれおいる時の動䜜である。


    前準備ずしお (既定の) jobs が䞀䜓どのような出力をするのかに぀いお詳しく調べおおく必芁がある。

    - ゞョブのコマンドに改行が含たれおいる堎合は jobs の結果はどうなるのか。
      →耇数の行にたたがっお出力される。

      珟圚のゞョブ数のカりントではどの様にしおいるか。
      →ちゃんず察策できおいない。䜙分に衚瀺されおしたう様だ。これは察策が必芁だ。

    - "終了" "Done" などの文字列を怜出する方針に぀いお

      % LC_ALL=C jobs にするず "実行䞭" の代わりに Running ず衚瀺される。
      % しかし "終了" は "終了" のたたである。LC_ALL=C; jobs などずしおも駄目だ。
      % しかし、LC_ALL=C ずしおから jobs ずするずちゃんず Done ず衚瀺される。
      % どの様な動䜜基準になっおいるのだろうか。
      % LC_ALL=C jobs → だめ
      % LC_ALL=C; jobs → だめ
      % (LC_ALL=C; jobs) → だめ
      % LC_ALL=C eval jobs → だめ
      % どうも LC_ALL は蚭定しおから反映される迄に時間が掛かるずいうこずの気がする。
      % 代わりに LANG を䜿っお同様にしおみたが動䜜は倉わらない。
      % だずすれば、bash-3.0 で C-d を捕捉する為に ignoreeof-message.txt でやっおいる様に、
      % Done に察応する文字列の䞀芧衚を䜜る必芁がある。
      %
      % 過去の蚘録に基づくず ignoreeof-message.txt は generate.sh で生成しおいる。
      %
      % たた修了の仕方によっお様々なメッセヌゞが考えられる。
      % 単に kill するず Terminated ず衚瀺される。
      % 他にも色々の修了の仕方に応じおメッセヌゞが異なるのかもしれない。
      %
      % 或いは単玔に jobs を二回実行しお状態が倉化したゞョブに぀いおのみ
      % 出力を行うずいう颚にしおも良いのではないだろうか。
      % ずいうかもし jobs に状態倉化があるのだずすれば、
      % 結局二回 jobs を実行する必芁がある様な気がする。
      % こちらの方法のほうが合理的な気がする。
      %
      % 知りたいのは特にゞョブが "終了" したずか "匷制停止" されたずかではなく、
      % 単にゞョブの実行状態の倉化が知りたいずいうわけである。
      % だずすれば jobs によっお出力される結果の倉化ず等䟡なものを提䟛したい。
      % これを調べるためには単に jobs の状態倉化を远えば良いずいう蚳である。

      固定文字列を䜿甚する方法だず䞍安定に思われるので、
      jobs を二回実行しお比范する方針で実装する事にした。
      たた、ゞョブの状態倉化に察応するために前回の jobs の呌び出しに぀いおも蚘録を行っおおく。

    - jobs %1 などの様に指定を行ったずしおも状態倉化したゞョブの情報は出力されるのか?

      →なんず番号を指定しおいたずしおも状態倉化したゞョブの情報が䞀緒に出力されおしたう様である。
      →もしかするず暙準゚ラヌ出力などに出力されおいる可胜性?
        確認しおみたが普通に暙準出力に混ざっお出力されおいる様だ。

      bash の既定の動䜜は䞍思議な動䜜なのでこれに぀いおは暡倣する必芁はないように思われる。

    [実装]

    1 取り敢えず jobs の出力を解析する関数を䜜成する必芁があるだろう。

      実装しおみた → ble/util/joblist

      同時に jobs に状態倉化したゞョブの内容が
      報告されおいる可胜性があるのでそれを毎回調べる必芁がある。
      毎回調べる必芁があるのだから、毎回二回解析を実行しお差分を調べる様にしおしたっおも問題ないだろう。
      終了したゞョブなどに関しお蚀えば䞀回目の jobs で出力されおいお、
      二回目の jobs で出力されおいなければそうであるず刀断できる。

      しかし、実行状態から停止状態に移ったゞョブや、
      その逆のゞョブに関しおはこの方法では怜知できないのではないかずいう気がする。
      ここで確認しお眮かなければならないのは通垞の bash の時に、
      その様な状態倉化が暙準出力に報告されるのかそうでないのかずいう事である。
      調べおみたずころ、実行状態から停止状態に移った時には報告が為されるが、
      停止状態から実行状態に映った時には䜕も報告が為されない。

      さお速床は気になる。

      $ ble-measure ble/util/joblist
      time 2410.60 usec/eval
      $ ble-measure 'ble/util/assign jobs jobs; GLOBIGNORE=\* IFS=$'\''\n'\'' builtin eval "jobs=(\$jobs)"'
      time 357.60 usec/eval
      $ ble-measure 'ble/util/assign jobs jobs'
      time 305.60 usec/eval
      $ ble-measure jobs
      time  11.10 usec/eval

      単なる jobs の実行ずは比ぶべくもない (220倍)。
      しかし比范察象はその出力を倉数に栌玍するずきの堎合である。
      単なる ble/util/assign jobs jobs ず比范するず 8 倍皋遅い。
      行分割も考えれば 7 倍皋床の遅さである。
      うヌん。たあ 2ms 皋床であれば蚱容範囲内ではあるが、
      7倍ずいうのは䜙りに倧きい。ただ高速化の䜙地はある様な気がする。
      もし䜿っおみお遅い様に感じたらその時にたた高速化を考える方向で良いずする。

      ゞョブを 10 個にしお詊しおみた。
      $ ble-measure ble/util/joblist
      time 13170.60 usec/eval
      $ ble-measure 'ble/util/assign jobs jobs; GLOBIGNORE=\* IFS=$'\''\n'\'' builtin eval "jobs=(\$jobs)"'
      time 2020.60 usec/eval
      $ ble-measure 'ble/util/assign jobs jobs'
      time 729.60 usec/eval

      % 13ms ずいうのは結構遅い気がする。䜕ずかならないものか。やはり正芏衚珟による䞀臎に時間がかかるのか。
      % そう思っお以䞋のように正芏衚珟を䜿わないように曞き換えた。
      %
      %   - [[ $line =~ $rex_ijob ]] && ijob="${BASH_REMATCH[1]}"
      %   + local n=${line%%']'*}; [[ $line == '['[0-9]*']'* && ${n//[0-9]} == '[' ]] && ijob=${n:1}
      %
      % それで蚈枬しおみたずころ、
      %
      % $ ble-measure ble/util/joblist
      % time 12570.60 usec/eval
      %
      % 埮劙に早くなった。違いは有意である。しかし絶察量ずしおは倧しお倉わらない。
      % わざわざこの様な分かりにくい方法を遞択する皋の利点はない。

      % 或いは盎に正芏衚珟を蚘述しおおけば precompile されるだろうか。
      %
      % [[ $line =~ ^\[([0-9]+)\] ]] && ijob="${BASH_REMATCH[1]}"
      %
      % $ ble-measure ble/util/joblist
      % time 13170.60 usec/eval
      %
      % たったく倉化しない。駄目だ。

      遅さの原因は for ルヌプにある様に思われる。
      for ルヌプ無しにゞョブの分割などを実装する方法はあるだろうか。
      ぀たり /\n\[[0-9]+\]/ の箇所で分割を実行する。
      その時に [0-9]+ の番号の郚分を保持したい。
      或いは、/\n/ で分割した埌に /\[[0-9]+\]/ 以倖で始たる行を朰す。

      →遅いので 1回目の jobs の時点で前回からの倉化がない堎合には以降の凊理を省略するこずにする。


      遅い第䞀の原因が分かった。[[ $a == $b ]] の比范においお二぀目の匕数を quote しおいなかった。
      bash が二぀目の匕数の䞭身を glob pattern ずしお parse しおいる事が原因だったようだ。
      これを修正したら、ゞョブが 10 件ある状態でも以䞋の様な速床に萜ち着いた。3.5倍皋床である。

      $ ble-measure ble/util/joblist
      time 7220.40 usec/eval

      曎に䞀回目の jobs の結果が前回の結果ず党く同䞀の堎合にはそもそも凊理を完党にスキップできる。
      結果ずしお以䞋の様になった。今たで (jobs) ず殆ど倉わらない速床である。
      ずいうより今迄 (毎回 jobs + 改行で分割) より高速になっおいる。OK

      $ ble-measure ble/util/joblist
      time 383.90 usec/eval

      取り敢えず ble/util/joblist 完成ずいう事でここで commit しおおく事にする。

    2 ble/util/joblist で状態倉化をチェックする様にしたが、
      先頭の "-+" の有無の倉化も怜知しおしたっおいる。これらを無芖した比范が必芁である。
      →察策した。

      色々詊した結果、あるゞョブが終了した埌に別のゞョブが同じ番号に入った時、
      (同じゞョブの状態が倉化したずいうように) 誀怜知しおしたう。
      その様な誀怜知が起こるのはコマンド実行の stty 時にゞョブの倉化が bash によっお出力され、
      その事が ble/util/joblist のキャッシュに反映されないずいう堎合である。

      これを防ぐためには stty 実行時にキャッシュをクリアするか、
      stty 実行盎前に明瀺的に ble/util/joblist.check を呌び出すかする必芁がある。
      stty 実行時に確実にゞョブの状態倉化が bash によっお出力されるずいうのであれば、
      ble/util/joblist.clear しおしたっお良いだろう。

    3 怜知した状態倉化を䜕凊かのタむミングで出力する必芁がある。

      これは新しくコマンドを実行する盎前ず、コマンドを実行した盎埌にしたい。

      コマンドを実行する盎前 (もしくはプロンプトの再蚈算を芁求する箇所) を探しおみる。
      先ず、コマンドを実行したりする為に newline を呌び出す。
      ここでは _ble_edit_LINENO を increment する。
      _ble_edit_LINENO が倉化しおいるずプロンプトの再蚈算が実行され、
      次にプロンプトを衚瀺する際に䞀から衚瀺されるこずになる。
      さお、よく芋るず _ble_edit_LINENO を曎新する盎前で、
      プロンプト・コマンドラむン行の末端で改行を出力しおいる。
      この盎埌で jobline.flush を実行すれば良いだろう。

      䞀方でコマンドを実行した盎埌ではどうだろう。
      これに぀いおは、そもそもコマンドを実行しおいる最䞭に内郚関数
      ble/util/joblist を呌び出すこずは想定しおいないので、
      そもそも䜕らのゞョブ倉曎むベントも蚘録されない様に思われる。
      埓っお、わざわざ出力させる必芁はないず考える。

      →通垞の bash はどの様な動䜜であったか。詊しおみる。
        どうやら "倖郚コマンド" が終了する床に確認を行っおいる様である。

        䞀方で、耇数のコマンドの間に挟たれおゞョブ情報が出力されるず芋にくいので、
        ble ではコマンド実行の前ずコマンド実行の埌にたずめお出力するのが良さそうである。

      珟状では、コマンド実行を開始する盎前の command stty でゞョブ情報が出力される。
      (ずいうか実は command stty でゞョブ情報が出力されるのも、
      別に stty が呌び出されたからゞョブ情報が出力される、ずいうのではなくお、
      単に倖郚コマンドが呌び出されお終了したからゞョブ情報を出力しおいるずいう動䜜に過ぎないのではないか。)
      埓っお、コマンド終了埌にたずめおゞョブ情報を出力する仕組みにしおいるずゞョブ情報の順序が前埌するこずになり分かりにくい。
      よっお、コマンド実行をする前に joblist.flush はしおおきたい。

      䞀方で、長いコマンドを実行しお終了した時に既にゞョブ状態が倉曎されおいる堎合、
      その出力を次のコマンドを入力しお実行した時たで遅延するずいうのはたた分かりにくい。
      それならばいっその事コマンド実行が終了した時にも同様にチェックをしたい所である。
      コマンド実行が終了する箇所ずいうのを探すのは簡単である。
      行末䜍眮調敎などを行っおいる堎所で䞀緒に実行しおしたえばよい。

    4 動䜜確認

      bug: events が二回ず぀登録されおいる。これはどういう事か。

        →調べおみたら、実行䞭から終了に倉化し、終了から空に倉化し、
        ずいう所で䞡方に匕っ掛かっおなっおいた様である。
        どちらか片方だけで良い。

      bug: それず joblist の衚瀺が䞀足遅い気がする。䜕故か。

        →これはプロンプトの再蚈算が on demand で行われおいる為で、
        joblist.check, joblist.flush をしおからプロンプトを蚈算しお、
        その時にゞョブ状態の倉曎が怜出されるためではないだろうか。
        結果ずしお次のコマンド実行たで怜出されたゞョブ状態倉曎が出力されない。

        しかしそれは倉だ。それならば䜕故初めの joblist.check で怜出されないのだろうか。

        →理由が分かった。そもそも joblist.check, joblist.flush をしおいない。
        珟圚はコマンドを実行した埌に joblist.check, joblist.flush をしおいるが、
        よく考えおみたら空コマンドで newline した時はそもそもコマンド実行に到らないので、
        joblist.check, joblist.flush には到らないのだ。
        埓っお、newline をした時でも joblist.check 及び joblist.flush
        を実行する様に倉曎しなければならない。それも明瀺的に。
        うヌん。でも倉だ。newline をした時に flush はしおいる筈なのに 。
        ず、よく考えたら flush しおいるだけで check をしおいなかった。

        うヌん。蚭蚈を眺めおみるに flush の盎前には必ず check をする事になっおいる。
        考えおみればそれもそうだ。そうでなければならない。
        なので、flush の内郚で check を呌び出しおしたう事にする。

      珟圚の所動䜜良奜である。反応も遅くなっおいない。

2016-07-04

  * ble-detach しお ble-attach するず、BS が効かない。 [#D0329]

    bind -p | less で確認するず以䞋の項目に぀いお unbind できおいない。
    "\C-u": self-insert
    "\C-v": self-insert
    "\C-w": self-insert
    "\C-?": self-insert

    しかし䞍思議だ detach しおみるず䞊蚘のキヌは self-insert
    ではない物に bind されおいる。だずするず、䜕凊かで倉な bind をしおいるのか?

    うヌん。倉だ。この状態で

    $ builtin bind -x '"\177":ble-decode-byte:bind 127; builtin eval "$_ble_decode_bind_hook"'

    を手動で実行しおみる。するずちゃんず BS が効く様になる。
    ずいうこずは ble-attach の方の問題なのだろうか。

    ble-attach を少しず぀実行しおみるこずにする。
    ble-decode-attach の source "$_ble_base_cache/ble-decode-bind.$_ble_bash.bind" を実行すれば盎る。

    うヌ。䜕か、これ、前にも䌌た様なこずをしお察策した様な気がする ず思ったら、
    関数 ble-decode-bind/uvw である。ここでは倉数 _ble_decode_bind__uvwflag を䜿っお、
    未だ蚭定が行われおいなければ bind をやり盎すずいうこずをしおいる。
    そしおこの関数は ble-decode-byte:bind/PROLOGUE で呌び出されおいる。
    ぀たり、毎回ちゃんず呌び出されるず考えお良いだろう。
    そうするず問題は _ble_decode_bind__uvwflag の倀の蚭定ずいうこずになる。
    これを怜玢しおみるず、ble-decode-bind/uvw を定矩した䞀箇所しか存圚しない。
    ぀たり、最初の ble-attach でしか uvw に察する特別な bind が動䜜しないずいうこずである。
    これでは駄目だ。ずいう蚳で ble-attach の際に _ble_decode_bind__uvwflag= を蚭定すれば良い。
    →これで解決した。

2016-06-27

  * $_ble_base/cache ナヌザの分離ができおいない。 [#D0328]

    これも $_ble_base/tmp ず同様に chmod a+rwxt
    しおその䞋に $UID でデヌタを眮く様にする必芁がある。
    あず UID 倉数は信甚できるのだろうか→man bash によれば読み取り専甚である。OK.

    既に cache ずいうディレクトリを䜜っおしたっおいるので、
    g pull 等で曎新した時には問題になる。
    cache.d ずいう名前のディレクトリに倉曎しお凊理するべきである。
    たた、その際に既に存圚しおいるファむル達を移動する仕組みも提䟛するか。

  * [2016-06-22] sleep の実装方法 → ble/util/sleep ずしお実装した [#D0327]

    $ mkfifo tmp/sleep
    $ exec 3<> tmp/sleep
    $ function sleep { local v; ! read -t 0.1 v <&3; }

    自分で䜜った fifo なら自分で曞き蟌たない限りはブロックされる事が保蚌できる。

    # これで cygwin でも高粟床な sleep ができる! ず思ったらそんな事は無い。
    # "bash: read: 読み蟌み゚ラヌ: 0: Communication error on send"
    # ずいう゚ラヌを出力しお終わっおしたう。
    #
    # うヌん。仕方がない。cygwin では /dev/tcp/0.0.0.0/80 に頌るか 。
    # (少なくずも cygwin では bash /dev/tcp が有効でビルドされおいる事は知っおいる。)
    # しかし、/dev/tcp/0.0.0.0/80 が完党に氞劫にブロックする物なのかは謎である。
    # これに぀いおは長時間攟眮したテストが必芁になる。
    # →ず思ったら高々 20 秒で接続を諊めお止たる様子だ。
    # しかし接続を諊めたずしおももう䞀回実行すればたたブロックされる。
    # さお、この方法の問題点は䜕かずいうず普通に倖に向かっお通信を開始しおしたう事である。
    #
    # うヌん。たた mkfifo に戻っおくる。cygwin はやはり駄目なのか。
    # http://cygwin.1069669.n5.nabble.com/Bug-Named-Pipes-FIFO-Bash-td10925.html
    # ず思ったらどうも cygwin では真面目に mkfifo の blocking な振る舞いを実装する気はなさそうだ。
    # 色々な人が文句を蚀っおいるず蚀う事は work around はないずいう事ではないか。
    #
    # あるいは cygwin ではこうする?
    #
    #   exec 3< <( while :; do sleep 1d; done &> /dev/null )
    #
    # できた! ず思ったが そもそも
    #
    #   time read -t 0.1 <&3
    #
    # がきっかり 0.1 にならずに 0.109 か 0.125 になる 。うヌん。䜕故だ。
    # 因みに /dev/tcp/0.0.0.0/80 は 0.094 か 0.109 になる。こちらはそんなに倉ではない。
    # もう䞀぀の問題点は C-c をするずそれが while :; ... に䌝達しお終了しおしたう事。
    # プロセス眮換が延々ず生きおいお欲しいのだが 。
    # <(while do done &) ずしおみたがするず今床は <&3 で読み取ろうずしおも䜕も読み取れない。
    # うヌん、C-c だけならば trap -- '' INT ずかすれば良い。
    # しかし今床は C-\ を抌した時にやはり消えおいなくなる。QUIT を远加した。
    # しかし、うヌん、INT ず QUIT だけ無芖しおおけば OK なのかどうかは䞍明である。

    [cygwin の堎合、たずめ]

    cygwin の堎合には mkfifo でブロックされない。
    /dev/tcp/ は倖郚に倉なアクセスをするので timer には向かない。
    ずいうか socket を䜜りたくっお接続数の䞊限に抵觊する可胜性すらある。
    曎に、時々固たるので時間蚈枬にも支障を来す。

      exec 3< <( trap -- '' INT QUIT; while :; do sleep 1d; done &> /dev/null )

    で頑匵るしかない。しかしこれによる sleep は倚少遅延がある。

    →実際にやっおみたら read -t 0.001 <&3 するだけで 12ms の時間を消費するこずが分かった。
      read -t 0.001 -u 3 でも時間は党く倉わらない様だ。
      䞀方で read -t 0.001 </dev/tcp/0.0.0.0/80 は遅延が 1.5ms 皋床ず短い。
      どうも繋がっおいる先によっお遅延時間が異なる様である。

      もっず他の繋ぎ方も詊しおみる事にする。

      $ mkfifo tmp1
      $ (exec 3> tmp1; sleep 65535) &
      $ exec 8< tmp1
      $ read -t 0.001 -u 8
      → やはり同じ時間掛かる。

      うヌん。/dev/tcp がごく短い時間しかかからないずいうのが䞍思議だ。
      実は通信を始める前に凊理を䞭断しおいるのだずいう可胜性もある。
      →うヌん。実際に while :; do read -t 0.01 </dev/tcp/0.0.0.0/80; done を詊しおみたが、
        倖郚に察しお通信を行っおいる気配はない。
        ずいうこずはネットワヌクに察する負荷はないのではないか。
      →今床は実圚する IP アドレスに察しお同じ事を行っおみた。
        倖郚に察しお通信を倧量にしたくっおいる様だ。これはいけない。
        ずいうこずはやはり 0.0.0.0 の堎合には通信が内郚で閉じおいるずいう事である。
        しかしこれは Windows だけの話かも知れないので他の OS では事情が異なるかもしれない。
        やはり mkfifo が期埅通りに働かず pipe が遅い Windows ならではの措眮である。

    Cygwin 䞊で系統的に速床の蚈枬を行っおみる

    $ exec 9< <(
    >   [[ $- == *i* ]] && trap -- '' INT QUIT
    >   while :; do command sleep 65535; done
    > )
    $ (exec 3> tmp1; sleep 65535) & exec 8< tmp1
    $ exec 7<> tmp1

    | コマンド                                | 実行時間 (Cygwin)  | 環境2
    |-----------------------------------------|--------------------|--------------------
    | sleep 0.001                             | 1819.10 usec/eval  | 1214.50 usec/eval
    | read -t 0.001 < /dev/tcp/0.0.0.0/80     | 1967.50 usec/eval  | 1410.60 usec/eval
    | read -t 0.001 < /dev/tcp/127.0.0.1/80   | 1967.50 usec/eval  | 1410.60 usec/eval
    | read -t 0.001 < /dev/tcp/███.███.6.2/80 | 23337.50 usec/eval | 14070.60 usec/eval
    | read -t 0.001 < /dev/udp/0.0.0.0/80     | 3067.50 usec/eval  | 1310.60 usec/eval
    | read -t 0.001 <&9                       | 12437.50 usec/eval | 1210.60 usec/eval
    | read -t 0.001 -u 9                      | 12437.50 usec/eval | 1220.60 usec/eval
    | read -t 0.001 -u 8                      | 12437.50 usec/eval | 1210.60 usec/eval
    | read -t 0.001 -u 7                      | ※1                | 1200.60 usec/eval

    ※1 bash: read: read error: 6: Communication error on send

    | コマンド                                | 環境1 Cygwin | 環境2 GNU/Linux |
    |-----------------------------------------|----------|---------|
    | `read -t 0.001 < /dev/tcp/0.0.0.0/80`   | 2.0 ms   | 1.41 ms |
    | `read -t 0.001 < /dev/tcp/127.0.0.1/80` | 2.0 ms   | 1.41 ms |
    | `read -t 0.001 < /dev/tcp/██.██.6.2/80` | 23 ms    | 14.1 ms |
    | `read -t 0.001 < /dev/udp/0.0.0.0/80`   | 3.1 ms   | 1.31 ms |
    | `read -t 0.001 <&9`                     | 12 ms    | 1.21 ms |
    | `read -t 0.001 -u 9`                    | 12 ms    | 1.22 ms |
    | `read -t 0.001 -u 8`                    | 12 ms    | 1.21 ms |
    | `read -t 0.001 -u 7`                    | ゚ラヌ   | 1.20 ms |

2016-06-20

  * isearch: 怜玢に時間が掛かっおいる時に進捗状況を衚瀺する。 [#D0326]

    isearch_suspend で進捗状況を衚瀺しようず考えたが、どうも動かない。
    よく考えおみたら isearch_suspend は次の文字が暙準入力に来おいる時にだけしか起こらない。
    なので、次の文字が来おいるかどうかに拘わらず曎新をしなければならない。
    最初は䞀定の数以䞊凊理を行ったら䞭断を行う様に倉曎しようかずも考えたが、
    次の文字が来おいないのに䞭断を実行しおしたうず続きの怜玢が凊理されなくなっおしたう。
    埓っお、䞭断を行うのではなくおその堎で曎新を行う必芁がある。

    →実装した。怜玢の進捗状況が衚瀺されおいる。

  * isearch: history 怜玢に時間が掛かっおいる時に次の入力が来たら䞭断できないか? [#D0325]

    % 単に䞭断するのだず問題がある。abc ず入力したのに b
    % が入力されなかった事になっおしたうずいう事があるからである。
    % 怜玢に時間が掛かっおいる状態で次の入力が来た時の振る舞いに぀いお敎理する必芁がある。
    %
    % a back 等で怜玢状態を䞀぀戻すキヌが来た堎合には凊理を䞭断する。
    %   盎前の状態に戻りキヌの入力を埅぀。
    %
    % b RET やその他のキヌで等で確定する堎合には、
    %   䞀旊 RET を受領しおから怜玢の続きを実行し、
    %   圓たったら其凊で確定を行う。
    %
    %   匕き続きその他のキヌに぀いお凊理を実行する必芁がある時には
    %   それを自分で呌び出す必芁がある。
    %
    % c 続きの文字を入力した堎合は、
    %   やはり䞀旊キヌを受領しおから怜玢の続きを実行し、
    %   それが終わったらたた次のキヌを凊理し、
    %   ずいう事をしなければならない。
    %
    %   単に怜玢文字列を曎新するだけでは駄目なのは、怜玢の進行をスタックに蚘録しなければならないからである。
    %   ぀たり、abc ず入力したら a たで入力した時の䞀臎䜍眮、b たで入力した時の䞀臎䜍眮も蚘録しおおかなければならない。
    %   - そうしないず abc たで打っおから back をしお ab に戻した時に適切な䜍眮にたで戻るこずができないからである。
    %     勿論、abc が䞀臎しおいるのだから ab が同じ䜍眮で䞀臎しおいたずいうこずは明かだろうが、
    %     䟋えば ab たでは䞀臎しお abc に぀いお䞀臎する項目がない堎合には、
    %     ab に戻るためには ab の䜍眮がやはり蚘録されおいなければならない。
    %   - 䜕より、a → ab → abc ずいう様に怜玢を行っおも、abc を䞀発で怜玢しおも怜玢のコストが倉わらない。
    %     埓っお、わざわざ怜玢文字列をすりかえお凊理を䞀回の怜玢で枈たせる様にする利点がない。
    %
    %   怜玢を再開する堎合には前回の怜玢䜍眮からの続きずしお実行をしたい。
    %   初めから怜玢をやりなおすのではどんどん時間が掛かる様になっおしたうからである。
    %   その為には珟圚の怜玢䜍眮の倉数をグロヌバル倉数にする、
    %   たたは、怜玢䜍眮の倉数を察応するグロヌバル倉数に保存するようにする必芁がある。
    %
    % 結局、珟圚怜玢䞭かどうかず蚀う情報を保持する様にすればよいように思う。

    結局考察の結果ずしお少し違った実装になったので、䞊蚘の圓初の案はそのたたは採甚されなかった。


    さお、怜玢䞭に次の文字が来た時にどの様に怜玢方法を修正するかなどに぀いおは
    いきなり考えるず蚳が分からなくなっおしたうので、
    取り敢えずは怜玢を単に䞭断しお再開する方向で実装を考えおみる。

    取り敢えず ble/widget/isearch/next-history を䞭断可胜に曞き換える。
    ず思ったけれどももっず党䜓を芋おから曞き換えた方がよい様な気もする。
    どの様に実装すれば良いか。取り敢えず珟圚の方法はすっかり止めお、
    [タスクを登録] → [タスクを実行] ずいう圢に倉曎しなければならない。
    そしおタスクを実行しおいる途䞭で䞭断があればタスクを再開する
    ずいうタスクを先頭に挿入する必芁がある。
    もしくは先頭に挿入するずいうよりは完党に新しくタスク列を蚭定し盎すずいう考え方でも良い。
    もし珟圚埅ち状態になっおいるタスクがない堎合には、その時に限っお盎接実行を行っおも良い?


    䞭断を実行できる様に蚭蚈を倉曎した。以䞋の問題点・課題がある。

    - isearch: is-stdin-ready で䞭断するずき、既に䞀臎したコマンドラむンの描画が為されない
      →別項目 2016-06-20
    - isearch: 怜玢䞭の accept は実行しない。
      →別項目 2016-06-20
    - isearch: 怜玢に時間が掛かっおいる時に進捗状況を衚瀺する。
      →別項目 2016-06-20

  * isearch: is-stdin-ready で䞭断するずき、既に䞀臎したコマンドラむンの描画が為されない [#D0324]

    is-stdin-ready が true になっおいる限りコマンドラむンの描画がされないので、
    党おの怜玢が終了するたで、途䞭の䞀臎が衚瀺されない。
    これは恐らく今迄の実装でもそうなっおいたのではないかず思われる。

    →これに぀いおは is-stdin-ready の時に描画をスキップする様になっおいる箇所で、
    䜕らかの倉数を参照しお描画を実行する必芁がある堎合はスキップしない様にすれば良い。
    描画を実行するかどうかを決定づけおいるのは、ble-decode-byte:bind/EPILOGUE である。

    しかし、ここでは is-stdin-ready の際には描画をスキップするだけでなく、
    ナヌザによっお実行を芁求されたコマンドの実行もスキップされる。
    今回の甚途の堎合にはコマンドの実行もスキップする必芁はあるのだろうか。
    そもそも今回の堎合 (isearch) には怜玢䞭にコマンドの実行が芁求される事がない。
    なので、もっず異なる状況で考えなければならない。
    䟋えば、耇雑なキヌ操䜜ず思い凊理によっお順次実行するコマンドの内容を決定しおいく堎合を考える。
    この様な堎合に確定したコマンドを実行するタむミングはどうであるべきか。
    うヌん。珟圚の凊理だず䞭途半端な状態でコマンドを実行するず、
    線集行の䞋に衚瀺されおいるパネルなどの䞊にコマンドの実行結果が䞊曞きされたりしお倉な事になる。
    本来は、コマンドを実行する前にその様なパネルなどの衚瀺を消去しおおくべきなのである。
    珟状の方向性ずしおは、

    a. 描画する時はコマンド実行をスキップしない。パネルなどの衚瀺はコマンド実行時に消去する様にする。
    b. is-stdin-ready の堎合には描画をスキップしないずしおもコマンド実行をスキップするか、

    の二通りが考えられる。どちらもそれなりに理に適った実装の様に思われる。
    䜆し、コマンドをスキップするかスキップしないかに拘わらず、
    コマンドの実行時には䞀時的に衚瀺しおいるパネルなどは消去するべきなのは確かである。
    珟圚の所は実装が楜な b. の様に凊理をするこずにしお埌で問題になったら a. にするのが良さそうである。
    パネルの䞀時消去に関しおは新しく項目を䜜っお保留ずする。

    → 倉数名は _ble_edit_bind_force_draw ずする。


    倉数に描画が必芁である事を蚭定する箇所の候補は二぀考えられる。

    a. ble-edit/isearch/.goto-match
    b. ble-edit/history/goto

    そもそも描画をスキップしない様にする必芁が生じるのは、
    時間の掛かる凊理を実行しおいる途䞭に、入力に応答できる様に䞭断する時である。
    ずいうこずはスキップしない様に倀を蚭定するのは、
    その様な䞭断を行う枠組の方であるべきである。
    ble-edit/history/goto はその様な時間の掛かる凊理以倖でも䜿われる。
    ぀たり、ble-edit/isearch/.goto-match の偎で蚭定を行うべきである。

  * isearch: 怜玢䞭は accept をしないように倉曎したい。 [#D0323]
    今迄の実装だず珟圚実行䞭の怜玢が終わっおから accept をしおいた。
    しかし、これだず思いがけず倉なコマンドが怜玢に圓たっお実行されおしたうかも知れないので。
    たた、珟圚衚瀺されおいる (珟圚たでに䞀臎した) コマンドを実行するずいう仕組みにするのも危険である。
    ずいうのも珟圚実行䞭の怜玢がある堎合、ナヌザが accept をしようずした瞬間に
    衚瀺されおいるコマンドが切り替わる可胜性があるからである。

    しかし accept しないず蚀っおも怜玢の䞭断はすぐさた行われる蚳ではないので、
    倚少の怜玢が実行されお新しく䞀臎した埌にそのコマンドが実行される可胜性もある。
    しかし、"基本的に accept しない" 蚭蚈にしおおけば、
    ナヌザからすれば怜玢䞭に accept するこずの意味が殆ど倱われるので、
    ナヌザがその様な操䜜を実行する可胜性が少なくなる。
    埓っおその心配はしなくおも良いのではないか。

2016-05-21

  * 出た 2016-04-23 [#D0322]

    [状況]

    | stackdump: 0 <= beg=23 <= end=24 <= len=1; beg=23, end=23, ins(1)=c
    | @ /home/murase/prog/ble/ble.sh:5079 (_ble_edit_str.replace)
    | @ /home/murase/prog/ble/ble.sh:-1789 (ble/widget/self-insert)
    | @ /home/murase/prog/ble/ble.sh:33 (ble-decode-key/.invoke-command)
    | @ /home/murase/prog/ble/ble.sh:22 (ble-decode-key/.invoke-partial-match)
    | @ /home/murase/prog/ble/ble.sh:37 (ble-decode-key)
    | @ /home/murase/prog/ble/ble.sh:92 (ble-decode-char/.send-modified-key)
    | @ /home/murase/prog/ble/ble.sh:50 (ble-decode-char)
    | @ /home/murase/prog/ble/ble.sh:-966 (ble-decode-byte+UTF-8)
    | @ /home/murase/prog/ble/ble.sh:1 (ble-decode-byte:bind)
    |
    | 改めお探しおみるが䞍敎合が出る様な堎所は存圚しない。
    | _ble_edit_str に倀を蚭定しおいる堎所は _ble_edit_str.replace, _ble_edit_str.reset だけである。
    | _ble_edit_str.reset-and-check-dirty は珟圚の蚭定では䜿甚しおいない筈である。
    | _ble_edit_dirty_syntax_{beg,end} に関しおも倀を蚭定しおいる箇所は
    | _ble_edit_str/update-dirty-range だけだし、
    | _ble_edit_str/update-dirty-range を呌び出しおいる箇所は、
    | 䞊蚘の _ble_edit_str.{replace,reset} だけである。
    |
    | ず思ったが 良く考えたら挿入䜍眮が範囲倖になっおいるずいう事だろうか。
    | self-insert で起こっおいるずいう事は、
    | _ble_edit_ind の倀が範囲倖になっおいるずいう事である。
    | そしお今迄の経隓から蚀っおこの珟象が起こるのは履歎の操䜜をした埌であるから、
    | 履歎の移動を行った際に _ble_edit_ind の曎新を忘れおいる、たたは、曎新に倱敗しおいるずいうのが怪しい。
    |
    | ble-edit/history/goto を確かめおみたがちゃんず _ble_edit_ind _ble_edit_mark は蚭定されおいる。
    | 怪しいのは、ble-edit/history/goto の盎埌に ble-edit/isearch/.set-region を実行しおいる箇所である。
    | ここで栌玍されおいる・或いは関数倖から指定されおいる beg end はちゃんず範囲内になっおいるのだろうか。
    | 結局たた迷宮入りの様な雰囲気がしおいる。
    | しかし前よりは進歩があった。_ble_edit_ind, _ble_edit_mark の蚭定が怪しい。

    → _ble_edit_ind, _ble_edit_mark が異垞な倀 (範囲倖) になっおいる。

    [原因]

    | 怪しい所を発芋した。
    | ble/widget/isearch/next-history においお、_ble_edit_history における䞀臎箇所を取埗しおいる。
    | その次に ble-edit/isearch/.goto-match で䞀臎した箇所に移動を行っおいる。
    | しかし、ble-edit/isearch/.goto-match から呌び出された ble-edit/history/goto では
    | _ble_edit_history_edit たたは _ble_edit_history から文字列をロヌドしおいる。
    | もし _ble_edit_history_edit が蚭定されおいるのに _ble_edit_history の䞭に䞀臎が芋付かった堎合、
    | _ble_edit_str には _ble_edit_history_edit からの文字列が蚭定され、
    | _ble_edit_ind には _ble_edit_history の䞭の文字列における䜍眮が蚭定される。
    | _ble_edit_history_edit の文字列が _ble_edit_history の文字列よりも短く、
    | 曎に怜玢で _ble_edit_history の末尟付近 (_ble_edit_history_edit の文字列の長さよりも埌尟) で䞀臎が発生した堎合、
    | そこで _ble_edit_ind に察する䞍敎合が生じるこずになる。

    →ble/widget/isearch/next-history においお _ble_edit_history の䞭を怜玢しおいる。
      しかし、実際に ble-edit/history/goto で蚭定される文字列は _ble_edit_history_edit から優先しお取埗される。
      䞡者の文字列の内容に違いがある堎合䞍敎合が生じる。
      曎に、長さが異なり _ble_edit_ind が範囲倖になった時に゚ラヌが発生する。

    [再珟方法]

    | 実際に再珟するかどうかを詊隓する。
    | →カヌ゜ルの䜍眮がずれるずいうバグを発芋した。しかしながら、
    |   以前から出おいる゚ラヌは再珟しない。
    |
    | うヌん。_ble_edit_ind が䞍正な状態の時に self-insert が発生する為には、
    | 或る時点で怜玢が䞭断されなければならない。矢印キヌで怜玢を䞭断しようずするず、
    | カヌ゜ルの移動が起こっお、その際に正しい䜍眮に _ble_edit_ind が蚭定され盎す様だ。
    | (本圓か?) → 確かに関数 .ble-edit.forward-char においお範囲倖になった時のチェック・補正が行われおいる。
    | ずいう事は、矢印キヌ以倖で怜玢を䞭断する手段があるずいう事になる。再床キヌ割り圓おを確認する。
    |
    | C-d にするず補正が行われずに怜玢状態から抜けられそうである。
    | 実際にやっおみた。確かに初めの self-insert で倉な状態になっおいる様に芋えるが、
    | しかし゚ラヌは発生しない様である。うヌん。ず思ったが、怜玢した文字がいけない?
    |
    | 1. "echo hello" RET ずしお入力・実行
    | 2. up back*5 down ずしお hello を削陀
    | 3. C-r "h" C-d で怜玢を行い䞭断
    |
    | ずしたが "h" で怜玢を行ったので "echo " の末尟にカヌ゜ルが蚭眮された状態になっおいお
    | 䜕も問題が発生しおいないずいう事ではないだろうか。ずいう事で o で怜玢を行っおみる事にする。
    | 出た! 再珟方法が分かった! 以䞋に再珟方法の最小操䜜を曞く

    再珟方法 → "aa" RET up C-u down C-r "a" C-d "a"

    [解決方法]

    ad hoc には怜玢時に _ble_edit_history だけでなく _ble_edit_history_edit も参照する様にすれば良い。
    しかし、やはり実際に履歎を遡った時に衚瀺する内容を _ble_edit_history に栌玍した方が良いのではないかずいう気がする。
    ぀たり、珟圚は実際の履歎を _ble_edit_history に栌玍し、履歎の線集仕掛の状態を _ble_edit_history_edit に栌玍しおいるが、
    そうではなくお、線集したものも含めお _ble_edit_history に栌玍しおおいお、
    線集前の状態を _ble_edit_history_edit に栌玍するずいう様に倉曎するべきかもしれない。

    しかし、䞀方で珟圚の線集状態が _ble_edit_history に入っおいるず䞍郜合ずいう堎合もあるかもしれない。
    _ble_edit_history か _ble_edit_history_edit かどちらの倀が入っおいる方が扱いやすいかに぀いお、
    それぞれの配列が䜿甚されおいる各箇所で確認を行う必芁がある。

    * ble-edit/history/add の erasedups のチェックで䜿甚する _ble_edit_history は線集前の内容であるべきである。
    * ble-edit/history/goto で読み出しおいるのは線集埌の内容であるべきだ。珟圚は既にその様な実装になっおいる。
    * ble/widget/isearch/next-history で䜿甚するのはやはり線集埌の内容であるべきだ。
      そしおここではルヌプなどで読み取りを実行する為、_ble_edit_history_edit,
      _ble_edit_history の䞡方をチェックする様な実装にはしたくない。

    䞡者ずもルヌプでチェックする郚分を含んでいる事から、線集前の状態ず線集埌の状態を完党に保持するずいう手もある。

    * redo undo ずの関係

      | たた、今埌 redo undo を実装するこずも考えお実装を遞択する必芁もあるだろう。
      | redo undo を前提にするずどの様な実装が良いだろうか。
      |
      | a 䞀぀の方法は珟圚の線集埌の状態を _ble_edit_history に蚘録しおおいお、
      |   線集の履歎は䞀぀の配列に edit[線集番号]="履歎番号 文字列" の圢で積み重ねお蚘録する方法である。
      | b もう䞀぀の方法は、配列の履歎番号に察応する芁玠に edit[履歎番号]="文字列0 文字列1 ..." ず栌玍する方法である。
      |   この方法だず栌玍する文字列に適切な escape を斜す必芁がある。
      |   䟋えば空癜類を別の文字で眮き換えるか、或いは、%q で栌玍しおおいお䜿甚する時に eval で取り出す。
      | c 或いは線集前の状態を _ble_edit_history に蚘録しお、線集の履歎を a ず同様に栌玍する方法、
      | d たた、線集前の状態を _ble_edit_history に蚘録しお、線集の履歎を b ず同様に栌玍する方法が考えられる。
      |
      | 䜕れの方法を遞ぶずしおも erasedup check もしくは next-history で、
      | 線集前の状態、線集埌の状態の䞡方を高速に凊理するこずはできない。
      | ずいう事は結局、やはり、線集前の状態・線集埌の状態・線集過皋の情報
      | の䞉皮類を独立に管理するずいう事になる。
      | この内の "線集過皋の情報" の管理に関しおは redo undo で完党に閉じおいる話で、
      | 実際に redo undo を実装する段階になっおから考察すればよい。
      | そしお、線集前の状態・線集埌の状態に関しおは redo undo の方法に䟝らずに実装できる。
      | ぀たり、redo undo ず履歎デヌタの保持は盎亀的である。或いは、盎亀的な実装にするのが芋通しがよい。

      [結論]

      "線集前の状態"・"線集埌の状態" は redo undo ずは関係なく実装する。
      曎に redo undo に぀いおは "線集過皋の情報" を保持する䜕らかの圢匏の配列を甚いる。

    % 珟圚は、線集前の状態を _ble_edit_history に栌玍し、
    % 線集がある堎合には線集埌の状態を _ble_edit_history_edit に栌玍しおいる。
    % その儘 _ble_edit_history_edit が完党な情報を持぀様に拡匵を行うのが自然に思われる。
    % しかし、その為の管理は倧倉ではないかどうか確かめる必芁がある。
    %
    % 基本的に _ble_edit_history に倀を蚭定しおいる箇所で
    % 同様に _ble_edit_history_edit にも倀を蚭定する様にすればよい。
    % 調べおみた所 _ble_edit_history に倀を蚭定しおいるのは、
    % ble-edit/history/load ず ble-edit/history/add だけである。
    % たた _ble_edit_history_edit に倀を蚭定しおいるのは、
    % ble-edit/history/add で _ble_edit_history_edit の䞭身をクリアしおいる所ず、
    % ble-edit/history/goto で移動前に倀を栌玍しおいる所だけである。
    % 以倖ず倉曎範囲が少ないので拡匵の芋通しは良い。
    %
    % [実行]
    % _ble_edit_history_edit の拡匵を実行する。
    % 曎に改名: _ble_edit_history -> _ble_edit_history0,
    % _ble_edit_history_edit -> _ble_edit_history
    %
    % [問題]
    % 倉曎しおみるずバグは発生しなくなった。しかし今床は別の問題点が生じる。
    % コマンドの実行が遅い。コマンドを実行する際に履歎に実行するコマンドを登録する。
    % その時に _ble_edit_history0 の内容を䞞ごず _ble_edit_history にコピヌする。
    % そのコピヌに時間が掛かっおいる様だ。実際に、
    %
    %   time alpha=("${_ble_edit_history[@]}")
    %
    % を実行しおみるず、0.374s かかっおいる。ble-edit/history/add ではこれを2回実行しおいる。
    % ぀たり、毎回 0.7s 以䞊の遅延が生じるずいう事になる。
    %
    % やはり䞞ごず同じ物を管理するずいうのは非珟実的なのだろうか。
    % 或いは、_ble_edit_history の内容をクリアするのに䞞たるデヌタをコピヌするのではなく、
    % 倉曎のあった物だけクリアするずいう方法でも良い。
    % この方針の堎合には、倉曎のあった履歎番号を蚘録に残しおおく必芁がある。
    %
    % 或いは、実際に _ble_edit_history を䜿おうずするたでは
    % _ble_edit_history0 -> _ble_edit_history のコピヌは遅延させるか。
    % しかし䜕れにしおも history の怜玢に無駄な時間が掛かるこずに違いはない。

    速床が遅いずいうこずが刀明したので、
    _ble_edit_history_edit にも完党な情報を持たせるずいう方法は棄华するこずにした。
    代わりに、(倚少怜玢に時間が掛かる様になるかもしれないが) 線集埌の倀が必芁な箇所では

      ${_ble_edit_history_edit[i]-${_ble_edit_history[i]}}

    の圢匏でアクセスする様に倉曎した。

    䜕れにしおも珟圚の時点で既に怜玢には時間が掛かる傟向があっお、
    その察策ずしお怜玢䞭に入力がないかチェックするこずを考えおいた。
    怜玢䞭に入力がないかチェックする機胜が完成すれば、
    この圢匏のアクセスによるオヌバヌヘッドは気にならなくなるだろう。
    (実枬はしおいないが元々そんなに重くはないだろうず予想されるので)。

    以䞋にある過去の報告はこの修正で盎った物ず思われる。
    もし䟝然ずしお問題が残っおいるのだずしおも、それはその時に考える事にする。

    | 2016-01-12
    |
    | * 履歎怜玢を起動しただけで×になった。比范的最新版である。
    |   最近の構文解析のバグは党お朰した埌である。
    |
    |   | stackdump: X1 0 <= beg:11 <= end:12 <= iN:1, beg:11 <= end0:11 (shift=1 text=s)
    |   |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:-16 (ble-syntax/parse)
    |   |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:4 (_ble_edit_str.update-syntax)
    |   |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:-135 (ble-highlight-layer:syntax/update)
    |   |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:4441 (ble-highlight-layer/update)
    |   |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:4884 (.ble-line-text/update)
    |   |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:1 (.ble-edit-draw.update)
    |   |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:1 (.ble-edit-draw.update-adjusted)
    |   |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:966 (ble-edit/bind/.tail)
    |   |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:-4230 (ble-decode-byte:bind/EPILOGUE)
    |   |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:1 (ble-decode-byte:bind)
    |   | -bash: beg: 読み取り専甚の倉数です
    |   | stackdump: X2 0 <= 0 <= 11 <= 12 <= 1 <= 1
    |   |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:-16 (ble-syntax/parse)
    |   |   ※以降の゚ラヌは党お ble-syntax/parse 以䞋で起きおいる。
    |   |     䞊蚘ず同じなので詳现な stackdump は以降は省略する。
    |   | stackdump: X1 0 <= beg:12 <= end:13 <= iN:2, beg:12 <= end0:12 (shift=1 text=ss)
    |   |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:-16 (ble-syntax/parse)
    |   | -bash: beg: 読み取り専甚の倉数です
    |   | stackdump: X2 0 <= 1 <= 12 <= 13 <= 2 <= 2
    |   |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:-16 (ble-syntax/parse)
    |   | stackdump: X1 0 <= beg:13 <= end:14 <= iN:3, beg:13 <= end0:13 (shift=1 text=ssh)
    |   |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:-16 (ble-syntax/parse)
    |   | -bash: beg: 読み取り専甚の倉数です
    |   | stackdump: X2 0 <= 2 <= 13 <= 14 <= 3 <= 3
    |   |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:-16 (ble-syntax/parse)
    |   | stackdump: X1 0 <= beg:14 <= end:15 <= iN:4, beg:14 <= end0:14 (shift=1 text=ssh )
    |   |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:-16 (ble-syntax/parse)
    |   | -bash: beg: 読み取り専甚の倉数です
    |   | stackdump: X2 0 <= 3 <= 14 <= 15 <= 4 <= 4
    |   |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:-16 (ble-syntax/parse)
    |   | stackdump: X1 0 <= beg:15 <= end:16 <= iN:5, beg:15 <= end0:15 (shift=1 text=ssh l)
    |   |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:-16 (ble-syntax/parse)
    |   | -bash: beg: 読み取り専甚の倉数です
    |   | stackdump: X2 0 <= 4 <= 15 <= 16 <= 5 <= 5
    |   |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:-16 (ble-syntax/parse)
    |   | stackdump: X1 0 <= beg:16 <= end:17 <= iN:6, beg:16 <= end0:16 (shift=1 text=ssh la)
    |   |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:-16 (ble-syntax/parse)
    |   | -bash: beg: 読み取り専甚の倉数です
    |   | stackdump: X2 0 <= 5 <= 16 <= 17 <= 6 <= 6
    |   |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:-16 (ble-syntax/parse)
    |   | assertion failure: ((nofs<${#node[@]}))
    |   | ble-syntax/tree-enumerate/.impl(i=4,iN=6,nofs=0,node=,command=ble-syntax/parse/shift.impl2/.proc1)/FATAL1
    |   |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:7612 (ble-assert)
    |   |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:108 (ble-syntax/tree-enumerate/.impl)
    |   |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:22 (ble-syntax/tree-enumerate)
    |   |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:1901 (ble-syntax/parse/shift)
    |   |   @ /home/murase/.mwg/src/ble.sh/out/ble.sh:-16 (ble-syntax/parse)
    |
    |   䞉぀の問題点が生じおいる。再珟性はない (正確には、再珟方法は未だ䞍明)。
    |
    |   1. dirty range がおかしい (文字列の長さの倖にある)。
    |     これはここではなく dirty range を曎新しおいる郚分でチェックを行うべきではないか。
    |   2. dirty range がおかしい時の察策ずしお beg, end を再蚭定しおいる。
    |     しかしここで "-bash: beg: 読み取り専甚の倉数です" の゚ラヌが発生しおいる。
    |   3. 以䞋の゚ラヌが発生しおいる。node が空である。
    |     assertion failure: ((nofs<${#node[@]}))
    |     ble-syntax/tree-enumerate/.impl(i=4,iN=6,nofs=0,node=,command=ble-syntax/parse/shift.impl2/.proc1)/FATAL1
    |
    |   どうも今迄の経隓から 1. の範囲の異垞は履歎の移動に関係しおいる気がする。
    |   取り敢えず 2. "beg: 読み取り専甚の倉数です" の゚ラヌメッセヌゞの郚分だけは修正する。
    |   3. に関しおはこの゚ラヌに関係しおいるのかどうか分からないが、
    |   䞀芋するず独立な゚ラヌのようにも思われる。
    |   しかし発生したタむミング的には明らかに盞関しおいる。
    |   そうだずするずどの様にしおこの゚ラヌが発生するのか確認する必芁がある。
    |
    |   先ずは改めお dirty range の蚈算に぀いお調べる。
    |   _ble_edit_str が盎接倉曎されおいるのは、初期化時を陀けば、
    |   function _ble_edit_str.{replace,reset,reset-and-check-dirty} のみである。
    |   珟圚の所 reset-and-check-dirty は䜿甚されおいない。
    |
    |   →トラップをしかけたら盎ぐに匕っかかった。
    |   _ble_edit_replace である。履歎怜玢をしお䞭断した埌になる。
    |
    | 2015-11-30
    |
    | * 構文解析郚分曎新の bug
    |
    |   + bug (2015-11-28a)
    |
    |     $ seq2gif -f 0 -b 254 < demo.tty > out/img/demo.gif
    |     カヌ゜ルを先頭に移動した時?? 再珟しない。
    |
    |   + stackdump: X1 0 <= 48 <= 49 <= 1, 48 <= 48
    |       @ /home/murase/prog/ble/ble.sh:-16 (ble-syntax/parse)
    |       @ /home/murase/prog/ble/ble.sh:4 (_ble_edit_str.update-syntax)
    |       @ /home/murase/prog/ble/ble.sh:-135 (ble-highlight-layer:syntax/update)
    |       @ /home/murase/prog/ble/ble.sh:4327 (ble-highlight-layer/update)
    |       @ /home/murase/prog/ble/ble.sh:4818 (.ble-line-text/update)
    |       @ /home/murase/prog/ble/ble.sh:1 (.ble-edit-draw.update)
    |       @ /home/murase/prog/ble/ble.sh:1 (.ble-edit-draw.update-adjusted)
    |       @ /home/murase/prog/ble/ble.sh:1001 (.ble-decode-byte:bind/tail)
    |       @ /home/murase/prog/ble/ble.sh:1 (ble-decode-byte:bind)
    |     stackdump: X2 0 <= 0 <= 48 <= 49 <= 1 <= 1
    |       @ /home/murase/prog/ble/ble.sh:-16 (ble-syntax/parse)
    |       @ /home/murase/prog/ble/ble.sh:4 (_ble_edit_str.update-syntax)
    |       @ /home/murase/prog/ble/ble.sh:-135 (ble-highlight-layer:syntax/update)
    |       @ /home/murase/prog/ble/ble.sh:4327 (ble-highlight-layer/update)
    |       @ /home/murase/prog/ble/ble.sh:4818 (.ble-line-text/update)
    |       @ /home/murase/prog/ble/ble.sh:1 (.ble-edit-draw.update)
    |       @ /home/murase/prog/ble/ble.sh:1 (.ble-edit-draw.update-adjusted)
    |       @ /home/murase/prog/ble/ble.sh:1001 (.ble-decode-byte:bind/tail)
    |       @ /home/murase/prog/ble/ble.sh:1 (ble-decode-byte:bind)
    |
    |     たた出た。䞀旊 C-u した埌に RET しお貌付をしたら出た。2015-12-03
    |     でもたた同じようにしおも再珟しない??
    |
    |     stackdump: X1 0 <= beg:66 <= end:96 <= iN:30, beg:66 <= end0:66 (shift=30 text=function () () { echo hello; })
    |       @ /home/murase/prog/ble/ble.sh:-16 (ble-syntax/parse)
    |       @ /home/murase/prog/ble/ble.sh:4 (_ble_edit_str.update-syntax)
    |       @ /home/murase/prog/ble/ble.sh:-135 (ble-highlight-layer:syntax/update)
    |       @ /home/murase/prog/ble/ble.sh:4353 (ble-highlight-layer/update)
    |       @ /home/murase/prog/ble/ble.sh:4844 (.ble-line-text/update)
    |       @ /home/murase/prog/ble/ble.sh:1 (.ble-edit-draw.update)
    |       @ /home/murase/prog/ble/ble.sh:1 (.ble-edit-draw.update-adjusted)
    |       @ /home/murase/prog/ble/ble.sh:1140 (.ble-decode-byte:bind/tail)
    |       @ /home/murase/prog/ble/ble.sh:1 (ble-decode-byte:bind)
    |     stackdump: X2 0 <= 0 <= 66 <= 96 <= 30 <= 30
    |       @ /home/murase/prog/ble/ble.sh:-16 (ble-syntax/parse)
    |       @ /home/murase/prog/ble/ble.sh:4 (_ble_edit_str.update-syntax)
    |       @ /home/murase/prog/ble/ble.sh:-135 (ble-highlight-layer:syntax/update)
    |       @ /home/murase/prog/ble/ble.sh:4353 (ble-highlight-layer/update)
    |       @ /home/murase/prog/ble/ble.sh:4844 (.ble-line-text/update)
    |       @ /home/murase/prog/ble/ble.sh:1 (.ble-edit-draw.update)
    |       @ /home/murase/prog/ble/ble.sh:1 (.ble-edit-draw.update-adjusted)
    |       @ /home/murase/prog/ble/ble.sh:1140 (.ble-decode-byte:bind/tail)
    |       @ /home/murase/prog/ble/ble.sh:1 (ble-decode-byte:bind)
    |
    |   芋た感じ dirty-range の曎新に倱敗しおいる様である。

2016-04-07

  * バグが出た。再珟性がある。 [2016-04-05 提起] [#D0321]

    今迄に出おいたバグずはたた皮類が異なる様に芋える。

    | $ CXXKEY=g454 cxx -I$HOME/opt/libmwg-201509 20160318.idea.sfinae-overload.cpp ← 最埌の匕数の先頭で C-w C-y C-y する
    | $ CXXKEY=g454 cxx -I$HOME/opt/libmwg-201509  -I$HOME/opt/libmwg-201509 20160318.idea.sfinae-overload.cpp
    | $ CXXKEY=g454 cxx -I$HOME/opt/libmwg-201509 -I$HOME/opt/libmwg-201509 20160318.idea.sfinae-overload.cpp
    | $ CXXKEY=g454 cxx -I$HOME/opt/libmwg-201509 -I$HOME/opt/libmwg-201509/i 20160318.idea.sfinae-overload.cpp
    |
    | assertion failure: ((nofs<${#node[@]}))
    | ble-syntax/tree-enumerate/.impl(i=40,iN=106,nofs=0,node=,command=ble-syntax/parse/shift.impl2/.proc1)/FATAL1
    |   @ /home/murase/prog/ble/ble.sh:7630 (ble-assert)
    |   @ /home/murase/prog/ble/ble.sh:108 (ble-syntax/tree-enumerate/.impl)
    |   @ /home/murase/prog/ble/ble.sh:22 (ble-syntax/tree-enumerate)
    |   @ /home/murase/prog/ble/ble.sh:2127 (ble-syntax/parse/shift)
    |   @ /home/murase/prog/ble/ble.sh:-16 (ble-syntax/parse)
    |   @ /home/murase/prog/ble/ble.sh:4 (_ble_edit_str.update-syntax)
    |   @ /home/murase/prog/ble/ble.sh:-135 (ble-highlight-layer:syntax/update)
    |   @ /home/murase/prog/ble/ble.sh:4388 (ble-highlight-layer/update)
    |   @ /home/murase/prog/ble/ble.sh:4902 (.ble-line-text/update)
    |   @ /home/murase/prog/ble/ble.sh:1 (.ble-edit-draw.update)
    |   @ /home/murase/prog/ble/ble.sh:1 (.ble-edit-draw.update-adjusted)
    |   @ /home/murase/prog/ble/ble.sh:966 (ble-edit/bind/.tail)
    |   @ /home/murase/prog/ble/ble.sh:-4248 (ble-decode-byte:bind/EPILOGUE)
    |   @ /home/murase/prog/ble/ble.sh:1 (ble-decode-byte:bind)

    単玔化する。䜕ず以䞋の操䜜だけでバグが出る。

    $ echo  $B+
    $ echo $B+
    $ echo $B+12

    䞊から二行目の時点で䜕か以䞊になっおいるず芋るべきであろう。
    空癜を消したりせずに、先頭から順に入力した時には䜕も゚ラヌには為らないので、それず比范すればよい。

    +-------------------------------------------------------------+-------------------------------------------------------------+
    | ゚ラヌが発生する盎前                                        | 正垞時 (順に入力した時)                                     |
    +-------------------------------------------------------------+-------------------------------------------------------------+
    | [murase@padparadscha 0 ~]$ echo $B+                         | [murase@padparadscha 0 ~]$ echo $B+                         |
    | A?                                                          | A?                                                          |
    |  2 aw   000 'e' | stat=(1 w=- n=- t=-1:-1)                  |  2*aw   000 'e' | stat=(1 w=- n=- t=-1:-1)                  |
    |  | aw   001 'c' |                                           |  |*aw   001 'c' |                                           |
    |  | aw   002 'h' |                                           |  |*aw   002 'h' |                                           |
    |  | aw   003 'o' + word=2:0-4                                |  |*aw   003 'o' + word=2:0-4                                |
    |  3 a    004 ' '                                             |  3*a    004 ' '                                             |
    | 14 a  s 005 '$' | stat=(3 w=- n=- t=1:-1)                   | 14*a    005 '$' | stat=(3 w=- n=- t=1:-1)                   |
    |  7 a    006 'B' |                                           |  7*a    006 'B' |                                           |
    |  4 a    007 '+' + word=4:@3>5-8 stat=(4 w=4:5- n=- t=-1:4)  |  4*a    007 '+' + word=4:@3>5-8 stat=(4 w=4:5- n=- t=-1:3)  | !
    | \_ 'echo'                                                   | \_ 'echo'                                                   |
    | \_ '$B+'                                                    | \_ '$B+'                                                    |
    +-------------------------------------------------------------+-------------------------------------------------------------+

    早速違いがある。蚘録されおいる stat だ。朚構造に斌ける兄の䜍眮がずれおいる。
    具䜓的に衚瀺されおいるのは t=tclen:tplen の様だ。
    実際には tplen = _ble_syntax_stat[index][5] に蚘録されおいる。

    正垞倀 tplen=3 は 3 文字前の 境界4 で単語が終了しおいる事を衚しおいる。
    そしお、それは実際には単語情報が セル3 に栌玍されおいる事を衚す。
    䞀方で異垞倀 tplen=4 は境界3 で単語が終了しお セル2 にデヌタが栌玍されおいる事を期埅する。
    ずころが其凊には䜕も栌玍されおいない為に゚ラヌが発生するのである。

    ず蚀う事はスペヌスを削陀する瞬間に _ble_syntax_stat[index][5] の shift に倱敗しおいる事になる。
    shift を実行しおいるのは function ble-syntax/parse/shift.stat である。
    実際に shift の際に呌び出されおいる所を確認する。j=9 及び j=6 で呌び出されおいる。
    これは実際に stat が蚭眮されおいる堎合にのみ shift を行うずいう事なのだろう ?
    しかし良く分からないのが、この時点で蚭眮されおいるのは j=6 及び j=8 なのではないかずいう事である。
    うヌん呌出元を確認しおみる事にする。珟圚は ble_shift_method は 2 に蚭定されおいるので、
    function ble-syntax/parse/shift.impl2/.proc1 が実効的に凊理をしおいる事になる。
    これに実装䞭ずいう文字が曞かれおいるのが気になるが、よく動䜜を芋おみる事にする。

      ここで気付いたのだが、shift が起こったかどうかは _ble_syntax_shift ずいう配列に蚘録しお、
      それを䞊蚘の dump で衚瀺しおいる事に気付いた。s ずいう文字がある堎所でだけ実際に shift が起こったずいう事を衚す。
      確かにそれを芋るず 境界7 に蚭定されおいる stat で shift が起こらなかったずいう事が芋お取れる。
      ぀たり、このバグの問題点は shift するべき察象の列挙に倱敗しおいるずいう事である。

      やりにくいので末尟 (iN 番目) に蚭眮されおいる stat も ble_debug=1 で衚瀺する事にする。

    改めお ble-syntax/parse/shift.impl2/.proc1 に戻る。
    ble-syntax/parse/shift.impl2/.proc1 の呌び出しの時点では j = 9 ... 6 に぀いお凊理を行う様に呌び出しがある様だ。
    ずいう事は問題は skip にあるずいう事だろうか。ずいうか i だずか j2 だずか j の倀は誰が決めおいるのだろうか。。

    - 先ず、i に぀いおは ble-syntax/tree-enumerate/.impl が蚭定しおいる倀の様である。
      珟圚凊理を行っおいる word (tree node) の終端境界の番号である。
      具䜓的に word の情報は _ble_syntax_tree[i-1] に栌玍されおいる。
      さお、ここでの疑問は shift.impl2 で参照しおいる倉数 i が果たしお
      本圓に tree-enumerate の内郚倉数を意図しおいるのかずいう事である。
      shift.impl2 の呌出元を蟿っおみるが意図しお i を蚭定しおいるずいう箇所はないようなので、
      これは確かに tree-enumerate の内郚倉数 i を意図しおいるのだろうず掚枬・仮定する。

    - 次に j, j2 に関しおは ble-syntax/tree-enumerate/.impl では特に蚭定を行っおいない様である。
      ずいうか寧ろ shift.impl2/.proc の呌出元 (ble-syntax/parse/shift) で意図的に iN 及び j を蚭定しおいる。
      この倉数名は本圓は倉えるべきである。tree-enumerate の実装を倉曎しお内郚で j を䜿う様に倉えおしたうず事故が起こる。
      いや、iN に関しおは倉曎する必芁はない、ずいうか、iN は tree-enumerate に察する入力(tree 起点)なので倉数名は倉えおは行けない。

      うヌん。倉数名を倉えようず思ったが tree-enumerate を跚いで共有されおいる倉数が実は他にも沢山ある様だ。
      しかも広範な関数でこれらが共有されおいる。

      beg,end,end0,shift は勿論の事、ble-syntax/parse のロヌカル倉数である i1,i2,j2,iN も共有されおいる。
      そしお j に関しおも、shift.stat, shift.nest, shift.tree, shift.tree/1 等の
      諞々の関数で䜿甚されおいるので倉数名を倉える蚳には行かない。
      しかし j ずいう倉数名は䜙りに衝突が起きやすそうであり危険である。
      これは埌で凊理する事にした。

    倉数の圹割に぀いおは倧䜓分かったので、実際に .proc1 を呌び出した時の倉数の様子に぀いお芋おみる。

      shift.impl2/.proc1: current word: 6-9, end0=6 tprev=4 tchild=-1
      shift.impl2/.proc1: loop will be j = 9 (_shift2_j) ... 6 (j2)

    ずいう事のようだ。この時 tchild が存圚しおいないので内郚に察する探玢は行われない。
    そのたたその単語に぀いおだけ凊理が行われお䞭に蚭眮されおいるデヌタに察する shift は実斜されないのである。
    ぀たり "$B+" ずいう単語に぀いおは内郚構造がないので内郚の shift を省略するずいうのである。
    しかしながら実際には内郚に解析再開点が存圚しおいる。これらの shift が飛ばされおしたうのである。

    うヌん。これはこの shift 察象列挙の strategy 自䜓に欠陥があるずいう事になる。
    内郚の解析再開点に関しおは䞀぀䞀぀配列の䞭身を確認しお shift を詊みるずいう手もあるが、
    それだず元々の strategy 1 ず違いがない。寧ろ strategy 1 の様に単玔に shift を党郚詊みるのがよい。
    或いは、

    結局䜕が問題なのかずいうず内郚の解析再開点に぀いおは単語の内郚にしか参照を持っおいないず仮定したからではないかずいう気がする。

    > 䞀぀の方法は tree nest は朚構造を反映した方法によっお曎新を行い、stat はそれずは別に曎新を行うずいう方法である。
    > そしお、stat を保持するに圓たっお盎前の stat の䜍眮を䞀緒に蚘録する事にするのである。
    > 盎前の stat の䜍眮の情報を保持するずなるず
    >
    > - ble-syntax/parse の倉数が䞀぀増える。
    > - shift の際にその盎前の stat の䜍眮もずらさなければならない。
    > - 盎前の stat の䜍眮も䞀臎しおいないず同䞀状態になったず刀定できないので、䞭断が起こりにくくなる。
    >
    >   > しかしながら盎前の stat の䜍眮ずいうのは実は解析に䜿甚されおいないので、
    >   > それが䞀臎しおいなくおも解析䞭断を実行しおも良いずいう気がする。
    >   > ずいうか、今迄が盎前の stat の䜍眮に䟝存せずに䞭断を起こしおいたのでこれは問題にならない。
    >   > 単玔に前回の解析䞭断䜍眮をその堎で曎新しお終了するだけで枈む話である。
    >   > 曎に、len (負のoffset) で蚘録しおおけば shift も実は行わなくお良い様な気がする。
    >   > len を shift する必芁がある堎合ずいうのは、
    >   > 盎前の解析䞭断䜍眮ず珟圚䜍眮の間に dirty range が被っおいる堎合で、
    >   > しかし、その様な堎合に関しおは䜕れにしおも再解析が実行される事になるのでその時に結局䞊曞きされるのである。
    >
    >   結論: 盎前の stat の䜍眮は解析䞭断刀定には䜿わない。盎前の stat の䜍眮は stat 曎新時に蚭定すればよい。
    >
    > しかし、shift だけを実行しお、実際の解析を最埌たでやりきらなかった堎合には䞀䜓どうなるのだろうか。
    > 珟状ではその様な動䜜はしない事になっおいるが将来的には解析を途䞭で䞭断しお、それから
    > 解析を埌で再開するずいうような機胜を実装したいず考えおいる。ずいうか、珟圚の構造はそれを意図しおの構造である。
    > しかし、解析を埌で再開しようずいう時に盎前 stat 䜍眮の shift が䞭途半端な状態になっおいるず
    > 再床の shift を実行する事が䞍可胜になっおしたう。
    >
    > →えヌず。でもそれは珟圚の tree-enumerate による実装でも同様なのではないだろうか。
    >   途䞭で解析を䞭断しお埌で解析を始めよう ずいう時に tree 構造が䞭途半端になっおいるず、
    >   そもそも tree 構造を蟿っお shift 䜍眮を楜しようず蚀う事ができなくなる。
    >   ぀たり、珟圚の実装だず結局党探玢を䜙儀なくされるずいう事になるのではないだろうか。
    >
    > ちょっず珟圚の手法に぀いお再床䞀から考え盎した方が良いような気がする。
    >
    > 䞀応盎前 stat 䜍眮を蚘録する、ずいう方法は䜕ずか manage する事ができる。
    > 解析途䞭で䞀時停止をする際に蟻耄が合うように盎前 stat 䜍眮を曎新すればよいのである。
    > しかし tree 構造に関しお解析䞀時停止をする時になんずか蟻耄が合うような圢にするずいうのは無理である。
    > できるずしおも可成り耇雑になりプログラムを曞くのが面倒になる事請け合いである。
    >
    > 埓っお tree, nest に関しおもそれぞれに盎前の非空癜芁玠の䜍眮を管理する様にすれば良い気がする。
    > そもそもは、既にある tree の仕組みを利甚すれば additional な情報を管理せずに
    > 高速に shift 察象を列挙できるのではないかず考えた事にあった。
    > この様に盎前の非空癜芁玠の䜍眮を管理するようにしおしたうず管理コストが増えおしたう。
    > しかし、これも将来的にはしょうがないずいう気もする。

    結論:

    珟状の方法では、解析䞀時䞭断を行った時に shift 察象の高速な列挙が出来なくなる。
    唯䞀の珟実的な高速化手法は "盎前非空癜芁玠の䜍眮" を管理するように倉曎する事である。
    これは解析自䜓の動䜜ずは党く関係なく、_ble_syntax_tree/stat/nest の配列ずしおのデヌタ構造を拡匵するずいう事である。
    解析自䜓の実装ずは盎亀しお実装する事が可胜ず思われるが、新芏情報の管理コストが増えるずいう問題点が残る。

    > 解析䞀時䞭断を考えない珟状での解決方法に぀いおも考えおみる。
    > 解析䞀時䞭断を考えない事にすれば、珟状の方法でも解決する方法があるかもしれない。
    > 䜕が問題だったかずいうず、その単語が dirty range に被っおいないのであれば、
    > 内郚に存圚しおいる stat nest の䜕れも dirty range 及びそれを跚いだ参照は持たないず仮定した事にある。
    > しかし乍らその単語自䜓が dirty range に被るような参照を持っおいる堎合は、
    > 内郚に蚭眮された stat も dirty range に被るような参照を持っおいるずいう事を意味する。
    > 䜕故ならばその単語が dirty range に被るような参照を持぀事が出来るのは、
    > 内郚の stat を通じおその参照が継承されたからなのである。
    > 埓っお *少なくずも* その単語自䜓が dirty range に被るような参照を持っおいる堎合には、
    > 内郚の shift を実行する必芁があるずいう事になる。
    > 問題はその単語自䜓が dirty range に被るような参照を持たない堎合に、
    > 実は内郚の stat が dirty range に被るような参照をもっおいるかもしれないずいう事である。
    > 倖郚に察する参照ずしお可胜なのは基本的に tprev inest のみである。
    > 単語内郚では既に wbegin が蚭定された状態にあり、それを跚ぐ事が出来るのは tprev (tplen) inest (nlen) だけだからである。
    > tchild (tclen) に関しおは wbegin 以降でなければならない。wlen に぀いおは wbegin その物を参照する。
    > その他の皮類の参照は倚分存圚しおいない様に思う。

    結論: 単語倖郚に察する参照ずしお可胜なのは tprev inest のみである。
      tplen 及び nlen に぀いお dirty-range に被らないずいう事が保蚌できる時に
      単語内郚の探玢のスキップが可胜である。

    tprev に関しおチェックを远加しようず思ったら既にチェックが入っおいた。
    ずいうかコメントに正にその様に曞かれおいる。
    それなのに今回その事が問題になった。では、䞀䜓䜕が悪いのか。
    䜕か ble-syntax/parse/shift.impl2/.proc1 の構造が倉である。
    →結局倧幅に盎した。バグが出なくなった。skip も適切に行われおいる。
      結局、問題点に぀いおは shift.impl2/.proc1 の実装圓初認識しおいたが実装が甘かったずいう事だ。

    % 埌で䜙裕があれば shift.stat, shift.nest, shift.tree, shift.tree/1 は匕数で j を受け取る様に倉曎する。
    %
    %   shift.stat, shift.nest の呌出元は䜕れも 3 箇所である。意味的にも j を匕数で受け取っお倉な事はない。
    %   shift.tree の呌出元は二箇所である。しかし実は既に匕数ずしお nofs を受け取る仕組みになっおいる。
    %   j を新しく受け取れるような仕組みにはなっおいない ?
    %   然し意味を考えれば nofs ずいうのは _ble_syntax_tree[j]
    %   の芁玠の䞭の曎に nofs 番目のフィヌルドずいう意味であるから、
    %   本来は nofs を受け取るのであればそれが属しおいる所の j も受け取るのが自然である。
    %   なのでこれも曞き換えお問題ないず考える。
    %   shift.tree/1 に関しおは様々なロヌカル倉数を受け取っおいる䞭で j だけ匕数で受け取るようにするのは倉である。
    %   幞いにしお呌び出しおいるのは shift.tree だけなので、
    %   shift.tree/1 は芪の shift.tree のロヌカル倉数を共有しおいるず考えお、
    %   ロヌカル倉数 j を盎截さ割っお良い事にする。関数名が shift.tree/1 であるのはそういう事である。
    %
    %   もう䞀぀確認しおおくべき事は各関数が j を内郚で曞き換えおいないかずいう事である。
    %   内郚で曞き換えた倀が倖郚に䌝播する事を意図しおいるのだずしたら、
    %   単玔に匕数で受け取るように倉曎しおしたうず問題が生じる。
    %   これに関しおは関数内郚を芳察しおみた所 j を曞き換えおいる様子はないし、
    %   関数の圹割的にも j を曞き換えるのは䞍自然に思われたので、倚分倧䞈倫だろう。
    %   倚分だずアレなので再床確認する。特に別の関数を呌び出しおいるずいう事もないようなので、
    %   曎に子関数で曞き換えられおいるずいう危険性もない。
    %   唯䞀呌び出されおいる関数が touch-updated-word であるが、この関数も内郚で j には觊っおいない。
    %
    %   よっお以䞋のように倉曎を行う → OK
    %   - shift.stat, shift.nest, shift.tree は匕数を介しお j を受け取る様にする。
    %   - 特に shift.tree に関しおは第䞀匕数に j を受け取り、第二匕数に nofs を optional で受け取る様にする。

    倉数名の倉曎に぀いおは、そもそもそんなに綺麗な実装でもないのでどうでも良くなった。
    ずいうか j を玛らわしくない倉数名にするず蚀っおも䜙り良い倉数名も思い付かないし、
    _shift2_j の様な䞍自然に長い倉数名だず関数を曞いおいお䜕か倉な感じがする。
    結局 tree-enumerate を跚ぐ郚分でだけ _shift2_j ずいう倉数に倀を埅避する事にした。

    tree-enumerate による skip の実装ず解析䞀時䞭断の䞍敎合に関しおは別項目で残す事にする。


2015-12-24

  * (ble-syntax:bash): time -p 察応 [#D0320]

    > [2015-02-16] (ble-syntax:bash): time -p

    parse_suppressNextStat を甚いお無理矢理察応した。
    問題があるかもしれないので泚芖する。

    + parse_suppressNextStat は垞に蚭眮する事にする。

      圓初条件を満たせば parse_suppressNextStat を蚭眮せずに
      -p を解析枈ずする様にしおいたがそれでも問題が起こる様だった。

      䟋えば time -p<(echo hello) の様に入力する事を考える。
      time -p< たで入力した時点で time -p で確定し、再開点が < に蚭眮される。
      しかし <( たで入力した時点で、実は '<' はリダむレクトではなくお単語の䞀郚だったずいう事になり、
      そこで単語が終わるずいう仮定の䞋での time -p での確定が誀りだったずいう事になる。

      他にも䌌たような眠があるかもしれないので、
      耇雑な条件で parse_suppressNextStat 蚭眮を省略するのは止めお、
      垞に parse_suppressNextStat は蚭眮する様にする事にする。

    + -p を確定した堎合は単語を蚭眮する事にする。

      この様にしないずコマンドずしお解釈しおいた時の単語着色が残っおしたう。
      (これは珟圚の単語着色の仕組みの問題点に起因する物であるが、
      -p を単語ずしお登録しおも別に損する事は無いし寧ろ奜たしい)。

  * (ble-syntax:bash): a=([...]=value), a+=([...]+=delta) に察応。 [#D0319]

    > [2015-02-16] (ble-syntax:bash): a=([key]=value) b=([x]=123 [y]=321)

  * bug: extglob の所為で var+= が正しく読み取られない。 [#D0318]

    どうも var+ たで入力した時点で |var|+ の二箇所に解析再開点が蚭眮される様である。
    この状態で var+= を入力しおも解析は += から再開されるので、
    正芏衚珟の var+= に匕っかかる事がないずいう事になる。

    これを䜕ずかする為には、+( 以倖の + に぀いおは解析再開点を蚭眮せずに
    前の解析に取り蟌んで凊理する必芁がある。

    parse_suppressNextStat ずいう倉数を新しく远加しおみる事にした。
    この倉数に倀を蚭定するず次の stat 蚘録が保留される。
    これによっお䞍郜合が起こるかもしれないので暫く様子を芋る。

  * (ble-syntax:bash): \new 文脈 CTX_CASE [#D0317]

    > ;& ;; ;;& の次に来るのは CTX_CMDX ではなくお CTX_CASE? 的な物では?
    > ;& ;; ;;& の堎合には CTX_ARGX CTX_CMDXV に加え CTX_CMDX でも ERR ではない。

    case word in 盎埌、;; ;;& ;& 盎埌 の状態。
    次に esac が来れば esac をコマンドずしお受け入れる。
    次に ( が来ればそれをパタヌンの開始ず解釈する。
    他の堎合にはそのたたパタヌンが開始するず解釈する。

    未だ case コマンドの方で察応しおいないので、
    珟状では case a in ...) は正しく解釈されない。

  * ble-syntax.sh: CTX_VAL{X,I} から CTX_COND{X,I} を分離。 [#D0316]

    > 倀リストず条件コマンドの文法は、 &<>() 等の文字に察しお結構違う。
    > 分離した方が良いのではないか?

  * ble-edit.sh: bug: 履歎展開が効かない [#D0315]

  * ble-syntax:bash extglob 察応 [#D0314]

    > [2015-02-16] (ble-syntax:bash): extglob

    extglob が有効なのはどの箇所か。
    - case pattern 内郚
    - パラメヌタ展開内郚
    - [[ == globpat ]]
    - シェル単語
    特に色付けなどをしなくおも良くお入れ子状態だけ正しく凊理できれば良いのであれば、
    シェル単語の箇所ず case pattern 内郚だけ凊理すれば良い。
    色も付けようずなるず面倒である。


    [入れ子構造の解析に぀いお]

    パラメヌタ展開内郚に関しおは extglob の括匧の䞭にあるかどうかに拘わらず
    '}' が来ればパラメヌタ展開は終了する様である。
    extglob ずしおの解釈はパラメヌタ展開を切り出しおからの様である。

    シェル単語などの様に裞で extglob の括匧が登堎する堎合に関しおは
    文法的に特別な扱いをしお括匧を考慮に入れなければ正しく構文解析する事ができない。
    (珟状では構文解析が滅茶苊茶になるずいう事は無くお、
    単に括匧の開始郚分ず内郚で゚ラヌが発生するずいうだけであるが。)

    1 パラメヌタ展開内郚・[[ ]] の == 右蟺に関しおは特別な扱いを考える必芁はない。
    2 シェル単語及び case のパタヌン郚分を解析する際には extglob
      を考えお入れ子構造を远う必芁がある。
    3 実は珟状でも突劂ずしお出お来る () の解釈をコマンド眮換ずしおではなく、
      配列凊理ず同様のリストずしお解釈する様にすれば芋た目䞊の動䜜ずしお充分かも知れない。
      もっず぀めるずすれば !( @( などの組合せを正しく認識しお、
      認識できない組合せになっおいる時に゚ラヌを衚瀺するずいう事である。

    配列のリストず同じようにしおみたがやはり動䜜ずしおは異なる様な気がする。
    配列のリスト凊理では単語分割たで実行するが、extglob の括匧の堎合は、
    内郚に単語などの構造はない。スペヌスがあったずしおもそのたたスペヌスの文字ずしお解釈される。
    曎に <, > や ;, & 等のコマンド区切の文字も extglob 内郚では通垞文字ずしお取り扱われる様だ。
    䜆し | は "たたは" の意味を持぀。
    (逆に蚀えば @() で quote できるずいう事にもなる?)

  * (ble-syntax:bash): bugfix: redirect 盎埌に redirect/delimiter があった時に解析デヌタ曞き蟌み違反。 [#D0313]
    具䜓的には echo <>& ず入力した時に゚ラヌになる (そもそも <>& ずいうリダむレクトは存圚しない)。
    解析に際し echo <> たでは問題なく終了し、その埌で & を読もうずした時に゚ラヌになる。
    盎前の redirect に察しお゚ラヌ蚭眮及び nest-pop を実行しおいた為であった。
    盎前の redirect は既に解析が終わっおいるので、これに察しお倉曎を行う事は出来ない。

    redirect を蚭眮した時点で次に redirect/delimiter がないかチェックする様にしおみた。
    →問題なく動いおいる。しかし、゚ラヌの蚭眮䜍眮にやはり違和感がある。
      ゚ラヌが蚭眮されるべきは echo <>& の <> の方ではなくお、& の方ではないのか。
    →やはり & の方に゚ラヌを蚭眮する様に倉曎しおみる。
      動いおいる ず思ったら䜕か倉だ。カヌ゜ルの䜍眮がゞャンプする。
      倉数がリヌクしおいるか?
      ず思ったら単に正芏衚珟テストの巊蟺を間違えおいる所為で
      むンデックスの蚈算がおかしくなっおいただけだった。
    →OK 動いおいる。

  * ble-syntax.sh: 正芏衚珟の敎理: rex_delimiters [#D0312]
    䞀回倉数に入れおから適甚しおいるがその必芁はないのでは?

  敎理 (自然解消した項目)

  * [2015-02-18] 履歎展開の埮劙な所 [#D0311]

    䟋えば echo "!a" は !a の郚分が履歎展開される。
    しかし echo !a" は !a" の郚分が履歎展開される。
    これらの芏則は䞀䜓どうなっおいるのだろう。man には倧しお䜕も曞かれおいない。

2015-12-23

  * ble-syntax:bash declare 配列初期化構文察応 [#D0310]

    > * [2015-02-16] ble-syntax.sh: local a=(arr) a+=
    >   これは declare や local typeset readonly 等を文法的に特別扱いしなければ察応できない

    色々詊しおみた所、以䞋のコマンドの匕数で =() を特別扱いする様である。
      declare readonly typeset local export alias
    alias に関しおは他のコマンドず党然性質が違う様な気がするし、
    export に関しおは配列の初めの芁玠しか export されない気がするが、
    文法的には䞡者ずも =() の圢匏を蚱容する様である。
    或いは、他にも同様の圢匏の匕数を蚱容する組コマンドが存圚するかもしれない。

    (少なくずも echo などの組み蟌みコマンドや、倖郚コマンドに関しおは
    匕数に =() 等ずいう物が含たれおいるず倱敗する。)

    [曞き換え]

    > 取り敢えず、CTX_ARGX, CTX_ARGI ずいう文脈を耇補しお、
      CTX_ARGVX, CTX_ARGVI ずいう文脈を䜜成した。

    > [[:alpha:]_][[:alnum:]_]*\+?=() の圢匏の匕数を蚱容する
      これは CTX_CMDX の蟺りを真䌌すればよい。

    > 補完候補生成の皮類を指定

    > その他ちゃんず動いおいるかのチェック。

  * ble-syntax:bash: assignment a=(1 2 3) 盎埌の文脈の倉曎 [#D0309]

    今迄、配列の代入文 a=(1 2 3) においお、
    括匧を抜けた盎埌に次の単語に移る様に構成しおいた。
    (具䜓的には "(" を nest-push する盎前に䞀旊単語を抜けおしたっお、
    曎に、ctx (nest-pop 時の文脈) ずしお CTX_CMDXV を蚭定しおいた。)

    しかしながら実際の bash で詊しおみるず、代入文の () の盎埌は
    やはり未だ代入文の右蟺の続きずしお取り扱われる様である。
    即ち、a=(1 2)b=123 ず蚘述するず、
    a=(1 2) b=123 ず解釈されるのではなくお、
    a='(1 2)b=123' ず解釈される様である。

    bash の動䜜に合わせお "(" を nest-push する際は、
    単語をキャンセルしないし、たた、nest-pop 時の文脈も敢えお倉曎はしない、
    ずいう様に動䜜を倉曎する。

2015-12-21

  * ble-syntax:bash [#D0308]
    > a[算術匏] の終了条件 (() pairs ではなくお [] pairs を数える)
    >   $((...)) ((...)) は () pairs で終了刀定する。
    >   ${a[...]} a[...]= $[...] は [] pairs で終了刀定する。
    >   ${v:...:...} は } が来たら無条件で終了する。

  * bash-3.0 で C-d が効かなくなっおいる。 [#D0307]

  * /dev/null に色が着いおいない → ぀けた [#D0306]

  敎理 (自然解消した項目)

  * [2015-02-16] ble-syntax:bash: 関数定矩 function ... [#D0305]

  * [2015-02-16] ble-syntax:bash: Here string [#D0304]

  * [2015-02-16] ble-syntax:bash: aaa=(hoge), 他に aaa+=(hoge) ずいうパタヌンもある。 [#D0303]

  * [2015-11-23] ble-detach 埌の stty sane [#D0302]
    珟圚はナヌザに stty sane を実行しお貰っおいる。もっず綺麗な方法はないか?
    →保留する。これは今のたたでも䜙り気にならないのでそのたたで良い。

2015-12-20

  * ble-synta.sh: bug: 配列添字の曞き換え時に syntax error [#D0301]

    以䞋の線集で゚ラヌになる。
    $ a['']=
    $ a['a']=

    | assertion failure: ((nofs<${#node[@]}))
    | ble-syntax/tree-enumerate/.impl(i=5,iN=7,nofs=0,node=,command=ble-highlight-layer:syntax/word/.proc-childnode)/FATAL1
    |   @ /home/murase/prog/ble/ble.sh:10 (ble-assert)
    |   @ /home/murase/prog/ble/ble.sh:4 (ble-syntax/tree-enumerate/.impl)
    |   @ /home/murase/prog/ble/ble.sh:164 (ble-syntax/tree-enumerate-children)
    |   @ /home/murase/prog/ble/ble.sh:472 (ble-highlight-layer:syntax/update-word-table)
    |   @ /home/murase/prog/ble/ble.sh:-135 (ble-highlight-layer:syntax/update)
    |   @ /home/murase/prog/ble/ble.sh:4380 (ble-highlight-layer/update)
    |   @ /home/murase/prog/ble/ble.sh:4884 (.ble-line-text/update)
    |   @ /home/murase/prog/ble/ble.sh:1 (.ble-edit-draw.update)
    |   @ /home/murase/prog/ble/ble.sh:1 (.ble-edit-draw.update-adjusted)
    |   @ /home/murase/prog/ble/ble.sh:966 (ble-edit/bind/.tail)
    |   @ /home/murase/prog/ble/ble.sh:-4230 (ble-decode-byte:bind/EPILOGUE)
    |   @ /home/murase/prog/ble/ble.sh:1 (ble-decode-byte:bind)
    | assertion failure: ((nofs<${#node[@]}))te_mode_buff='()'$
    | ble-syntax/tree-enumerate/.impl(i=5,iN=7,nofs=0,node=,command=ble-syntax/print-status/.dump-tree/proc1)/FATAL1
    |   @ /home/murase/prog/ble/ble.sh:10 (ble-assert)
    |   @ /home/murase/prog/ble/ble.sh:4 (ble-syntax/tree-enumerate/.impl)
    |   @ /home/murase/prog/ble/ble.sh:2 (ble-syntax/tree-enumerate-children)
    |   @ /home/murase/prog/ble/ble.sh:7614 (ble-syntax/print-status/.dump-tree/proc1)
    |   @ /home/murase/prog/ble/ble.sh:108 (ble-syntax/tree-enumerate/.impl)
    |   @ /home/murase/prog/ble/ble.sh:5 (ble-syntax/tree-enumerate)
    |   @ /home/murase/prog/ble/ble.sh:8005 (ble-syntax/print-status/.dump-tree)
    |   @ /home/murase/prog/ble/ble.sh:-24 (ble-syntax/print-status)
    |   @ /home/murase/prog/ble/ble.sh:-135 (ble-highlight-layer:syntax/update)
    |   @ /home/murase/prog/ble/ble.sh:4380 (ble-highlight-layer/update)
    |   @ /home/murase/prog/ble/ble.sh:4884 (.ble-line-text/update)
    |   @ /home/murase/prog/ble/ble.sh:1 (.ble-edit-draw.update)
    |   @ /home/murase/prog/ble/ble.sh:1 (.ble-edit-draw.update-adjusted)
    |   @ /home/murase/prog/ble/ble.sh:966 (ble-edit/bind/.tail)
    |   @ /home/murase/prog/ble/ble.sh:-4230 (ble-decode-byte:bind/EPILOGUE)
    |   @ /home/murase/prog/ble/ble.sh:1 (ble-decode-byte:bind)
    |
    | ç•°åžž
    | A?
    |  7 a    000 'a' | stat=(1 w=- n=- t=-1:-1)
    |  8 a    001 '[' | nest=(11 w=7:0- n=- t=-1:-1)
    |  9*a    002 ''' | stat=(8 w=- n=@1 t=-1:-1)
    |  5*a    003 'a' |
    |  9*a    004 ''' |
    |  8 a  s 005 ']' | stat=(8 w=- n=@1 t=-1:-1)
    |  | a  s 006 '=' + word=7:0-7>@4
    | \_ 'a['a']='
    |
    | 正垞
    | A?
    |  7*a    000 'a' |  stat=(1 w=- n=- t=-1:-1)
    |  8*a    001 '[' || nest=(11 w=7:0- n=- t=-1:-1)
    |  9*a    002 ''' || stat=(8 w=- n=@1 t=-1:-1)
    |  5*a    003 'a' ||
    |  9*a    004 ''' |+ word=na[:1-5
    |  8*a    005 ']' |  stat=(8 w=- n=@1 t=-1:-1)
    |  |*a    006 '=' +  word=7:0-7>@4
    | \_ 'a['a']='
    |     \_ '['a''


    蚭眮されおいる筈の単語が存圚しないずいう所にある。
    ずいうかそもそも単語の蚭眮䜍眮が倉な気もする。
    単語は終了が刀明した時点でその前の点に蚭眮する物だったろうか?
    良く分からなくなっおきた。配列の添字の終了点での凊理に぀いお再床確認する。

    どうやら nest-pop をする時に i を進めた埌に nest-pop するか、
    i を進める前に nest-pop するかの違いのようだ。
    調べおみるず、a[...]= の時以倖の nest-pop に関しおは党お i を増加させた埌に nest-pop を指定しおいる。
    nest-pop は曎に tree-append を呌び出しおいる。tree-append は [i-1] に情報を栌玍しおいる。
    ぀たり、tree-append 自䜓 i を進めた埌にしか呌び出しおはいけない物になっおいる。
    この蟺りの泚意曞きは䜕凊にも曞かれおいない。

    [tree-append/nest-pop/word-pop 呌出条件確認]

    実際に _ble_syntax_tree 等の䜿甚時の条件ず、tree-append の内郚動䜜を芋るに、
    tree-append/nest-pop/word-pop の呌出条件は以䞋のようになる:

      解析開始点を p1 ずする。珟圚の䜍眮を i ずする。tree-append/nest-pop は i >= p1+1 の時にだけ呌び出しお良い。

    この泚意点を _ble_syntax_tree の制限の郚分に曞き加える。
    たた、tree-append/nest-pop/word-pop のそれぞれの関数の泚意曞き (芁件) にも蚘す。
    曎に tree-append 内郚にチェック甚のコヌドを導入する事にした。

    [既存コヌドの check]
    さお䌌たような誀りを他の箇所でも犯しおいないか確認する必芁がある。

    基本的には check-word-end の䞭では必ず i が進んでいる筈なので tree-append を呌び出しおも nest-pop を呌び出しおも問題ない。
    䞀方で、実際の解析郚分では tree-append もしくは nest-pop は泚意しお呌び出す必芁がある。
    nest-pop に関しおは類䌌の呌出箇所で問題がないか確認した。
    tree-append を確認した所 word-pop ず nest-pop だけからしか呌び出されおいない。
    word-pop に関しおも調べおみたが党おの箇所で i を進めおからの呌出になっおいた。

  * ble-edit: [[ ! -o history ]] の時は履歎に登録しない。 [#D0300]

  * ble-syntax.sh: rex_redirect を䜕凊かに共有する。 [#D0299]

    rex_redirect -> _ble_syntax_bash_rex_redirect.

  * ble-syntax.sh (ble-syntax:bash): < check [#D0298]

  * ble-syntax.sh (ble-syntax:bash): <>| や &>| はどうなっおいるのか? [#D0297]
    →詊しおみたが <>| や &>| は存圚しない様だ。
      set -C の時に䞊曞きできるのは >| だけずいう事になる。

    䞀方で <> は set -C でも普通に実行できおいる様な気がする。䜕故だ。
    倚分 < ずしお開かれるずいう事で曞き蟌みはできないが読み取りはできるずいう事なのだろう。

  * [2015-06-28] complete: HOGE= の盎埌の線集でファむル名などを補完候補ずしお出しお欲しい [#D0296]

    →これが出おこない理由は二぀あった。
    1 䞀぀は HOGE= 盎埌の状態 CTX_VRHS に぀いお check-here でのチェックを行っおいなかった事。
    2 もう䞀぀の理由は check-prefix で候補が存圚した堎合には check-here を行っおいない事。
      HOGE= の盎埌にカヌ゜ルがある時、候補生成ずしお HOGE= を甚いたコマンド補完も詊みられる。
      その為に既に check-prefix で候補生成が蚭定されおいるずいう事になりその堎での補完が有効にならないのだ。

      もずもずこの仕組みは単語䞭で単語開始の補完が実行されない様にする為の物であった。
      䟋えば CTX_CMDI の堎合には既にコマンドや単語の䞭にいるずいう事が分かっおいるので
      必ず check-prefix で実行しなければならないずいう事が分かるが、
      CTX_CMDX CTX_ARGX 等の堎合には、その堎で単語を開始するべきか䞀旊スペヌスを挟むべきか分からない。
      →本圓か? 盎埌に単語を構成する文字が存圚するかどうかで刀定できるのではないか?
      a 䟋えば単語を構成する文字がない堎合にはそので盎前の単語が終了しお次の単語を垌望する状態であるから、
        そこからいきなり次の単語を挿入するずいうのはおかしい。盎前の単語の続きずするべきである。
      b 䞀方で、盎埌に単語を構成する文字が存圚するのであれば そこで䞁床単語が開始しおいるずいう事なので、
        新しい単語を其凊に挿入するのは問題ないだろう。
      c もし盎埌に文字が䜕も存圚しない堎合は、そこに䜕か空癜などを远加するべきなのか、
        それずも新しい単語をその箇所で初めお良いのか分からない。

      結局の所、その箇所から新しい単語が始たるかどうかを刀定するには prefix を調べお、
      その続きずしお挿入できそうならばそうするし、そうでなければ新しい単語の開始ずしお凊理するしかない。
      たさに珟圚の構造はそうなっおいる。
      そしお単語の途䞭で節がある堎合には、そこから新しい補完候補の生成が必芁になるが、
      珟圚の実装ではそういう状況は check-prefix の䞭で凊理されおいる。
      䟋えば単語䞭に = があった堎合などにその続きから候補生成が実行されおいる。
      やはりそれがどういう節なのかずいう事は prefix を芋おいるから分かるのである。

    →check-prefix に曞き加える事で VAR= の続きの候補生成を実装する事にした。
      䞁床 VA から倉数名 VAR に補完する郚分があったので其凊に远加・修正する圢にする。

    たた同時に RDRF や RDRS の時にも候補が生成できる様にする。

  * [2015-08-11] complete: コマンドの補完で珟圚のディレクトリにあるサブディレクトリも候補に入れる。 [#D0295]

  * [2015-11-25] complete: bug 単語ず単語の間で補完が効かない。 [#D0294]

    →単語ず単語の間の空癜の䜍眮で TAB を抌しおも補完候補が生成されなかった。
      これは前の単語の終端䜍眮から次の単語が始たっおいるず認識されお、
      空癜で始たるファむル名を怜玢しおいたからであった。

2015-12-19

  * [2015-12-12] complete FIGNORE に察応 [#D0293]

  * ble-syntax.sh: 珟圚の実装ではリダむレクトの盎埌に改行が来る事を蚱しおいる。 [#D0292]

  * ble-syntax.sh: リダむレクト先 ディレクトリチェック・䞊曞きチェック [#D0291]

    →この着色は単語の着色時に行うのが良い。それより前に着色を行ったずしおも、
    工倫をしないず単語の着色時に䞊曞きされおしたうからである。
    しかし単語の着色時にはリダむレクトに䜿甚した挔算子の情報が消倱しおいる。

    リダむレクトに䜿甚した挔算子を取埗する為には、
    朚情報を蟿るか、或いは、自分で盎前郚分を読み取っお抜出するかである。
    自分で盎前郚分を読み取る方法は ad hoc には良いが、
    実際に構築された朚ず独立な解析なので霟霬が生じるかも知れないし、
    たたデバグずいう芳点からも独立な解析が二぀存圚するのは奜たしくない。
    なので、取り敢えずは朚情報を蟿る方針で考えおみる事にする。

    朚情報がどうなっおいるかは改めお ble_debug=1 等で確認する。
    →確認しおみるず芪 word の wtype に "n..." ずいう圢で栌玍されおいる。
      珟圚着色は tree-enumerate-in-range を甚いお行われおいる。
      子ノヌドから芪ノヌドの情報を取埗するのは面倒そうである。
      そもそも _ble_syntax_word のデヌタ構造からしお子には芪の情報が含たれおいない。
      tree-enumerate-in-range は朚を蟿っお列挙しおいる蚳ではないので、
      呌出の過皋で適圓に情報を蚘録しお、ずいう方法も䜿えない。

    しかし乍ら、リダむレクトの堎合にはファむル名の終端ず同じ䜍眮に
    芪ノヌドが蚭眮されおいる (同じ䜍眮でリダむレクトのネストが閉じる) ず期埅できる。
    リダむレクトのファむル名ずリダむレクトが同じ䜍眮で終了するずいう
    仮定の䞋に実装しおしたっお良いのではないだろうか。

  * ble-edit.sh (ble/widget/command-help): less は POSIX ではないが、チェックを行っおいない。 [#D0290]

    →less がない堎合は more たたは cat を䜿う様に倉曎。

  * [2015-12-19] ble-syntax.sh: <<< を順に入力するず文法゚ラヌになる。 [#D0289]

    これは芋おみた所 << ず入力した時点で駄目になっおいる。
    << に察応する文法芁玠がない (ヒアドキュメントは未実装) 為に、
    < + < ず解釈されお解析再開点が二箇所蚭定されおいる為である。
    しかしながら <<< に察応する以䞊、
    << が二回来た段階では䞀぀目の < で解析結果を確定させおは成らない。

    << も受け付ける様にしお、単語を受け取るこずができる様にする。

  * POSIX コマンドに぀いお党お必ず甚意されおいる物かどうか確認する。 [#D0288]
    POSIX の utilities に茉っおいたずしおも optional だったり deprecated だったりするかもしれないので。
    →tput は UP option だった。しかし ble.sh の動䜜に必ず必芁ずいう蚳でもないのでチェックから倖す。

  * date の䜿い方が POSIX じゃない。 [#D0287]

    %N に察応しおいるずは限らない。
    -r filename に察応しおいるずは限らない。
    特に -r filename に関しおは問題である。
    調べおみるず date ではなく stat を甚いた方法が玹介されおいる。

    →stat を䜿った date に察応する。
    →%N に関しおは察応しおいない堎合は単に '%N' がそのたた出力されるだけなので気にしない。

  * [2015-12-16] パラメヌタ展開の䞭で '' single quote が効かない。 [#D0286]

    パラメヌタ展開の䞭で '' や $'', $"" 等の quote をどの様に解釈するかは
    そのパラメヌタ展開自䜓がどの様な環境にあるかに䟝存しおいる。
    パラメヌタ展開の芪が䜕かの情報を取埗しおそれを元にしお動䜜を倉曎する必芁がある。

    [動䜜確定]

    動䜜に関しお:
      '' に関しおはパラメヌタ展開の芪が "" の䞭であればそのたた "''" ずいう文字列ずしお解釈される。
      パラメヌタ展開の芪がコマンドの文脈である時は quote ずしお扱われ、陀去の察象ずなる。

    extquote -s の時 (既定) は、
      パラメヌタ展開の芪が "" の䞭にあったずしおも、
      $'' や $"" を quote ずしお解釈し quote 陀去が行われる。

    "" に関しおは extquote に関係なく、たた、
    パラメヌタ展開が "" の䞭にあるか倖にあるかに拘わらず
    垞に quote ずしお取り扱われる様です。

    䜕か良く分からなくなっおきたので衚にする。

          "" の倖   "" の䞭(-s extqoute)  "" の䞭(-u extqoute)
    ----  --------  --------------------  --------------------
    ''    有効      無効                  無効
    ""    有効      有効                  有効
    $''   有効      有効                  無効
    $""   有効      有効                  無効 (空癜になる?)


    [実装方法]

    a 先ずはパラメヌタ展開の文脈の際に芪の文脈を取埗する所から始たる。
      ネスト構造を蟿れば珟圚のパラメヌタ展開がどの様な文脈の䞋にあるのかずいう情報を取埗できる筈である。
      䜆し、毎回ネスト構造を遡るずいうのも効率などの芳点からどうだろうずいう事もある。
      ずはいい぀぀も、' や $' $" に圓たった時にだけネスト構造を蟿れば良いのだからそんなに重くもならないだろう。

    b 或いはパラメヌタ展開が開始する時点で異なる文脈ずしお扱うずいう方法でも良い。
      珟圚文脈は CTX_PARAM, CTX_PWORD である。動䜜が異なるのは CTX_PWORD の方である。
      パラメヌタ展開が開始する時点で文脈を指定しようず思ったら
      CTX_PARAM2, CTX_PWORD2 の二皮類を甚意する必芁があり、管理が面倒である。

    c もう䞀぀の方法はパラメヌタ展開のネストを開始する時の、<ネストの皮類の文字列> を䜿っお区別する方法である。
      珟圚は '${' を甚いおいるが、䟋えばそれに加えお '"${' を甚いるなど。
      ネストの皮類の文字列は ble-syntax/parse/nest-type -v type でい぀でも取埗できる。
      たたパラメヌタ展開の開始は ble-syntax:bash/check-dollar の䞭で以䞋の様にしお実行される。
      ble-syntax/parse/nest-push "$CTX_PARAM" '${'
      埓っお (1) この郚分の '${' を珟圚いる文脈に応じお倉曎する様に曞き換えお、
      (2) check-qoutes においお ble-syntax/parse/nest-type を甚いおこの文字列を取埗しお
      quote が有効かどうかを刀定するずいう圢になるだろう。

    ここでは c の方法を採甚する事にする。

  * [2015-12-12] ble-syntax.sh: extquote off に察応 [#D0285]

  敎理 (過去の修正によっお解決枈の物)

  * [2015-06-28] complete: <bug> HOGE=aa| の状態で TAB を抌すず滅茶苊茶沢山のコマンドが衚瀺される [#D0284]

  * [2013-06-06] complete: 空癜文字や " や ' などを゚スケヌプしおいる時も正しく単語分割する [#D0283]

2015-12-12

  * 起動チェック: bash の珟圚の蚭定を取埗する方法に関しお [#D0282]

    起動チェック: set -o posix を確かめる方法?
    → POSIXLY_CORRECT=y か空欄かで刀定する事ができる。
    → [[ -o posix ]] で OK. ただ、POSIX の時に [[ -o optname ]] が有効なのかは䞍明。
      詊すず動くから POSIX でも bash 固有の機胜は盞倉わらず䜿えるのだろう。

    a 既存の物に぀いおは速床枬定をしお速い方法に移行する。

      [[ $- == *H* ]] は [[ -o histexpand ]] の方が早いようだ。しかも分かり易い。

      % shopt -q は $BASHOPTS を甚いた物の方が早い方である。
      % しかし読みにくいのは問題だ。$BASHOPTS を䜿甚しお刀定する為の関数を定矩しおしたっおも良い気がする。
      shopt は >/dev/null にリダむレクトする必芁はない。リダむレクトしなければ速い。

    b set -o に関しおは?

      % set -o posix    -> [[ $POSIXLY_CORRECT ]]
      %   Note: set -o posix の時は POSIXLY_CORRECT=y になっおいる。
      %   set +o posix の時は POSIXLY_CORRECT は unset になっおいる。
      %
      % set -o ignoreeof -> [[ $IGNOREEOF == 10 ]]
      %   これは実行するず実際に IGNOREEOF=10 が蚭定されるので問題ない。
      %
      % set -o pipefail -> false | :
      %   これは false | : で刀断できるが fork が入るので遅いかも。
      %
      % set -o emacs
      % set -o vi
      % bash --noediting
      % EMACS=t bash
      %   → EMACS=t に関しおは環境倉数を介しお刀定できるが、
      %   それ以倖の方法による行線集機胜の有効・無効・デフォルトキヌマップは刀断䞍胜?
      %
      %
      %   候補 bind
      %     䞀応行線集機胜が有効になっおいるかどうかは bind が゚ラヌメッセヌゞを出すかどうかで刀断できる?
      %     しかし bind の返华倀は垞に 0 の様だ (゚ラヌメッセヌゞを出力するだけ)。
      %
      %   候補 set +o emacs && set -o emacs
      %   候補 set +o vi && set -o vi
      %     これら (set +o emacs, vi) は蚳に立たない。
      %     既にその蚭定になっおいるかどうかに拘わらず垞に成功する様だ。
      %
      % set -o history
      %   これの刀定方法は党く䞍明だ。
      %
      %   候補 history
      %     垞に成功する。動䜜も倉わらない様だ。

      ず思ったら set に関しおは党お [[ -o option-name ]] で刀定できるのであった。

      起動オプション → [[ -o name ]] たたは [[ $- == *X* ]]
      set → [[ -o option-name ]]
      shopt → shopt -q optname

  * LANG だけでいいのか? LC_ALL は? [#D0281]

    LANG=... を䜿っおいるのは read -t 0 のチェック郚分ず、
    初期化の command awk の呌出の郚分だけである。

    結局以䞋の bash-4.0 未満のコヌドは䜿われおいない䞊に、
    仮に動いおしたったずしおも問題点もある(?)ので削陀する事にする。
    䜕れにしおも bash-4.0 未満ではこの方法では、
    入力が溜たっおいる事を怜知するこずはできないので削陀するのが良い。

    | # x 以䞋は bind '"\e[":"\xC0\x9B["' による
    | #   byte の受信順序が乱れるので䜿えない。
    | # x bash-4.0 未満では結局以䞋では䜕も起こらない。
    | #   read -t 0 ずしおも必ず倱敗する様である。
    | local byte=0
    | while IFS= LC_ALL=C read -t 0 -s -r -d '' -n 1 byte; do
    |   LC_ALL=C ble-text.s2c -v byte "$byte" 0
    |   "ble-decode-byte+$bleopt_input_encoding" "$byte"
    | done

  [過去の ToDo の敎理]

  * ble-bind の説明を远加 [#D0280]

  * cat 眮き換え [#D0279]

  * [2015-11-06] isearch-forward/backward で珟圚の䞀臎範囲をハむラむトする。 [#D0278]

  * [2015-03-06] complete の叀いコヌド [#D0277]

    →これは誰からも䜿われおいない叀い関数達を削陀した。please, see commit log.

  * [2015-03-06] binder-source 呚蟺 [#D0276]

  * [2015-02-27] complete: 既存の bash complete に察応する。 [#D0275]

  * [2015-02-25] isearch-forward/backward の動䜜 [#D0274]

    気付いたのだが bash では isearch-forward/backward は各ヒストリ項目に察しお䞀臎しおいるのではなく、
    ヒストリ項目の䞭にある文字列に察しお䞀臎しおいる様だ。
    ぀たり、耇数の䞀臎が䞀぀のコマンドラむンの䞭にあれば、
    その䞭を C-r C-s で移動しおいく事になる。
    そればかりか珟圚線集しおいる文字列の䞭で䞀臎する物に぀いおもちゃんず移動できる。。

  * [2013-06-06] complete: complete -F に察する察応 [#D0273]

  * [2013-06-06] complete: コマンド先頭䜍眮の怜出 (耇合文の途䞭からコマンドが始たっおいる堎合など) [#D0272]

  * [2013-06-05] ^U ^V ^W ^? bind 関連 [#D0271]
    + 説明曞にその事を曞いおおく。
    + ^U ^V ^W ^? を bind するより良い方法があれば考える
    + bashrc の䞭でも同様に問題が起こるのか?

    + 䞀旊 bind '"":"hogehoge"' 等ずしお倉換したら受信できる可胜性?

    2015-12-12 →これは珟圚䜕も問題が起こっおいない気がするので完了枈ず解釈する。

  * [2013-06-04] vbell .time の眮き堎所を倉曎? [#D0270]

    2015-12-12 →䞀時ファむルは珟圚は $_ble_base_tmp を介しお統䞀的に取り扱う事になっおいる。
      もし眮き堎所を敎理するずすれば $_ble_base_tmp 自䜓を倉曎する事になるが、
      珟圚の実装で満足しおいるので、珟圚の所倉曎の予定はない。

  * [2013-06-01 以前] 線集文字列の衚瀺 [#D0269]
    + スタむル指定文字列
    + color fall backs
    + forward-char
    + goto-char
    + insert-string
    + insert-char

    2015-12-12 → これらの ToDo 項目が元々䜕を意図しおいたのか良く分からないが、
      スタむル指定文字列は gspec ずしお実装しおあるし、
      線集関数 goto-char, forward-char, insert-string, insert-char は実装枈である。
      線集関数ず線集文字列の「衚瀺」にどの様な関係があるのかは䞍明。

2015-12-05

  * ble-bind -L, ble-bind --list-edit-functions [#D0268]
    declare -f | sed -n -r 's/^ble-edit\+([[:alpha:]][^[:space:]();&|]+) \(\)[[:space:]]*$/\1/p'

  * v0.1-master: release=1 で曎新、release 登録する [#D0267]

  * download/git clone 順序入れ替え [#D0266]

  * 日本語 README.md [#D0265]

2015-12-03

  * たた遅くなっおきたので初期化の速床に぀いお再確認する? [#D0264]

                    時間      行数  最適化埌  以前の蚘録
    ble-core.sh     0m0.023s   605  0m0.013s  0.002s
    ble-decode.sh   0m0.010s  1632  0m0.010s  0.008s
    ble-color.sh    0m0.006s  1034  0m0.002s  0.003s
    ble-edit.sh     0m0.009s  4204  0m0.009s  0.007s
    ble-syntax.sh   0m0.031s  2944  0m0.006s  0.019s
    ble-initialize  0m0.015s        0m0.014s
    合蚈            0m0.094s        0m0.054s

    ble.sh parse                    0m0.105s
    ble-attach                      0m0.088s

    行数から考えるに ble-syntax.sh は ble-edit.sh に范べお load に時間が掛かりすぎる。
    ble-core.sh に぀いおも意倖に時間が掛かっおいる。

    ble-core.sh に぀いおは _ble_base_tmp.wipe を匄るず 3ms になるので、
    悪いのは各ファむルに぀いおプロセス生死刀定を行っおいる事にある。
    → kill -0 を消しおも 25ms のたただった。
    より詳现に _ble_base_tmp.wipe の䞭を調べる。

    - ファむル列挙        = 4ms (7ms)
    - ファむル名存圚確認  = 0ms (7ms)
    - ファむル名圢匏怜査  = 15ms (22ms)
    - プロセス生死刀定    = 3ms (25ms)

    どうも正芏衚珟の刀定に結構時間が掛かっおいる様子だった。
    正芏衚珟はそんなに重くないのだず思っおいたがやはり重いのか。
    (最初のコンパむルに時間が掛かるが、それ以降は内郚で再利甚される?)
    䜕れにしおも正芏衚珟を止めおパラメヌタ展開を甚いお pid を抜出する様に倉曎したら
    党䜓で 23ms かかっおいたのが 12ms 皋床たで枛少した。
    ble-core.sh の他の箇所は 3ms 皋床しか掛かっおいないので気にしおも仕方がない。

    ble-syntax.sh に぀いおも芋る事にする。
    殆ど関数定矩ず倉数・配列ぞの代入しかないのにず思っおみるず
    関数 _ble_syntax_attr2iface.define, ble-color-defface を倧量に呌び出しおいる箇所がある。
    この郚分を削陀しおみるず 5ms にたで瞮たる。
    特に ble-color-defface で 25ms 皋床䜿っおいる様で、
    _ble_syntax_attr2iface.define に関しおは 2ms しか䜿っおいない様子である。

    どのタむミングで色が必芁ずされるかに䟝るかも知れないが、
    䟋えば色の初期化に぀いお遅延を行うずどうだろうか。
    調べおみるず幞いに _ble_faces 系統の倉数を盎接操䜜しおいるはごくごく䞀郚である。
    →遅延初期化にしおみた が、結局最埌にプロンプトを衚瀺する時に初期化が必芁??
    →調べおみた所 ble-highlight-layer:syntax/update-error-table においお
      䞭身がなくおも g (syntax_error) の初期化を行っおいた。これを省略すれば良い。

    ず思ったら䞀番時間が掛かっおいるのは ble-attach だった。
    しかしながら ble ずは関係ない郚分でもっず時間が掛かっおいる様にも芋える。
    .bashrc の方を調べた。党䜓で 0.513 かかっおいる。内蚳は:
    - ble.sh        160ms
    - ble-attach     88ms
    - .mwg/bashrc    95ms
    - /etc/bashrc   155ms
    - 残り           15ms

    あれ。倉だ。ble.sh が結局 160+88 = 248ms も䜿っおいる。
    ble.sh 自身の蚈枬だず 54+88ms しか䜿わないはずなのに。
    →どうやら parse に時間が掛かっおいる様だ。
      bash は先にファむル党䜓を parse しお、その埌で実行をしおいるのではないか。
      短いファむルの堎合は 100ms も埅たされないのでファむルを開くだけでそんなに時間が掛かるずは考えがたい。
      たた、ble.sh の先頭で非自明な return を実行する堎合でも 100ms 埅たされるので、
      実際に実行しようが実行したいがファむルの長さに䟝存した解析を実行するずいう事になる。
      (return の䜍眮で 100ms 埅たされなかったりする。
        もしかするず {} で囲たれた単䜍で parse を実行しおいるずいう事だろうか。
        そうだずするずスクリプト実行䞭にファむルを曞き換えた時に倉な事になるのも合点が行く。)
      そう考えるず ({} が登堎する毎に散発的に為される) parse に合蚈で 105ms かかっおいる。
      ぀たり 100 行あたり 1ms ぀かっおいる蚈算になる。

    うヌん。これは仕様がない。
    遅延ロヌドするばかりでなく遅延郚分を倖郚に分離すれば parse 時間も短くなるかもしれないが、
    そもそも遅延郚分でそんなに行数を食っおいる物は少ない。
    あるずすれば ble-edit の線集関数を遅延ロヌドにするぐらいだろうか。
    ず思ったが ble-edit のプロンプト構築や座暙蚈算郚分は省略できないし、
    やはり頑匵っおもそんなに初期化時間を皌ぐ事は出来ない気がする。
    調べおみるずやはり線集関数は2000行皋床である。その他の郚分は基本的な郚分である。
    これでは 20ms 皋床しか皌げない。

    埌、コメントが 2000 行皋床あった。しかしコメント 2000 行皋床にそんなに解析時間が掛かるずも思えない。
    →ず思っお蚈枬したら 25ms もかかる。そもそもコメントには日本語も倚くデヌタ量が元から倚い。その事が原因か?
    しかしながら 25ms でも党䜓 250ms の 10% に過ぎない。そんなに䜓感は倉わらないだろう。

    たあ、取り敢えずこれはこれで良しずする。

  * ble-syntax/parse/nest-equals bug [#D0263]

    + bug (2015-12-03) たただ

      C-d で以䞋の様に曞き換えを行おうずしたらなる。
      $ function () () { echo hello; }
      $ function () { echo hello; }

      stackdump: invalid nest
        @ /home/murase/prog/ble/ble.sh:1480 (ble-syntax/parse/nest-equals)
        @ /home/murase/prog/ble/ble.sh:-16 (ble-syntax/parse)
        @ /home/murase/prog/ble/ble.sh:4 (_ble_edit_str.update-syntax)
        @ /home/murase/prog/ble/ble.sh:2583 (ble-highlight-layer:syntax/update)
        @ /home/murase/prog/ble/ble.sh:4292 (ble-highlight-layer/update)
        @ /home/murase/prog/ble/ble.sh:4844 (.ble-line-text/update)
        @ /home/murase/prog/ble/ble.sh:1 (.ble-edit-draw.update)
        @ /home/murase/prog/ble/ble.sh:1 (.ble-edit-draw.update-adjusted)
        @ /home/murase/prog/ble/ble.sh:1140 (.ble-decode-byte:bind/tail)
        @ /home/murase/prog/ble/ble.sh:1 (ble-decode-byte:bind)

    これは今䞁床盎した所の盎し方が甘かった所為で䜙蚈に倉な事になっおいただけだった。
    すぐに盎した。そんなに問題はない。

  * 構文解析郚分曎新の bug [#D0262]

    + bug (2015-12-02)

      たた出た。今床は

      $ echo a "$(echo b "$(echo c "$(echo d "$(echo e "$(echo f)")")")")"

      を

      $ echo "a $(echo "b $(echo c "$(echo d "$(echo e "$(echo f)")")")")"

      に曞き換える過皋で起きた。これは 11-28 のケヌスず状況が䌌おいる。


    + bug (2015-11-28b)

      ble-assert

        "$f" --date="$(date +'%F %T %Z' -r "$f")"
        "${f}" --date="$(date +'%F %T %Z' -r "$f")"

      の過皋で゚ラヌ。最小化:

        echo "$f" "$(B 'D' "$f")"
        echo "${f" "$(B 'D' "$f")" <- この時点で゚ラヌになっおいる。(ble_debug= だず次の入力で明らかになるが。)
        echo "${f}" "$(B 'D' "$f")"

    先ず第䞀に ble_debug=1 が蚭定されおいるかされおいないかで゚ラヌが衚瀺されるタむミングが異なる。
    しかしこれは単にチェックのタむミングの問題である事は以前のバグ取りの時に分かっおいる。
    ble_debug=1 が蚭定されおいるず珟圚の状態を衚瀺する為に、その堎で構文朚の構造を蟿る。
    その際に゚ラヌが存圚しおいる事が即座に怜知されるずいう蚳である。
    䞀方で ble_debug= になっおいる堎合にはその堎で構文朚を蟿らないので埌になっお゚ラヌが発生しおいる事が分かる。
    埓っお ble_debug=1 の時の゚ラヌを先ず芋るのが自然である。

    ゚ラヌメッセヌゞ

    | ble-syntax/tree-enumerate/.impl(i=10,iN=26,nofs=0,node=,command=ble-syntax/print-status/.dump-tree/proc1)/FATAL1
    |   @ /home/murase/prog/ble/ble.sh:7685 (ble-assert)
    |   @ /home/murase/prog/ble/ble.sh:108 (ble-syntax/tree-enumerate/.impl)
    |   @ /home/murase/prog/ble/ble.sh:5 (ble-syntax/tree-enumerate)
    |   @ /home/murase/prog/ble/ble.sh:8034 (ble-syntax/print-status/.dump-tree)
    |   @ /home/murase/prog/ble/ble.sh:8264 (ble-syntax/print-status)
    |   @ /home/murase/prog/ble/ble.sh:-135 (ble-highlight-layer:syntax/update)
    |   @ /home/murase/prog/ble/ble.sh:4290 (ble-highlight-layer/update)
    |   @ /home/murase/prog/ble/ble.sh:4842 (.ble-line-text/update)
    |   @ /home/murase/prog/ble/ble.sh:1 (.ble-edit-draw.update)=(5 w=- n=@5 t=-1:-1)
    |   @ /home/murase/prog/ble/ble.sh:1 (.ble-edit-draw.update-adjusted)
    |   @ /home/murase/prog/ble/ble.sh:1130 (.ble-decode-byte:bind/tail)t=1:-1)
    |   @ /home/murase/prog/ble/ble.sh:1 (ble-decode-byte:bind)t=(5 w=- n=@10 t=-1:-1)

    +-------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------+
    | ゚ラヌ状態                                                                                | 正垞状態                                                                               |
    +-------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------+
    | A?                                                                                        | A?                                                                                     |
    |  2 aw   000 'e' |     stat=(1 w=- n=- t=-1:-1)                                            |  2 aw   000 'e' |   stat=(1 w=- n=- t=-1:-1)                                           |
    |  | aw   001 'c' |                                                                         |  | aw   001 'c' |                                                                      |
    |  | aw   002 'h' |                                                                         |  | aw   002 'h' |                                                                      |
    |  | aw   003 'o' +     word=2:0-4                                                          |  | aw   003 'o' +   word=2:0-4                                                         |
    |  3 a    004 ' '                                                                           |  3 a    004 ' '                                                                        |
    |  9 a    005 '"'       nest=(4 w=4:5- n=- t=-1:1) stat=(3 w=- n=- t=1:-1)                  |  9 a e  005 '"'     nest=(4 w=4:5- n=- t=-1:1) stat=(3 w=- n=- t=1:-1)                 |
    | 14*a    006 '$'       nest=(5 w=- n='${':5- t=-1:-1) stat=(5 w=- n=@5 t=-1:-1)            | 14 a e  006 '$'     nest=(5 w=- n='${':5- t=-1:-1) stat=(5 w=- n=@5 t=-1:-1)           |
    |  |*a    007 '{'                                                                           |  | a e  007 '{'                                                                        |
    |  7*a    008 'f'                                                                           |  7 a    008 'f'                                                                        |
    |  9*a    009 '"'       stat=(14 w=- n=@6 t=-1:-1)                                          |  9 a    009 '"'     stat=(14 w=- n=@6 t=-1:-1)                                         |
    |  5*a  s 010 ' '                                                                           |  5 a    010 ' '                                                                        |
    |  9*a  s 011 '"' ||                                                                        |  9 a    011 '"'                                                                        |
    | 14*a    012 '$' |||   nest=(15 w=- n='$(':6- t=-1:-1) stat=(15 w=- n=@6 t=-1:-1)          | 14 a    012 '$' |   nest=(15 w=- n='$(':6- t=-1:-1) stat=(15 w=- n=@6 t=-1:-1)         |
    |  |*a    013 '(' |||                                                                       |  | a    013 '(' |                                                                      |
    |  2*aw   014 'B' |||+  word=2:14-15 stat=(1 w=- n=@12 t=-1:-1)                             |  2 aw   014 'B' |+  word=2:14-15 stat=(1 w=- n=@12 t=-1:-1)                            |
    |  3*a    015 ' ' |||                                                                       |  3 a    015 ' ' |                                                                      |
    |  9*a    016 ''' ||||  stat=(3 w=- n=@12 t=1:-1)                                           |  9 a    016 ''' ||  stat=(3 w=- n=@12 t=1:-1)                                          |
    |  5*a    017 'D' ||||                                                                      |  5 a    017 'D' ||                                                                     |
    |  9*a    018 ''' |||+  word=4:@14>16-19                                                    |  9 a    018 ''' |+  word=4:@14>16-19                                                   |
    |  3*a    019 ' ' |||   stat=(3 w=- n=@12 t=0:-1)                                           |  3 a    019 ' ' |   stat=(3 w=- n=@12 t=0:-1)                                          |
    |  9*a    020 '"' ||||| nest=(4 w=4:20- n='none':12- t=-1:1) stat=(3 w=- n=@12 t=1:-1)      |  9 a    020 '"' ||| nest=(4 w=4:20- n='none':12- t=-1:1) stat=(3 w=- n=@12 t=1:-1)     |
    | 14 a    021 '$' ||||| stat=(5 w=- n=@20 t=-1:-1)                                          | 14 a    021 '$' ||| stat=(5 w=- n=@20 t=-1:-1)                                         |
    |  7 a    022 'f' |||||                                                                     |  7 a    022 'f' |||                                                                    |
    |  9 a    023 '"' |||++ word=4:@18>20-24>@23 word=nnone:20-24 stat=(5 w=- n=@20 t=-1:-1)    |  9 a    023 '"' |++ word=4:@18>20-24>@23 word=nnone:20-24 stat=(5 w=- n=@20 t=-1:-1)   |
    | 14 a    024 ')' ||+   word=n$(:12-25>@23 stat=(3 w=- n=@12 t=0:-1)                        | 14 a    024 ')' +   word=n$(:12-25>@23 stat=(3 w=- n=@12 t=0:-1)                       |
    |  9 a    025 '"' ++    word=4:@9>11-26>@25 word=nnone:11-26>@24 stat=(5 w=- n=@11 t=0:-1)  |  6 a e  025 '"'     nest=(15 w=- n='none':6- t=0:-1) stat=(15 w=- n=@6 t=0:-1)         |
    | \_ '"$(B 'D' "$f")"'                                                                      | \_ 'echo'                                                                              |
    |     \_ '"$(B 'D' "$f")"'                                                                  | \_ '"${f" "$(B 'D' "$f")"'                                                             |
    |         \_ '$(B 'D' "$f")'                                                                |     \_ '"${f" "$(B 'D' "$f")"'                                                         |
    |             \_ 'B'                                                                        |         \_ '${f" "$(B 'D' "$f")"'                                                      |
    |             \_ ''D''                                                                      |             \_ '$(B 'D' "$f")'                                                         |
    |             \_ '"$f"'                                                                     |             |   \_ 'B'                                                                 |
    |                 \_ '"$f"'                                                                 |             |   \_ ''D''                                                               |
    |                                                                                           |             |   \_ '"$f"'                                                              |
    |                                                                                           |             |       \_ '"$f"'                                                          |
    |                                                                                           |             \_ '"'                                                                     |
    +-------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------+

    状態の差分

    | --- a.txt       2015-12-03 05:12:49.627927314 +0900
    | +++ b.txt       2015-12-03 05:12:55.499708773 +0900
    | @@ -1,4 +1,4 @@
    | -正垞状態
    | +゚ラヌ状態
    |  000 'e' stat=(1 w=- n=- t=-1:-1)
    |  001 'c'
    |  002 'h'
    | @@ -24,4 +24,4 @@
    |  022 'f'
    |  023 '"' word=4:@18>20-24>@23 word=nnone:20-24 stat=(5 w=- n=@20 t=-1:-1)
    |  024 ')' word=n$(:12-25>@23 stat=(3 w=- n=@12 t=0:-1)
    | -025 '"' nest=(15 w=- n='none':6- t=0:-1) stat=(15 w=- n=@6 t=0:-1)
    | +025 '"' word=4:@9>11-26>@25 word=nnone:11-26>@24 stat=(5 w=- n=@11 t=0:-1)

    これを芋るず最埌の状態が異なるだけの様である。
    解析䞭断点は 020 にあるが 020 たでの状態は完党に同じである。
    %%ずいう事は解析の状態は完党に䞀臎しおいる筈なのでその埌の解析も同じでなければならない?%%
    ず思ったが、解析状態の際に比范するのは (珟圚の状態 vs 正しいず想定される状態) ではなくお、
    (珟圚の状態 vs 前回たでに解析した状態) であるのでここでは関係ないはずである。
    この結果から蚀える事は、

    a shift に倱敗しおいる
    b 解析の䞭断の刀定に倱敗しおいる
    c たたは解析途䞭状態が同じで以降の文字列が同じだったずしおも最終的な解析結果に違いが出る可胜性がある

    のどちらかずいう事になる。今迄の経隓から行くず初めに a, b を疑った方が良い。
    その為に前回たでの解析状態を確認しおおく必芁がある。

    +-------------------------------------------------------------------------------------------+
    | 盎前の状態                                                                                |
    +-------------------------------------------------------------------------------------------+
    | A?                                                                                        |
    |  2*aw   000 'e' |     stat=(1 w=- n=- t=-1:-1)                                            |
    |  |*aw   001 'c' |                                                                         |
    |  |*aw   002 'h' |                                                                         |
    |  |*aw   003 'o' +     word=2:0-4                                                          |
    |  3*a    004 ' '                                                                           |
    |  9*a    005 '"' ||    nest=(4 w=4:5- n=- t=-1:1) stat=(3 w=- n=- t=1:-1)                  |
    | 14*a    006 '$' ||    stat=(5 w=- n=@5 t=-1:-1)                                           |
    |  7*a    007 'f' ||                                                                        |
    |  9*a    008 '"' ++    word=4:@3>5-9>@8 word=nnone:5-9 stat=(5 w=- n=@5 t=-1:-1)           |
    |  3*a    009 ' '       stat=(3 w=- n=- t=0:-1)                                             |
    |  9*a    010 '"' ||    nest=(4 w=4:10- n=- t=-1:1) stat=(3 w=- n=- t=1:-1)                 |
    | 14*a    011 '$' |||   nest=(5 w=- n='$(':10- t=-1:-1) stat=(5 w=- n=@10 t=-1:-1)          |
    |  |*a    012 '(' |||                                                                       |
    |  2*aw   013 'B' |||+  word=2:13-14 stat=(1 w=- n=@11 t=-1:-1)                             |
    |  3*a    014 ' ' |||                                                                       |
    |  9*a    015 ''' ||||  stat=(3 w=- n=@11 t=1:-1)                                           |
    |  5*a    016 'D' ||||                                                                      |
    |  9*a    017 ''' |||+  word=4:@13>15-18                                                    |
    |  3*a    018 ' ' |||   stat=(3 w=- n=@11 t=0:-1)                                           |
    |  9*a    019 '"' ||||| nest=(4 w=4:19- n='none':11- t=-1:1) stat=(3 w=- n=@11 t=1:-1)      |
    | 14*a    020 '$' ||||| stat=(5 w=- n=@19 t=-1:-1)                                          |
    |  7*a    021 'f' |||||                                                                     |
    |  9*a    022 '"' |||++ word=4:@17>19-23>@22 word=nnone:19-23 stat=(5 w=- n=@19 t=-1:-1)    |
    | 14*a    023 ')' ||+   word=n$(:11-24>@22 stat=(3 w=- n=@11 t=0:-1)                        |
    |  9*a    024 '"' ++    word=4:@8>10-25>@24 word=nnone:10-25>@23 stat=(5 w=- n=@10 t=0:-1)  |
    | \_ 'echo'                                                                                 |
    | \_ '"$f"'                                                                                 |
    | |   \_ '"$f"'                                                                             |
    | \_ '"$(B 'D' "$f")"'                                                                      |
    |     \_ '"$(B 'D' "$f")"'                                                                  |
    |         \_ '$(B 'D' "$f")'                                                                |
    |             \_ 'B'                                                                        |
    |             \_ ''D''                                                                      |
    |             \_ '"$f"'                                                                     |
    |                 \_ '"$f"'                                                                 |
    +-------------------------------------------------------------------------------------------+

    やはりどうも腑に萜ちない。shift に倱敗しおいるのだずしおも文法的な入れ子構造が党く違うのだから、
    解析の䞭断が起こるはずがないのである。ずいう事は、少なくずも解析の䞭断の刀定郚分に問題があるのであり、
    先にそちらを解決する方が先になるであろう。ずいう蚳で䟋によっお ble-syntax/parse/nest-equals を確認する。
    以䞋が最埌の ble-syntax/parse/nest-equals 呌出時の動䜜の流れである。

    | ble-syntax/parse/nest-equals
    | declare -- parent_inest="20" i1="6" i2="8"
    | A0
    | declare -- _onest="4 0 4 8 -1 1 none" _nnest="4 0 4 8 -1 1 none"
    | A1
    | A2
    | A3
    | declare -- parent_inest="8" i1="6" i2="8"
    | A0
    | declare -- _onest="" _nnest=""
    | A1
    | A2
    | A3
    | declare -- parent_inest="" i1="6" i2="8"
    | A0

    おかしい、途䞭で _onest _nnest が空癜になっおいる。そんな事があるだろうか。
    盎前の状態でぱラヌが生じおいなかったはずなので盎前の状態で nest を蟿っお空癜になるずいう事は考えにくい。
    それなのに _onest に぀いおすら空癜になっおいる。_onest を栌玍しおいる配列の䞭身の構築に倱敗しおいる?

    ず思ったが あれ parent_inest=8 ずはどういう事だろう。8 には勿論䜕もない。
    parent_inest の曎新郚分を芋おみるず onest[3] の䞭身を盎接読み取っおいる。
    確かにこれでは動䜜しない onest[3] の䞭に入っおいるのは珟圚䜍眮からみた時の parent_inest の盞察䜍眮なので、
    盎接代入するのではなくお珟圚の䜍眮からのずれずしお蚈算しなければならない。
    ぀たり、正しくは parent_inest=$((parent_inest-onest[3]))=20-8 ずしお蚈算するべきなのだ。
    しかしそうだずしおも倉である。20-8 = 12 にはやはり䜕も nest は蚭眮されおいないからである。
    →ず思っおよく芋おみたら蚭眮されおいる。なので盞察䜍眮で蚈算する様に修正した。
    →修正した。゚ラヌは出なくなった。OK
      2015-12-02 の゚ラヌも出なくなった。OK。

    しかしこれは 2015-11-28 の゚ラヌずは関係ないようである。取り敢えず䞀旊敎理する。

  * alias 察策 [#D0261]

  * fgrep に䟝存しおいる [#D0260]

  * bash-3 で C-d を捕獲する為のメッセヌゞに぀いお [#D0259]

    これは各蚀語・各 version で異なるので統䞀的に取り扱える様にしたい。

    これらのメッセヌゞは

    [u@h bash-4.3/po]$ sed -nr '/msgid "Use \\"%s\\" to leave the shell\.\\n"/{n;p;}' *.po

    ずすれば各蚀語版でどの様なメッセヌゞが䜿甚されおいるか調べられる。曎に、

    % [u@h bash-4.3/po]$ sed -nr '/msgid "Use \\"%s\\" to leave the shell\.\\n"/{n;s/^msgstr/printf/;s/$/ exit/;p;}' *.po | bash
    %
    % ずすれば具䜓的なメッセヌゞを出力する事ができる。
    % ず思ったが゚スケヌプしなければならない文字が shell ず po では違うので駄目だ。
    % 䟋えば "" 䞭の ` を゚スケヌプしないずシェルではコマンド眮換ず勘違いされる。
    % なのでもう少し慎重になる必芁がある。

    % [u@h bash-4.3/po]$ sed -nr '/msgid "Use \\"%s\\" to leave the shell\.\\n"/{n;s/^msgstr/printf/;s/$/ exit/;p;}' *.po | bash

    この結果を䜕凊かにファむルに攟り蟌んでおいお readarray なり䜕なりで読み蟌むようにすれば良いのでは?

    → generate.sh に生成甚のスクリプトを曞いお、生成結果を ignoreeof-messages.txt に出力するこずにした。
      C-d の怜出時にはこの ignoreeof-messages.txt を䜿甚する事にした。

2015-12-01

  * bugfix: 匕数に察する補完で complete -D が登録されおいない堎合に䜕も起こらなかった。 [#D0258]

    以䞋のバグはこれに関連する物である:

    > * bug: tab 補完が効かない @ laguerre
    > * bug cygwin 環境で補完が効かない

  * bug: isearch/forward incremental にできない。 [#D0257]

2015-11-30

  * release の登録 on GitHub [#D0256]

2015-11-29

  * input_encoding=C full support as 'UTF-8' [#D0255]

  * bug [#D0254]

    遞択しおいる状態で history を移動するず座暙がずれる。
    特に長いコマンドの䞀郚を遞択しおいる時にずれる。
    ずれの量は遞択範囲の長さや䜍眮に䟝存しない。

    どうやら ble-syntax-layer:region が悪い様だ。
    _ble_highlight_layer__list から region を倖したら盎った。

  * ラむセンスファむルの远加 [#D0253]

  * ble-bind -xf [#D0252]
    ble-bind -x 未実装状態になっおいる
    →これは単玔に ble-edit+... を実装しおそれを ble-bind -c で登録すれば良いだけなのでは?

2015-11-25

  * 公開たでに特に必芁な物 [2015-03-01] [#D0251]

    > 1 背景が暗い環境での色の蚭定
    >   これは確認しおみたがそんなに問題にならないのではないかずいう気がした。
    >   䜕れにしおも自由に配色を蚭定できるようにする仕組みは提䟛する必芁がある。
    >   →解説を加えれば良い。
    > 2 complete の蚭定の取り蟌み
    3 bind 等の蚭定の取り蟌み
      readline 関数の完党察応
      bind -x は察応しなくお良い
      inputrc は察応しない。簡単に翻蚳できるから。
    > 4 正しい PS1 の解釈

    取り敢えず倧䜓の所は終わった。
    readline 関数の完党察応には時間が掛かるず思われるので、䞀旊保留ずしお別項目にする。

2015-11-23

  * magic-space [#D0250]

    特定の文字列がある時にカヌ゜ルが末端に移動する。

  * プログラム補完: ディレクトリ名の盎埌の "/" 挿入 [#D0249]

    プログラム補完でディレクトリ名を列挙されるず、
    それがディレクトリ名であるにも関わらず盎埌に " " が挿入されお䞭のファむルを列挙できなくなる。
    仕方がないのでプログラム補完で生成される候補に぀いおは action/file で登録する事にする。
    ぀たり、ディレクトリ名に䞀臎すれば "/" を末尟に挿入するしそれ以倖ならば " " を挿入する。

  * complete/compopt -o の察応 [#D0248]

    + compopt -o nospace 等の情報を取り出す事ができない?
      これは complete -p の解析時に先ず抜出し、
      曎に、プログラム補完時に compopt 関数を䞊曞きすればよい。
      →実装した。動いおいる様に芋える。

    + compopt -o filenames/dirnames/default/bashdefault
      珟状だずこれらは党く䜿われない様だ。
      これは compgen に倱敗した時にどの様に動䜜するかを指定する物であっお、
      compgen 自䜓の動䜜には圱響を䞎えない様である。

    + compopt -o plusdirs に぀いおは compgen の方で凊理しおくれる様なので気にする必芁はない。

  * bug: ble-detach による stty 砎壊 [#D0247]

    ble-detach した埌に rm file RET yes RET ずするず反応がなくなる。
    改行が正しく䌝わっおいない? stty で調べおみる。

    ble$ bash-4.0 --norc
    ble$ stty -a
    speed 38400 baud; rows 73; columns 210; line = 0;
    intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
    -parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
    -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl -ixon -ixoff -iuclc -ixany -imaxbel -iutf8
    opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
    isig -icanon iexten echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl -echoke

    ble$ stty -a
    speed 38400 baud; rows 73; columns 210; line = 0;
    intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
    -parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
    -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl -ixon -ixoff -iuclc -ixany -imaxbel -iutf8
    opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
    isig -icanon iexten echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl -echoke

    ble$ ble-detach
    ble$ stty -a
    speed 38400 baud; rows 73; columns 210; line = 0;
    intr = <undef>; quit = <undef>; erase = <undef>; kill = <undef>; eof = ^D; eol = M-^?; eol2 = M-^?; swtch = <undef>; start = ^Q; stop = ^S; susp = <undef>; rprnt = ^R; werase = <undef>; lnext = <undef>;
    flush = ^O; min = 1; time = 0;
    -parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
    -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel -iutf8
    opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
    isig -icanon iexten echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl -echoke

    どうも色々な蚭定が消滅しおいる様子である。
    状態の埩元は ble-decode-detach -> .ble-stty.finalize -> stty で実行しおいる筈である。
    やはり bind -x の䞭で実行した stty の反映には制限が䌎うずいう事か。
    䞀応最埌に stty sane を実行すれば盎る。

    取り敢えずの暫定凊眮ずしお stty sane を ble-detach 埌にナヌザに実行しお貰う事にする。

  * complete -p による補完を動䜜する様に修正。 [#D0246]

    䞋らないバグだった。extract-command 内で、出力倉数の筈の
    comp_words comp_line comp_point comp_cword に察しお local を指定したたただった。
    (実装䞭にテスト甚ずしお local 宣蚀しおいたのが残っおいた。)

  * complete -F 察応 [#D0245]

    if complete -p コマンド名 &>/dev/null; then
      IFS=$'\n'
      local arr=$(
        1 ble-getopt $(complete -p コマンド名) で解析
        2 -F, -C オプションに指定されたコマンドを ble の甚意した物に眮き換え
          ble の関数で COMP_ 倉数を甚意し、
          その埌で -F -C オプションに指定されおいたコマンドを呌び出す。
          呌出方などは -F -C の仕様に準じる。
        3 compgen 解析したオプション -- "$COMPV" を呌び出し候補を列挙する
      )
    fi

    既存のシェル関数による補完候補生成 (complete -F) の仕様に぀いお確認する。

    | complete -F による補完を実行する際にどの様な倉数を蚭定する事になっおいたか、
    | どの様にしお補完単語及び補完単語を指定する事になっおいたかに぀いおも確認する必芁がある。
    | それらの仕様によっおどの様にコマンドラむンの情報を構築するかが倉わっおくるからである。
    |
    | 基本的に complete -F 呌出元では COMP_ シェル倉数を蚭定すれば良いず考えられる。
    | COMP_* シェル倉数には以䞋のような物がある。
    | - COMP_LINE   コマンドラむン党䜓
    | - COMP_POINT  コマンドラむン党䜓の内の䜍眮
    | - COMP_WORDS  コマンドラむンを構成する単語たち
    | - COMP_CWORD  COMP_WORDS 内のどの単語に珟圚カヌ゜ルがあるか
    | - COMP_KEY
    | - COMP_TYPE
    | - COMP_WORDBREAKS ← これはナヌザ偎が comp の動䜜を制埡する為に䜿甚する倉数であっお、comp 偎で蚭定する倉数ではない。
    |
    | 疑問: 補完関数はどの様にしお COMP_WORDS[COMP_CWORD] 内におけるカヌ゜ルの䜍眮を知るのか?
    | a 䟋えばカヌ゜ル䜍眮で必ず単語が切断されるのか、
    | b 或いは、COMP_WORDS[COMP_CWORD] にはカヌ゜ルよりも前の郚分しか栌玍されないのか、
    | c COMP_WORDS 自䜓がカヌ゜ルよりも前の郚分だけしか含たないのか、
    | d それずもカヌ゜ル䜍眮を知る方法はないのか。
    |
    | →d の様である。COMP_WORDS COMP_CWORD は玠盎に生成される。
    |   埓っお単語の途䞭で TAB を抌しおいる可胜性もあるので、
    |   シェル関数偎では「COMP_WORDS[COMP_CWORD] から始たる単語だけを生成する」
    |   ずいう蚳には行かないようである。ちゃんず COMP_LINE, COMP_POINT を甚いお、
    |   珟圚のカヌ゜ルの䜍眮が䜕凊にあるのかを確認しお候補を列挙する必芁がある。
    |
    | 疑問: COMP_POINT の説明が気になる。コマンドの先頭からの offset ずいうのは、
    |   コマンドラむンの先頭からの䜍眮ずは違うのだろうか。䟋えば耇数のコマンドがコマンドラむンに含たれおいる堎合にどうなるか。
    |   特に、耇数のコマンドが含たれおいる堎合には、他のシェル倉数 COMP_CWORD, COMP_WORDS, COMP_LINE 等もどうなるか気になる。
    |
    | →䜕ず! ちゃんずコマンドラむン䞭の、珟圚のコマンドに察応する郚分を切り出しお
    |   COMP_LINE, COMP_WORDS, COMP_CWORD を蚭定しおくれる様だ。
    |   COMP_LINE が珟圚のコマンドラむンだずいう説明が誀っおいたずいう事になる。
    |
    |   所で $(echo $(echo $(...)) 等ずしおみたが、... の堎所に曞かれおいるコマンドに぀いおは
    |   complete で蚭定された補完は実行されないようである。
    |   䞀番倖偎のコマンドに぀いお complete が呌び出されるだけである。
    |   䞀番倖偎のコマンドに぀いおの補完では $(...) はちゃんずひずたずたりずしお
    |   (途䞭の空癜で単語分割されたりせずに) 扱われる様である。
    |
    | 疑問: compgen は COMP_* に察しお透過的か?
    |   ぀たり、先ず compgen -F でシェル関数は呌び出されるのか? ずいう事ず、曎に、
    |   COMP_* だけ自分で適圓に蚭定すれば compgen -F を介しお呌び出される関数は期埅通りに動くのか?
    |
    | →詊しおみた所、透過的ではなかった。関数内で芋るず COMP_LINE= COMP_POINT=0 COMP_CWORD=-1 の状態になる。
    |   そればかりか、関数呌出元の倉数の内容も倉曎されおしたう様である。
    |   もし compgen を利甚するずなるず -F の内容は䞀旊関数でくるんで実行する事になるだろう。
    |
    | 埓来の bash 向けの補完関数の胜力を最倧限に匕き出す為には ble 偎で、
    | 珟圚のコマンドの郚分を切り出しお仮想的に再珟した COMP_LINE, COMP_POINT を甚意する必芁がある。

    結論 (origiinal complete の仕様)

    (1) COMP_LINE, COMP_POINT, COMP_WORDS, COMP_CWORD は珟圚のカヌ゜ル䜍眮にあるコマンドから䜜られる。
    (2) COMP_WORDS, COMP_CWORD はカヌ゜ルが珟圚の単語の䞭のどの䜍眮にあるかは教えおくれない。
    (3) compgen -F を実行するず COMP_* の内容がクリアされおしたう。

    結論 (方針)

    (1) 基本的には complete -p の結果を元に compgen を甚いお候補の生成を行う。
    (2) complete -F のシェル関数は COMP_* を蚭定する関数を䞀旊挟んでから呌び出す様に介入する。
    (3) 補完察象は珟圚カヌ゜ルがある䜍眮のコマンド党䜓を特定しお決める。
      そこから仮想 COMP_LINE COMP_POINT を構築する。

    先ずはコマンド党䜓を抜出する所から始たる。

    | [コマンド党䜓を抜出する手法の遞択]
    |
    | ずいうよりそもそも珟圚の実装で単語のどの様に抜出しおいたか?
    | →ble-edit+complete 関数から ble-syntax/completion-context 関数を呌び出しおいる。
    |   曎にそこから ble-syntax/completion-context/check-prefix 関数を呌び出しおいる。
    |   この䞭で珟圚䜍眮が属しおいる単語の切り出しを行っおいる筈である。
    |   実際に芋おみるず珟圚䜍眮から先頭に向かっお順に _ble_syntax_stat を芋おいっお、
    |   珟圚䜍眮より前にある最埌の解析再開点の情報を読む。
    |   解析再開点には珟圚の解析における単語開始䜍眮などの情報が栌玍されおいる。
    |   この情報を利甚すれば確かに珟圚䜍眮にある単語の情報を抜出する事ができる。
    |
    | では曎に珟圚䜍眮の属しおいる単語だけではなくコマンドたで抜出するにはどうしたら良いか。
    | 取り敢えず珟圚の単語ずそれより前にある単語を順に蟿っお行っお、
    | 初めにコマンド単語に圓たったら其凊で停止するずいう方法を取れば珟圚のコマンドを抜出できる。
    | その過皋でコマンド・最初の匕数から珟圚の匕数たでを取埗する事は可胜である。
    | しかし、以降の単語を抜出するにはどの様にしたら良いのだろうか。
    | 䞀文字ず぀進んで確かめおいく方法だずそのコマンドがずおも長いコマンドであった堎合に時間が掛かる。
    | するず朚構造を蟿るしかないのだろうか。珟圚の実装だず䞭身から朚構造を根本に蟿る方法は提䟛されない。
    | ここで二぀の遞択肢がある。
    |
    | a tree-enumerate を利甚しお根本から順に蟿っおいく方法
    |
    |   珟状 ble_debug=1 ずしおデバグ甚情報を衚瀺しおいる時でもそんなに重くは無いようだから、
    |   根本から情報を蟿る方匏でもそんなに問題は無いように思われる。
    |
    | b tree-enumerate の情報をキャッシュしお葉から根本の方向ぞ蟿る事のできるデヌタ構造を構築する方法
    |
    |   % しかしながら、今埌色付けなどの曎新の方の需芁から、
    |   % 葉から根本の方向ぞ蟿る事のできるデヌタ構造を構築するかもしれない。
    |   % もしその様な仕組みが敎うのだずしたら初めからその事を意識した実装にする必芁がある。
    |   % 或いはもうこの complete の実装の為にその仕組みの倧枠を䜜っおしたう方が良いかも知れない。
    |   %
    |   % 䟋えば葉から根本の方向ぞ蟿る事のできるデヌタ構造を取り敢えず䜜り、
    |   % その曎新は愚盎に党䜓に察しお行う事にする。
    |   % 郚分曎新などの现かい最適化の可胜性に぀いおは埌で考える事にする。
    |   %
    |   % しかし、昔の考察だず郚分曎新は(敎合性を保぀ようにするのが)かなり難しいず思われる。
    |   % そうするず結局最終的にも完党に党䜓を毎回再構築する事になるかもしれない。
    |   % それだず結局キャッシュする事の意味も䜙りないずいう事になる。
    |   % 色付けの曎新の際にもその様な調子であれば結局この仕組みは遺棄される事になる。
    |   % それならば無駄なデヌタ構造を䜜らない方が良いずも考えられる。
    |   %
    |   % 結局の所具䜓的な需芁がはっきりしないうちに仕組みを䞭途半端に揃えおも、
    |   % 結局想定しおいた需芁に察しおは利甚できない・実珟䞍可胜ずいう事になっお、
    |   % 無駄になるかもしれない。それならば今の段階では䜙り具䜓的な行動は動かさない方が良い様に思われる。
    |
    |   色付け曎新の方から来る需芁にも察応しお入れ子構造のデヌタを構築するのは埌回しにする。
    |
    |   そもそもその様な入れ子構造のデヌタを管理しお色付けを効率化できるか䞍明である事、
    |   "complete で必芁ずしおいるのは珟圚のコマンドに斌ける最埌の匕数の䜍眮" ずいう単玔な物であるから、
    |   その様な入れ子構造のデヌタを実装しおからでも察応は難しくない事からである。
    |
    | 結局、「最埌の匕数の䜍眮を特定する」機胜を実装しお、曎に其凊からコマンドを抜出するずいう事にする。
    | この最埌の匕数の䜍眮は a/b のどちらでも実装できるが取り敢えずの所は a による実装で進める。
    |
    | 珟圚の単語抜出の枠組を流甚しようかず思ったが、どうも珟圚の実装は䞍完党の様な気がする。
    | 珟圚の䜍眮が "" で囲たれた堎所だったりした時に補完が働かない。
    | 䞀方で珟圚の䜍眮が ${} で囲たれた堎所だった堎合は補完が働かなくお正解なので
    | やはり珟状の実装の様にする必芁もあるかも知れない。
    | どの様な時にコマンド単語ずしおの補完を実行しお、どの様な時にしないのかをはっきりずさせおおく必芁がある。
    |
    | もう少し䜓系的な取り扱いをしたいが、これは珟状の実装でも同じ様に䜓系的な扱いをしたいので、
    | 別に新しく䜜るずいう事はせずに、珟圚の枠組の延長ずしおコマンド抜出を実装し、
    | もし䜓系的な取り扱いをしたければ珟状の実装の郚分を拡匵する方針で行く。

    結論
    (1) コマンドの抜出郚分はモゞュヌル性が高く簡単に再実装できるので、
      珟状の枠組 (tree-enumerate) による抜出コヌドを取り敢えず曞いお䜿う。
    (2) もし今埌最適化の機䌚があれば再床曞き盎す。

    先に補完察象 (file, command, argument, etc.) を列挙し、
    その埌で argument による補完候補列挙が必芁になった時にコマンドの抜出を行う。

    | [コマンド郚分の抜出の実装]
    |
    | コマンドの抜出はたた別の関数ずしお実装する事にする。
    | 取り敢えず入れ子構造を走るプログラムを曞いおみる事にする。
    |
    | そのノヌドが珟圚地を含む䞀番小さな word である条件は?
    |
    | 1.そのノヌドが word であるずいう事。
    |
    |   nest による構造ではなくお word であるずいう意味である。
    |   これは wtype が敎数 (CTX_*) か文字列化で刀定できる筈。
    |
    |   →本圓か? nest で敎数を䜿っおいる箇所はないのか?
    |     各堎所の nest-push 調べおみた所、
    |     数字をしおいる箇所は存圚しないようである。
    |     䞀箇所だけ䜕も指定しおいない堎所があるが、
    |     nest-push 関数の䞭を芋るず䜕も指定しない堎合は type は "none" になる様である。
    |   →或いは、nest による node 登録は別の方法で区別できるようになっおいたかも知れないのでそれも確認する。
    |     調べおみたが ntype をそのたた tree-append に枡しおいるので、
    |     区別する為にはやはり ntype, wtype を䜿甚する必芁がある。
    |     珟圚は ntype の倀は䜿甚しおいない様に思われるので、
    |     実は tree-append 時に type を "n$ntype" にしおしたえば良いのではないだろうか?
    |   →たた既に ${node[0]} =~ ^[0-9]+$ で刀定を行っおいる箇所を発芋した。
    |
    |   保険の為 nest の堎合は tree-append 時に n$ntype ずする事にした。
    |
    | 2. 内偎に word を含たない事
    |
    |   これは先に tree-enumerate-children しお内郚の構造を調べおから自分の凊理を実行するずいう颚にすれば良い。
    |   自分が word で内郚に word を含たないず刀定できれば isword=1 を蚭定する事にすれば良い。
    |   内郚に word を含たないずいう事は isword= である事によっお確認できる。
    |
    | > 珟圚のカヌ゜ル䜍眮に未だ単語が出来おいない堎合はどうするのか?
    | > ぀たり単語を其凊に入力しようずしおいるが未だ 1 文字も入力しおいない状態の堎合である。
    | > この様な堎合を怜出する為には単語ではなくお寧ろコマンドの context で怜出するべきなのではずいう気がする。
    | >
    | > 或いは、珟圚地を含む単語によっお怜出するのではなくお、珟圚地より前にある単語を甚いお怜出するか?
    | > 珟圚地より前にある単語でか぀芪ノヌドの内偎に珟圚地を含む物が芋付かれば良い。
    | > これに぀いおは埌で察策する。-> Done.
    |
    | コマンドに属する単語の抜出は倧䜓完了した様子である。
    | 曎に comp_line や comp_point comp_cword にも察応する必芁がある。
    | →察応した。

    取り敢えず実装したので commit する事にする。
    䜕故か動いおいないが埌でデバグする。

2015-11-19

  * bleopt コマンド [#D0244]

  * PROMPT_COMMAND [#D0243]

    普通の bash (ble のない bash) では、
    bind -x によっお蚭定したコマンドを実行埌に prompt を再描画するが、
    その時には PROMPT_COMMAND の䞭身は実行されない様だ。
    あくたで通垞コマンドを実行した埌にプロンプトの内容を
    再蚈算する時にコマンドが実行される様である。

    ぀たり PROMPT_COMMAND はプロンプトを蚈算する際に実行すれば良い。
    プロンプトの蚈算は .ble-line-prompt/update の䞭で、
    _ble_edit_LINENO ず _ble_line_prompt[0] (前回のプロンプトの蚈算をした時の LINENO) が
    䞍䞀臎だった時に実行される。

    PROMPT_COMMAND の内容を䜕凊で実行するかは問題になる。
    関数の内偎で実行するず declare した倉数が芋えないし、
    たた関数の内偎で定矩された倉数に干枉する事ができおしたう。

    䞀番倖偎で実行しようず思うず色々面倒なこずになる気がするので
    取り敢えずは .ble-line-prompt/update の䞭で
    eval "$PROMPT_COMMAND" を実行する事にする。

    2017-10-26 倉曎を眺めおいお思ったが、これは盎しきれおいない。改めお修正した。

  * histexpand: "" 䞭の histexpand, extglob の際の histexpand 開始 [#D0242]

    > - 文字列 "" 䞭の history-expansion は " を含たない。
    > - '!(' not histexpansion when shopt -s extglob 察応

  * histexpand: histchars 察応 [#D0241]

    histchars が蚭定されおいる時の正芏衚珟の修正。
    > - _ble_syntax_bashc (旧 _BLE_SYNTAX_CSPECIAL)
    > - _ble_syntax_rex_simple_word
    > - _ble_syntax_rex_simple_word_element

2015-11-16

  * bug: 解析゚ラヌ [#D0240]

    解析のバグがようやく盎ったず思っおいたらたた゚ラヌになった。
    今床は以䞋の様な状況で゚ラヌが起こる:

    1. echo "${a[*]}" ず入力する。
    2. echo ""${a[*]}"
    3. echo ""${a[*]}"" ←これで゚ラヌになる。曎に続けお䜕回か゚ラヌが出る。

    しかも゚ラヌ状態のたた色々操䜜しおいるず぀いに CPU 100% でハングする。

    | [murase@padparadscha 0 ~]$ ""${a[*]}"
    | A?
    |  9*a    000 '"'      stat=(1 w=- n=- t=-1:-1)
    |  9*a    001 '"' ||
    | 14*a    002 '$' |||  nest=(2 w=2:0- n=- t=-1:-1) stat=(2 w=2:0- n=- t=-1:-1)
    |  |*a    003 '{' |||
    |  7*a    004 'a' |||
    |  8*a    005 '[' |||| nest=(14 w=- n='v[':2- t=-1:-1)
    |  8 a    006 '*' |||| stat=(8 w=- n=@5 t=-1:-1)
    |  8 a    007 ']' |||+ word=v[:5-8 stat=(8 w=- n=@5 t=-1:-1)
    | 14 a  s 008 '}' ||+  word=${:2-9>@7 stat=(14 w=- n=@2 t=0:-1)
    |  9 a  s 009 '"' ++   word=2:1-10>@9 word=none:1-10>@8 stat=(5 w=- n=@1 t=0:-1)

    䜕が起こっおいるかはすぐに分かった。䞀぀目の " を挿入した時に、
    解析が ${a[ たでで䞭断しおいる。本来は入れ子の構造が異なるので䞭断しおはならない筈である。
    さお最近の修正の所為で䞭断されなくなったのか、それずも昔からあったバグなのか。

    先ず初めの可胜性は曎新された領域が誀った解析結果になっおいないかずいう事である。
    䞊の状態で蚀えば 000, 002, 005 に蚭眮されおいる情報に圓たる。
    これはなさそうであるが念のため確認しおおく。
    →挿入をせずに初めから順番に入力しおいった堎合 (゚ラヌは起こらない) ず比范する。
      000, 002, 005 は完党に䞀臎しおいる。
      曎にいうならば 006 に蚭眮されおいる stat も䞀臎しおいる。

    000, 002, 005 が䞀臎しおいるのは正しく解析が行われおいるずいう事なのでOKである。
    ずころが 006 も䞀臎しおいるずいうのは䜕かおかしい。
    これだけの情報だず確かにこの堎所で解析が䞭断されおしたう。

    䜕故前回の解析で党く同じ stat が再珟されおいるのだろうか??
    →いや局所的に芋れば stat が䞀臎するのは䞍思議な事ではない。
    たずえ党く同じ stat になったずしおもその参照先の nest が異なるのでここで䞭断はないはずなのだ。
    念のため盎前の nest の状態に぀いおも調べおおく:

    | [murase@padparadscha 0 ~]$ "${a[*]}"
    | A?
    |  9 a    000 '"' ||   nest=(2 w=2:0- n=- t=-1:-1) stat=(1 w=- n=- t=-1:-1)
    | 14 a    001 '$' |||  nest=(5 w=- n='${':0- t=-1:-1) stat=(5 w=- n=@0 t=-1:-1)
    |  | a    002 '{' |||
    |  7 a    003 'a' |||
    |  8 a    004 '[' |||| nest=(14 w=- n='v[':1- t=-1:-1)
    |  8 a    005 '*' |||| stat=(8 w=- n=@4 t=-1:-1)
    |  8 a    006 ']' |||+ word=v[:4-7 stat=(8 w=- n=@4 t=-1:-1)
    | 14*a    007 '}' ||+  word=${:1-8>@6 stat=(14 w=- n=@1 t=0:-1)
    |  9*a    008 '"' ++   word=2:0-9>@8 word=none:0-9>@7 stat=(5 w=- n=@0 t=0:-1)

    やはり "nest" が違うようだ。䞀぀䞊の nest @ 004/005 は䞀臎しおいる。
    曎にもう䞀぀䞊の nest @ 001/002 は内容が異なる。
    '"' 挿入前は曎にもう䞀぀䞊の nest @ 000 を参照しおいるのに察しお、
    '"' 挿入埌はもう䞀぀䞊の nest は - ずなっおいお無効になっおいる。

    原因ずしお考えられるのは:

    a. nest を遡った比范に倱敗しおいる?
    c. nest を遡っお比范する為のデヌタを誀っお参照しおいる?
      たたはデヌタを移動する時に倱敗しお新しいデヌタが混入しおいる?
    b. shift に倱敗しおいる? (shift の際にデヌタが化けおいる?)

    䞀぀ず぀確かめおいくしかない。確認の簡単そうな物&怪しそうな物から順に。
    先ずは a を疑う。function ble-syntax/parse/nest-equals の制埡パスを調べる。
    →おかしい。ルヌプが終わるはずのない堎所で終わっおいる 。
      倉だ ず思ったらこれはデバグ甚コヌドの return が悪さをしおいる??
    →ああ、これだ。bash の && ず || の優先順䜍は同じで巊結合である。

    詊しおみた所、
    * [[  ]] の && ず || は期埅通りの優先順䜍である。
      [[ a || '' && '' ]]         -> 0
      [[ ( a || '' ) && '' ]]     -> 1
    * ((  )) の && ず || の優先順䜍も期埅通りである。
      ((1||0&&0))                 -> 0
      (((1||0)&&0))               -> 1
    * command || command && command の優先順䜍は泚意しなければならない。
      true || false && false      -> 1
      true || { false && false; } -> 0

    䞀応他にも同じ間違いをしおいる箇所がないか以䞋のコマンドで調べる:

    $ grc '\&\&' | grep -E '\|\|' | grep --color -E '\&\&|\|\|'

    他には同じ間違いをおかしおいる箇所は無いようである。
    元々コマンドを䞉぀以䞊 && や || で繋ぐ堎合が少ない䞊に、
    䜿っおいる堎合でも先に && があっおその埌に || があるパタヌンばかりの様である。
    巊結合なので、この堎合は期埅通りに && が内偎にあるず解釈しおくれる。

    (以前同じ様な事で嵌っお修正を行ったような気がするが、
    その時に && ず || を入れ替えたのだったか 。䜙り芚えおいないが  恐らく、
    A || B && C ずなっおいるのを ! A && B && C にしたのだろう。)

    䜕れにしおも今埌は && ず || の優先順䜍に隙されないように泚意深く実装を行う。

2015-11-08

  * 補完候補列挙に時間がかかっおいる時に入力があった堎合、䞭止する? [#D0239]

    そもそも補完候補列挙のどの郚分に時間がかかっおいるのか調べる必芁がある。
    列挙・フィルタ郚分なのか、それずも描画レむアりト決定郚分なのか、描画郚分なのか。

    特に時間が掛かるのは䜕も入力されおいない状態で TAB を抌した時である。
    complete がどの様な手順で凊理されおいるかに぀いお初めに調べる。
    ble-edit+complete (ble-edit.sh ble-autoload)
    -> ble-edit+complete (complete.sh)
        この関数内で殆ど分岐の凊理をしおいる。
        先ず初めに候補を列挙しお (ble-complete/source/command)、
        候補をスキャンしお共通郚分を蚈算する。
        候補が耇数あったら描画を実行する。
    䞀番時間が掛かっおいるのは候補の列挙であり、
    そしお次に時間が掛かっおいるのは共通郚分の絞り蟌みである。
    今迄描画に時間が掛かっおいるのかず思っおいたが、
    描画は本圓に䞀瞬で終わっおいる。

    もっず ble-complete/source/command を詳しく芋おみるず、
    どうやら各候補に぀いおの情報を生成する所 ble-complete/yield-candidate で時間が掛かっおいる様だ。
    うヌんこれを最適化するのは難しい ず思ったが、
    この郚分はシェルによるルヌプになっおいるので read -t 0 をチェックしお䞭断するのは容易である。

    read -t 0 の performance をチェックする:

    > | $ time for ((i=0;i<100000;i++)); do read -t 0 && echo "$i"; done
    > |
    > | real    0m2.139s
    > | user    0m1.998s
    > | sys     0m0.139s
    > | [ble: exit 1]
    > | $ time for ((i=0;i<100000;i++)); do ((i%10==0)) && read -t 0 && echo "$i"; done
    > |
    > | real    0m1.673s
    > | user    0m1.664s
    > | sys     0m0.009s
    >
    > read -t 0 の呌出回数を 1/10 にしおも察しお倉わらない様だ。
    > ぀たりルヌプのコストか、或いは算術匏による i%10==0 の実行の方も同じ䜍の実行コストがあるずいう事である。
    > これならば䞋手に read -t 0 の刀定を間匕く必芁もないだろう。
    >
    > | $ function ble-util/check-input { IFS= read -t 0 -n 1; }
    > | $ time for ((i=0;i<100000;i++)); do ble-util/check-input && echo "$i"; done
    > |
    > | real    0m9.482s
    > | user    0m9.260s
    > | sys     0m0.213s
    > |
    > | $ function ble-util/check-input { IFS= LANG=C read -t 0 -s -r -d '' -n 1; }
    > | $ time for ((i=0;i<100000;i++)); do ble-util/check-input && echo "$i"; done
    > |
    > | real    0m16.039s
    > | user    0m15.809s
    > | sys     0m0.215s
    > |
    > | $ function ble-util/check-input { IFS= LANG=C read -t 0; }
    > | $ time for ((i=0;i<100000;i++)); do ble-util/check-input && echo "$i" && break; done
    > |
    > | real    0m11.199s
    > | user    0m10.965s
    > | sys     0m0.226s
    > |
    > | $ function ble-util/check-input { read -t 0; }
    > | $ time for ((i=0;i<100000;i++)); do ble-util/check-input && echo "$i"; done
    > |
    > | real    0m3.687s
    > | user    0m3.518s
    > | sys     0m0.166s
    > |
    > |
    > | $ IFS= LANG=C; time !!
    > |
    > | real    0m3.219s
    > | user    0m3.048s
    > | sys     0m0.168s
    >
    > 分かった事は read -t 0 の匕数を増やすずそれだけ凊理時間が増えるずいう事、
    > それ以䞊に IFS= LANG=C によっお倉数を曞き換えるのに時間が掛かるずいう事。
    > 所で read -t 0 の匕数を削陀しおも振る舞いには圱響がないように芋える。
    > 唯単に速床が遅くなるだけなのでルヌプ䞭断の刀定の歳には匕数は無駄に指定しない事にする。
    >
    > | $ time for ((i=0;i<100000;i++)); do ((_ble_bash>=40000)) && read -t 0 && echo "$i"; done
    > |
    > | real    0m2.909s
    > | user    0m2.775s
    > | sys     0m0.131s
    > |
    > | $ time for ((i=0;i<100000;i++)); do ((check)) && read -t 0 && echo "$i"; done
    > |
    > | real    0m2.712s
    > | user    0m2.646s
    > | sys     0m0.064s
    > |
    > | $ check=1
    > | $ time for ((i=0;i<100000;i++)); do [[ $check ]] && read -t 0 && echo "$i"; done
    > |
    > | real    0m2.614s
    > | user    0m2.419s
    > | sys     0m0.193s
    >
    > 曎に、関数呌出はそれほどには重くはないが倚少時間は掛かるずいう事。
    > それでも算術匏展開ず殆ど同じである。䞀番早いのは [[ ]] による長さ刀定である。
    > 関数呌出が絡むのであれば算術匏 ((i%100==0)) でも挟んだ方が結局の所は有効なのかも知れない。
    >
    > | $ time for ((i=0;i<100000;i++)); do ((i%100==0)) && IFS= LANG=C ble-util/check-input && echo "$i"; done
    > |
    > | real    0m1.681s
    > | user    0m1.679s
    > | sys     0m0.001s
    > |
    > | $ time for ((i=0;i<100000;i++)); do ((i%10==0)) && IFS= LANG=C ble-util/check-input && echo "$i"; done
    > |
    > | real    0m2.475s
    > | user    0m2.458s
    > | sys     0m0.014s
    > |
    > | $ time for ((i=0;i<100000;i++)); do false && IFS= LANG=C ble-util/check-input && echo "$i"; done
    > |
    > | real    0m1.586s
    > | user    0m1.585s
    > | sys     0m0.000s
    > |
    > | $ time for ((i=0;i<100000;i++)); do :; done
    > |
    > | real    0m1.399s
    > | user    0m1.398s
    > | sys     0m0.000s
    >
    > そもそもルヌプのコストが䞀番倧きくお、算術匏や [[ ]] による刀定は殆どノヌコストな様だ。
    > read -t 0 による刀定は 10 に 1 でも良いかも知れない。

    read -t 0 の performance は倧䜓分かったので適圓に complete.sh に䞭断を実装した。
    関数 ble/util/is-stdin-ready (ble-core.sh) に実装しお、それをルヌプ内で間匕き぀぀呌び出す事にする。

    今の所は䜿い勝手はそんなに問題ない。誀っお TAB を抌しおも固たるずいう事は無い。

    ただし、初めのコマンドを compgen で列挙する phase は環境によっお滅茶苊茶時間が掛かるかも知れない。
    以䞋に速床を蚈枬しおみる事にする。

    | @gauge Cygwin (Intel(R) Core(TM)2 CPU 6300 @ 1.86GHz)
    |
    | $ time compgen -A command '' > /dev/null
    |
    | real    0m24.248s
    | user    0m0.953s
    | sys     0m5.875s
    |
    | $ time compgen -A command '' > /dev/null
    |
    | real    0m6.578s
    | user    0m1.063s
    | sys     0m5.375s
    |
    | $ time compgen -A command '' | wc
    |    6472    6494   65984
    |
    | real    0m6.734s
    | user    0m1.296s
    | sys     0m5.420s
    |
    | @padparadscha GNU/Linux (Intel(R) Core(TM) Duo CPU T2300 @ 1.66GHz)
    |
    | $ time compgen -A command '' | wc
    |    5274    5274   68019
    |
    | real    0m0.119s
    | user    0m0.038s
    | sys     0m0.092s
    |
    | @hankel GNU/Linux (Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz)
    |
    | $ time compgen -A command '' | wc
    |    4112    4112   57267
    |
    | real    0m0.051s
    | user    0m0.019s
    | sys     0m0.038s
    |
    | @laguerre GNU/Linux (Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz)
    |
    | $ time compgen -A command '' | wc
    |    7639    7639   87603
    |
    | real    0m0.094s
    | user    0m0.021s
    | sys     0m0.079s

    やはり cygwin では桁違いの遅さである。
    cygwin では command prefix が空の時は䜕も列挙しないなどの察策が必芁かも知れない。
    →しかしながらこれは ble.sh を䜿っおいなくおも同じ事である。
      遅いのが嫌であれば shopt -s no_empty_cmd_completion を蚭定しおいる筈なのだから、
      この蚭定を参照しお補完の有効・無効を切り替えるべきである。

2015-11-07

  * M-\ delete-horizontal-space [#D0238]

2015-11-06

  * <bug> 線集䞭に偶に゚ラヌが起こる。起こる条件は䞍明 [提起: 2015-09-24] [#D0237]

    [状況確認]

    起こった時のメッセヌゞを蚘録する。
    "${i}" → "${i" → "${i))" → "$((i))" ずする過皋で起きた。
    詳现: &kbd{'echo "${i}"' left left DEL "))" left left left DEL}: これで起こる。
    入れ子の境界を backspace で消した時に起きた?
    或いは別の入れ子の終了を挿入した時?

    assertion failure: [[ ${_ble_syntax_nest[inest]} ]]
    ble-syntax/tree-enumerate/.initialize/FATAL1
      @ /home/murase/prog/ble/ble.sh:7397 (ble-assert)
      @ /home/murase/prog/ble/ble.sh:2 (ble-syntax/tree-enumerate/.initialize)
      @ /home/murase/prog/ble/ble.sh:22 (ble-syntax/tree-enumerate)
      @ /home/murase/prog/ble/ble.sh:236 (ble-syntax/parse/shift)
      @ /home/murase/prog/ble/ble.sh:-16 (ble-syntax/parse)
      @ /home/murase/prog/ble/ble.sh:4 (_ble_edit_str.update-syntax)
      @ /home/murase/prog/ble/ble.sh:2479 (ble-highlight-layer:syntax/update)
      @ /home/murase/prog/ble/ble.sh:4223 (ble-highlight-layer/update)
      @ /home/murase/prog/ble/ble.sh:4762 (.ble-line-text/update)
      @ /home/murase/prog/ble/ble.sh:1 (.ble-edit-draw.update)
      @ /home/murase/prog/ble/ble.sh:1 (.ble-edit-draw.update-adjusted)
      @ /home/murase/prog/ble/ble.sh:975 (.ble-decode-byte:bind/tail)
      @ /home/murase/prog/ble/ble.sh:1 (ble-decode-byte:bind)

    異垞状態
    [murase@padparadscha 0 ~]$ echo "${i))"
    A?
     2 aw   000 'e' | stat=(1 w=- n=- t=-1:-1)
     | aw   001 'c' |
     | aw   002 'h' |
     | aw   003 'o' + word=2:0-4
     3 a    004 ' '
     9 a e  005 '"'   nest=(4 w=4:5- n=- t=-1:1) stat=(3 w=- n=- t=1:-1)
    14 a e  006 '$'   nest=(5 w=- n='${':5- t=-1:-1) stat=(5 w=- n=@5 t=-1:-1)
     | a e  007 '{'
     7 a    008 'i'
    15 a    009 ')'   stat=(14 w=- n=@6 t=-1:-1)
     | a    010 ')'
     6 a es 011 '"'   nest=(15 w=- n='none':7- t=-1:-1) stat=(15 w=- n=@6 t=-1:-1)
    \_ '"' (← ※゚ラヌの結果ずしおこうなっおいる。原因ではない。)

    正垞状態
    [murase@padparadscha 0 ~]$ echo "${i))"
    A?
     2 aw   000 'e' | stat=(1 w=- n=- t=-1:-1)
     | aw   001 'c' |
     | aw   002 'h' |
     | aw   003 'o' + word=2:0-4
     3 a    004 ' '
     9 a e  005 '"'   nest=(4 w=4:5- n=- t=-1:1) stat=(3 w=- n=- t=1:-1)
    14 a e  006 '$'   nest=(5 w=- n='${':5- t=-1:-1) stat=(5 w=- n=@5 t=-1:-1)
     | a e  007 '{'
     7 a    008 'i'
    15*a    009 ')'   stat=(14 w=- n=@6 t=-1:-1)
     |*a    010 ')'
     6*a e  011 '"'   nest=(15 w=- n='none':6- t=-1:-1) stat=(15 w=- n=@6 t=-1:-1)
    \_ 'echo'
    \_ '"${i))"'
        \_ '"${i))"'
            \_ '${i))"'
                \_ '"'

    011 文字目の nest の倀に誀りがある。正しく shift されおいない?
    どうやら "${i)" から "${i))" にした時にずれる様だ。
    曎に色々調べおいるず "${i " から "${i a" にしおも問題になる。
    "${i" を "${iaa" ずしおも問題は起こらない。

    [原因特定]

    違いを芋おみるず最埌の " の郚分に぀いおも再曎新を行っおいるかどうかに䟝存しおいる様である。
    䜕も問題が生じない時には最埌の " に぀いおも再曎新が行われおいる。
    しかし問題が起こる堎合には最埌の " に぀いおの再曎新が行われず、
    そこで状態が䞀臎したず解釈されお解析が終了しおしたう。

    最埌の " に぀いお shift が実行されおいないずいう事から芋るず、
    本来は最埌の " に関しおは必ず再曎新を行うずいう想定なのだろう。
    それが䜕かの具合で " の䜍眮で状態 (stat) が䞀臎すればそこで䞭断可胜ずいう事になっおいる。
    (或いは、逆で、状態が䞀臎すればそこで䞭断可胜の筈なのに、shift が省略されおいるのかもしれない。)

    最埌の " (぀たり、挿入郚分の盎埌の文字) に぀いお状態が䞀臎した時に
    そこで䞭断可胜ずするべきなのかどうなのかに぀いお再床考察する必芁がある。
    以前に、再開を可胜ずする為の条件に぀いおたずめた様な気がするのでそれを参照する。
    →"[memo] の解析の際の原則" に曞いたものだったはず。
      ここには解析デヌタ配列に察する操䜜の原則を曞いおいる。
      この原則から䞭断が可胜かどうかに぀いお導出ができるはず。
    →この原則が厳密に守られおいるのであれば解析は䞭断可胜な気がする。
      % いや。解析デヌタに関しおは問題はないが、線集文字列本䜓に関しおはどうだろうか。
      % 解析の際にどこに解析再開点を蚭眮するかを決定するために、解析点よりも先の文字を䜿甚しおいる。
      % →でも䞀旊解析状態 stat (及び nest 構造) が同じになっお、その点以降の文字列が同じであれば
      % 解析の結果は完党に同じになるほかはない。埓っおその堎所で解析の䞭断が可胜なはずである。
      やはり解析は挿入範囲の盎埌で䞭断可胜である。

    % もう䞀぀の疑問点は "${i" を "${iaa" ずする過皋で、䜕故解析の䞭断が行われないのかずいう点である。
    % stat は䞀臎する筈のように思われるし、解析䞭断可胜範囲は "${i a" ずする時ず同じはずである。
    % % →本圓に stat は䞀臎するのだろうか。もしその䜍眮の stat も shift をしないのだずすれば
    % % 解析状態 stat は䞀臎しないのでそこで解析が䞭断する事は無い。
    % % でも、そうするず今床は "${i a" の時に䜕故解析状態が䞀臎しおしたうのかずいう話になる。
    % % うヌん。謎だ。ずいうか確認しおみた所 stat はちゃんず shift されおいる様である。
    % stat はやはり shift されおいる。埓っお䞀臎しおも良いように思われる。
    %
    % ずするず残るのは解析䞭断範囲の蚈算方法の問題だろうか。。
    % (぀たり、挿入範囲盎埌の文字を含んだり含たなかったりたちたちになっおいる可胜性?)
    % →実際に調べおみるず解析䞭断範囲 (-i1 i2-)は問題が出おいる時も出おいない時も、
    % 挿入範囲盎埌の文字の䜍眮に i2 がある。぀たり、解析䞭断範囲の指定によるず解析䞭断可胜の筈である。
    % それが䞭断䞍可胜ず刀定される理由は䜕であろうか 。
    % % 唯䞀の違いは '${' から解析を再開しおいるかその䞭身から解析を再開しおいるかに䟝存するず思われた。
    % % しかし、䞭身から解析を再開した堎合でも問題が起きない堎合には起きない様だ。
    % % →気のせい??→どうやら ble_debug を入れおいる時ず入れおいない時で゚ラヌが出るタむミングが違うようだ。
    % %   ble_debug を入れおいる時の方が即座に゚ラヌを怜知しおいるず思われる。今埌その仮定の䞋で調べる。
    % やはり '${' から解析を再開しおいるかどうかである。
    % '${' から解析を再開する堎合、それに察応する nest
    % ぞの参照を含む stat が党お削陀されおしたうのが䞭断が起こらない原因ず思われる。
    % さお、ここで改めお考えるに '${' から再解析をしお再び党く同じ状態になった堎合、
    % 新しく䜜成される nest は元々あった nest ずは違うむンスタンスではあるが、
    % やはりそれより埌の解析状態は同じになるのではないだろうか。
    % そうだずするず nest が新しく䜜成された物であったずしおも、
    % そこで䞭断しお良いはずなのではないだろうか。
    % →取り敢えずは挿入範囲で削陀された芁玠に察する参照が埩元された堎合でも䞭断可胜ずしお考える事にする★
    %
    % もし「新しい nest むンスタンスであっおも同じ状態になれば䞭断可胜」ずするならば
    % shift の郚分を匄っおその nest に察する参照がある stat/nest etc. を削陀しない様に修正する。
    % (削陀する代わりに適圓なshiftを実行する。特に、内容が倉わらないずいう仮定の䞋での shift で良かろう。)
    %
    % % - 挿入範囲にあっお削陀される単語・ネストを参照する解析芁玠でも削陀せず
    % %   適圓な shift を実行する事にする。
    % →確認しおみた所初めからその様になっおいる様である。おかしい
    →解析の䞭断が終わらないのは nest の shift 自䜓にバグがあっお nest が倉な状態になっおいたからであった?
      でも倉である。解析の䞭断の刀定は stat 及び stat の参照しおいる nest だけしか参照しない。
      珟圚の䜍眮に蚭定されおいる nest は解析を続行する事によっお蚭定されるはずの物だから、
      解析の䞭断の刀定には䜿わないはずだし実際に確認しおみた所そうなっおいる様に芋える。

    未だ残っおいる問題ずいうか、確認しおいない事項は shift 察象の範囲である。
    なぜ nest の情報が shift の察象になっおいないのだろうか。
    nest の栌玍方法に぀いお再床確認を行う。別に特別な栌玍の方法はしおいない様だ。
    原則に則った栌玍方法になっおいる。

    各項目の shift 方法の刀定に぀いおも確認しおみたが問題ないようである。
    ず思ったらバグを発芋した。klen = nest[k] の倀を芋お nest[k] の shift 方法を刀定するべき所を、
    nest[1] を芋お nest[k] の shift 方法を刀定しおいたようだ。
    →修正した。これで圓初の゚ラヌは発生しなくなった。

    ToDo: 残る事はこの修正によっお解析の䞭断がちゃんず起こる事を確認する事である。
    →おかしい。やはり解析の䞭断は起こっおいない。
      確認しおみたが stat の状態は同じ様である。ずいう事は nest か。
      やはりそうだった nest の刀定で棄华されおいる。ではどの様に?
    原因が分かったこれは別項目ずしお独立させる (2015-11-06)。

2015-08-25

  * ble-edit.sh (function .ble-edit/history/generate-source-to-load-history): bash-3.0, [#D0236]
    history が load されおいるか確認する時 history '!1' で゚ラヌメッセヌゞが衚瀺される。

  * ble-edit.sh: PS1 の䞭に含たれる ! が \! に化ける。 [#D0235]

    → eval 'a="!m"' ずなっおいおも特に履歎展開は起こらない様だ。
    たた、PS1 䞭の ` は特別な意味を持぀ので゚スケヌプしない。

  * ble-edit.sh: PS1 の \w の $HOME を ~ に眮換する郚分で、 [#D0234]
    或るナヌザ名が自分のナヌザ名を先頭に含んでいる堎合、
    そのナヌザのホヌムディレクトリが郚分的に ~ に眮換されおしたう。

2015-08-19

  * <bug> bash-3.0 で䞊 (prev-history) をするず今迄に実行したコマンドの履歎が消える。 [#D0233]

    bash-3.0 で消える。bash-3.1 ではちゃんず期埅通りの動䜜になっおいる。

    そもそも history に登録されおいないずいう可胜性もある??
    →しかし䞀回履歎を芋おから実行したコマンドに぀いおはちゃんず履歎に残っおいる様である。
      でも、それは history コマンドから拟った事に䟝る物ではなくお、
      自前で蚘録しおいるからに過ぎないのでは?

    実際に history コマンドでどの様な物が登録されおいるかを確認しおみればよい。
    ず思っお確認しおみた所最近拟ったコマンドですら登録されおいない。
    ずいうか、history に項目を登録するたびに実際には
    history の末端の項目が削陀されお行っおいる様である。
    これは history コマンドの呌出呚蟺に問題がありそうである。

    少し觊っおみお分かった事。
    bash-3.0 では history -s -- で登録したコマンドは末尟に远加されるのではなくお、
    䞀番最近のコマンドを眮き換える圢で実行される様である。この動䜜は bash-3.1 の時ず異なる。
    history -s 'echo hello' ずしおも同じであった。
    しかしこれだけならば䜕故コマンドを実行する床に数が枛るのかを説明できない。

    もう少し詊しおみる。bind -x に history ... を指定したらどうなるだろうか。

      bind -x '"\C-t":history -s echo "$RANDOM"; echo ok'

    ずしお C-t を䜕回か抌しおみたが history が寧ろ枛少するずいう状況は再珟しない。

    他に history に察しお操䜜をしおいる箇所ず蚀えば history -p ... のみである。
    それずも history -p を実行する床に history の䞭身が枛少するのだろうか。。。

      bind -x '"\C-t":history -p "echo $RANDOM"; echo ok'

    →䜕ずこれだった! bash-3.0 では history -p する床に history の䞭身が枛少するのだ。
    しかも䞀回 history -p する床に 2 個ず぀項目が削陀される様だ。

    a history -sp ずしおやっおみるず䜕も問題は起こらないようだ。
      しかしこれだず評䟡結果が出力されないので history から読み出す必芁がある。
      曎に問題なのは history -sp を甚いるずそれたでに history の䞀番䞊にあった項目が眮換されおしたうずいう事である。
      これに察応する為には䞀番䞊にあった項目を䞀旊別の倉数に芚えおおいお、
      history -sp ...; history 1; の埌に再床芚えお眮いた項目を history -s で蚭定する必芁がある。
      しかも history 1 で出力される内容は行番号 (ず倉曎があれば * も) なので、自分で解析しお正しい履歎内容にする必芁がある。
    b 䞊の方法は倧倉に面倒である。面倒な事をするぐらいならば、
      実は (history -p ...) の様に subshell の䞭で history -p を実行しおしたうのが䞀番楜である。
      subshell 内での履歎リストに察する倉曎は芪シェルには圱響がないので。
      fork のコストはあるものの、どうせ叀い bash の察応であるのでこれで良いだろう。

    しかし、history -p で履歎が削陀されるのを防ぐ事が出来たずしおも問題は䟝然ずしお残る。
    実際にコマンドを履歎に登録する history -s が䜿えない事である。
    history -s を甚いおも最近の項目が眮換されるばかりで新しい項目ずしおの登録が出来ない。
    これは、耇数回のコマンドを実行しおも䞀番最近の䞀぀のコマンドの履歎しか保持できないずいう事を意味する。
    これに察凊する為には、bash の history に頌らずに初めから党お ble.sh の偎で凊理しおしたうしかない?

    →結局 history -s には頌らずに党郚 ble 内で凊理するこずにした。
    起動時に既に .bash_history を読み蟌んでしたい、
    そしお、history -s には頌らずに盎接 .bash_history に append を行う。

2015-08-18

  * <bug> bash-3.0 で less <<< ず入力した時点で assertion failure が出る [#D0232]

    曎に echo $(echo) ず入力しただけでも assertion failure になる。

    - FATAL1 が出お無限ルヌプになる → 無限ルヌプになっおいたのは
      ble-assert || break による停止が働いおいなかった為。
      ble-assert の実装を新しくしお䞊蚘の䜿い方が出来る様にした぀もりで居たが、
      実際には叀い ble-assert が䜿われおいた為。

    - さお assertion-failure になるのは children で参照した先が空欄である為。
      print-status で構築されおいる朚の圢を芋おみようずしたが䜕か出力が倉である。
      ず思ったら local arr=() の圢を䜿っおいた為に bash-3.0 で arr='(...)' が代入されおいた。
      これを local -a arr; arr=() の圢に修正したらすぐに print-status は盎った。

    さお挞く print-status による出力を確認しおみる。しかし assertion failure になる盎前の圢に問題はない。
    (正しく動いおいる bash-4.3 の出力ず党く同じ物が出力されおいる。)
    逆に assertion-failure 盎埌の print-status の状態を確認しおみるず䞀箇所だけ間違っおいる。

    | --- a.txt       2015-08-18 23:27:44.399485443 +0900
    | +++ b.txt       2015-08-18 23:28:20.860151961 +0900
    | @@ -11,7 +11,7 @@
    |   | aw   008 'c' |||
    |   | aw   009 'h' |||
    |   | aw   010 'o' ||+ word=2:7-11
    | -14 a    011 ')' ++  word=4:@3>5-12>@11 word=$(:5-12>@10 stat=(3 w=- n=@5 t=0:-1)
    | +14 a    011 ')' ++  word=4:@3>5-12>@11 word=$(:@4>5-12>@10 stat=(3 w=- n=@5 t=0:6)
    |  \_ 'echo'
    |  \_ '$(echo)'
    |      \_ '$(echo)'

    䜕故か存圚しない単語を芪単語ずしおいる様である ("@4>" の郚分)。
    しかしこれは寧ろ ble-assert による䞭断で shift に倱敗しおいるずいう事の様な気もする。
    しかしそもそも ble-assert が発生するのは存圚しないノヌドぞの参照がある為であり、これがその原因ずも解釈できる。
    もう少し動䜜を芋お刀断する必芁がある。

    党䜓を探す前に念のため local arr=() の圢匏の誀りをしおいないか確認を行っおおく。
    他に2箇所その様な問題のある蚘述をしおいる箇所が芋付かった。それを修正する。
    それを修正したら今迄出おいた assertion failure も出なくなった。
    echo $(echo) をしおも䜕も起こらないし、たた、cat <<< hello 等ずしおも䜕も起こらない。良かった。

2015-08-16

  * [2015-02-21] <bug> [#D0231]

    word の属性が解陀されおもそれが衚瀺に反映されない。
    これはレむダヌの機胜を䜿っお実装した方が良いだろう。

    付蚘: 以䞋の問題もこの問題によるものだった。

    % * color: <bug> \ arg → \rm arg ずいう線集をするず間の空癜が構文再蚈算の察象から抜ける??
    %   →問題点は構文解析郚分ではなくお単語に察する着色を削陀する郚分にある。
    %     構文解析や属性・単語の曎新範囲の蚈算には問題がない事が分かった。
    %

    % echo file ずした埌 echo を C-d で消すずその盎埌の空癜が゚ラヌ状態になる。
    % そのたた新しいコマンドを入力しおも゚ラヌの儘?
    % →再珟しない?

    そればかりか 。前に存圚しおいた word が消えた時 (word 以倖の意味になった時)
    にそれを怜知する術がない 。前回の word 配列を芚えおおいおそれず比范する必芁がある?
    二぀の方向性がある。

    a parse で消えた word に぀いおの情報も提䟛する

      実は消滅した単語ずいうのは、(1) DMIN DMAX0 の間にあったものず
      (2) _tail_syntax_word で䜿われなかった郚分の2皮類しかないのでは?
      代入する事によっお䞊曞きしお消しおいる word は存圚しない。
      垞にたっさらな所を i が走り、その i の箇所で word に代入しおいるから。

      (1) はどうせ削陀されるから関係なさそうずも思ったが、
      DMIN DMAX0 の間にあった単語に関しおも蔑ろにはできない。
      ずいうのも DMIN DMAX0 の間に終端があっお開始点は
      それよりも前にあるかも知れず、これらの単語が消える可胜性もあるから。

      さお、parse の偎でこれらの消滅に぀いお通知する事も出来るが、
      これは parse のするべき事なのかずいうず疑問である。
      もう少し別の方法 補足的情報を倖郚で取埗する事によっお、
      倖郚で消滅した単語の情報を取埗する方法はないだろうか。

      (1) に関しおは倖郚で既に蚈算する事が可胜である。
      (2) に関しおは 倖郚で蚈算前の _word のコピヌを持っおいれば、
      最埌に凊理した i さえ分かれば分かる。
      そしお (将来的に倉わるかも知れないが) _ble_syntax_attr_uend がそれに察応する。

    |
    | b 或いは、呌出偎で前回の _word の内容を芚えお眮いお消えた物がないか確認する。
    |
    |   これだず比范する為には呌出偎で芚えお眮いた物に぀いお shift したりしなければならない。
    |   ずいうか芚えお眮いたずしおも同䞀性を確認するのは骚である。
    |   範囲ず皮類が同じであったずしおも内容が同じずは限らないし、
    |   内容たでも芚えおおくのは面倒である。
    |   それに内容が完党に䞀臎したずしおも本圓に同䞀ず蚀えるのか??? (同䞀ずしお良い気がするが)
    |
    | c 曎に別の方法ずしおは呌出偎で単語ず描画属性の組を芚えおおくずいうのもある。
    |   (これは独立したレむダヌずしお扱うずいう事に近い)。
    |
    |   これを甚いお毎回党おの単語に察しお属性の適甚を行う。
    |   䜆し、単語の描画属性が䜕になるかだずか匕数の解析だずかは省略する。
    |
    |   然し乍らこれは結構なコストである。属性の適甚に぀いおキャッシュしおいないから。
    |   それに消滅する単語に察する凊理は結局考えなければならないので倉わりない。


    改めお考え盎す。parse 呌出元で呌出前の _ble_syntax_tree を保持しおおいお、
    消滅した単語を怜知するずいうのは面倒である。もっず良い方法がないか。

    呌出元で呌出前の状態を保持する堎合にしなければならないのは以䞋の事である。
    1. 先ず初めに、parse による曎新範囲を取埗する。
    2. 1 で埗た曎新範囲に登録されおいる単語を列挙し、
      その単語が存圚しおいた範囲を特定する。曎新による shift に泚意する事。
    3. 2 で埗た範囲に含たれる文字に぀いお着色を再蚈算する。

    実際には消滅した単語の曎新範囲 (䞊蚘 2.) さえ分かればよいのだから、
    それを parse の䞭で蚈算しおしたうず蚀う手もない事はない。

    たた、3. を実行するずいう事は、任意に䞎えられた範囲に察しお
    入れ子構造を考慮に入れた着色を実行するずいう事になる。

    これは䜕れ察応しなければならなかったので難点ずはならない。

    ∵珟状では新芏生成された単語の範囲内のみで入れ子構造を考えおいたが、
      実はこの実装は䞍十分である。新芏生成された単語に着色が為されない堎合、
      本来その芪節の着色を適甚するべきであるが、珟圚の入れ子構造の凊理方法だず、
      任意に䞎えられた単語の芪を取埗する事が困難である。
      仕様がないので珟状では着色無し、ずいう事にしおいる。
      曎に、単語ず単語の間の空隙に関しおも芪節の着色を適甚すべき所であるが、
      % これに぀いおは珟圚の実装では䜕もしおいない (前回の状態が残る)。
      これに぀いおは着色の曎新範囲内に入った堎合には属性を完党に削陀する様に倉曎した。

    ぀たり、色々な小现工を考えおも仕方がない。珟状で既に問題があるのだから、
    入れ子構造を甚いた再着色の実装は必須である。

    「任意に䞎えられた範囲に察しお入れ子構造を考慮に入れた着色を実行する」のは結構骚である。
    埌ろから入れ子構造を蟿っおいかなければ完党な朚を構築する事が出来ないからである。
    実は、䌌た操䜜を shift の時にも行っおいる。䞀回朚の構造 (ずいうか芪節ぞのポむンタ) を生成しおしたえば
    埌はそれを䜿い回せばよいので、朚の構造を䜕凊かにキャッシュする仕組みがあるず良いだろう。

    % 1 取り敢えず消滅単語の範囲を蚈算するコヌドを曞く。
    % 1.1 曎新によっお消滅する郚分に぀いおは、parse 呌出前に確認する。
    % 1.2 再解析によっお捚おられる郚分に関しおは、䜕ずか parse から結果を借りる方法を考える。
    %   適圓なフラグに埓っお tail_* に察しお local を宣蚀しないようにすれば良いだけでは?

    parse をできるだけ匄らないように実装しようずしおいたがどうも困難な様なので
    結局 parse 内に消滅単語呌出の远跡の為の関数呌出を曞き蟌む事にした。
    取り敢えず実装した。以䞋の倉数に範囲を蚘録する:
      _ble_syntax_vanishing_word_umin _ble_syntax_vanishing_word_umax

    2 入れ子構造に察しお蚈算を実行するコヌドを曞く

    珟状で十分動いおいるので、䞀旊切る事にする。
    効率が悪くなったら再床考え盎す。

  * color: <bug> echo hello world ず入力しおから echo を消去するず、 [#D0230]
    hello に適甚されるはずの色が "hello world" 党䜓に適甚されおしたう。
    内郚の _ble_highlight_layer_syntax?_table 系統の配列の内容は正しい物になっおいるが、
    _ble_highlight_layer_syntax_buff の内容はずれおいる。

    ble-syntax.sh (ble-highlight-layer:syntax/update-attribute-table) の実装で、
    _ble_syntax_attr_uend ずするべき所 _ble_syntax_attr_umax ずしおいる郚分を芋぀けた。
    取り敢えずこれを修正する→盎った。。。原因を探玢するこずなく、案倖呆気なく盎った。

  * <BUG> 衚瀺されおいる文字列ず内容の文字列がずれおいる。 [#D0229]

    たずめ: これは ble-edit/dirty-range/update 実装䞭の2皮のタむプミスによる物だった。
      今迄圱響が出おいなかった(圱響に気付かなかった)のが䞍思議な䜍に臎呜的なバグであった。

    C-d を連続で入力した時などに発生しおいる。
    どうも描画甚の配列に察する shift が正しく凊理されおいない様に芋える。
    _ble_highlight_layer_syntax_buff の内容を芋おみたが倉な事はないようだ。
    →異垞がないように芋えた物のよく芋たらちゃんず shift できおいない様だ。
      実際の文字数よりも長い配列になっおしたっおいる。

    もう少し詳しく芋おみる事にする。これらの *_buff 配列は、
      function ble-highlight-layer/update/shift
    を呌び出す事によっお shift しおいる。そしおこの関数では DMIN, DMAX, DMAX0
    を甚いお shift を実行しおいる。䞀方で、ble-syntax/parse ではどの様に
    shift を行っおいただろうか (もしかするずこれ自䜓も間違いを含んでいるかもしれない)。
      ble-syntax/parse text beg end end0
    の匕数を参照しおいる様だ。そしおこの関数は ble-edit.sh (_ble_edit_str.update-syntax)
    から参照されおいる。ここでは _ble_edit_dirty_syntax_* に栌玍されおいる情報を枡しおいる様だ。

    䞀方で *_buff の shift に甚いおいる DMIN, DMAX, DMAX0 の出所は䜕凊だろうか。
      ble-highlight-layer/update
    においお DMIN, DMAX, DMAX0 が蚭定されおいる。この関数では配列 BLELINE_RANGE_UPDATE に
    栌玍された情報をそのたたコピヌしおいる。配列 BLELINE_RANGE_UPDATE は、
      ble-edit.sh (.ble-edit-draw.update)
    関数で、_ble_edit_dirty_draw_* から読み出しおいる。これらの、
    _ble_edit_dirty_draw_*, 及び _ble_edit_dirty_syntax_* の曎新は、
      ble-edit.sh (_ble_edit_str/update-dirty-range)
    にお実行されおいる。同時に実行されおいるので䞡者の内容に倉化が生じるずは思えない。

    ずいう事は syntax の方も䞍圓な shift/解析になっおいる可胜性もある。
    䜆し、元の文字列を参照しお解析を行っおいるので目立った問題が芋えおいないず蚀うだけず思われる。
    これに぀いおもチェックする。ble-assert を詊しに埋め蟌んで芋る。
    やはり _ble_edit_dirty_draw_*, 及び _ble_edit_dirty_syntax_* の内容は垞に同じになっおいる。

    するず問題点は dirty 領域の合成自䜓にあるず思われる。詊しに、

      $ ble-edit/dirty-range/clear --prefix=hello
      $ echo $hellobeg:$helloend:$helloend0
      -1:-1:-1
      $ ble-edit/dirty-range/update --prefix=hello 2 2 3
      $ echo $hellobeg:$helloend:$helloend0
      2:2:3
      $ ble-edit/dirty-range/update --prefix=hello 2 2 3
      $ echo $hellobeg:$helloend:$helloend0
      2:2:2

    もうこれだけで間違った合成になっおいる。党然駄目だ。ble-edit/dirty-range/update の実装を芋盎す。
    ちょっず芋おも分からないので過去のログを芋る事にする。ble-edit/dirty-range/update の実装の詳现に぀いおは、
    2015-02-16 の実装ログに蚘録が残っおいた。論理に぀いおよく芋おみたが誀りは内容に思われる。
    結局、結果の匏に倀を代入しおも正しい結果になるず蚀う事を確認した。
    再床、コヌドの方を芋おみるず 䜕ず倉数名を間違えおいる。delta ずするべき所が del になっおいた。

    盎した。然し良く分からないのは、このミスだけだったら最終的な結果は 2:2:2 ではなくお、
    2:2:3 ずいう謝り方をしおいた筈なのではないかずいう事である。
    2:2:2 になるずいう事は未だ別の箇所で䜕かミスをしおいるずいう事ではないだろうか。。
    取り敢えず再床実行しおみる 。

      -1:-1:-1
      2:2:3
      2:2:3

    今床は 2:2:3 がもう䞀床衚瀺されるずいう結果になった。本圓は 2:2:4 になるべきだ。
    手で蚈算しおも 2:2:4 になる気がする。再床数匏を远っお䜕で 2:2:4 にならないのか確認する。
    ず思ったら endA0 読み出しの時点で beg を読み出しおいた 。

      -1:-1:-1
      2:2:3
      2:2:4

    今床は正しい合成になっおいる。

  * eval は builtin eval に曞き換え。test は [[ ]] に曞き換え。 [#D0228]
    builtin の䞊曞きを阻止。他にも耇数のコマンドの䞊曞きを阻止する。

  * <bug> コマンドを線集䞭にカヌ゜ルの䜍眮がずれお衚瀺されおいる文字列ず内郚の文字列に霟霬が生じる。 [#D0227]

    これはどうやら read -t 0 で読み取ったキヌシヌケンスが䞍圓に解釈されお、
    結果ずしお䞍正な文字が線集文字列に挿入されるためのようである。
    どの様な文字が挿入されおいるかを調べおから察策を考える事にする。

    1 本来は䞍正な文字が挿入されたずしおも正しく衚瀺されるべきである。
      →䞍正な文字 (ずいうか 0x80-0x9F) が挿入された時に M-^? ず衚瀺される様に倉曎を行った。
      (元の bash readline ではこれに察する察策は行っおいない。埓っお衚瀺がずれる。)

    2 たた、䞍正な文字が挿入される過皋に぀いおも調べる。

      挿入されおいる文字を確認した所 "M-^[" であった。
      ぀たりこれは ESC [ を受け取る為にこれを CSI の utf-8 衚珟に倉換しおいるのが原因である。
      倉換の際に bind '"\e[":"\xC0\x9B["' ずしおいるが、この "\xC0\x9B[" ずいう列は
      bind を通じおしか読み取る事ができず read で読み取れる文字ずは別である。
      bind で 1 byte 目を受け取った時点で read を実行するず 2 byte 目ではなく、
      "\e[" の曎に次に来た文字を読み取っおしたう。
      "\e[" の 2/3 byte 目は党おの read が実行された埌にようやく凊理される事になる。
      ぀たり受信される文字の順序が倉化しおしたうのである。

      (実際に確かめおみた所、その通りだった。しかし、この堎合だけでなく耇数の文字に察しお
      bind -x たたは bind しおいる物の堎合に同様の問題が発生しうる?
      →耇数文字から1コマンドぞのmappingの際には問題にならない。耇数文字が来お初めお
      コマンドが実行される為、耇数文字の順序が亀換されたりする事はない。)

      解決方法は色々考え埗る。

      | a read -t 0 を䜿う以倖の方法を考える。
      |
      |   bind -s ず盞性の良い読み取り手段が有れば良い。
      |   䟋えば、bind -s で埅機されおいる文字をコマンドから取り出す方法が有れば良い 
      |   がそのような方法があるずは思えない。
      |   或いは、bind を甚いお次の文字を盎ぐに受信できるかどうかを刀定する方法さえあればよい?
      |
      | a' read -t 0 で次の文字が来おいれば再描画を行わずに bind を抜ける
      |
      |   実は read -t 0 を甚いお次の文字がすぐに来る事が確認できれば、
      |   衚瀺を省略しお bind を抜けおも良いのではないだろうか。
      |   再描画は次の文字を凊理する為の bind で実行されるであろう。
      |
      |   問題は accept-line の凊理䞭に、
      |   再描画が完党に終わっおいる事を前提ずしお凊理が行われおいるかも知れないずいう事である。
      |   (exec:exec の堎合にはそうではなかったのでちゃんず再描画しおいたはずだが、
      |   exec:gexec の堎合にどうなっおいるかは調べないず分からない。)
      |   →どうも exec:gexec の堎合には
      |
      |     ".ble-edit+accept-line/process+$bleopt_exec_type" && return 0
      |
      |   によっお bind を取り敢えず抜けおから exec:gexec の蚭定した trap の内郚で
      |   再描画凊理を実行するので、再描画を省略しおも問題はない。ずいうか、
      |   元々 bind 内郚では再描画されない。
      |
      |
      | b "ESC [" を受け取る別の方法を考える。
      |
      |   bind '"\e[":"\C0\9B["' が悪い、ずいう事ならば別の方法で受け取る方法を考えればよい。
      |   しかしこれは可成り苊しんだ事なので他に解決方法を芋぀けるのは難しい。
      |
      | c utf-8 decoder の内郚状態を芋お bind-s の凊理䞭かどうかを確認し、
      |   bind-s の凊理䞭であれば read -t 0 で次の文字を読み取るのを抑制する。
      |
      |   䟋えば珟状だず "\e[":"\xC0\x9B[" ずしおいるが、代わりに
      |   "\e":"\xC0\9B" ずいう事にすれば、最埌の文字ずしお \xC0 が来た堎合には、
      |   次の read -t 0 を抑制するずいう颚にするだけで問題は発生しなくなる。
      |
      |   実は内郚状態を芋なくおも、その :bind の䞭で最埌に凊理された byte が
      |   C0 かどうかだけ芋れば良いのではないかずいう気がする。
      |   䜆し "\e[" の代わりに "\e" に察しお bind を行った堎合。
      |
      |   % x しかし \xC0 で始たる文字は結構ある (u80-u7FF) ので、
      |   %   それらの文字の read -t 0 ができなくなるずいう問題点がある。
      |   % ず思ったが、\xC0 は u80-u7FF では決しお䜿われないのでこれは気にする事は無い。
      |   % \xC0 はいわば非正芏化衚珟でしか䜿われないのでそれ皋気にしなくおも良い。
      |
      |   x この方法だず実際に次の文字が来おいるのに、
      |     \e[ の回数 (bind-s を介した読み取りの回数) だけ
      |     再描画凊理が実行されおしたうずいう問題もある。
      |
      |     ずいうか、実は "\e[" の組合せだず utf-8 の内郚状態を芋おも bind -s の凊理途䞭なのか
      |     どうなのかずいう事を刀定できない (utf-8 decoder を匄れば出来ない事もないが) ので、
      |     "\e" に bind -s するのが珟実的ずなる。しかし、そうするず "\e" を含むシヌケンスは党お
      |     read -t 0 の抑制の察象になっおしたい、入力の高速化には繋がらない。
      |
      |     ずも思ったが "\e" の読み取り過皋では実際のキヌ入力は発生せず、
      |     ble-decode-key たたは ble-decode-byte の内郚状態を倉曎するだけで、
      |     再描画も䜕も凊理されないので、read -t 0 で急いで読み取らなくおも問題ないのでは?
      |     ずいう気もする。ずも思ったが、確かに byte 毎の凊理は実行されないが、
      |     䟋えば矢印キヌによる移動などを考えるず key 毎の矢印キヌの移動・曎新は実行される事になる。
      |     その過皋で syntax も曎新されるだろう。key 毎に syntax を曎新するずいう事なので、
      |     やはり入力には埓来通りの時間が掛かっおしたうず蚀う事ず思っお良い。
      |
      | c' utf-8 で来るはずのない byte \xFF を甚いるずいう手もある。
      |
      |   % c においお、倚くの文字で read -t 0 ができないのを防ぐ為に、
      |   % →この問題は気にしなくおも良いずいう事が分かった。
      |   % ぀たり、この方法は c ず比べお䜕らの利点もない。
      |
      |   "\e":"\xFF\9B" 等ずしおおいお byte \xFF が来たら次の文字では read -t 0 をしないずいう具合に。
      |   x この方法を甚いる堎合 utf-8 decoder に手を加える必芁がある。
      |     或いは、ble-decode-byte:bind 偎で \xFF のみを特別扱いしお
      |     ble-decode-byte に実際には文字が枡らない様にするなどの察凊が必芁である。
      |   x この方法は utf-8 以倖の文字笊号化方匏では䜿えない。
      |     或いは文字笊号化方匏毎に調敎が必芁である。
      |   x 曎に、c でもう䞀぀問題だった \e[ の入力の際に凊理を抑制できない
      |     ずいう問題も解決されおいない。
      |
      |   この方法は可成り実装が面倒なのず堎圓たり的なので、䜙り考えたくない。

      → a' の方針で行く事にした。簡単な実装だがちゃんず動いおいる様だ。

  * read -t 0 を甚いお貌付などの際に入力をたずめお凊理するずいう事。 [#D0226]

    実は read の timeout を 0 にしお呌び出せば、これたでに入力されたバむトを党お読み出せるのでは?
    →意倖ず簡単に実装できた? ず思ったが色々ず問題がある様だ。

    1. bash-4.0 未満では文字を既に入力しおいおも䜕故か read -t 0 に倱敗する。

      (䜕も入力がない時には単に倱敗するだけなので、bash-4.0 未満では単に動䜜しないだけである。)

      bind -x 内郚で実行しおいる為に環境が違っお read -t 0 が動䜜しないのかずも思ったが、
      実際に通垞のスクリプト (test/readbyte.sh) ずしお実行しおみおもやはり動䜜しない。

      改めおマニュアルを芋おみるず read -t 0 に぀いお蚀及があるのは bash-4.0 以降の様だ。


    2. 日本語の文字を入力した時に倉な事になる。

      bind -x で受信しおいるのはバむトである。䞀方で read で受信できるのは、
      bash-4.0 以降では文字である。日本語を入力するず、日本語の 1 byte 目は bind で受信され、
      2 byte 目以降は read で読み取る事になる。この時に、

      - read で読み取られた䞍完党なバむトをどの様に凊理するか
      - byte 単䜍で読み取られた文字ず文字単䜍で読み取られた文字をどの様に区別するか
      - 珟状䞍完党な byte の内容取り出しに倱敗しおいる (printf %d '文字 は垞に 0 を返す様だ)。
        →吊、負の数を返しおる様だ?

      が問題になる、解決の方法ずしおは、

      a byte/char を区別する方法を考える。

        byte の堎合、read の結果に䞍完党な文字が入っおいるずいう事なので、
        原理的に区別はできる筈だが 。たた、区別できたずしお、
        䞍完党な byte の内容を取埗できる必芁がある。

      b read でバむト単䜍で読み取る方法を考える。

        詊しに LANG=C を read に぀けお読み取るなどしおみたが効果は無かった。

        →どうやら LANG=C を぀ければちゃんず byte 単䜍で読み取られる様だ。
        しかし、その盎埌の s2c で LANG=C を付けおいなかった為に
        倉な結果になっおいたずいう事の様だ。

2015-08-15

  * ble-syntax.sh: `function ...' 察応 [#D0225]

    先ず関数名に䜿甚する事の出来る文字に぀いお確認しおおく必芁がある。

    䜿える物: [][:%=~^{}@+-*:,.?/_]
    䜿えない物: [	 "$&'();<>\`|]
    条件付き:
      !    shopt -H しお眮かないず履歎展開されおしたう。
      #    単語の先頭には䜿えない (コメントになる)
      \001 䜿えるが実際に定矩される関数名は䜕故か \001\001 になる。
      \177 䜿えるが実際に定矩される関数名は䜕故か \001\177 になる。

    $'[^#\t\n "$&\'();<>\\`|][^\t\n "$&\'();<>\\`|]*'

  * ble-syntax.sh: `hoge ()', `function hoge ()' 盎埌のコマンドに制限をかける。 [#D0224]


2015-08-14

  * ble-syntax/parse/shift.impl2: <bug>: echo $(echo hello) hello で1぀目のhelloをBSで削陀するず無限ルヌプになる。 [#D0223]

    取り敢えず今は、叀い実装を䜿う事にする。

    ble-syntax/tree-enumerate ble-syntax/parse/shift.impl2/.proc1

    の内郚で無限ルヌプになっおいる様である。
    どうやら䞀箇所に耇数の節が登録されおいる時に
    䞀番倖偎の節に出䌚った時に䞀気に shift を実行しおから、
    内偎の節に察する凊理を続けるずいう圢にしおいた為に䞍敎合を生じおいたようだ。
    䞀気に shift をするのではなく自分に察応しおいる所だけ shift をする様に倉曎したら問題は発生しなくなった。
    取り敢えず、これで䞀旊解決ずする。


  * [2015-03-08] <bug> $() を閉じるず䞭身に色が着かない。 [#D0222]

    $( だけ曞いお䞭身を蚘述しおいる時は正しく着色されおいる。
    $( の䞭の匕数も、コマンド名に぀いおも同様に着色の察象になっおいない様だ。
    ( ) の䞭に぀いおは正しく凊理されおいる様に芋える。

    原因は分かった。$() 党䜓が䞀぀の単語ずなっおいる為に
    $() 党䜓ずしおの着色が斜され、内郚にある個々の単語の着色が消されおいるずいう事だ。
    これをどの様に凊理するのが良いかは考える必芁がある。
    䟋えば zdepth 的な物を䜿っお被芆されない様にするずか?
    しかし、それだず単語が消滅した時に困る。
    より䞊の階局にある単語の色を䜿いたいが
    その情報は倱われおいるので単語の色を再蚈算しなければならない。

    䞀応適甚順序を範囲の広い物が先に行われる様に修正したが、
    それでも郚分曎新に際しおは完党ではない。
    やはり郚分曎新ず単語毎の着色は芪和性が䜎いのだろうか。

    これに完党に察応する為には珟圚存圚しおいる党おの単語に぀いお
    どの様に着色をしおいるかの情報を保持する必芁がある。
    その為には必然的に単語の生死を完党に远跡する必芁がある。

    実は単語の生死を远跡するのは簡単なのではないか?
    単語の生成に関しおはわざわざ述べる迄もない。
    単語の消滅に関しおも beg-end0 に存圚しおいた単語ず、
    shift 埌に j2-i に存圚しおいた単語が消滅する単語ず分かっおいる。

    ただし、問題は単語が消滅した事が分かったずしおどの様に着色を修正するのかずいう事である。
    芪単語が倉曎された時に党おの子単語に぀いお再床着色をするのは倧倉であるが、
    各単語の着色に぀いおは _ble_syntax_tree に蚘録しおしたうずいう手もある。

    入れ子構造が倉化した時の着色の倉化をどの様に適甚するかに぀いお二通りの方法を考え埗る。

    a 着色の倉化を考慮に入れるべき範囲を先に蚈算し、その範囲内の各点に぀いお色を蚈算する。
      この方法を甚いるずどの郚分を再床着色し盎さなければならないのかずいう事を蚈算しやすい。
      䞀方で、各点がどの色になるのかずいう蚈算が難しい。
      愚盎にやるず各点に぀いおその点に存圚する word を列挙しなければならず珟実的でない。

      実は末端から順番に着色を進めおいけばそんなに耇雑な操䜜をしなくおも着色ができるのでは?

    b 生成・倉曎のあった各単語に぀いお着色を実行する。

      単語に overlap がある堎合に耇数回着色されお非効率に思われるかもしれないが、
      芪単語から順に着色を実行する様にすれば他の単語の事は考えずに自然に着色が出来る。
      問題点は芪単語の䞀郚でも倉曎があるず、その芪単語に含たれる党おの子芁玠に぀いお再床着色を実行する必芁が生じるこずである。

      特にこの問題はトップレベルの単語が消滅した堎合にも拡匵される。
      トップレベルの単語が消滅した堎合、その郚分の着色は解陀されお既定の色になるべきである。
      しかし、単語に察しお着色を実行するだけで、既定の色を適甚するずいう操䜜をしなければそこに色が残っおしたう。
      結局トップレベルの文脈で既定の色を適甚するずいう操䜜が必芁になるのである。
      しかし、トップレベルで既定の色を適甚するず党おの単語に぀いお再床着色を実行しなければならなくなる。

    c もっず効率的な実装はないだろうか?

      䟋えば CG で耇数の物䜓が重なり合っおいる堎合にどの様に凊理を行うか?
      CG の堎合には毎回党おのオブゞェクトを描画し盎すずいう事をする気がする。
      その堎合には z-depth を甚いおどのオブゞェクトが前に来るかの刀断を行う。

      今回の堎合には単語の入れ子構造の情報を持っおいるので z-depth を考える必芁はなくお、
      単玔に芪のノヌドから順に着色を実行しおいけばよいだけの事である。
      埓っお z-depth だずかの手法は今回の堎合には蚳に立たない。

      今回特に考えたいのは "郚分曎新" である。
      郚分曎新の察象は、生成された単語に察する着色、消滅した単語に぀いおの着色解陀を含む。
      曎に、コマンドに応じた着色を行っおいる際には、単語自䜓に倉化が無くおも着色が倉化する事もあるだろう。
      これらを効率的に凊理するにはどうしたら良いだろうか。
      特に最終的に "その点の配色" を栌玍した配列を曎新・取埗できればそれで良い。

      % 䟋えば単語の depth 毎に配列を甚意しおそこに倀を蚘録するずいう方匏は?
      % →単語のレベルがたずめお䞊がったり䞋がったりする時に倧移動が起こる。非効率である。
      %   曎に、depth が深くなれば成る皋より遅くなる。

      % 各点に぀いおそこに存圚する単語ぞのリスト構造を保持する方匏は?
      % この様にすれば或る単語が削陀された時に、その䜍眮に次に存圚する色を盎ぐに取り出す事ができる。
      % →リストを管理するのが倧倉である。
      %   単語の生成・消滅に際しおリストぞの登録・解陀を行う必芁がある。
      %   単語自䜓はその範囲情報を䌎っおいるので、どの範囲に登録・解陀をするべきかずいう情報を远加で持぀必芁はない。
      %   逆にリストの各項目がどの単語に察応しおいるかずいう情報が必芁である。
      %   shift が起こった堎合などには曎に面倒な事になる。
      %   䜙り考えたくない方法である。単語が削陀された時にその䞋にある色を取埗する方法ずしおは倧袈裟すぎる。

    色々考えたが a の方法が珟実的な気がする。もう少し案を具䜓化する。

    先ず、単語自䜓の着色ず結果の着色は独立に扱う。

    単語自䜓の着色情報は _ble_syntax_tree に補足情報ずしお远加する事にする。

    > 1 _ble_syntax_tree に色情報を蚘録できる様にする。
    > 1.1 4ず即倀で指定しおいる所を修正する。
    > 1.2 _ble_syntax_tree の幅を5に増やす。未蚭定の状態では - を眮く。
    >   終端しおいない単語の堎合には - の代わりに -- を眮く事にした。
    > 1.3 長さや内容の倉化した node に぀いおの色も - に戻す。
    >   _ble_syntax_word_umin 等に登録を行う。
    >
    > 2 曎新された単語に぀いお色情報を再蚈算する。
    >   同時に色情報の倉化のあった範囲を蚘録する。
    >
    > 3 色の倉化のあった範囲に関しお色配列を曎新する。

    取り敢えず実装した。$() の䞭も期埅通りに着色されおいる。
    䞀旊歀凊でこの項目は解決ずする。

    削陀しお消滅した単語に぀いお着色が陀去されない、
    速床に぀いお怜蚌しおいない、等の問題点はあるが、
    これらは埌で問題になっおから考えればよい。

  * leak variables [#D0221]

    > cs ps1out                             # local 宣蚀忘れ
    > rex=$'^([ \t]*)(\\([ \t]*(\\))?)?'    # local rex 宣蚀忘れ
    > rmax=-1 rmin=-1                       # local rmax rmin 宣蚀忘れ
    > type='$('                             # parse/nest-type -v type 前に local type 忘れ
    > tchild=11 tprev=-1 wbegin=-1 wtype=-1 # parse/nest-pop を parse の倖偎で呌び出しおいたのが原因

    珟圚 g が leak しおいる事が分かっおいるが、䜿甚箇所が分散しおいる為に芋぀けるのが面倒。
    → g も凊理した。

  * ble-syntax/parse: shift チェックのルヌプが遅い。 [#D0220]

    [珟状]

    % これはどんなに埌ろの方であっおも挿入䜍眮に wbegin や inest の参照があるかもしれない
    % ずいう可胜性が吊定できない所に問題点がある。取り敢えず、この可胜性があるかないか
    % 刀定する簡䟿な方法に぀いお考えおみる。
    %
    % 1 削陀領域内に word 開始点や nest 開始点がなければこのチェックは免れられる。
    % 2 word 終了点や nest 終了点は䞀぀の開始点に察しお䞀぀たでしかない

    ず思ったが、stat の有効性のチェックは䞊蚘の様に工倫すれば省略を考えられるが、
    shift に関しおは結局党おチェックしなければならないので意味がない様に思う。
    ただ、stat や word を盞察䜍眮で芚えおおくようにすれば、
    線集領域に跚る word や nest 以倖に぀いおの shift をしなくおも枈む様になる。

    % どの様にすればスキップを行う事ができるだろうか。
    % 先ずは stat から考えおみる事にする。
    % inest の可胜性に぀いお。
    %
    % 1 線集領域の終了点でトップレベルならば䞭で始たった inest が倖で閉じる事は無い
    %
    %   線集領域の前ず埌で nest level が同じ堎合、新しい inest が䞭で始たっおいる可胜性はあるだろうか。
    %   ず思ったが、ある。xxxx の䞭で䞀旊括匧が閉じお再び括匧が始たる可胜性などを考えなければならない。
    %   䜆し、xxxx が top の nest level にある堎合には䞭で括匧が閉じる事は出来ないので inest が䞭にあるずは考えにくい。
    %   (ただ、inest の境界などで䜕が起こるかは慎重に考えなければならない。)
    %
    %   たずめ: 線集領域の開始点ず終了点でトップレベルならば䞭で始たった inest が倖で閉じる事はない
    %   ず思ったが、別に開始点はトップレベルでなくおも関係ない。終了点でトップレベルならば関係ないのだ。
    %
    % 2 線集領域の終了点での inest が線集領域の開始点よりも前を指しおいるのならば、
    %   䞭で始たった nest が倖で閉じる事はない。
    %
    %   ずいうか぀たり線集領域の終了点で inest が線集領域の内郚を指しおいなければ OK ずいう事である。
    %
    % 3 線集領域の終了点から順に芋おいっお、䞀床でも inest が線集領域よりも前を指したならば、
    %   それ以降に線集領域の内郚を指す inest が珟れる事はない。
    %
    % 3 は 1,2 の䞀般化になっおいるので 3 だけチェックすれば OK である。
    % もっず条件を課す事が出来ないかずも考えたが、長いネスト領域の開始点を線集した時に
    % 倚少凊理に時間が掛かるずいう事は䞍自然な事ではない。
    % 長さ(盞察䜍眮)を補正するのに時間が掛かっおいるのだなずいう事は想像できるだろう。
    %
    % 次に stat に栌玍されおいる wbegin に぀いお。基本的に wbegin に぀いおも同じである。
    % wbegin は通垞 inest よりも曎に䞋の構造である。぀たり inest < wbegin の筈である。
    % この事が䜿えるかは分からない。
    % 少なくずも蚀える事は wbegin も inest ず同じ様な刀定方法ができるずいう事である。
    % ここで曎に考えたいのは inest ず wbegin を組み合わせおより効率的に䞭断をできないかずいう事。
    % もう少し考える inest < wbegin であるのならば、
    % wbegin < dbeg になった時には inest も wbegin も曎新を䞭断しお良い。
    % しかし inest < dbeg ずなった段階では未だ wbegin が dbeg より手前にあるかもしれない。
    % でも少なくずも word は同じネストレベルの䞭で構造は䜜らないはずだから、
    % 䞀旊 dend0 < wbegin ずなったならばそのネストレベルでは二床ず wbegin が線集領域内に珟れる事は無いだろう。
    % 䜆し、䞀぀ネストレベルを抜けた時にたた wbegin が線集領域内に珟れる可胜性はある。
    % 䞀぀ネストレベルを抜けた時にたた wbegin が珟れない為の条件は䜕か?
    % これは䜕ずも蚀えない。抜けたネストレベルの inest が線集領域内にある限りは
    % 垞に wbegin が線集領域内に新しく珟れる可胜性を排陀できない。
    % 逆に inest < dbeg なネストを抜けたら OK ずいう事になる。
    %
    % wbegin も考慮に入れた時の䞭断の条件を曎新する:
    %
    % 4 線集領域の終了点から順に芋おいっお始めに以䞋の条件を満たした時に䞭断できる
    %   inest < dbeg か぀ ( wbeg < dbeg たたは dend0 < wbeg )
    %   この時に inest が再び線集領域内郚に珟れる事は無いし、
    %   たた wbeg も線集領域内郚に珟れる事は無い
    %
    %   仮定: word は或るネストレベルの䞭で構造を䜜る事はない
    %     (これは珟圚の解析の仕組み䞊保蚌されおいる様に思うので特別に意識する必芁はない)

    歀凊たで曞いお気付いたが、䞊は線集領域内に inest や wbegin がない事の条件であっお、
    inest や wbegin の盞察䜍眮を補正しなくおも良い条件ではない。
    盞察䜍眮で蚘録した堎合に inest や wbegin の補正が必芁になるのは、
    線集領域の長さが倉化し、か぀、inest や wbegin が線集領域よりも前を参照しおいる堎合である。

    䞀方で線集領域の長さが倉化しなかった堎合でも、
    word の invalidate が必芁になるのでルヌプを回す必芁は残る。
    いっその事 word の invalidate は別のルヌプで凊理した方が良いのかも知れない。
    word の invalidate に関しおは䞊蚘の方法でルヌプを回すのを䞭断しお問題ない。

    思うに、尻からで良いからネストの構造を掘り出す事ができる様なデヌタを蚘録するべきだずいう気がする。
    特に、盎前のネスト構造ノヌドぞの nest の offset を保持する様な。
    党おの点に぀いお䞀々ネストノヌドだずか stat だずかが蚭定されおいるかどうかをチェックするのは倧倉である。
    考えなければならないのはその様なデヌタ構造自身も shift の察象ずしなければならない事、
    それから文脈倀 (stat) が同じになった時に解析の䞭断をしおデヌタ構造が壊れないかどうか考える事。

    少し考えおみる。その様な掘り出すのに必芁なデヌタは䜕かずいうず 。
    先ず、途䞭から解析を再開できる様にする為にはその点よりも埌の情報を含んでいる様なデヌタは保持できない。
    埓っお、必然的にノヌドはデヌタ構造の末尟に眮く事になる。
    1 兄(末尟)のoffset 2 芪(先頭)のoffset 3 末子(末尟)のoffset である。
    芪の offset に関しおは兄を蟿っおいけば早晩に蟿り着くので蚘録しなくおも良い。
    ずいうか、芪の offset は stat の inest に蚘録されおいるのでわざわざ歀凊で蚘録する必芁はないし、
    そもそも芪の末尟の offset さえ知っおいれば問題なく、
    これは掘り出す過皋で知っおいるはずなので各ノヌドのデヌタに含める事は考えない。

    曎に良く考えおみたら自身の情報に぀いおも栌玍しなければならない。自身の先頭の offset も含める。
    デヌタの内容に぀いお改める。
      data="${自身の先頭のoffset} ${兄(末尟)のoffset} ${末子(末尟)のoffset(子がなければ -1)}"

    [2015-08-11] 取り敢えず _ble_syntax_* に含たれるポむンタを offset (長さ) で衚珟する様に曞き換えた。

    [2015-08-13] _ble_syntax_tree (旧 _ble_syntax_word): 入れ子構造を蚘録する様に倉曎

    入れ子構造の情報を利甚しお shift を実行するコヌドを曞いおみた。
    しかしそれ皋高速化はしおいないようである。もっず積極的に shift の skip を行うべきか?
    しかし、取り敢えずはこれで良いずいう事にする。

  * [2015-08-13] _ble_syntax_tree (旧 _ble_syntax_word): 入れ子構造を蚘録する様に倉曎 [#D0219]

    shift の際に入れ子構造を考慮に入れたスキップをする為に、
    入れ子構造を蚘録・構築する様に改良を行う。

    % 敎理2015-08-12
    %
    % 改めお _ble_syntax_* の圢匏に぀いおたずめる:
    %
    % | _ble_syntax_text    解析結果の察象の文字列を蚘録
    % | _ble_syntax_stat[]  文字 #i を解釈する盎前の解析状態
    % |   ctx     珟圚の解析の文脈
    % |   wlen    珟圚のシェル単語の継続長さ
    % |   wtype   珟圚のシェル単語の皮類
    % |   nlen    珟圚の入れ子段階の継続長さ
    % | _ble_syntax_nest[]  入れ子の情報
    % |   ctx     入れ子を抜けた時の埩垰状態
    % |   wlen    同䞊
    % |   wtype   同䞊
    % |   nlen    同䞊
    % |   type    入れ子の皮類を衚す文字列
    % | _ble_syntax_word[]  境界 #(i+1) で終わる単語の情報を蚘録
    % |                     (぀たり単語の最埌の文字の䜍眮に蚘録されるず思えば良い)
    % |   wtype   シェル単語の皮類
    % |   wlen    シェル単語の長さ
    % |
    % |   ※境界#(i+1) (たたは境界#i が word[i-1] に察応する) の様に1぀ずらしお栌玍しおいるのは、
    % |     郚分曎新の際の配列の切り貌りを他の配列ず同様に行える様にする為である。
    % |     基本的に配列の切り貌りは、添字 data[i] に察応しおいる情報はその境界の右にある文字に附属しおいるず芋做しお実斜される。
    % |     埓っお単語の情報は単語を構成する最埌の文字、぀たり添字 i-1、に附属しなければならない。

    [蚈画]

    - 入れ子構造を利甚しお効率的に shift を実行するためには、
      入れ子構造の情報を残しお眮かなければならない。
      珟状の実装では入れ子構造の情報の䞀郚は _ble_syntax_nest 等に残存しおいるが、
      解析終了埌に再び構造を調べるのに十分な情報は蚘録されおいない。

    - 入れ子構造を構築するに圓っお、word に関する入れ子構造の管理は䞍芁である。
      ずいうのも、word が入れ子になっおいる堎合には
      必ず nest を通しお入れ子になっおいるはずだからである。

      ただし、word を効率的に列挙しお凊理を実行するためには
      "前のword" に察するポむンタを word 情報に含めおおくのが良い。
      →しかしそうするず prev_word ポむンタに぀いおも
        shift を考えなければならないずいう面倒な事に 。

      nest に関しおは自分の芪、自分の兄、自分の末子に察するポむンタを保持する。

    - どこにどの様な圢匏で情報を栌玍しおおくかずいうのも考える必芁がある。
      既存の _ble_syntax_* のどこかに入れ子構造を蚘録するずいう圢にするずいう手ず、
      新しく _ble_syntax_tree などの配列を䜜成しおそこに蚘録するずいう二皮類の方法がある。

      既存の _ble_syntax_* のどこかに蚘録するずしたら _ble_syntax_word が適切であろう。
      ちょうど _ble_syntax_word は解析の動䜜自䜓に圱響は䞎えず「出力」ずしおの効果を持぀。
      たた、word ず nest の入れ子構造を統合しお統䞀的に蚘述できる可胜性がある。
      この倉曎にあたっお _ble_syntax_word の䞭身の圢匏を倧幅に倉曎しおしたっおも良い。

      新しく _ble_syntax_tree などの配列を䜜成しお管理する事にするず、
      x 切り貌りをしなければならない配列が増える。
        元々 sparse な配列なので無駄に切り貌りの䜜業を増やしおも損した気分になる。
      x word/nest の䞡方に぀いお入れ子構造を蟿るのも面倒かも。

      _ble_syntax_word を改造しお圢匏を䞀新する方向で考える。
      たず、珟圚 _ble_syntax_word が䜿甚されおいる箇所に぀いお確認を行う。
      - 単語の登録・shift
      - 色付け (syntax/update-word-table)
      - debug 甚コヌド (print-status など)
      珟圚の圢匏は "wtype wlen" である。歀凊にどの様な情報を付加するべきか?
      - word ず nest は同じ箇所で終了する可胜性がある。
        したがっお䞡方登録できる様にするべきである。
        同じ箇所で終了する堎合、word の内郚に nest があるずいう構造になっおいる。
      - word の芪ず nest の芪は必然的に同じである。
      - word の芪はなしたたは nest である。nest の芪はなしたたは word である。
        word が word の芪になっおいたり nest が nest の芪になっおいる事はない。

      a 案 "wtype wlen parent prev child ..." ずいうのはどうだろうか。
        [[ $wtype == ^[0-9]+$ ]] の時に word でありそれ以倖の時に nest である。
        child > 0 の時は末子はその offset の䜍眮に存圚する。
        child == 0 の時は末子は同じ䜍眮で終了し ... に末子の情報が蚘録される。
        既に登録されおいる堎合には "wtype wlen parent prev 0 既存内容" などずすれば良い。

        % ? 疑問点: 前回の解析たでに存圚しおいた内容を消去しなくおも良いのか?
        %   前回の内容はい぀消去されるのだろうか。
        %   䜕凊かで削陀を実斜しないず、前回の解析の結果が混ざっおしたう。
        % - これは今迄の実装でも泚意しなければならなかったはずだ。
        %   前回の解析で単語の終端だった郚分が新しい解析で単語の途䞭になった堎合、
        %   前回の解析で生成された単語が消去される機䌚が倱われおしたう。
        % →前回の解析で存圚しおいた内容を気にする必芁はない。
        %   これらは配列の切り貌りの時点で削陀され _tail_syntax_word に移動される。
        %   途䞭で解析状態が同䞀になった時にのみ _tail_syntax_word から再床コピヌされる。
        %   ぀たり、解析する時には _ble_syntax_word は空文字列になっおいるので
        %   前回の内容の残存に぀いおは気にしなくお良い。

        この方法ならば同じ䜍眮で耇数のレベルの word が終端する堎合にも察応できる。
        今珟圚ではそのような単語の区切り方は存圚し埗ないが、柔軟な構造にしおおいた方が芋通しが良いだろう。

        ? nest-push の type ずしお [0-9]+ の様な物が存圚しおいるず word ず区別が付かない。
          そのような物が存圚しおいないこずを確認する必芁がある。
          → grc --exclude=out nest-push で確認した。その様なものは今のずころない。OK

    [実装]

    䞊蚘 a 案で行くこずにする。

    1 先ず初めに word に登録する関数を準備する。これで word を登録する様に倉曎する。動䜜を確認する。
    2 word に別の情報も登録できる様に word 読み取り郚分の倉曎を行う
    3 nest 情報も pop 時に登録する様に倉曎する。print-status の改良

    4 兄情報・子情報も登録する。入れ子になっおいる郚分も shift する

    > (a) 兄情報・子情報をその堎で蚈算しお登録するずいう可胜性?
    >
    >   兄情報・子情報も登録するためには stat に兄情報・子情報を蚘録する必芁がある?
    >   もし兄情報・子情報をその堎で蚈算しお求めるこずができるのであれば、
    >   わざわざ珟圚の解析状態に含める必芁はないのではないかずいうこず。
    >
    >   ? stat に蚘録を行わなくおも _ble_syntax_word, _ble_syntax_nest 等を甚いお
    >     兄情報・子情報を構築するこずは可胜だろうか?
    >
    >     兄は max { 終端 | 芪の開始䜍眮 < 終端 <= 自身の開始䜍眮 } の筈である。
    >     たた、子は max { 終端 | 自身の開始䜍眮 <= 終端 <= 自身の終端䜍眮 } の筈である。
    >     芪の開始䜍眮は、
    >       wbegin が蚭定されおいる堎合は wbegin が、
    >       inest が蚭定されおいる堎合は inest が、
    >       それ以倖ならば初期䜍眮 0 が該圓する。
    >     自身の開始䜍眮・終端䜍眮は知っおいる。
    >
    >     これらの情報を甚いれば兄情報・子情報を必芁になった時に構築する事は可胜である。
    >
    >   ? 解析時は兄情報・子情報はロヌカル倉数に保持しながら解析しお、
    >     ただし、stat から埩元する時には兄情報・子情報を再構築するずいう方法はどうか?
    >     nest-pop の際にも同様に構築する必芁が生じるのでは?
    >     これだずコストがかかっおしたうので、nest-push の際にたずめお兄情報・子情報も push しお良い。
    >     しかし、その様にするのであれば stat にも同様に保存しおしたえば良いのではずいう事になる。
    >     䜆し面倒なのは、兄情報・子情報を stat/nest に蚘録する様にしおしたうず、
    >     兄情報・子情報に察する shift も実装しなければならないずいう事である。
    >
    >   取り敢えずの方針ずしおは、shift の実装が面倒なので兄情報・子情報は stat/nest には含めない。
    >   代わりに word に登録する際に毎回自分で兄情報・子情報を蚈算する、ずいう事にする。
    >
    >   問題点
    >
    >   ? 兄情報・子情報は shift だけで良いのか?
    >     stat に登録しおいない為に兄情報・子情報がずれおいおも
    >     解析状態が同じになったず刀定されおしたう可胜性がある。
    >
    >     →削陀された領域にあるノヌドを参照しおいる stat は削陀すればよい。
    >       stat で珟圚参照しおいるのは wbegin, inest である。
    >
    >     % 䜆しチェックする範囲が広がるのが難点かも知れない。
    >     % →stat に兄情報・子情報を蚘録する堎合でも stat の曎新範囲が広くなるので
    >     %   結局どのようにしおも同皋床チェックする範囲が広がる。気にしなくお良い。
    >
    >     →削陀された領域にあるノヌドを参照しおいる匟ノヌドはどうするのか?
    >       それも削陀するず曎にその匟も再構築の察象になり を繰り返しお結局すべお解析し盎す事になる?
    >       曎に、削陀された領域にあるノヌドでなくおも、
    >       解析状態が䞀臎しないこずによっお再解析が行われお倱われる word も存圚しおいる。
    >       それらを兄情報・子情報ずしお参照しおいるノヌドはどの様に取り扱うべきか。
    >
    >     結局 _ble_syntax_* に蚘録された昔の情報を参照しお構築する方匏だず、
    >     郚分曎新した際に䞍敎合が生じおしたう。
    >     昔の情報を参照しお構築した郚分をすべお再蚈算しなければならなくなるが、
    >     どの郚分がどの郚分の昔の情報たで䜿っお構築したかの情報がないので、
    >     すべお再蚈算しなければならなくなる。
    >     (䞀応各ノヌドを調べれば再蚈算が必芁かどうかを埗るこずができるが、
    >     いずれにしおもすべおのノヌドに぀いおそのチェックを実行しなければならない。)
    >
    >     因みに _ble_syntax_nest に関しおは過去の情報を䜿甚しお解析が実行されるが、
    >     解析状態䞀臎の確認の際にはちゃんず _ble_syntax_nest の䞀臎たで確認されおいる。
    >
    > (b) 兄情報・子情報に察応する情報も stat に含めお蚈算を実行する
    >
    >   word/nest が混合しおいるのでどの様に取り扱うかが埮劙である。
    >   兄にしろ子にしろ (ある条件を満たすノヌドで) 最埌に登録したノヌドぞのポむンタになる。
    >
    >   䜕れにしおも wbegin/inest 蚭眮の瞬間に兄・子の情報も曎新する必芁があるような気がする。
    >   inest 蚭眮の瞬間の凊理に぀いおは nest-push で行えば良い。
    >   wbegin 蚭眮に぀いおは新しく wbegin 蚭眮甚の関数を眮くこずにするか?
    >   先ず初めに wbegin 蚭眮䜍眮に぀いお確認を行う。
    >   →䞻に3箇所の wbegin 蚭眮箇所があったので新しく関数を甚意しおそれに眮き換えた。
    >
    >   曎に解析状態を衚す tprev, tchild ずいう倉数を远加した。
    >   tchild は珟圚の level で䞀番最埌に蚭眮された節の䜍眮を衚す。
    >   tprev は䞀぀䞊の level で䞀番最埌に蚭眮された節の䜍眮を衚す。
    >   child/prev ずいうのは珟圚の節からの芖点であっお、
    >   珟圚の䜍眮に新しく蚭眮する節からの芖点ではないこずに泚意する。
    >
    >   ? stat に tprev/tchild を蚘録する必芁は実はないのではないか?
    >     ずいうのも解析再開時に状態を埩元する際は、
    >     過去のデヌタ配列の内容を参照しお良いはずだから、
    >     わざわざ蚘録しなくおも蚈算で tprev/tchild を再構築できるからである。
    >
    >     →やはり蚘録する必芁はある。stat には2぀の圹割がある。
    >       䞀぀は解析再開時に解析途䞭の状態を埩元する圹割であり、
    >       もう䞀぀は解析状態が䞀臎したかどうかを刀定しお、
    >       解析を䞭断するための参照状態ずなる圹割である。
    >
    >     前者の圹割を果たす為には tprev/tchild は再構築できるので䞍芁であるが、
    >     埌者の圹割を果たす為には参照甚の tprev/tchild を保持しおいる必芁がある。
    >     (埌者の堎合でも、䞀応 "叀いデヌタ配列を党お芚えおおいお、か぀解析状態の比范の際に
    >     毎回叀いデヌタ配列から tprev/tchild を再構築しお䞀臎するか確かめる" ずいう力技もあるが、
    >     それはさすがに遅くなるのでやはり蚘録をする。)
    >
    >     結論: stat に tprev/tchild も蚘録する。
    >
    >   ? nest に tchild を蚘録する必芁は実はないのでは?
    >     nest は pop した時に状態を埩元するためにある。
    >     ずころで pop した時に新しい節が䜜成されお tchild は䞊曞きされお消える。
    >     どうせ盎埌に䞊曞きされお消えるのであれば蚘録する意味は無いのでは?
    >
    >     解析状態の䞀臎の際にもチェックする必芁はないように思われる。
    >     ずいうのも結局䜿われない情報であるため、
    >     もしチェックをせずに違いを看過したずしおも最終的な結果には䜕の違いも出ないからである。
    >
    >     % たた蚘録するずその分たた shift のコストが䞊がるずいう事を意味する。
    >     % 取り敢えず nest には tchild を蚘録しない方針で行くこずにする。
    >
    >     実は nest の tchild は必芁のようだ。
    >     nest の䞋に word を構築する際、word に入っお word から抜けた時に tprev を埩元しなければならない。
    >     それが実は nest-push した時の tchild に察応しおいる。
    >
    >   ? word-pop 埌の tprev に぀いお珟圚のデヌタ圢匏で自然に再構築できるか?
    >
    >     word-pop 埌は nest の level (たたは top level) に必ずいる。
    >     ずいうのも word の䞋に word は盎接来ないからである。
    >     word-pop 埌の tprev は䜕を意味するかずいうず、珟圚の nest-level の前の nest-level である。
    >     これは nest-push する盎前の tchild を意味する。
    >
    > 取り敢えず (a) で実装したが (b) に方針転換する事にする。

    4.1 word-pop の際の tprev の再構築?
    4.2 ble_syntax_stat の圢匏倉曎
    4.3 check
    4.4 新しく远加した項目の shift

    > shift は再床敎理しお曞き盎す事にする。
    >
    >   䞍可解な実装になっおいる郚分に぀いおも再考察を行う。
    >
    >   ? stat 無効化に斌いお wbegin/inest の刀定範囲が
    >     曎新領域 beg-end0 ではなく再蚈算領域 i1-j2 になっおいるが、
    >     無効化は曎新領域に被る時にだけ行えば問題ないのでは?
    >
    >     或いは実は原則を砎っおいる箇所があった為にこの様になっおいた?
    >     䟋えば var[]= の郚分に関しおは、元々原則を砎った実装になっおいた。
    >     (珟圚は、この郚分に関しおは保留䞭である。
    >     最終的には word 着色で var[] ずしおの着色を䞊曞きしおしたうなどすれば良い。)
    >
    >   ? stat の shift に斌ける無効化チェックは必芁なのだろうか?
    >
    >     原則さえ守っおいれば stat/nest の解析状態チェックだけでOKなのでは?
    >
    >     元々この様にした理由は、無効化がないず䞍正確な stat が残っおしたうずいう事である。
    >     % この䞍正確な stat の状態で解析を続行しおも続きのデヌタを再珟できない可胜性がある。
    >     % ぀たり、この事により予期しない解析䞭断が生じる可胜性がある。埓っお無効化は必芁である。
    >
    >     →本圓だろうか? 䞍正確な stat (その様な stat が生成される機䌚はなかった) ずしおも
    >     stat が䞀臎しおいる以䞊は埌続のデヌタも党く同様の物が生成されるのではないだろうか?
    >     ぀たり、stat を無効化するかどうかの刀定は「前回の解析の shift だけで同じ stat が生成されるかどうか」
    >     ではなく、もっず蚱容的な「埌続のデヌタを再珟するこずができる stat」ずいう条件にするべきずいう事である。
    >
    >     逆に stat が壊れた状態になったずしおも、
    >     埌続のデヌタず敎合する様に修正する事ができれば無効化する必芁はないずいう事になる。
    >     stat の wbegin/inest が指し瀺しおいる郚分が消滅した時の wbegin の倉曎の仕方を䞀぀決めればよい。

    5 check: チェックの為に print-status に構文朚の結果を衚瀺する。

    5.1 未だ終端しおいない入れ子構造に぀いおも正しく凊理する必芁がある。

    > 䟋えば shift を蚈算する範囲を決定する際に愁嘆しおいない入れ子構造の郚分を跳ばす事はできない。
    > 終端しおいない入れ子構造に぀いおどの様に凊理を実行するべきかは、print-status の実装で詊せばよい。
    > 他の shift 等に察しおも同様の凊理を実行する際には print-status の実装を真䌌すれば良い。
    >
    > 䞀぀の方法は無理矢理終端させた時のデヌタ配列を䜜成しお、
    > その配列に察しお凊理を実行する方法である。
    > この様にすればデヌタ配列の圢匏に埓っおそのたた凊理を実行する事が出来る。
    > 終端しおいない節ず終端した節 (デヌタ配列に栌玍された節) が混合したたただず、
    > それに察する凊理を䞊手に曞くのが面倒なように思われる。
    >
    > 䜕れにしおも print-status の実装を終端しおいない節に察応する過皋で再考察を行う。
    >
    > 䜕だか良く分からなくなったので、結局終端しおいない入れ子構造に぀いおの情報を倉数 tree に集蚈した埌で、
    > ("${_ble_syntax_tree[@]}" "$tree") に察しお凊理を実行するずいう圢にする事にした。
    > 関数 ble-syntax/tree-enumerate proc, ble-syntax/tree-enumerate-children proc を䜿う。
    > proc には各節を凊理する関数名を指定する。
    > これを甚いお print-status も実装した。倚分動䜜しおいる。

2015-08-11

  * _ble_syntax_* の単語・入れ子開始䜍眮の蚘録方法を倉曎 (絶察䜍眮 wbegin → 盞察䜍眮 wlen) [#D0218]
    蚘録点からの負のoffset(単語長・入れ子継続長)で指定する事にした。

    % 敎理2015-08-11
    %
    % 䜕やらよく分からなくなっおきたので改めお珟圚の状況に぀いおたずめるこずにする。
    % たず、珟圚の _ble_syntax_* のデヌタは以䞋のような圢匏になっおいる。
    %
    % _ble_syntax_text    解析結果の察象の文字列を蚘録
    % _ble_syntax_stat[]  文字 #i を解釈する盎前の解析状態
    %   ctx     珟圚の解析の文脈
    %   wbegin* 珟圚のシェル単語の開始䜍眮
    %   wtype   珟圚のシェル単語の皮類
    %   inest*  珟圚の入れ子の開始点
    % _ble_syntax_nest[]  入れ子の情報
    %   ctx     入れ子を抜けた時の埩垰状態
    %   wbegin* 同䞊
    %   wtype   同䞊
    %   inest*  同䞊
    %   type    入れ子の皮類を衚す文字列
    % _ble_syntax_word[]  境界 #(i+1) で終わる単語の情報を蚘録
    %                     (぀たり単語の最埌の文字の䜍眮に蚘録されるず思えば良い)
    %   wtype   シェル単語の皮類
    %   wbegin* シェル単語の開始䜍眮
    %
    %   ※境界#(i+1) (たたは境界#i が word[i-1] に察応する) の様に1぀ずらしお栌玍しおいるのは、
    %     郚分曎新の際の配列の切り貌りを他の配列ず同様に行える様にする為である。
    %     基本的に配列の切り貌りは、添字 data[i] に察応しおいる情報はその境界の右にある文字に附属しおいるず芋做しお実斜される。
    %     埓っお単語の情報は単語を構成する最埌の文字、぀たり添字 i-1、に附属しなければならない。
    %
    % shift の察象ずなるのは * で瀺した項目である。
    % 珟圚、内郚構造を衚珟する情報に nest ず word の2皮類がある。
    %
    % A word&nest を統合する可胜性に぀いお:
    %
    %   word ず nest を別々に管理しおいるこずによっお、
    %   shift 察象の管理がより面倒になっおいる様に思われる。
    %   nest は解析のために必芁な入れ子の情報であり、
    %   word は解析には必芁がないが解析の結果ずしお呌び出し元に提䟛する情報である。
    %   どちらも䌌た様な入れ子構造を構築するこずには倉わりないが䜿い方が倚少異なる。
    %
    %   x どちらも同じ䜍眮で二段階の入れ子を䜜ったり抜けたりする事はない、
    %     ずいう前提で実装されおいる気がする。
    %     統合するずしたらこの前提が成立しなくなるので泚意する必芁がある。
    %     䟋えば echo $(command),$(command) ずなっおいる堎合、
    %     echo の第䞀匕数の単語は、開始点で2段階の入れ子を䜜成し、
    %     たた、最終点で2段階の入れ子を抜ける事になっおいる。
    %     (ずころで、単語ず解析の入れ子が亀錯する様な事態は起こらないので、
    %     倚段階の入れ子䜜成・解陀にさえ察応すればそれで問題はなくなる。)
    %
    %   x word/nest は埮劙に異なる構造の構築になっおいる気がする。
    %     word は word の終了時にその性質が決定され、末端に情報を栌玍する。
    %     word が開始した時点では word 情報は確定しおいないので、
    %     配列には蚘録せずにむしろ解析状態 stat に珟圚の word を盎接蚘録しおいる。
    %     䞀方で nest は入れ子が開始した時点で、
    %     それがどの様な入れ子なのかが確定するので、開始点に党おの情報を栌玍できる。
    %
    %   x 䜕より完党に解析郚分を再実装するこずになりそうなので統合したくない。
    %     珟圚の実装では、解析の制埡に最䜎限必芁な郚分を nest に栌玍しおいる圢になっおいお、
    %     解析の制埡に関係のない word の郚分は分離しおいる、ずいう䜓である。
    %     Shift 時の耇雑さには目を瞑っおこのたたで良い気がする。
    %
    %   →䞊蚘の色々な理由から word&nest の統合は取りあえず断念する
    %
    % shift 時は単玔に該圓する項目の補正を行うだけではなく、
    % 無効になった word, nest を参照しおいる stat を削陀するずいう事もする。
    %
    % B 単語の開始䜍眮を offset で管理しおいる堎合:
    %
    %   単語が完党に曎新領域の倖偎にある時は曞き換えの必芁性はない。
    %   単語の開始点が曎新領域に含たれおいる堎合、
    %     単語は消滅する。この単語を参照しおいる stat (解析状態) も同時に削陀しなければならない。
    %     削陀しおおかないず、再解析の結果ずしお偶々同じ stat になった時に解析が停止しおしたう。
    %     # 或いは、解析が停止するのならばそれで良いのではないだろうか?
    %     # 党く同じ状態になったのであれば以埌の蚈算をしおも同じ結果になるはず。
    %     # もし同じ結果にならないのであれば shift/状態埩元 に倱敗しおいるずいう事だから、
    %     # そちらを修正するべきずいうこずである。
    %     # これは shift を正しく実行できないのだずしたら削陀するべきずいうこずでもある。
    %     # 今、単語の開始䜍眮の衚珟を倉曎した為に、前ず状況が倉わっおいるかもしれない。
    %     # この蟺りの stat を削陀するかしないかに぀いおは再床慎重に怜蚎するべきである。
    %     この単語を参照しおいる nest は、䜿甚されるこずがないので攟眮で良い。
    %     䜕故ならば解析再開点は nest が蚘録された䜍眮よりも前になり、
    %     たた (本圓か???)
    %   単語の内郚に曎新領域が含たれおいる堎合
    %     その単語の長さの修正を行う。
    %   単語の終端だけが曎新領域に含たれおいる堎合
    %     単語は word には蚘録されおいない。
    %     stat にある盞察䜍眮だけ修正を行えば問題ない。
    %
    %   →考えるのが面倒になったので実際に実装しおしたう事にした。意倖ず簡単に枈んだ。
    %     _ble_syntax_{stat,word,nest} に察しお内容の圢匏を倉曎した。
    %     先ず単語の終端が曎新領域よりも埌にある堎合にしか単語の shift は必芁ない。
    %     (ずいうのも、単語の終端が曎新領域よりも前にある堎合は勿論 shift は䞍芁だし、
    %     単語の終端が曎新領域の内郚にある堎合は単語自䜓が無効になるからである。)
    %     そしお曎に単語の長さが倉曎になるのは単語の開始が曎新領域よりも前にある堎合である。
    %     (ずいうのも、単語の開始が曎新領域の内郚にある堎合には単語自䜓が消滅するからである。)

  * <bug> 履歎が正しく初期化されない [#D0217]

    䜕かコマンドを実行した埌に history-prev を実行するず、
    盎前に実行されたコマンドが衚瀺されず、少し昔のコマンドが衚瀺される。
    幟぀か遡っおいくず盎前に実行されたコマンドが衚瀺される。

    history で衚瀺されるコマンドは正しいコマンド順になっおいる。
    たた、遡っおいっお盎前に実行されたコマンドに行き着けば、
    それより前は正しいコマンド順になっおいる様である。
    䜙分コマンド (盎前に実行したコマンドず履歎リストの末端の間にあるコマンド)
    に察応した抜けがある蚳でもなく、䜙分コマンドず同じコマンドが幟぀か繰り返しおいる。
    どうやらコマンド順が倉になっおいるのではなくお、
    履歎のリストの末端に䜙分にコマンドが远加されおいるずいう事のようだ。

    どうやら .bash_history に空行があるず駄目な様だ。
    .bash_history の空行は初期化の際に読み取られないので行番号がずれる。
    行番号がずれおいるず history -n で远加読み取りした郚分がずれる。
    →.bash_history の空行を削陀したら問題は発生しなくなった。

    ず思ったが、それでも ble.sh を起動しおからコマンドが远加されたりしお、
    その埌で初めお履歎を䜿う、ずいう事をするずたた履歎が末尟に远加されお分かりにくい。

    % 無条件で履歎を読み取るのではなくお、履歎゚ントリが空の時にだけ読み取る様に倉曎するべきでは?
    % →履歎゚ントリが空の時にだけ読み取る様にするず、
    %   䞀回でもコマンドを実行するず過去の履歎が蟿れなくなる。
    %   履歎の初期化をせずにコマンドを実行したずきの履歎の凊理はどうしおいるのか。

    再床履歎情報の取り扱いに぀いお敎理する:

      履歎情報は2段階ある。shell が持っおいる history 情報ず、
      ble で取り扱えるようにシェル倉数に栌玍した履歎情報である。
      ble の履歎情報の初期化には時間がかかるのでできるだけ遅延したい。
      bashrc 凊理時には shell の history にただ履歎が読み蟌たれおいない。
      bashrc の凊理が終了しお察話状態になった時には shell の history は初期化されおいる。
      しかし、ble の履歎情報はただ初期化されおいない状態である。
      ble でコマンドを実行したずきには shell の history に情報を远加する。
      ble の history 情報が既に初期化されおいればそちらの曎新も行う。

    結局、shell の history が空の時にだけ読み取る様に倉曎するこずにした。

2015-08-09

  * complete: <bug> リダむレクトのファむル名でファむル名補完が効かない。 [#D0216]
    →察応した。
  * complete: <bug> .# で始たるファむルを扱うために .\# などずしお tab をしおも補完が効かない。 [#D0215]
    →再珟しない。再床改めお詊しおみたが、補完は問題なく動いおいる様である。

  * complete に関連する過去の修正 [#D0214]
    - 倉数= の補間でファむル名を取り扱える様にする
    - > の盎埌のファむル名の補間が働かないのを修正
    - (command) ディレクトリ名の盎埌に / を挿入する

2015-04-25
  * complete: 補間挿入: 既に盎埌に '/' たたは ' ' がある堎合にはこれらの文字を挿入せずに次に文字を進める。 [#D0213]
  * complete: option hoge=, hoge: の続きにファむル名を指定できる様にする [#D0212]

2015-03-22

  * ble-decode.sh: bugfix, bash-4.1 でも ESC * に登録しないず駄目 [#D0211]

    䞀回でも ESC z 等を bind -x で登録しお解陀すれば OK になる。
    しかし、䞀回も bind -x をしおいない状態だず
    ESC 単䜓で登録しおも䜕も起こらない。
    どの bash の version でも ESC * に察しお匵る事にする。

    今床は ESC [ を捕たえられなくなった。
    bash_execute_unix_command: cannot find keymap for command の゚ラヌになる。
    bash-4.3 ず同じ症状である。結局 bash-4.3 ず同様に ESC [ を倉換する事にする。

2015-03-11

  * ble-syntax.sh: <bug> 単語の先頭に空癜を挿入するず空癜が単語の䞀郚ずされる [#D0210]

    % 単語の先頭に文字列を挿入した時に単語情報 _ble_syntax_word が曎新されない。
    % 結果ずしお単語の先頭䜍眮が曎新されず、空癜も単語の䞀郚ず解釈される。
    %
    % 本来であれば wbegin の䜍眮が倉化しおいるのだから _ble_syntax_stat が䞀臎せず、
    % 単語の終端たで行っお挞く _ble_syntax_stat が䞀臎する筈である。
    % 単語の終端たで行くのであるから word の情報も再蚭定されるはずずいう算段である。

    これは単に単語の shift が実行されおいない事が原因であった。
    元々は、単語の登録は必ず stat の蚭定を行った箇所でしか起こらないず決めおいた。
    埓っお shift 刀定の時は stat に倀が蚭定されおいる時にだけ単語の shift の確認を行っおいた。
    所が、shift の刀定を stat に倀が蚭定されおいるかどうかに拘わらず実行する様にしたら、問題が発生しなくなった。
    これは぀たり stat の蚭定が行われた箇所ずは異なる堎所で word が蚭定されおいるずいう事を意味する。

    - よく考えおみれば for の盎埌などでも空癜を飛ばしおいるので for に察する word の箇所では stat が起きない。
      ぀たり、この堎合にも stat が蚭定されおいる事を前提ずした word の shift は動かない事になる。
      ず思ったが改めおみおみるず for の盎埌には stat が蚭定されおいる。
      改めお考えおみれば for の盎埌の状態は CTX_CMDXF で衚珟する様に倉曎したのであった。

    - 問題の発生しおいた䟋 "echo hello" の堎合には word の䜍眮に必ず stat が蚭定される様に思ったが、
      これで問題が起きおいたずいう事は echo の終端䜍眮に stat が蚭定されおいないずいう事を意味する。
      実際に echo hello を解析した埌に stat の内容を吐き出しおみたが、stat が蚭定されおいるのは、
      (echo の盎前、hello の盎前、終端) の䞉箇所だけになっおいる。
      改めお ctx-command/check-wrod-end を芋おみるず、
      関数定矩に察応した時にコマンドの埌の空癜を読みずばす様に倉曎したのであった。

  * <bug> i-word[1]: substring expression < 0 [#D0209]

    time : $(echo | echo | echo) を time : $(: | : | :) に曞き換えおいる最䞭に
    bash-4.0: i-word[1]: substring expression < 0 ずいう゚ラヌが出た。
    bash-4.0 ず bash-4.1 で再珟したが、再床起こそうずしおも起きない。
    起きる条件が良く分からない。

    ゚ラヌメッセヌゞに珟れる匏は ble-syntax.sh の
    ble-highlight-layer:syntax/update-word-table
    にしか珟れない匏である。wbegin の shift に倱敗しおいるのだろうか。

    再び起こった。今床はもう少し違ったパタヌンだが共通点はある。
    $() の䞭で | の盎埌の単語の䞀郚を削陀しおいる時に起こったずいうのが共通点である。
    しかし䌌たような線集を再床実行しおも問題が再珟しないようである点も同様である。

    倚少 shift の郚分に手を加えた。これで解決したかは分からない。

    远蚘:

    "単語の先頭に空癜を挿入した時に空癜が単語の䞀郚になる" バグの修正の際に、
    word は必ずしも stat の蚭定された堎所だけに蚭定される蚳ではない、
    ずいう事が刀明しそれに察する修正を行った。
    この修正の前は shift するべきなのに shift されおいない単語があった事になる。
    この substring expression < 0 の問題もこれに関連しおいた可胜性が高い。
    再床 $() 等を入力しお色々しおみおも問題は再珟しないようなので、
    取り敢えずこの bug に関しおも解決したず解釈する事にする。
    実際には解決されおいないずしおも、再び問題が発生した時に考える事にする。

2015-03-08

  * cygwin 䞊で prompt の色が぀いおいない。 [#D0208]

    _ble_line_prompt の内容を芗いおみるず、
    䜕ず ps1out に CSI 99s や CSI 99u が残っおいる。
    たた、\e[32m も本来ならば \e[0;32m 等に翻蚳されおいる筈なのにそれがない。
    芁するに ps1esc がそのたた出力されおいる様に芋える。
    出力幅が22桁䜙分である事から CSI sequence を認識しおいない様に思われる。
    先頭の CSI の郚分だけ無芖しお残りを普通に出力しおいる。

    詊しに以䞋を cygwin 䞊で実行しおみた所、倱敗する。(linux の䞊では成功する。)
    rex_csi=$'^\e\\[[ -?]*[@-~]' && [[ $'\e[99s' =~ $rex_csi ]] && echo hello
    䜕故だろう。locale の問題かも知れない。ず思っお LANG=C ずしたら成功した 。
    曎にプロンプトにも色が着くようになった 。

    然し、LANG=C にしおいるず今床は日本語があった堎合の動䜜が怪しいのではずいう気がする。
    →実際に日本語を入力しおみるず倧倉な事になる。なので䞀時的にだけ LANG=C にしたい。
    実装した。テストは未だしおいない。→テストした動くようになった。

  * <bug> bash-4.1 以䞋でカヌ゜ルの衚瀺䜍眮がずれおいる。 [#D0207]
    珟圚のカヌ゜ル䜍眮の远跡自䜓は誀っおいない様に思われる。
    ずいう事は、移動先の cx cy の算出を誀っおいるずいう事か?

    bash-4.1, 4.0, 3.2 で起きる。bash-3.0, 3.1, 4.2, 4.3 では起きない。
    調べおみるず getxy.cur の返す倀が倉である。
    倉な倀を返しおいる時に _ble_line_text_cache_pos の䞭身を確認したが問題ない。
    ず思ったら ((_eoc[2]&&(_pos[0]=0,_pos[1]++))) が駄目であった。
    bash のバグで条件分岐内で配列芁玠を参照できないのであった
    (参照するずその branch が必ず実行される)。

  * <bug> bash-4.2, 4.0, 3.2, 䞍完党な線集内容に察しお゚ラヌが出る。 [#D0206]

    i=${ で駄目。
    bash-4.3 では起きない。bash-4.1 でも䜕故か起きない?

    どうも正芏衚珟が正しく動いおいない様な気がする。
    →これは正芏衚珟䞭の "'" を無駄に倚く escape しおいたのが原因であった。
    '[^']*' で枈む所を \'[^\']*\' ずしおいた事による。
    然し \' になっおいた時の解釈が謎である。䟋えば以䞋が䞀臎する。

    rex="^([^\$]|\\'[^\\']*\\')+\$" && [[ 'i$' =~ $rex ]] && echo hello

    䞊で 'i$' を '$' にするず䞀臎しない(正垞)。
    䞊をこれ以䞊単玔化する事は出来なかった。

    䜕だか良く分からないが \' を ' に修正したら問題は起きなくなったのでこれで解決ずする。

  * <bug> bash-4.0, 4.1 でプロンプトが衚瀺されない [#D0205]
    これは declare DRAW_BUFF ずしただけの時に、
    ${#DRAW_BUFF[*]} が 1 になっおいる事が原因であった。

  * <bug> bash-4.1 以䞋でプロンプトの色が着かない。。 [#D0204]
    䜕ず、_ret="${specs[++i]%%:*}" を実行するず i が 2 増える 。
    ぀たり配列の添字を耇数回評䟡しおいるずいう事になる。

    色々詊しおみた。
    i=1; _ret="${a[++i]%%:*}"
    - a が配列でない堎合には起こらない。
    - %%:* がない堎合には起こらない。
    - %%:* の代わりに #a 等でも起こる。${a{++i]#a} では起こらない。

2015-03-07

  * ble-decode.sh: CSI Function Key Sequence を特別扱いする? (2015-02-28) [#D0203]

    珟圚の登録䜜業は些か無駄な事をしおいる様な気がする。
    ble-bind の出力も exaustive になっおいるし、
    テヌブルも巚倧な物になっおいお declare や set の時に芋苊しい。

    - .ble-decode-char 再実装した。
    - それに䌎っお .ble-decode-char/csi/* も远加し、
      CSI シヌケンスを特別に読み取る様に倉曎した。
    - たた、cmap/default.sh も倧幅に倉曎した。
    - 修食の機胜は sendkey の方で䞀括で行う様に倉曎する。
      C-x @ S 等に察しお ESC ず同様の修食の機胜を䞎える。

2015-03-06

  * ToDoの敎理 [#D0202]

    > 2015-02-17
    > * for 等の末端が赀くならない
    >   →コマンドずしおの着色によっお゚ラヌ色が䞊曞きされおいた。
    >   着色の "レむダヌ" に察応できる様にしたい。その埌で再床考える。

    これは改めお確認しおみた所、赀くなっおいる。
    単語の色付けよりも埌に゚ラヌの着色を行っおいる為であろう。
    ゚ラヌに関しおは又埌で仕組みを敎える぀もりであるが、
    特にこの問題に関しおは解決枈ずいう事にする。

    > 2013-06-10
    > * <lbug> complete: ~ で始たるパス名の堎合、
    >   ディレクトリ名の末端に / を远加したり、
    >   ファむル名の末端に SP を远加したりする機胜が機胜しない。
    >   これは test -e "$hoge" ずしおファむル名がどうかを刀定しおいる時に、
    >   hoge の䞭に含たれおいる ~ が展開されない為である。
    >   同様に ~user で始たる圢匏のパスに぀いおも期埅通りに働かない。

    これは新しい complete の仕組みの元では問題なく動䜜しおいる。
    単語を eval で評䟡しおから候補を生成しおいる事により芋た目の衚珟には関係なく動䜜する。

  * overwrite-mode に察応 [#D0201]

    | 2013-06-06
    | * overwrite mode
    |   + 開始時は insert
    |   + self-insert, delete-backward-char で察応するだけで OK
    |   + 珟圚のカヌ゜ル䜍眮を反転しお衚瀺する

    ble-edit+overwrite-mode 実装、self-insert, delete-backward-char の察応。テスト。
    test (overwrite-mode): OK, accept-line 埌のリセットOK
    test (self-insert): 半角を半角で䞊曞き、党角を半角で䞊曞き、半角を党角で䞊曞き、党角で党角を䞊曞き。
    test (self-insert): 行末での半角挿入、行末での党角挿入、改行の挿入
    test (delete-backward-char): 線集文字列終端での削陀、文字列䞭途での削陀、行末での削陀、行頭での削陀

    TAB や改行が関係する堎合の emacs の動䜜に぀いお調べる。
    - 改行ずタブを挿入する堎合は次にある文字を削陀する事はしない様だ
    - 改行を䞊曞きする事は無い。タブを䞊曞きする時はタブの終端に達する堎合にはタブを削陀する。
      終端に達しない堎合にはタブをそのたた保持する。
      面倒なので ble では取り敢えずはタブを垞に保持する事にする。

    →xterm の堎合は元からカヌ゜ル䜍眮を反転しお衚瀺する様になっおいる。
      この状態でカヌ゜ル䜍眮の属性を反転させるず二重に反転しお、カヌ゜ルが芋えなくなっおしたう。
      カヌ゜ル䜍眮の別の衚珟方法を考える必芁がある。
      或いはカヌ゜ルの倧きさを制埡するシヌケンスを出す? カヌ゜ルを隠すシヌケンスを出しおも良い。
      $'\e[?25l' $'\e[?25h' を発射しおカヌ゜ルを隠す。

    カヌ゜ルの反転は layer で行うか、それずも描画郚分に察しお完党にハヌドコヌドするか。
    ハヌドコヌドする前回曞き蟌んだカヌ゜ル䜍眮の情報を再び回埩しなければならない。
    別に layer ずしお実装した時ず比べお実装が楜になる蚳でも無い様に思われる。
    layer ずしお実装した。無駄に耇雑になったように思うが取り敢えずテスト。
    - insert を toggle しおも即座に反映されおない
      →これは .ble-line-draw.update の曎新刀定に登録するのを忘れおいただけ。
    - 前の文字の反転が解陀されない
      前回の buffer の内容を流甚しおいるのが行けないのかず思ったが、
      どうやら PREV_UMIN PREV_UMAX の方の問題の様である。
      ずも思ったがそうでもない。どうも倉な動きをするず思ったら、
      そもそも䞊のレむダヌでの曎新に倱敗しおいる様だ。/update/getg を匄った事が原因だろうか。
      確認しおみるず ble-highlight-layer:syntax/update で
      ble-highlight-layer/update/getg を呌び出すべき所で、
      ble-highlight-layer/getg を呌び出しおいた。぀たり layer:syntax 偎でのバグであった。

      ble-highlight-layer/update/getg を呌び出す様に倉曎しおみた物の、それでも䜕か倉だ。
      良く考えたら /update/getg でも駄目だ。自分自身を含めないず行けない。
      ble-highlight-layer:syntax/getg を呌び出しお空だったら ble-highlight-layer/update/getg を呌び出す様に倉曎した。
    - bugfix: PREV_UMAX の蚈算
      insert mode の時に途䞭を線集するずカヌ゜ルの䜍眮が狂う。
      C-u を抌した時のカヌ゜ルの䜍眮が倉。
      C-u 等、overwrite ず関係なく芋える物でも起こっおいるので、別の箇所のバグかず思いきや、
      layer:overwrite_mode を倖すず䞊蚘の珟象は起こらなくなる。
      色々詊した結果 oindex の shift を間違っおいる所為で PREV_UMAX が倉に倧きな倀になり、
      その所為で座暙䜍眮が 0 0 にあるず勘違いされおずれるずいう事が分かった。

2015-03-05

  * ble-edit.sh (ble-edit/draw/trace): 描画属性も詳しく。 [#D0200]

    描画属性の远跡も実装した。
    これに䌎っお、プロンプトの最埌の文字の属性も(限定的ではあるが)取埗できる様になった。

    | 2015-02-23
    | * bleopt_suppress_bash_output 制限
    |   - プロンプト最埌の文字の SGR が消える。これに察応するにはプロンプト䞭の SGR を解析しなければならず倧倉。

    完璧な察応ずいう蚳ではないが、これで䞊の問題は解決された。

2015-03-04

  * 修正: 環境での行末での動䜜 [#D0199]

    線集の行が枛った時に削陀される行が間違っおいる気がする。
    長い行を線集しおその行が短くなった時の動䜜に問題がある。
    ずいうか行が枛った埌のカヌ゜ルの衚瀺䜍眮が倉だ。
    内郚的なカヌ゜ルの䜍眮(挿入䜍眮)は正しいようだ。

    どうも䞁床ぎったり columns に収たる時の座暙蚈算の問題?
    →カヌ゜ルを動かしおみるず座暙蚈算自䜓は問題ないようだ。
    やはり前の行の最埌の䜍眮にいるにも拘わらず次の行の先頭にいるず勘違いしおいる様に芋える。
    問題は䜕故前の行の最埌の䜍眮に移動しおしたうのかずいう事である。

    % 分かったような気がする。座暙蚈算ず郚分曎新に問題がある。問題点は結構耇雑な気がする。
    % 珟圚、update-positions で蚈算されるのは「次の文字が衚瀺される䜍眮」ずいう事になっおいる。
    % これは指定した䜍眮ぞカヌ゜ルを移動させるのに䜿う。カヌ゜ルの移動先は、
    % そこに存圚する文字の先頭にあるべきである。
    %
    % 䞀方で、郚分曎新をした埌にカヌ゜ルが存圚しおいる䜍眮、ずいうのは xenl cap のある端末では
    % 実は次の文字が衚瀺される䜍眮ずは異なっおいる。
    % 行末の文字を出力した時にカヌ゜ルはその行の末端に留たっおいる。
    % 所が、update-position に栌玍されおいるのは、次の文字の開始䜍眮である次の行の先頭である。
    % この時に勘違いが起こる。これを解決するには update-positions に栌玍されおいる情報の意味を考え盎すか、
    % 或いは、update-position ずは独立に文字を出力し終わった埌の䜍眮の情報も管理するずいう事である。
    % 埌者は䜙り考えたくない。殆どの堎合で文字出力埌の䜍眮ず次の文字の開始䜍眮は同じである。
    %
    % どの様な堎合にずれが生じるかずいうず、
    % 1 行末=次の行頭
    % 2 行末近くに wide 文字が存圚しお入りきらずに次の行ぞ送られおいる堎合
    %   珟圚の蚈算だず次の衚ぞ送られる堎合は先頭に行末を埋める padding を぀ける事になっおいる。
    %   䟋えば " あ" 等ずしおいる。この時カヌ゜ルの䜍眮は "あ" の䜍眮ではなく行末の空癜の䜍眮になっおいる。
    %   これはどちらに衚瀺するべきか改めお考えた方が良いかも知れない。この状態で䟋えば "a" 等ず入力するず
    %   行末に文字が挿入される事になる。カヌ゜ルは䟝然ずしお "あ" の䜍眮ではなくお行末にあるべきなのかもしれない。
    %   しかしながら、䟋えば↑キヌで曎に次の行の行頭から移動しおきた時に、カヌ゜ルが二぀䞊の行の行末に来るのは倉である。
    %   そういう意味から蚀うずあの先頭にやはり文字を眮くべきなのかも知れない。
    %
    % 少なくずも䞉皮類の䜍眮が存圚する
    % - 郚分曎新出力埌の䜍眮:
    %   これは郚分曎新をした埌の座暙蚈算に必芁である。
    % - 郚分曎新開始の䜍眮:
    %   これはカヌ゜ルの衚瀺䜍眮ずは異なる。䟋えば行末の " あ" の堎合には、
    %   カヌ゜ルの衚瀺䜍眮は "あ" の盎前に来るが、
    %   郚分曎新の開始䜍眮は " " の盎前になければならない。
    %   しかし出力埌の䜍眮ずも限らない。䟋えば出力埌に行末にカヌ゜ルがある堎合、
    %   そこから郚分曎新の出力を開始しようず思っおも、そもそも其凊にカヌ゜ルを移動させる手段がない。
    %   (xenl の厄介な所は文字を出力した時にだけ行末にカヌ゜ルが来る可胜性があるずいう所である。)
    %   そこ堎合は移動先を次の行頭に倉曎しなければならない。
    % - カヌ゜ルの衚瀺䜍眮:
    %   これは次に来る文字が䜕かに䟝存する。
    %   positions の郚分曎新なども考えるずこれは蚘録せず、出力埌の䜍眮から蚈算する方が良い。
    %   䟋えば次に改行が来るのであれば行末だし(でも行末にカヌ゜ルを移動させる方法はない■)、
    %   それ以倖の文字が来るのであれば次の行頭である。
    %
    % どの箇所で getxy が呌ばれおいるかに぀いお確認する
    % 意倖ず呌び出しおいる堎所は少ない様である。
    % (改めお考えおみればそんな物だろう、ずいうのは
    % 元々は update-positions は x y endx endy cx cy 等のシェル倉数を通しお
    % 盎接蚈算した倀を返しおいたからである。぀たり、結果は呌出元の関数でしか䜿っおいなかったずいう事である。)
    %
    % - 先ず、カヌ゜ル䜍眮ぞ移動する時の cx cy ず、
    %   bleopt_suppress_bash_output= の時にその巊の文字 lc を取埗する時。
    % - 埌、描画領域を確保する為の begx begy endx endy
    % - それから郚分曎新の為の umin umax → uminx uminy umaxx umaxy
    % - たた、矢印キヌによる移動の際の移動先の蚈算
    %
    % 取り敢えず、_ble_line_text_cache_pos に栌玍するのは
    % その文字の開始䜍眮ではなくお、前の文字の終了䜍眮ずいう事にする。
    % その文字の開始䜍眮は前の文字の終了䜍眮から蚈算する事が出来る。

    + bugfix: ascii printable characters の行末で \n を付加した時 ichg に登録しおいなかった。
      ず思っお update/position を倉曎しようずしたら新しい事実が発芚した 。
      そもそも xenl の堎合、行末に来た文字の末尟には \n を付けお、
      文字を出力した際に必ず次の行頭に進むように調敎をしおいた。
      しかしながら、ASCII 文字が連なっおいる堎合の最適化ずしお
      䜍眮を蚭定しおいるルヌプの郚分で、「倉曎文字」ichg のマヌクを぀けおいなかった。
      これの所為で実際の出力には \n が反映されおおらず期埅した䜍眮ずは異なる䜍眮に
      文字が出力されるずいう事態になっおいた。

      取り敢えずこれで問題点の䞀぀は解決される事になる。
      そしおたた、䞊の考察で区別しなければならないずしおいた郚分曎新埌のカヌ゜ル䜍眮ず、
      郚分曎新開始時のカヌ゜ルの䜍眮の違いがなくなった。
      曎に、行末にカヌ゜ルが来ない事を保蚌しおいるので、
      郚分曎新開始時の䜍眮ずしお行末が来た堎合に其凊にカヌ゜ルを移動できないずいう問題にも匕っかからない。
      (結局、\n を末尟に远加するずいうのは特に重い凊理でもなく、
      たた実装も面倒ではなく、そもそも実装されおいたずいうのが考察の䞊での穎であった。)

    䞊蚘の郚分を修正しおテストしおみた所、衚瀺がずれるずいう問題は解消された。
    しかし問題(ずいえるかどうかは分からないが)は未だ残っおいる。
    行末に入りきらなかった wide character の先頭に移動した時のカヌ゜ルの衚瀺䜍眮である。

    + bugfix: _ble_util_string_prototype の長さ指定に 0 を指定しおいた
      詊しおみたらかなり埮劙な事になっおいる 。空癜が挿入されおいない! ず思ったら
      x=cols を蚭定した埌に空癜を挿入しおいた。修正した。このバグはこの前党く同じ物を朰したような気がするが 。
      →怜玢しおみたら結構色々な所に䌌たようなコヌドがある様だ。(䜙り良い事ずは蚀えない )

      たた、これに䌎っお意図的に terminal の幅を瞮めた時の折返しの凊理も正しくされる様に、
      xenl の時に (本圓の端末の端にいる時には敢えお付加しなくおも良かった) \n を付加する様に倉曎した。

      曎に、^? や ^A 等の特殊な制埡文字の堎合に぀いおも远い出しを実行する事にする。
      (bash の readline ではこれらの特殊文字の衚珟に関しおはわざわざ远い出しはしないようだが。)

      たた、行末付近での tab の取り扱いに぀いおも倉曎を行った。
      特に䞀番右端にいる堎合には " " + 改行を入れる。
      (所で ble-edit/draw/trace の方の tab の取り扱いも同様の問題があるのでは、
      ず思っお確認しおみた所こちらに぀いおはちゃんず実装されおいた 。)

    先ず _ble_line_text_cache_pos の圢匏を倉曎した。今迄は "x y" だったが、
    曎に、入りきらない文字が远い出しされたかどうかを刀定する為に "x y wrapping" ずした。
    wrapping=0 が通垞の文字 (出力開始䜍眮ずカヌ゜ルの䜍眮が同じ) で、
    wrapping=1 が行頭に抌し出された文字 (出力開始䜍眮は前の行の最埌、
    カヌ゜ルの衚瀺䜍眮は行頭) を衚す物ずする。
    カヌ゜ルの䜍眮を取埗する堎合には wrapping を芋お、((x=0,y++)) 等ずする。

    曎に、出力䜍眮の制埡に甚いる getxy ずは別に
    カヌ゜ルの衚瀺䜍眮を制埡する getxy.cur を甚意した。
    カヌ゜ル移動などの際に参照するのは専ら getxy.cur である。
    たた get-index-at 関数も getxy.cur を参照する様に倉曎した。

    テスト: ず、実装しおからテストしおみたがずれおいる 。
    % 改めおみおみるず wrapping の栌玍䜍眮がずれおいる。
    その文字が wrapping の察象ずなるかどうかは、その文字を凊理しおからでないず分からない。
    埓っお、その文字の終端の境界に wrapping の情報を栌玍する珟圚の実装は正しい物である。
    寧ろ、参照する時に「珟圚の文字の䜍眮」ではなく「次の文字の䜍眮」の wrapping を参照するべきである。
    →この修正で自然な動䜜をする様になった。

  * ble-edit.sh: プロンプト内の job count 等の情報が曎新されない。 [#D0198]
    →新実装で取埗したデヌタのキャッシュを local に蚭定するのを忘れおいた。

  * ble-decode.sh (stty): -icanon の蚭定。 [#D0197]

    䜕故か bless を起動しおその儘抜けるず入力しおも反応しなくなる
    →無限ルヌプに陥っおいるのかず思ったらそうではない様だ。
    →どうも入力が buffering されおいる様で C-d を抌した時に初めお入力が読み取られ、
      それたでに入力した内容が䞀気に曞き蟌たれおいく。
    →stty で bless 前埌を比范しおみるず stty -icanon が stty icanon に倉わっおいる。
      stty -icanon を蚭定し盎したら正垞に衚瀺される様になった。
      stty.enter で -icanon も蚭定する事にする。

2015-03-03

  * ble-edit.sh: prompt 再実装 [#D0196]

    | 2013-06-06
    | * <bug> PS1 に $() などが含たれおいるずプロンプト䜍眮を正確に蚈算する事が出来ない。
    |   _ps1txt の方を eval しおから再床䜍眮の蚈算をする?
    |   →それだず _ps1txt, _ps1esc の䞡方に぀いお $() の展開をしなければならない。
    |     ぀たり、$() が2回実行される。これは意図しない動䜜になるかもしれない。
    |
    |   䟋えば \[ ... \] を [ - ] などに倉換しお出力し、
    |   その埌で [ ... ] を陀いた物を甚いお䜍眮の蚈算をする?

    この問題が未だ解決されおいなかったので。
    bash の PS1 に察する振る舞いも確認しお再実装した。
    bash 内郚では先に \? の郚分だけ展開しお、
    その埌で "" に党䜓を入れお eval しおいる様な振る舞いをする様だった。
    それに埓っお再実装を行った。幅の蚈算は eval の埌に行う事にした。
    \? の解決ず幅の蚈算を独立させた事により、実装は华っおすっきりずした物になった。

    | 2015-02-23
    |
    | * <最適化> プロンプト構築
    |
    |   改行を抌し続けた時の反応が遅い
    |   プロンプトの曎新を停止するず動きが速くなる。
    |   これはプロンプトの生成に時間が掛かっおいるずいう事。
    |   芋おみるに高速化できる䜙地はそんなに無い様な気がする。
    |   jobcount を実行するのに subshell 実行が必芁なのは気にはなるが。

    新実装に移行した埌に再床確認しおみたが、それ皋気にならないのでこの問題は砎棄する。
    新実装になった事で速くなったのかも知れないし、
    あるいは倉わっおいないが気分の問題で気にならなくなっただけかも知れないが。


  * ble-edit.sh, ble-edit.color: discard-line の際に着色 [#D0195]

    | 2013-06-02
    | * ble-edit+discard-line: 灰色にする

  * ble-edit.sh: bugfix, 耇数行で䞊に行けない [#D0194]
    →_ble_line_begx _ble_line_begy に線集内容の開始点を栌玍する様に倉曎。

  * ble-edit.sh: bugfix, 耇数行なのに空行の accept-line でのずれ量が1行になっおいる [#D0193]
    →行を曎新した埌に _ble_line_x=0 _ble_line_y=0 を蚭定する必芁。

2015-02-28

  * <bug> 履歎項目を移動䞭色が曎新されない䟋を発芋 [#D0192]

    "[[ ; == \; ]]" から "arr=(a b<a c)" に移動した時、初めの 2 文字の色がそのたただ。
    これは良く考えたら word による着色を消しおいない事ず関係がある。
    特に䞊の二぀の文字列は長さが䞀臎しおいるので、shift を呌び出しおも
    shift の実行が省略される為に䞭身がクリアされない。
    これは word 着色のバグ解決の時に解決されるはず。

    長さが䞀臎しおいおも shift を実行する事にする。
    shift によっお途䞭の線集郚分がクリアされる方が動䜜ずしお自然だからである。
    或いは、途䞭の線集郚分に䜕が入っおいるか未定矩、ずいう事にしおいるず、
    䞀々䜿う偎でクリアしなければならないからである。
    線集郚分で前の属性などを保持するのは䞍自然であるし、
    䜿う偎でクリアするよりは shift の内郚で行っおいる様な繋ぎ替えの方がコストが小さい。

    →結局 shift 長さが倉わらない堎合でも shift を実行するように倉曎した。

  * 初期化最適化: ble-bind が遅い [#D0191]

    どうも ble-bind の遅さが、埌続の bashrc をも遅くしおいる様である。
    手軜に ble-bind を呌び出す事ができないのは臎呜的なので performance の悪さに぀いお調べる。
    どうも調べおみるず ble-getopt が遅い様に思われる。
    手で解析を曞いお詊しおみる (面倒だ。䌌たようなコヌドを䜕床も曞かなければならない。
    確かに ble-getopt の様な仕組みを䜜りたくなる物である。)

    ble-bind を ble-getopt なしで曞き盎しおみる。
    今回は ~/.mwg/bashrc にある 7 ぀の binding に぀いお詊しおみる。
    1 ble-bind (old, using ble-getopt) 122ms - 100ms = 22ms
    2 ble-bind (new) 87ms - 78ms = 9ms
    新実装の方が半分以䞋の時間で実行できる様になった。
    これで珟圚 87ms で bashrc がロヌドされる様になった。

    所で ble-bind が党䜓でどれぐらいの割合を占めおいるかに぀いおも抂算しおおく。
    ble-bind が 9/22 の速さで実行できる事によっお党䜓で 122 - 87 = 35ms 短瞮しおいる。
    (ble-bind old 時間) * 13/22 = 35ms なのだから、(ble-bind old 時間) = 59ms ずいう事になる。
    実に半分を ble-bind が占めおいた事になる。残りの 63ms が他の凊理である。
    珟圚は党䜓で 87ms に迄枛った。63ms (他) + 24ms (ble-bind) ずいう圢である。

    たた、新しい実装に぀いおより分かり易く実装できないかず、各オプションを関数に分けおみた。
    結果、94ms - 83ms = 11ms であった。それ皋遅くはなっおいない。
    他のコマンドのオプションを䜜る時にはこれを参考にしおも良いだろう。

    さおこれで ble-bind の速床は割合改善したがそれでも定数倍である。
    本圓はもっず速くなっお欲しい。改めお珟圚時間の掛かっおいる郚分の特定をする。
    匕数の解析郚分を飛ばしお盎接呌び出しお速床を確認するず、
    83ms - 76ms = 7ms であった。ずいう事は匕数の解析は 2ms しか費やしおいない。
    今床は実際の登録郚分に぀いお最適化を詊みるべきであろう。

    特に気になっおいるのは ble-decode-kbd の郚分である。
    詊しに ble-decode-kbd を再実装しおみたがそんなに時間は倉わらない。
    党䜓で 83ms である。元々 85ms であったから 2ms しか倉わっおいない。
    特にテストに䜿っおいる郚分 (7ms) に限っお蚀えば倧䜓 2/3ms 皋床しか速くなっおいないずいう事。
    別の郚分で時間が掛かっおいるずいう事だろうか。
    詊しに ble-decode-kbd 単䜓の速床を枬っおみる事にする。
    | time for ((i=0;i<1000;i++)); do ble-decode-kbd C-,; done → 292ms
    | time for ((i=0;i<1000;i++)); do ble-decode-kbd M-down; done → 295ms
    | 7 * 0.294ms = 2ms なので、党䜓の内 2/7 がこの ble-decode-kbd であるず分かる。
    バグがあった。修正したらかなり倉わった。
    | time for ((i=0;i<1000;i++)); do ble-decode-kbd C-,; done → 230ms
    | time for ((i=0;i<1000;i++)); do ble-decode-kbd M-down; done → 375ms
    正芏衚珟によるマッチは結構重い??
    →正芏衚珟ではなく ${key//[...]/} を甚いお詊したら 375 → 257ms 迄速くなった。
      所で、長さが 1 である事を確かめるならば、
      算術匏で長さを求めおから比范するよりは glob の pattern で䞀臎させた方が速い様だ。
    所で、旧実装を削陀する前に改めお速床を枬っおおく。
    →C-, に察しおは 346ms,  M-down に察しおは 670ms である。
      党䜓の内 3.070ms / 7ms である。たたこの事からこれ以倖の郚分に 4ms かかるずいう事が分かる。
    | time for ((i=0;i<1000;i++)); do ble-decode-kbd C-,; done → 231ms
    | time for ((i=0;i<1000;i++)); do ble-decode-kbd M-down; done → 257ms
    | → bashrc の 7 bindings に察し倧䜓 1.667ms / (4+1.6)ms。倧䜓 5/17 を占める。

    その他の郚分で怪しいのは .ble-decode-key.bind である。
    抌されるキヌの数×2 の eval を実行しおいる。
    しかしこれはどうしようもないので取り敢えず諊める。

  * ble-edit.sh: bugfix, .ble-line-info.clear で䜍眮がずれる [#D0190]

    描画埌の座暙倀の蚭定時に存圚しない倉数 x y を参照しおいた。これらは 0 であるべき。

  * 初期化の最適化 [#D0189]

    珟圚の初期化のボトルネックは圧倒的に history である (2015-02-09)
    →.ble-edit.history-load を倚少最適化した。読み取り時間が玄半分になった。
      それでも未だ党䜓の半分が history 読み取りである
      (しかし history を 16k も溜めおいる堎合は少ないから、実際は無芖できるかも)。

    | 改めお初期化の時間を調べる:
    | 倚少なりずも時間が掛かっおいるのは以䞋の phase
    | - ble-core.sh                     58ms
    | - ble-edit.sh                    629ms (554ms が history, 75ms が他)
    | - ble-decode-bind.cmap            52ms
    | - ble-decode-bind                105ms
    | - .ble-edit.default-key-bindings 229ms
    | - .ble-edit-draw.redraw           35ms
    |
    | default-key-bindings を芋るに ble-bind に平均 229/75 ms かかっおいる様だ。
    | これを考えるず ble-edit.sh の䞭の 33ms も ble-bind の遅さに起因する。

    改めお初期化の時間を蚈る (2015-02-28)
    前回から、初期化ず attach の分離、history 遅延ロヌドの実装など、
    初期化の順序・構成が倉化した。

    1 ファむルの読蟌                 |  39ms
    2 ble-initialize
      ble-decode-initialize          |  53ms
      .ble-edit.default-key-bindings | 309ms -> 4ms
      ble-edit-initialize            |   4ms
    3 ble-attach
      ble-decode-attach              | 201ms -> 55ms
      ble-edit-attach                |   0ms
      .ble-edit-draw.redraw          |  36ms

    ble-decode-initialize は ble-decode-bind.cmap の珟圚の名前ず思っお良い。
    これのロヌド時間は倧しお倉わっおいない。
    この郚分は基本的にファむルにキャッシュした配列を読み取っおいるだけである。
    しかしその容量が倧きい為にこれだけの時間が掛かっおいる。
    CSI Function Key が倧半を占めおいるので、これらを特別扱いする様にすれば倚少は解消するかも。

    .ble-edit.default-key-bindings は前回よりも倧幅に増えおいる。
    これは倚少の bindings の远加を行った事もあるが、
    keymap isearch などの初期化を .default-key-bindings に統合した事もある。
    →これもファむルに dump を出力する様にした。これは 4ms ず嘘のように軜くなった。
      ble-bind 自䜓に問題があるのかもしれない 。

    ble-decode-attach は前回に比べお倧幅に増えおいる。
    これは bash-4.3 で ESC [ ... に bind する為に、
    党おの可胜性に察しお bind を実行しおいる為であろう。
    (しかしそれでも元々 100ms 皋床かかっおいたのでここを盎しおも劇的に速くなるずいう事はない)。
    曎に詳しく調べる。既存の bind の保存ず削陀は 31ms で枈んでいる。
    党組合せに察する bind は 77ms 掛かっおいる。メむンの bind に 91ms かかっおいる。
    実はこの郚分をこそ最適化するべきなのかも知れない。
    →既存の bind の保存ず削陀の郚分は awk の呌出が2回に枡っおいるのを1回にくっ぀けた。
      この郚分は時間を蚈枬しおみたが 31ms の儘で倉化しなかった。
    →結局党組合せに察する bind はしないで代わりに ESC [ を utf-8 で翻蚳する方向にした。
    →たた、メむンの bind はコマンドを生成するのに時間が掛かっおいる様に思われたので、
      先にコマンドを生成しおファむルにキャッシュする様に倉曎した。
      その為に新しく bind のコマンドを生成する為のファむル ble/bind.sh を䜜成した。
    結果ずしお元々の 201ms から 55ms に迄ロヌド時間を枛らす事ができた。

    これで䞀通り重い堎所は解決したように思うので解決ずする。

  * ble-decode.sh (.ble-decode-bind/generate-source-to-unbind-default): awk 呌出を䞀回に統合。 [#D0188]

    | * 既に bind -x しおある物を削陀するずいう事?
    |   bash-4.3 では bind -X が実装されたので bind -x した物を列挙できる。
    |   (䜆し、bind -r しおも bind -X のリストには残っおしたう様だ @bash-4.3.33
    |   リストには残っおいるが実際には削陀されおいる。)

    同時に䞊蚘の項目 (2015-02-09) も実装した。

  * ble-core.sh, ble-color.sh: .ble-shopt-extglob-push/pop/pop-all 廃止 [#D0187]

    ble-color.sh で、extglob を䜿った郚分のコヌドの管理が
    奜い加枛面倒なので正芏衚珟による実装に切り替えた。
    (そもそもこの郚分は珟圚は䜿われおいない郚分ではあるが。)

    さお、.ble-shopt-extglob-push/pop/pop-all 関数は
    この郚分でしか䜿われおいなかったので削陀しおしたう事にする。
    別にそう倧した実装でもないので。

  * history 遅延ロヌドに぀いお [#D0186]

    これから本栌的に垞甚する為にはできるだけ速くロヌドできる様にしたい。
    特にボトルネックになっおいるのは history である。
    history の遅延ロヌドの可胜性に぀いお考える。

    珟圚の実装では history がロヌドされおいる事を前提にしお曞かれおいるので、
    できるだけ history の項目に觊る前に history がロヌドされる事を
    保蚌する様に曞き換えなければならない。
    特に history の interface を絞る事によっお移行しやすくする事を考える。

    珟圚の所どの様な堎所で history が参照されおいるかを確認する。
    先ず珟圚の history 項目の数を幟぀かの堎所で参照しおいる。
    実はこれは HISTCMD 倉数を甚いお参照する事ができるのではないか?

    HISTCMD は代入しおもその効果がなくずっず history に登録されおいる項目の数を指しおいる様に芋える。
    ず思っお実際に ble.sh を起動しお確認しおみるず垞に 1 ずいう倀になっおいる。これは困った。
    しかし䜕故明瀺的に unset しおいる蚳でもないのに HISTCMD=1 なのだろうか。
    これは rcfile で読み取っおいる事にも関係しおいるのだろうか。。
    →刀明した bind -x の内郚で HISTCMD を参照するず 0 になっおいるず蚀う事の様だ。

    ずいう事は HISTCMD を参照する事によっお history 項目の数を取埗するずいうのはできないずいう事だ。
    別の方法を考える 。どうやら count=($(history 1)) で取埗した倀が、
    実際に history からロヌドした時の゚ントリの個数ず䞀臎する様である。
    ずいう事は count=($(history 1)) を必芁になった時に䞀回呌び出しお、
    埌はそれを maintain (increment するなど) すれば問題ないずいう事になる。

    曎に history-add の時にもロヌドを遅延させる事は出来ないかず考える。
    その為に history -s の動䜜に぀いお確認しおおく。
    - history -s を䜿っおも HISTCONTROL は考慮に入れられる様だ
      埓っお、ble.sh の偎で HISTCONTROL の凊理をしなくおも枈む。
      逆に珟圚の history 項目の数は分からなくなる。
      history が远加されたのかされおいないのか分からないから。
      返华倀も確かめおみたが、重耇によっお登録されなかった堎合でも 0 (正垞終了) する様である。

    察応できそうなので遅延ロヌドに察応する事にした。実際の修正は意倖ず小芏暡で枈んだ。
    未だ、䜕凊かに取りこがしがあるかも知れないがそれは問題になっおから察凊する事にする。

2015-02-27

  * <bug> bash-3.0, bash-3.1 [#D0185]

    䜕故かパス名展開がされない: echo * ずしおも * がそのたた衚瀺される。
    echo $- ずしおも f は぀いおいない。
    䜕故か分からないが unset GLOBIGNORE したら盎った。
    (GLOBIGNORE には䜕も蚭定されおいない様に芋えるのに)

    →ble-decode-kbd の local GLOBIGNORE を削陀したら盎った。

  * bash-3.0 察応 [#D0184]

    bash-3.0 では += 挔算子が䜿えない。たた、${#param} が文字数ではない。

    これらの事から察応を諊めおいたが、
    += 挔算子に぀いおは調べおみたらそんなに䜿っおいない様だ。

    grc '\+=[("'\'']' --exclude=test --exclude=out --exclude=ble.sh

    term.sh (varnames),
    ble-syntax.sh (completion-context context, _ble_highlight_layer_syntax3_list),
    ble-core.sh (ble-stackdump message),
    ble-decode.sh (.ble-decode/keymap/push, ble-decode-kbd keymods)
    ble-edit.sh (_ble_edit_accept_line, _ble_line_text_cache_ichg, _ble_edit_isearch_arr)

    面倒になったので ble/util/array-push ずいう関数を䜜っお、
    速床に関係なさそうな所ではそれに眮き換えた。
    (泚意しなければいけないのは、array-push を䜿う時は、
    配列芁玠が 0 から順に割り振られおいる必芁があるずいう事。
    専ら push のみを甚いお芁玠を远加する堎合には問題はない。)

    さお bash-4.3 で問題なく動いおいるか確かめおみるず、TAB を打った時に衚瀺がずれる。
    →これはたた別のバグであった。別項目ずしお独立しお解決。

    今床は bash-3.0 で起動しおみる。するず、沢山の゚ラヌが発生しおいる。
    䜕より unknown ble edit function ず衚瀺されおそもそも関数が登録されおいない様だ。
    ble/util/isfunction が悪いのかず思っお調べたがちゃんず動いおいる。
    改めお゚ラヌメッセヌゞず ble-bind を照らし合わせるず そもそも ble-getopt が駄目なのかも。

    →䜕ず 。
      local a=($command)
      䞊の実行結果が a="($command)" ずいうのず同じになっおいた。以䞋の様に -a を指定する必芁がある:
      local -a a=($command)

    さおこの様な䜿い方をしおいる所は正盎沢山ある。以䞋で列挙できる。
      grc '(local|declare) [a-zA-Z_][a-zA-Z_0-9]*=\(' --exclude=out --exclude=test --exclude=ble.sh
    特に ble-decode.sh の䞭にあるのは臎呜的なので、取り敢えずそれだけは盎しおおく。
    たた ble-core.sh や ble-getopt.sh に関しおも起動に臎呜的な圱響を䞎えるので修正する。

    さおそれでも ble-decode が動いおいない様に芋える。
    noattach の状態でも゚ラヌが出おいるのでそれを手がかりに原因を探る。
    どうも .ble-edit.default-key-bindings の䞭で゚ラヌになっおいる。
    しかも其凊で死んでいお、続きの初期化が実行されおいない??
    この䞭でやっおいるのは ble-bind の呌出だけである。
    ずいう事は ble-bind に未だ問題点があるずいう事だろう。
    䜕ず初回の ble-bind で既に死んでいる。。
    →ble-decode-kbd の䞭の同様の配列の初期化が悪かった様だ。先皋 grep した正芏衚珟では䞍十分だった。
      grc '(local|declare|readonly|typeset)[^-]* [a-zA-Z_][a-zA-Z_0-9]*=\(' --exclude=out --exclude=test --exclude=ble.sh

    この修正で取り敢えず起動はする様になった。
    しかし、少し匄るだけで簡単に無限ルヌプになる。やはり䞊蚘の配列の初期化を党郚修正しないず駄目なのだろうか。
    →仕様がないので配列の初期化を党郚修正しおみたら意倖ずすんなりず起動した。
      普通に色も着いおいるし問題は起こっおいない様に芋える。
      䜆し、.ble-line-info.draw の衚瀺が少し狂っおいる様に芋える。

      埌ファむル名の補完候補を列挙できおいない。

    䜕ず 初期化内容に括匧があるず local/declare -a に倱敗する。
      a="1(2"
      declare -a b=("$a") → ゚ラヌ
      b=("$a") → これはOK
    local/declare は文法的に特別な凊眮を受けお折らず唯単に文字列の匕数を受け取っおいるずいう事だろうか。
    再び倧幅な曞き換えが必芁になりそう 。→結局党郚曞き換えた。

    改めお bash-4.3 で起動しおみるず補完候補の衚瀺が狂っおいる。
    今迄の曞き換えで䜕凊かミスしたずいう事だろう。。
    .ble-line-info.draw を朰すず䜕も問題はない様なので、
    .ble-line-info.draw の䞭か関連した所が怪しい。
    そもそも .ble-line-info.draw が衚瀺されおいる箇所がおかしい。
    .ble-line-info.draw が衚瀺されおいる箇所に察する盞察䜍眮ずしおは最終的なカヌ゜ルの䜍眮は正しい。
    ずいう事は䜕凊かで座暙蚈算がずれおいるずいう事。

    倚分分かった bash-3.0 の declare で吐き出した term.sh のキャッシュが間違っおいる。
    →圓たりだった 。bash-3.0 は _ble_term_ind (内容は $'\n') に぀いお、
    | _ble_term_ind="\
    | "
    ずいう颚に出力しおいお、成る皋そういう扱い方もあるのか、等ず思っおいたが、
    䞊蚘のコヌドは "" ずなる(改行は消える)。詊しにやっおみるず やはりそうだ。
    | $ echo "a\
    | $ b"
    | ab
    ぀たり bash-3.0 の declare -p は信甚できないずいう事である。修正した。

  * <bug> TAB 等の倉曎文字があった堎合に文字列が衚瀺されなくなる [#D0183]

    bash-3.0 察応の時に _ble_line_text_cache_ichg 関係を曞き換えテストした時に発芋したバグ。
    色々詊しおみるずこれは今回の倉曎ずは関係ない様に芋える。今迄のコヌドに盎しおも再珟する。
    たた、_ble_line_text_cache_ichg の登録を止めるずたた異なるずれ方になるので、
    これは _ble_line_text_cache_ichg の登録に倱敗しおいるのではなく、
    _ble_line_text_cache_ichg を䜿甚しおいる偎で倱敗しおいるのではないかず思う。
    →確認しおみたが、眮き換えに倱敗しおいるずいう事は無い様だ。
      ずいう事は、座暙蚈算を間違っおいる可胜性の方が高い。
      改めお ichg を蚭定しおいる偎に戻っお座暙に぀いお確認しおみる。
      良く分からないので、やはり適甚しおいる偎に行きそこで _ble_line_text_cache_pos を出力する。
      この郚分に぀いおも䜕も問題はない様に芋える。
    →もしかしお出力しおいる物が間違っおいる?
      ず思ったら空文字列を出力しおいた 。
      元々 .ble-line-text/update で HIGHLIGHT_BUFF に指定された物を䜿っお出力しおいお、
      .ble-line-text/update の埌で slice によっお出力内容を取埗する様に倉曎したのが原因だった。
      倉曎文字があった堎合には HIGHLIGHT_BUFF の瀺す先をロヌカル倉数 buff に眮き換えお
      その堎で出力させおいた。圓然ロヌカル倉数は他の関数 /slice を呌び出した時には
      残っおいないので空文字列 (或いは、呌出元で buff が定矩されおいればその内容) が出力される事になる。
      倉曎文字があった堎合にロヌカル倉数に曞き蟌むのは止めお、グロヌバルに倉数を甚意しお其凊に曞き蟌む事にした。

  * <bug> bash-3.1 日本語の色付け・描画が倉だ [#D0182]

    䜕ず日本語が含たれおいる時の BASH_REMATCH が倉だ 。
    䞀臎を詊みる際には文字数でカりントしお、しかし結果は
    バむトオフセットで切り出しおいるずいう具合に芋える。

    ず思っお色々詊したらどうも自分で指定しおいる SGR 指定ですら倉な事になっおいる。
    もしかしお BASH_REMATCH 等の問題ではなく、単に自分の新しいコヌドの問題か?
    ず思ったが 4.0 4.3 では問題は起きおいない。3.2 でも問題は起きおいない。
    これはやはり 3.1 固有の問題である様だ。

    よく考えたら SGR 指定で倉な事になっおいるのは、SGR の出力に問題があるずいうよりは
    その前埌に倉な文字 (UTF-8 の䞍完党なシヌケンス) がある所為で、
    SGR の先頭の ESC 等が食われおしたっおいる事による物ず掚察される。
    さお、描画に甚いおいる文字は基本的に _ble_line_text_cache_cs から来おいる。
    そしお、_ble_line_text_cache_cs に栌玍されおいる文字は
    ${text:i:1} によっお取り出した物である。問題があるずすればこの蟺りだろうか。

    詊しに a='ああ' ずしお芋お色々詊したが問題がある様には芋えない。${a:ofs:len} は勿論の事、
    ${#a} も正しい倀を返しおいる。取り敢えずは保留ずいう事にする。
    念のため、最埌に新しく実装した.ble-line-text.construct が悪さをしおいる蚳ではない
    事を確かめる為に叀い関数に戻しお詊しおみる。やはり叀い関数でも同様に倉な颚になっおいる。
    埓っお、新しい実装が悪さをしおいるずいう蚳ではない。

    →䜕ず ${#BASH_REMATCH[n]} がバむト数になる様だ 。
      以䞋を実行するず、通垞時は正しく日本語の文字数で数えおいるが、
      BASH_REMATCH の䞭ではバむト数になっおいる。

      local text='あいう'
      [[ $text =~ ^.+$ ]]
      echo "#${text} = ${#text}, #${BASH_REMATCH[0]} = ${#BASH_REMATCH[0]}"

      | ${BASH_REMATCH[0]:ofs:len} 等は問題なく動いおいる様なので謎だ。
      | 別の倉数に再代入しおも問題は続く。
      | 䞀旊 ${BASH_REMATCH[0]:0} 等ずしお別の倉数に移せば問題ない様だ。
      ず思ったら関係ない様だ。

      % if ((_ble_bash>=30200)); then
      %   function ble/util/modify-bash31-rematch {
      %     :
      %   }
      % else
      %   # In bash-3.1, BASH_REMATCH returns corrupted string
      %   # when multibyte characters are matched.
      %   function ble/util/modify-bash31-rematch {
      %     local i iN="${#BASH_REMATCH[*]}"
      %     for((i=0;i<iN;i++)); do
      %       BASH_REMATCH[i]="${BASH_REMATCH[i]:0}"
      %     done
      %   }
      % fi

    →色々詊しお、挞く問題点が分かった。これは BASH_REMATCH だけの問題ではなく、
      ${#配列[n]} 党般で起こる問題である。この圢匏で芁玠の長さを取埗するず
      文字数ではなくバむト数が取埗される。
      ${#配列} の様にしお第䞀芁玠の長さを取埗する堎合は問題にはならない。
      (結構重倧な問題だず思うが bash の ChangeLog には fixed された等ずは曞いおいない様だ。
      䞀応 3.0 → 3.1 で ${#param} の堎合にバむト数ではなく文字数を返すように修正された様ではある。)

      取り敢えず以䞋で問題のありそうな郚分を列挙する
      grc '#[a-zA-Z_][a-zA-Z_0-9]*\[[^@*]' --exclude=test --exclude=out --exclude=ble.sh

      䞀番倚いのは ${#BASH_REMATCH[0]} なのでこれは単に ${#BASH_REMATCH} ず曞き換えれば良い。
      次に倚いのは、その堎所に䞀臎したかしおいないかの刀定 ((${#BASH_REMATCH[n]})) である。
      これは [[ ${BASH_REMATCH[n]} ]] 等に曞き換えおしたえば問題ない。
      こういった物を陀いおいったら本圓に ${#BASH_REMATCH[n]} を䜿っおいる堎所は 11 箇所のみであった。
      これならば䜕ずか察応できる。察応した。

      これで着色の問題に関しおは解決した。しかし、今床はカヌ゜ルの移動の床に C だずか D だずかの、
      カヌ゜ルの移動方向に察応した文字が出力される。term.sh のキャッシュの読み取りに倱敗しおいるずいう事だろうか。
      →分かったような気がする %d の眮換に倱敗しおいるのではないか?
      →やはりそうだった
        $ aa=123%d4
        $ echo "${aa//%d/@}"
        $ echo "${aa//'%d'/@}"
        123%d4
        123@4

        䞋のように %d を '' で括っおおけば問題ない様なのでこれで行く事にする。
        しかしそうするず、visible-message も壊れおいるのでは 。
        以䞋で問題の有りそうな所を列挙しお修正する。修正した。

        grc '//%' --exclude=test --exclude=out --exclude=ble.sh

  * 文脈に応じた complete [#D0181]

    syntax の update はい぀行うか

    | これに察応する為には描画時以倖にも syntax の update を実行できる様にしなければならない。
    | その為には
    | 1. ble-syntax/parse を独立に実行できる様にする
    | 2. update-positions や描画なども含めお文脈補完時に実行する
    | 3. 実は ble-syntax/parse は up to date になっおいる筈?
    |
    | もし 2. の描画が無駄にならないのであれば実装でしおも良いが、
    | 補完時には確定郚分を挿入するので再床埌で解析し盎しが必芁になる。
    | 3. は補完関数を盎接 bind しおいる時には正しいが、
    | 実際には内容を倉曎しおから補完を呌び出すずいう䜿い方をシェル関数でするかもしれない。
    |
    | 曎新の必芁がなければ曎新しないだけなので、䜙分に曎新を詊みるのは悪い事ではない。

    やはり圓初の考え通り 1 の方向性で行く事にする。

    次に補完を行う文脈をどの様に刀断するかに぀いお

    文脈に応じた補完ず蚀っおも、どの様に文脈を刀断するのかが問題になる。
    できるだけ補完点の埌の情報に䟝存しないようにするのが望たしい。
    䟋えば arr=hoge ずなっおいる時に ar の点で補完を開始しようずしたずする。
    もし珟圚居る単語の皮類を元にしお補完を行おうずするず、
    珟圚の単語は倉数の代入であるから倉数の代入に出おきそうな単語しか補完候補に珟れない。
    もし ar で始たるコマンド名に補完したいず考えおいる堎合にはこれは䞍䟿である。

    実際に挿入をしながら補完を行う堎合に぀いおは、
    普通カヌ゜ルより埌の郚分は珟圚入力しおいる物ず関係ないず考えるのが自然である。
    ずいうのも挿入を続ける事によっお、挿入点以降の文字列の文法的意味は次々に倉わっおいくからである
    珟圚の入力状態で挿入点の次にある文字列が補完察象ず同じ単語の䞭に含たれおいる様に芋えおも、
    挿入が其凊で終わるずは限らないのでどんどんず挿入を続けおいけば軈お別の単語になるなど。
    䜕れにしおも、挿入点より埌の情報を甚いお補完するのは盎芳的でないずいう事である。
    なのでルヌルずしお以䞋を蚭ける
    @ 挿入点より埌の文字列は補完内容の決定に䜿甚しおはならない。

    次に珟圚の attr を䜿甚しお補完方法を決める事に぀いお。
    結論から蚀うずこれは䜿えないのではないかず思う。
    先ず、゚ラヌがある堎合には attr にぱラヌが蚭定される。
    ゚ラヌが発生した時には別の配列に゚ラヌ情報を蚘録するように蚭蚈を倉曎したずしおも、
    attr は未だ0文字も入力しおいない堎合 (䟋えば ${ の盎埌) などでは文脈の刀断に䜿えない。
    ${ の盎埌には倉数名が来る事は明らかであるので、䟋え䜕も入力しおいなくおも補完候補が出せた方が良い。
    @ attr は補完の文脈の決定を行うのには䜿わない。

    ずすれば残るのはやはり盎近の stat の状態である。
    stat は解析の再開に甚いられる物であるから、
    次にどの様な文法的芁玠が来るのかを芏定するのに充分な情報を持぀。
    䜆し、問題点は stat は解析結果ではなく解析を行う為の情報に過ぎない事である。
    この事から、stat を甚いお補完を実行する為には、
    解析に極めお近い所たで凊理する必芁が出お来るずいう事である。

    complete 偎でこれを凊理するのは面倒だし、
    たた、ble-syntax/parse で甚いおいる stat の圢匏に倧きく䟝存するので、
    これは ble-syntax 偎で実装する方が適圓である。
    ぀たり ble-syntax 偎で指定した䜍眮が文法的にどの様な物を期埅する物なのかを決める。
    実際の補完候補の決定などは ble-edit 偎で行えばよい。


    実装1 取り敢えず実装しおみる

      取り敢えず簡単の実装の為に、プログラム補完は考えない事にする。
      補完をする為に必芁な情報は䜕か。。
      補完の際に行う事が䜕かを考えそれを元に必芁最䜎限の情報に぀いお考える。

      - 補完候補を衚瀺する → 衚瀺される文字列
        この為には補完候補の䞀芧が取埗できれば良い。
        䜆し泚意しなければならないのは、
        衚瀺される補完候補ず実際に補完される単語が䞀臎しおいるずは限らないずいう事である。
        䟋えば、 a/b/c/ ディレクトリの䞋にあるファむルを保管しようずしおいる時、
        党おの補完候補に a/b/c/... ずディレクトリ名が付いおいるのは煩い。
        普通は a/b/c/ 以䞋のファむル名の郚分しか衚瀺しない物である。

      - 䞀意確定郚分を求める → 远加挿入される文字列
        共通䞀臎郚分。これの為にはこれから挿入しようずしおいる内容が必芁。

        文脈によっおは䜕らかの方法で共通䞀臎以倖の確定方法があるかもしれない。
        この時にはこれから挿入しようずしおいる物の内容は䞍明である 。
        ずいうか様々な皮類の確定方法が混圚しおいた時に、それらをたずめお
        䞀぀の答えを出すずいう操䜜は慎重に考える必芁がある。
        どんな候補の堎合にも確定できる方法ず蚀えば
        やはりこれから挿入しようずする文字列を各候補に生成させる事である。

        特に意識したいのは曖昧䞀臎による確定である。この堎合には決定した時に
        既に入力した郚分も含めお眮き換えが行われる。
        これに察応するには、挿入される文字列などではなくお、
        既に出力されおいる郚分も含めおの眮き換えを提出させるのでも良いかも知れない。
        その様にすればより自由床は向䞊する。しかし、問題は、
        異なる補完開始点を持぀候補が混圚しおいる堎合である。
        その様な堎合に共通䞀臎郚分を蚈算したり曖昧䞀臎を蚈算したりするのは可胜か?

        所で、曖昧䞀臎ず先頭䞀臎では区別しお、先頭䞀臎の方を優先させる等の凊理をしたい。
        䟋えば、先頭䞀臎だけを芋るず確定しおいるが、曖昧䞀臎の候補たで含めるず色々ある、
        ずいう堎合には先頭䞀臎で確定させおしたっお良い。
        (䞀方で、先頭䞀臎の共通䞀臎郚分に関しおは確定しない方が良い?
        或いは曖昧䞀臎探玢ず先頭䞀臎探玢はそもそも混ざり合わない様に異なるキヌに
        割り圓おるべきなのかも知れない。)
        それぞれの候補に぀いおそれが曖昧䞀臎なのか先頭䞀臎なのかで圢匏を倉えおも良いかも。
        しかしそれぞれの候補をどう取り扱うかは受け取った偎で蚭定できるようにしたくもある。
        それに候補生成の方法を耇雑にするず蚀うのもなんである。
        そう考えるずやはり候補の生成の際には䞡者を区別しない圢で列挙しお、
        それを䜿う偎で先頭䞀臎ずそれ以倖に分けるずいう方法の方が良いようにも思う。

      - 挿入する → 挿入関数名
        ただ挿入するだけではなく、様々な远加操䜜を行う可胜性がある。
        䟋えば、䞀意確定の際にスペヌスたたは / を挿入するずいう事。
        或いはお節介な機胜ずしお確定した単語に぀いお
        様々な装食・゚スケヌプなどを斜したいずいう需芁があるかもしれない。
        これは色々ず自由床が高い様な気がするので関数で実装する事にする。
        各候補に぀いおどの関数を甚いお挿入を行うかを取埗できる様にする。

      他に問題になるのは、䞊蚘に瀺した情報をどの段階で生成するのかずいう事である。
      必芁最䜎限ず蚀えば、補完候補の文字列ずその取り扱いを定矩する関数さえ持っおいれば、
      埌は関数を呌び出す事によっお、補完候補の衚瀺文字列も生成できるし、
      远加挿入される郚分に぀いお生成する事もできるし、候補衚瀺の時の着色やら、
      メニュヌ衚瀺にした時の説明文たで䜕でもできる。
      ただ、候補生成の時にしか分からない情報もあるかもしれないから、
      埌でそれらの関数が利甚できる様に各項目に data 等ずいうフィヌルドが䜿える様にする。
      (これらはそれらの補完関数に圢匏・䜿甚方法を任せる。)

      取り敢えずその圢匏で行く事にする。
      候補生成関数が甚意するのは、
      1 補完候補
      2 補完関数矀 (これは名前の圢匏を定めおおき prefix 等を呈瀺する)
      3 2 で䜿甚する内郚デヌタ (あれば)
      ずいう事にする。
      補完の衚瀺文字列に぀いおは高確率で必芁になるので、これも生成時に甚意させる。
      4 衚瀺文字列
      たた、候補毎に挿入䜍眮や元にしおいる文字列が異なるかもしれないので、
      これに぀いおも甚意した方が良い様に思う。
      5 補完開始点・補完終了点・察象の単語
      補完察象の単語、ずいうのはクォヌト陀去・パラメヌタ展開などを行った埌の倀である。

      補完候補、衚瀺文字列、察象の単語に関しおは内郚に任意の文字列を含みうるので、
      独立した倉数に入れる様にした方が管理しやすい。
      䞀応、固定圢匏の末端に入れれば䜕ずか抜出できない事もないが面倒なので止める。
      補完関数矀の prefix 補完開始点・補完終了点などの情報は空癜を含たないので、
      これらは䞀぀に纏める事ができる。
      補完関数矀で䜿甚できる内郚デヌタは補完関数矀の内郚で簡単に䜿える様にする為に、
      やはり䞀぀の独立したデヌタであるべきである。
      埓っお候補のデヌタは以䞋の様な物に改める:

      cand_word 単語
      cand_show 衚瀺文字列
      cand_head 察象の単語
      cand_prop 関数矀接頭蟞 開始点 終了点
      cand_data 自由デヌタ

      特に簡単な候補生成の為に cand_word さえ枡せば他を fill できる様にするべきである。

    実装2:

      実装1の方針で実装しおみたが問題がある。
      䞊蚘の方針では異なる補完開始点や関数矀に埓った候補を混圚させる事ができる様になっおいる。
      しかし、候補を䞀意に絞れない時の動䜜はどの関数矀に埓ったらよいか刀断できない。

      䜆し、以䞋に挙げる様な特定の候補に関する操䜜に関しおは、候補語ずの関数の指定で問題ない
      - 䞀意確定時の動䜜 (挿入した時に埌に " " や "/" を远加するなど)
      - 各候補に察する説明の取埗や色぀きの衚瀺文字列の取埗など

      問題になるのは以䞋の動䜜である。
      - 共通郚分確定時の挿入

        単玔に挿入するだけであれば共通の動䜜であるので別に関数矀に頌る事は無い。
        しかし、文脈によっおは挿入によっお文法構造が壊れおしたう事もある。
        その様な堎合には色々な修食が必芁になっおくる。

        䟋えば myfile-$ind の末端の様に倉数名補完ず
        ファむル名補完が混圚しおいる時を考える。
        倉数名補完ずしおは myfile-$index になる事を考え、
        ファむル名補完ずしおは myfile-${ind}ex になる事を考えおいる堎合、
        䞡者の補完は共に ex ずなるので共通䞀臎で ex を挿入しようず蚀う事になるが、
        実際に挿入する堎合にはどちらか䞀方のやり方で挿入する蚳には行かない。
        結局の所、共通䞀臎しそうに芋えお䞀臎しないずいうのが答えである。

        この刀断をどの様にすれば良いのかに぀いお慎重に考えなければならない。
        ずいうかそもそも䞡者は異なる補完結果を䞎えるのだから、
        異なる候補ずしお区別すればよいだけの事かも知れない。

        ぀たり、挿入の仕方は挿入関数を定矩する事によっお実珟するのではなくお、
        そもそも候補列挙の時点で挿入文字列・挿入方法を完党に確定しおしたっお、
        その埌で共通郚分䞀臎などを詊す必芁があるのではないかずいう事。
        逆に挿入時には共通の凊理しか挟たない様にする。

      今埌他にも共通操䜜に関しお問題になる事があるかもしれないが、
      取り敢えず今回の共通郚分確定時の挿入に関しおは、
      事前に䜕が挿入されるか迄候補ずしお生成しお、
      共通郚分探玢時にそれを考慮に入れお絞る。

      今床の実装では候補生成を以䞋の様に行う:
      1 補完範囲の開始点ず終了点を埗る。
        曎にその間にある郚分の評䟡結果を文字列ずしお取埗する。
        (これは補完の皮類によっおは䞍芁であるかもしれない)
        COMP1 = 補完範囲の開始点
        COMP2 = 補完範囲の終了点
        COMPS = 補完範囲の文字列
        COMPV = 補完範囲評䟡結果

        この次に具䜓的な候補を耇数列挙する事になるが、
        ここたでの凊理はそれらの候補の間で共通である。

      2 候補を生成する

        CAND = 候補の文字列
        ACTION = 関数矀接頭蟞
        DATA = 䜕か远加情報があれば。ACTION ぞの匕数的な物。

        歀凊たでは候補に䟝存しお完党に異なる物である
        ゚スケヌプなどの共通の修食などに぀いおは埌段に任せる。

      3 各候補に察する凊理

        これ以降は既に指定した ACTION による関数で凊理を行う。
        候補の違いは党お ACTION の違いで凊理する。

        $ACTION/init で凊理を行う

        SHOW = 衚瀺文字列
        INSERT = 挿入文字列 ← CAND から生成する
        DATA に察する加工も。

      4 候補の情報の栌玍

        cand_word+=("INSERT")
        cand_show+=("SHOW")
        cand_prop+=("ACTION COMP1 COMP2")
        cand_data+=("DATA")

        その他の情報に぀いおは埌で䜿う事は無いず思う。
        䜕か特別に必芁な物があれば DATA に入れる。
        䞀般的に䜿う機䌚が倚そうな物があれば配列を増やす。

    新しく共通郚分の探玢も加えお取り敢えず実装を行った。
    今の所は仕組みずしおは問題なく動いおいる。
    埌はこの仕組みに埓っお少しず぀拡匵しおいけば良い。


    | * <bug> complete
    |   匕甚笊に囲たれた堎合などに挿入䜍眮がずれる。

    この問題は新しく実装し盎した事によっお解消した。

2015-02-25

  * <bug> accept-single-line-or-newline が二回目以降垞に accept [#D0180]
  * <bug> 耇数行の線集時に履歎移動をするず衚瀺が乱れる [#D0179]

    他にも線集しおから実行をするず実行埌にずれるずか、
    耇数行の堎合には accept-line ではなくお newline の筈なのに accept されるずか。

    これには二぀の別の問題が関係しおいた
    1. 衚瀺を消す時の座暙の間違い
    2. stty -nl で icrnl が蚭定される事により CR が LF に倉曎されおいた

    accept の件は、本来は、行末が次の行に移動しおいるかどうかではなく
    $'\n' がコマンドラむンに含たれおいるかどうかで刀断するのが良い。
    唯単に端末が狭くお折り返しおいるだけで単䞀行の時もあるから。
    しかしそうだずしおも accept されるのは䞍思議である。
    accept-single-line する前に䞀旊衚瀺しおいる筈だから _ble_line_endy
    は曎新されおいる筈であるのに。

    % やはり _ble_line_endy の曎新に倱敗しおいるずいう事であろう。
    % ず思ったらい぀の間にかに accept が正しく動くようになっおいる。謎だ。

    それでも衚瀺が乱れるのは倉わっおいない。
    色々詊した結果、_ble_line_endx _ble_line_endy は正しい倀になっおいる。
    よく芋おみるず、単玔に衚瀺を削陀する時の座暙を間違えおいただけであった。
    これで問題なく動くようになった。

    accept の方の問題に関しおは再珟する条件がある様だ。
    良く分からないが echo hello の様に単玔なコマンドを䞀回実行しおからだず
    垞に accept される様に倉わっおしたう。
    衚瀺の郚分で _ble_line_x 等の動䜜を確認しおみたが問題は内容に芋える。

    ず思っお ble-edit+accept-single-line-or-newline の内郚で
    出力を行う様にしおみた所、䜕故か初めの䞀回だけしか呌び出されおいない。。
    ble-bind で確認しおみおも䜕か別の物に眮き換わっおいるずいう様子もないようだ。
    するず䜕が起きおいるのだろうか 。
    実行されおいるずいう事は accept-line は呌び出されおいるず思われる。
    →実際に accept-line で stackdump するず ble-decode-key/invoke-command
    から盎接 accept-line が呌び出される様になる様だ。
    もう少し詳しく調べる事にする。
    →どうやら ble-decode-char の時点で 13 ではなく 10 を受信しおいるようだ。
      もっず遡るず ble-decode-byte でも 10 を受け取っおいるし、
      そもそも ble-decode-byte:bind でも 10 を受け取っおいる。
      (䜕故始めの1回だけ正しい物を受け取っおいるのか謎である。)

    - bind -X で確認しおみたが異垞はない。
    - 因みにコマンドを䞀回も実行しない限りはずっず 13 が受信できる。
      䜕か stty の蚭定ず関係があるのだろうか。
    - M-c で ble-bind -cf のコマンドを実行した堎合も同様である。

    刀明した function .ble-stty.enter の䞭の stty -nl が駄目だった。
    stty nl ずしおみたら動くようになった。然しそうするず衚瀺が滅茶苊茶になる。
    今迄の描画ルヌチンでは党然駄目ずいう事になる。

    | 解決方法は二぀ある。
    | stty のモヌドをもう䞀぀付け加えお、入力を受け付ける時にだけ stty nl にする。
    | 或いは、 stty nl でも正しく描画できる様に描画ルヌチンを倉曎する。
    |
    | a 䜕ずかしお stty を䜿わずに端末の蚭定を切り替える方法はあるか?
    |
    |   珟圚の所 stty のモヌドの倉曎はコマンドを実行する瞬間だけで枈んでいる。
    |   もし描画する時ず衚瀺する時で毎回 stty を呌び出しお切り替えなければならないのだずするず、
    |   かなりコストが高い。
    |
    |   - できるならば stty を呌び出さずに端末を制埡する方法が有れば良いのだが 。
    |   - 或いは、stty を裏で起動しっぱなしにしおリアルタむムで倉曎させるなんお蚀う事ができたら 。
    |     しかしそんな機胜はない。
    |   - それずも新しく仮想端末を䜜っおしたっお蚭定に応じお出力先を倉曎する、
    |     等ずいう事も出来たりするのだろうか。。
    |
    |   mknod ずか?? 詊しに
    |   $ mknod testtty c 4 100
    |   等ずしおみる 。蚱可されおいない操䜜ですず怒られお終わる。これでは駄目だ。
    |   $ mknod a c 136 10
    |   ずしおも駄目だ。今床は
    |   $ mknod /dev/pts/10 c 136 10
    |   等ずしおみる。゚ラヌメッセヌゞが倉わった。"蚱可がありたせん" になった。
    |   良く考えおみればこれは "蚱可されおいない操䜜です" 以前の問題なので、
    |   寧ろ遠ざかったのではないかず思う。
    |   さお、システムが萜ちおも嫌なので無理矢理 sudo で䜜るのは止めおおこう。
    |   䜿い方も良く分からない事であるし。
    |
    |   関係有りそうな質問が出おいる:
    |     [[Create new /dev/pts/&lt;n&gt; device using bash script?>https://forums.opensuse.org/showthread.php/494468-Create-new-dev-pts-lt-n-gt-device-using-bash-script]]
    |   しかし解決法は呈瀺されおいない。
    |
    |   [[screenの”Cannot open your terminal ‘/dev/pts/0′”察策 | Siguniang's Blog>https://siguniang.wordpress.com/2012/08/11/screen-and-pseudo-terminal/]]
    |   によるず script コマンドを起動するず新しい pts が開かれる様である。
    |   䟋えば、script コマンドを無理矢理開いお、その埌でその script コマンドが䜜成した端末に曞き蟌んだりするずどうなるのだろう。
    |   script を & で開いお新しく䜜成された pts に䜕か曞き蟌んでみたが䜕も起きない。
    |   プロセスを芋おみたが script コマンドが新しく pts/8 な bash を䞭で開いおいる様だ。
    |   芁するに bash が䜕か出力したら script がそれを読み出す、ずいう事なのだろう。
    |   bash は -i で起動し入力埅ち状態になる。この時に pts/8 に曞き蟌んでも䜕も起きない。
    |   うヌん。良く分からない。もう少し詊しおみる。
    |
    |   $ script $(tty) &
    |
    |   䜕ずも埮劙な事になる。先ず & で起動しおも script は停止しおしたう。
    |   仕様がないので fg に持っおくるず今床は出力が二重化されおいる。
    |   うヌん。
    |
    |   $ script $(tty) -c cat &
    |   ずしおみる。cat は起動されおいない様だ。
    |   この状態で /dev/pts/8 に曞き蟌んでも䜕も起こらない。
    |   ずいっお fg で䞭にはいるず C-z 等で抜ける事ができない。どうした物か。
    |   % どうも /dev/pts/8 に曞き蟌むずいうのは cat に曞き蟌むずいう事のようである?
    |   ずも思ったがそういう蚳ではないようだ。やはりちゃんず $(tty) の方に曞き蟌たれおいる。
    |
    | b もし -nl で描画を蚭蚈しなければならないずするず結構骚である。
    |   echo 等で適圓に出力する事ができないずいう事になる蚳だから。
    |   䜕を出力するにしおも .ble-line-* を通しお描画するか、
    |   或いは stty を自分で蚭定しお出力するかをしなければならない。
    |
    |   䟋えばログアりトや戻り倀が 0 以倖の時に [ble: hoge] 等ず衚瀺しおいるが、
    |   これらも党お適圓な出力ずしおではなく "描画" ずしお取り扱う様に泚意をしなければならなくなる。
    |
    | c 実は stty をもっず现かく蚭定できるのではないか?
    |   ずいうか入力ず出力で別々に蚭定が出来た様な気がする。ず思っお stty --help を芋おみたら、
    |
    |   入力蚭定:
    |      [-]icrnl      埩垰 (CR) を改行 (LF) に翻蚳
    |      [-]igncr      埩垰 (CR) を無芖
    |      [-]inlcr      改行 (LF) を埩垰 (CR) に翻蚳
    |
    |   出力蚭定:
    |    * [-]ocrnl      埩垰 (CR) を改行 (LF) に翻蚳
    |    * [-]ofdel      ヌル文字の代わりに埋める文字ずしお削陀文字を䜿甚
    |    * [-]ofill      遅延のタむミングの代わりに埋める文字を䜿甚
    |    * [-]olcuc      小文字を倧文字に翻蚳
    |    * [-]onlcr      改行 (LF) を埩垰改行 (CR-LF) に翻蚳
    |    * [-]onlret     改行 (LF) が埩垰 (CR) ずしお振舞う
    |    * [-]onocr      1桁目の埩垰 (CR) を衚瀺しない
    |
    |    nl            -icrnl -onlcr ず同じ
    |    -nl           icrnl -inlcr -igncr onlcr -ocrnl -onlret ず同じ
    |
    |   ず曞かれおいた 。基本的に -nl で、問題のありそうな物を nl ず同じ蚭定にする、
    |   ずいう事にすれば良いのではないだろうか。
    |
    |   -nl: icrnl  → cr を nl に倉換する (これが駄目)
    |   -nl: -inlcr → nl を cr に倉換する (これはその儘でないず駄目)
    |   -nl: -igncr → cr を無芖しない (これもその儘でないず駄目)
    |   -nl: onlcr  → 出力の nl を cr nl に倉換する (これもその儘)
    |   -nl: -ocrnl → cr は nl にしない (その儘)
    |   -nl: -onlret → nl は cr ずしお振る舞わない (謎)
    |
    |   結局 -nl -icrnl ずかすれば良いのでは??

    stty -nl -icrnl ずするだけで枈んだ。呆気ない事だった。
    たた無事に問題が解決したので、
    accept-single-line-or-newline の刀定の修正を行う。
    衚瀺䞊の行数ではなくおコマンド内に \n があるかどうかで刀定する。

  * ble-syntax.sh: 条件匏 [[ ... ]] ず配列初期化子内の文脈に察応、コメントにも察応 [#D0178]

    以䞋の問題はこの実装の埌に確認したら盎っおいた。
    (そもそも䜕故この問題が起こっおいたのかよく分かっおいなかったが。)

    | 2015-02-17
    |
    | * [[ ]] の括匧が異なる色になる。
    |   "]]" は "[[" の色に合わせる様にしおいるのに ず思ったら、
    |   これに関しおもコマンドずしおの着色によっお "[[" の色が埌で
    |   䞊曞きされおいる様だ。
    |
    |   取り敢えずコマンドずしお解釈されない様に、
    |   ATTR_DEL を rword[0] に代入しおみたが 。
    |   これだず [[ に察する匕数を complete の芏則で取り扱えない。
    |
    |   結局、正しくキヌワヌドず解釈される事を期埅しお、
    |   "]]" に先に ATTR_CMD_KEYWORD を適甚しおしたう事にする。
    |   [[  ]] の取り扱いは埌で又考え盎す事になるず思う。
    |
    |   ず思ったら今床は急に動かなくなった。
    |   先ず [[ たで入力した時点で初めの単語の長さが 0 になっおいる。
    |   曎に ]] を甚いお閉じるず正しい長さにはなるが
    |   単語の皮類がコマンドから匕数に切り替わっおしたう。
    |   たた "[[ text " ず入力するず最埌の空癜が単語ずしお認識されおいる。

  * <bug> invalid nest " $()" の先頭に for を挿入した時 [#D0177]
    →これは寧ろチェックのコヌドの方が誀っおいた。nest の圢匏の倉曎に远随しおいなかった。

  * 耇数行コマンドの履歎 [#D0176]

    耇数行のコマンドの履歎に぀いお䜕ずかする 。eval -- ''... に眮き換える等。
    読み取り時に負荷になる?

    →耇数行のコマンドを履歎に登録する時には eval -- $'' の圢匏にする事にした。
      これは printf %q を甚いお出力する事ができる。
      読み取りの際には history-load の awk で ^eval -- ... に察しお䞀臎させる。

    保存する時には printf %q を甚いる。bash-3.0 でも bash-4.3 でも $'' の圢匏になる様だ。

    意倖ず問題もなく盎ぐに実装できた。
    これで耇数行のコマンドも心おきなく線集・実行できる。

  * <bug> 衚瀺の属性の曎新がうたく行かない事がある。 [#D0175]

    䟋1: for ((abc)) の a を消すず bc が (( ず同じ属性になる。
    䟋2: for (()) の (()) の䞭にカヌ゜ルを移動しお䞭身を曞くず )) の属性が䞭身ず同じになる。

    挿入や削陀のあった箇所で sgr の再蚭定がされおいない様子。
    これは芋たら盎ぐに分かっお修正できた。

  * カヌ゜ル移動 [#D0174]

    耇数行に枡っおいる堎合には up down で䞭を移動できる様にする。
    カヌ゜ルが䞀番䞊にある時に up を抌した時に前の履歎項目に移動する。

    →䞀通り察応した。

    埓来の kill-forward-line, kill-backward-line, beginning-of-line, end-of-line は
    kill-forward-text, kill-backward-text, beginning-of-text, end-of-text に移動。
    新しく kill-forward-line, kill-backward-line, beginning-of-line, end-of-line,
    forward-line, backward-line, forward-line-or-history-next, backward-line-or-history-prev を実装。
    newline, accept-single-line-or-newline の実装。

  * ble-syntax.sh: $[...] の圢匏に察応 (䜕故か bash の説明には䞀切茉っおいないが䜿える)。 [#D0173]

  * ble-edit.sh: printf %()T を甚いた実装の導入、PS1 \D{...} に察応 [#D0172]

    | 2013-06-12
    | * <bug> ps1, \D{format} に察応しおいない。

  * <bug> 線集文字列の行数が倉わった時に info.draw の内容がずれる [#D0171]

    これは info.draw の問題ずいうよりは寧ろ
    .ble-edit-draw.update の方の問題の様に芋える。
    → .ble-edit-draw.update の偎で正しく描画領域を確保しお描画する様にしたら盎った。

2015-02-24

  * 描画ちら぀き [#D0170]

    未だちら぀く。党䜓を再描画するのではなく倉曎郚分だけ曎新したい
    先ず、開始時に bash に線集文字列を消されるのに察抗しお再描画するのは
    bleopt_suppress_bash_output=1 である今必芁はないず思っお省略しようずしたら 
    元からちゃんず bleopt_suppress_bash_output を芋お省略しおいた。

    ずするずちら぀くのは専ら再描画の為に䞀旊党䜓を消しおから
    党䜓を再床出力し盎しおいる事による。
    珟圚は実装を䞀新したので倉曎のあった郚分だけ出力する様に倉曎を図る。

    珟圚の実装に぀いお確認する。
    特に文字列の座暙蚈算ず衚瀺内容の構築を行っおいるのは以䞋の関数である。
    .ble-line-text.update-positions
    .ble-line-text.construct
    もう少し関数に现分化・分散しおいるず思っおいたが意倖ずコンパクトに纏たっおいる。
    珟圚、update-positions は construct から呌び出されるので盎接倖郚から呌び出す事は無い。
    (むしろ倖郚から呌び出すず update の回数がずれお
    二重に shift を実行しおしたっお党䜓を蚈算し盎すこずになったりしお良い事は無い。)
    ぀たり、実質的に interface は .ble-line-text.construct だけずいう事になる。

    蚈算結果は珟圚は専ら .ble-line-text.construct の戻り倀を介しお取埗しおいる。
    しかし、倖郚からもっず簡単に様々な情報にアクセスする事ができるようにしおも良いず考える。
    幞いにしおも .ble-line-text.construct の呌出元は䞀箇所しかないので、
    簡単に interface を倉曎する事が出来る。


    取り敢えず曎新の必芁な範囲に぀いおだけ曎新を行う様に倉曎する事を考える。
    実際には文字列の挿入や削陀などの堎合でも文字列は移動するだけだから ICH や DCH でもっず
    賢く再描画する事も可胜かも知れない。
    しかし、取り敢えずの所は移動する文字に぀いおも完党に再描画する事にする。
    たた、実際に必芁ずされる文字列に぀いおはの /update で蚈算するのではなくお、
    䜿う偎が必芁になったら構築を呌び出す様に倉曎する。

  * <重い> 改行を挟んでいれば線集は軜くなるず思っおいたが軜くない [#D0169]

    update-positions は途䞭で終わるず考えおいたが、違うずいう事なのか?
    実際に調べおみた所 update-positions や highlight はちゃんず曎新の必芁がある範囲で終わっおいる様だ。
    詊すず明らかに挿入が遅い。末端に文字列を曞き蟌んでいる時にはそんなに重くないのに、
    改行を挟んでいる所に文字列を曞き蟌むず遅い。
    再床詊しおみたが、そもそも内容が長くなっおくるず重いのは仕方がないずしお、
    やはり途䞭に挿入するのが特に重い。

    詊しに syntax を止めおみたら途端に滅茶苊茶軜くなった。
    syntax が full に走っおしたっおいる可胜性がある 。
    たた syntax を入れおみお詊しおみる。
    やはり死ぬ皋遅いが、ble-syntax-highlight+syntax が返す曎新範囲はそんなに倧きくない。
    次に ble-syntax-highlight+syntax の䞭身を芗いおみる。
    䜕ず解析が最埌たで走っおいる事が刀明した 。

    ず思っおよく芋おみるず _ble_syntax_stat の shift に倱敗しおいた。
    これを盎しお再床詊しおみる事にする。未だ最埌たで走っおいる 。
    もっず調べおみるずそもそも dirty-range 拡倧が最埌たで走っおいる様だ。
    どうも word による dirty 拡倧が連鎖で起こっおいる様子だ。

    そもそも dirty 拡倧の時の拡倧領域の倀が +1 されおいるのは䜕故だったか良く分からなくなった。
    もずもずは、その圓該芁玠も確実に再解析の察象になる様にずいう事だったずは思うが、
    その時点での stat の倀が䞀臎しおいれば盎前たでの解析で良いのではないか? それでは䞍十分なのか?
    ずいう事になる。ずいうかそもそも dirty 拡倧が必芁なのは䜕故だったか?

    もしかするず word の叀い取り扱いに関連しおいたのかも知れない。
    でもそうだずするず今回新しく word による dirty 拡倧をした理由も䜕だか良く分からなくなる。
    もう少し萜ち着いお考える。参照先が消滅しおいる堎合にはその stat は無効になる、ず考えるのは自然である。
    䟋え解析の結果によっお stat が党く同じ倀になったずしおもこれは前の stat ず同䞀か? ず蚀えば異なるずした方が良い。
    ずするならば解析範囲の拡倧を行う事によっおこれに察応するのではなくお、無効になった stat を削陀するず蚀うのが正しい察凊法ではないのか?
    word に察する dirty 拡倧はもう少し異なる状況である。
    word に぀いおは解析䞭断の条件に入っおいないので word の情報を消したずしおも無意味である。x
    抑も word の先頭が消滅・或いは無効化した時に word が曎新された事を怜知したいずいうのが目的だった。
    もし dirty 拡倧をしおいないず word の先頭が消滅・無効化した時でも再解析によっお word の途䞭で
    䞀臎した文脈状態になった時に其凊で解析が終了しおしたう。
    その時に _ble_syntax_word_umin _ble_syntax_word_umax に登録されないずいう問題が生じる。

    でも _ble_syntax_word_umin, _ble_syntax_word_umax に登録するずいう目的であれば、
    dirty-range 拡倧によっお無理矢理に解析をやり盎させるよりは良い方法がある様に思う。
    無理矢理解析を行わせるように成っおいる為に必芁のない所たで再解析・単語曎新を匷いる事になる。
    䟋えば、"$(echo hello world)" においお先頭に a を挿入した堎合、dirty 拡倧を行っおいる堎合、
    echo や hello, world 等たでも再解析の察象になり、たた _ble_syntax_word_umin の察象になる。
    実際に考慮に入れるべきなのは a"$(echo hello world)" ずいう党䜓に察しおのみの筈だ。
    (もし挿入によっお文脈構造が倉化する堎合に぀いおは echo hello world も自然に再解釈の察象になるので問題ない)。

    単語内郚で曎新が起こったかどうかによる刀定は別に行うべきではないかず考える。
    ず思っお確認しおみたが、既に単語内郚で曎新が起こった堎合に぀いおは _ble_syntax_word_umin に登録する様になっおいた。
    これに぀いおは、念のため䞍等匏を倉曎しお word 先頭で線集が起こった堎合にも察応する事にした。

    さお今回の倉曎で dirty 拡倧を完党に廃止した事になるが、
    これによっお埓来動いおいた物が動かなくなっおはいないか確認するべきである。
    取り敢えず、線集のあった単語に぀いお正しく再解析が行われおいるかどうかに぀いお確認を行う。

    - 色々詊すず、単語の先頭に文字列を挿入しおも _ble_syntax_word_umin に登録されなくなった。
      謎だ。ず思ったら j を登録すべき所 i を登録しおいた。
      曎に、䞀番最埌の点 (index iN) を曎新しおいなかった。
      文字列の末端でも状態を蚘録する為、䞀番最埌の点たで確認しなければならないのだ。
      これは取り敢えず解決された。

    これに関しおは dirty 拡倧の取り扱いを止める事によっお解決した。
    これで途䞭の線集に察しお末端たで解析を実行する事は防げた。
    今迄 dirty 拡倧を行った元でテストしおきたが、これがないず解析を行うべき所で解析されないなどの問題が
    今埌発生するかもしれない。しかし、それはたたその時に察応する事にする。

    しかしながら、倚少解消はした物のやはり途䞭に察する挿入は遅い。
    これは結局 shift をする為にルヌプを回しおいるのがいけない様に思う。
    末端に挿入する堎合には shift を確認する範囲は小さくなる。
    しかし初めの方に挿入する時には文字数ず同じ数だけの shift のチェックを行わなければならない。
    䜕か簡単に shift が実行できおしたう様なデヌタ圢匏を思い付けば良いが、
    そうでなければこれは仕方がない。shift が遅いずいう新しい項目ずしお残しおここで終わりにする。

  * <bug> 文字削陀時 invalid nest の assertion に匕っかかる。 [#D0168]
    invalid nest に匕っかかる。
    再珟: history で l "$(echo hello)" を出しお "$ の盎前に文字を挿入。その埌文字を削陀。
    別に history でなくおも起こる様だ。

    dirty 拡倧に代わり stat を削陀する様に倉曎ず蚀い぀぀、
    stat の該圓項目に -1 を代入しおいただけなのが灜いしおいる?
    良く考えたら -1 既に "より䞊䜍の nest が存圚しない" だずか "今は word の䞭ではない" ずいう意味だから、
    本圓は良くない。でもそうだずしおも nest のチェックに匕っかかるのかどうかずいうず疑問な気はする。
    取り敢えず本圓に削陀する様に倉曎しお様子を芋おみる事にする。
    →出なくなった。考えるのが面倒なのでもし今床出たらその時に考える事にしお歀凊で終わりにする。

  * <bug> 線集内容が零文字になった瞬間に改行が起こっお衚瀺が消える。 [#D0167]

    調べおみるず線集文字列が "" になった瞬間に
    _ble_line_x _ble_line_y が 53 1 ずいう倉な倀になっおいる。
    ず思ったらこれは .ble-line-info.draw による衚瀺の䜍眮である。
    しかし、䜕故線集文字列が空になった時にだけ .ble-line-info.draw の
    䜍眮が _ble_line_x に代入されおいるのだろうか。
    % ず思ったがそれは圓然である。
    % 倉曎点があっお文字が描画された時には umin<umax なのでその前に描画が為されおいる。
    しかしそれでも倉だ。では䜕故 "" になるたでは _ble_line_x に別の倀が代入されおいるのだろう。

    別に文字が "" にならなくおも末端から削陀をしおいる時は
    新しい文字を描画する必芁はないので umin==umax になっおいるはずである。

    䜕だか良く分からないのでたた別の方向でも調べおみる。
    郚分曎新ではなく、垞に党䜓を曎新する様にしおみる。
    →党䜓曎新であっおも勝手に改行が入っおしたう様である。
      もしかしお䜕凊かにデバグ甚に埋め蟌んだ echo があるのか?
    →どうやら bash が゚ラヌを出力しおいた様だ。
      䜕ず echo 11.8 "$_ble_syntax_word_umin $_ble_syntax_word_umax" で 0 0 が出力される。
      _ble_syntax_word_umin の代入箇所を探しおも 0 になる様な箇所はないのだが 。
      ず思ったが分かった。削陀した時に _ble_syntax_word_umin の shift によっお
      有限の倀だった物が 0 になっおいる。

      これが起こるのは仕方のない事なので、これに察しお特別に察策を取る事にした。
      曎新しようず考えおいた単語が消滅した時には _ble_syntax_word_umin を ++ する。
      それによっお察象の単語が䞀぀もなくなった堎合には -1 を代入する。

    これで盎った。しかし、描画の際に゚ラヌメッセヌゞが消されおしたうずいうのは厄介な事である。

  * <bug> 改行しおも先頭がコマンドになっおいない [#D0166]

    䜕ず [[ ${#BASH_REMATCH[0]} =~ $'\n' ]] ずしおいた。圓然 # は䞍芁である。
    これは盎ぐに盎った。

  * <bug> _ble_region_highlight_table で空欄になっおいる箇所がある。 [#D0165]
    echo " ず入力した時の空癜に察応する郚分。

    これは function ble-syntax/highlight/set-attribute の䞭で
    既に蚭定されおいる物ず同じ倀かどうかの確認の際に、
    数倀ずしお比范しおいた為に空欄ず 0 が同䞀芖されおいる事による物であった。
    修正した。これは無事に 0 が代入される様になった事を確認した。

    それず共に _ble_syntax_attr_umin における色の既定倀を正しく蚈算する様にした。
    (実際には問題にならなかったかも知れない。
    ぀たり _ble_syntax_attr_umin は必ず attr の蚭定されおいる点が蚭定される様な気がする。)

  * <bug> 単語の属性適甚が埌ろに続く単語にも続いおいる。 [#D0164]
    単語の分割はちゃんずできおいるのに䞍思議だ。
    これは属性適甚の偎のバグだず思われる。

    再珟:
    1 以䞋を先頭から順に入力する
      echo "$(less hello world)"
    2 "$( の盎前に文字を挿入する
      echo a"$(less hello world)"
      この時 less の属性が less hello world 党䜓に適甚される。
      その他の郚分の着色に぀いおは問題はない様に芋える。

    取り敢えず属性適甚の郚分で䜕が起こっおいるか調べようずするず 。
    属性適甚が起こっおいない様だ。やはり再床詊しおも呌び出されおいない。
    (よく考えおみれば _ble_syntax_word_umin はこの範囲を含んでいないので圓たり前である。
    たた、これは期埅した動䜜でもある。この郚分は倉曎しおいないのだから。)
    さお、この時に䜕故衚瀺内容が厩れおしたうのか。。

    たた、䞍思議なのは先頭にあるコマンドの着色がそのたた埌ろに適甚されおしたう点である。
    ぀たり、䞀旊 word による属性が党お解陀された埌に word による属性が適甚されない、ずいう蚳ではない様だ。
    _ble_syntax_attr が削陀されおいるずいう事だろうか。
    shift の際に属性が飛んでしたうずいう事なのか? shift ではちゃんず削陀された堎所以倖は保持しおいる筈なのだが。
    詊しに _ble_syntax_attr の䞭を確認しおみる。_ble_syntax_attr の䞭は正しい倀になっおいる。
    ずいう事は adapter での繋ぎ替えに倱敗しおいる? 念のため _ble_region_highlight_table を確認する。
    これも正しい倀になっおいる。ずいう事はやはり adapter が怪し。

    今床 _ble_highlight_layer_adapter_buff の䞭を出力させおみたらどうやら、
    問題は a を挿入前の時点で既に発生しおいた様だ。
    $( ずした状態で順次入力を行っおいくず垞に最埌に゚ラヌの赀い印が付いた状態で入力しおいく。
    そうするずどうやら属性 0 が党おはぎ取られおいく様だ。
    たた遡っお調べおみようず思ったが、_ble_region_highlight_table の時点で正しい状態だったから、

    やはり adapter の䞭での曎新が問題な様に思われる。
    ず思ったら芋぀けた。gprev に垞に 0 が入っおいた。
    これは党䜓に察しお _ble_region_highlight_table を読み出しおいた時のたたになっおいたずいう事だろう。
    i1>0 の時には i1 盎前の gprev を読み出す様にした。
    これで a を " 盎前に挿入した時の色付けは正しくなった。

    しかし、今床は䜕故か入力しおいった時の色がおかしくなった。
    ず思ったがこれは圓然の事である。郚分曎新なので途䞭から出力しおいる。
    それなのに前からの続きずしお出力しおしたっおいるので SGR が出力されおいない。
    これは ble-edit-draw.update 偎を修正する。
    これで正しく動䜜する様になった。

    意倖ず修正に手間取った。

  * <bug> _ble_syntax_attr の䞭に "BLE_ATTR_ERR" の文字列が混入しおいる。 [#D0163]
    䞀応算術匏評䟡では BLE_ATTR_ERR の䞭を読みに行くので問題はないずはいえ、その様に蚭蚈した぀もりはないので修正するべき。
    →これは parse の末端で起こっおいた。修正した。

2015-02-23

  * 過去の ToDo に぀いお改めお敎理を行う [#D0162]

    既に自然に実装された物、解決した物、或いは実装する事に意味が無くなった物などを敎理する。

    | 2013-06-12
    |
    | * ble-decode-byte:bind の先頭でプロンプトを再描画する必芁がある version の境を調べる。
    |   →これは bleopt_suppress_bash_output の実装で䜙り意味がなくなった。
    |     bleopt_suppress_bash_output=1 で問題が起きおいないので、
    |     今埌は bleopt_suppress_bash_output= に぀いお積極的な最適化をする事はない。
    |
    | * <bug> りィンドりサむズを倉曎するずプロンプトが bash の衚瀺する物になる
    |   これはりィンドりサむズを倉曎した時に bash が自動的にプロンプトを再描画する為。
    |   SIGWINCH を trap しお自前で描画し盎せばよい?
    |
    |   2015-02-09 bash-4.3 で詊したが問題が再珟しない。
    |
    |   2015-02-24 これも bleopt_suppress_bash_output=1 を実装したので
    |   今埌はこの問題が発生する事は無いのではないかず考えおいる。

    これらは出力関連の問題であったが、bleopt_suppress_bash_output の実装により䜙り意味が無くなったので削陀する。

    [Done]

    | 2013-06-10, X7 解析噚
    |
    | # bash script の解析噚を䜜る。
    | # これは syntax-highlight, complete 等から甚いる。
    |
    | 先ず、シェルスクリプトの文法に぀いお敎理する。
    |
    | !   履歎展開
    |     ! に非空癜の文字列が続いおいる時
    | "   二重匕甚笊の開始
    | '   単匕甚笊の開始
    | `   コマンド
    | $'  匕甚笊の開始
    | ${  パラメヌタ展開 {} の開始
    | $(  コマンド眮換
    | $(( 算術匏眮換
    | $他 パラメヌタ展開
    |
    | コマンド修食 (コマンドよりも前に来る事ができる物)
    |   [0-9]*(>|>>|&>|&>>|<|<>)(&[0-9]+|arg)
    |   [<>]( プロセス眮換開始
    |
    | コマンド
    |   ((  算術匏の開始
    |   [[  条件匏の開始
    |   {   重文開始
    |   (   サブシェル開始
    |   aaa=hoge
    |   aaa[]=hoge
    |   aaa=(hoge)
    |     コマンドが続く
    |   time
    |   time -p
    |     コマンドが続く
    |
    | ; & | && || |&
    |   コマンドが続く
    |
    | ;; ;& ;;&
    |   case パタヌンが続く
    |
    | ※incremental に解析できる様に再垰呌び出しなどは避けたい。

    この䞭で実装されおいないのは
    - time -p
    - aaa=(hoge), 他に aaa+=(hoge) ずいうパタヌンもある。
    - ;; ;& ;;& の埌に case のパタヌンを受ける
    - [[ 条件匏の文法に正確に察応しおいない
    等である。その他に぀いおは (倚少の問題点は残るが) 実装しおある。
    䞊蚘の物に関しおは、より最近の文法察応リストに远加しおおく事にする。

    | 2013-06-09
    |
    | * split, 曞きかけたけれど結局䜿っおいない関数
    |   function .ble-text.split {
    |     local GLOBIGNORE='*'
    |     test -n "${3+set}" && local IFS="$3"
    |     eval "$1=(\$2)"
    |   }

    これはどうでも良い。最近では手で曞いおいる。ずいうか手で曞いた方が楜だ。

    | * ble-decode-char: cmap+default.sh を統合する?
    |
    |   改めおコヌドを芋おみたが、それ皋サむズが倧きい蚳でもないので、
    |   ble.sh の䞭に埋め蟌んでしたっおも良いかも知れない。
    |   しかし、ナヌザにカスタマむズの䜙地を残す、ずいう意味では別のファむルになっおいた方が芪切である。
    |
    | * ble-decode-char:
    |
    |   これをナヌザの偎で生成するのには時間が掛かるので、
    |   予め䜜成しおおいた dump ファむルも䞀緒に配垃するのが良い。
    |
    |   連想配列を䜿う版ず䜿わない版の二皮類だけで良い。
    |   ず思ったが、連想配列を䜿うか䜿わないかが圱響を受けるのは、
    |   cmap の偎ず蚀うよりは keyname の方なので、元々巚倧ではない。
    |   keyname の郚分だけは ble.sh に統合しおしたうず蚀う手もある。
    |
    |   *.dump に぀いおも統合しおしたうずいう手もあるが、
    |   これに぀いおは䞭身が巚倧なので䜙り統合する気にはなれない。
    |   (でも、最終的には統合した方が綺麗かも知れない。)
    |
    |   もしも統合しないのだずしたら、䜕れにしおも耇数ファむルになっおしたう蚳だから、
    |   cmap+default.sh を ble.sh 内郚に統合する意味も䜙り無い 。
    |   ずいうか、dump を䞀緒に配垃する堎合、
    |   そもそも cmap+default.sh を実行する事はない筈である。
    |

    ble.sh は益々肥倧化しおいるのず、これからも様々な蚭定ファむルが増えおいくだろうず予想されるので、
    single file で提䟛する事はもう考えない。

    | * <bug> キャレットが線集文字列の先頭にある堎合、prompt の最埌の文字の SGR が反映されない。
    |
    |   これに察応する為には prompt の指定から SGR を抜出するしかない。
    |   普通は prompt の最埌の文字は空癜にする (本圓か?) ので気にしなくおも良い気もするが。
    |
    |   これを真面目に実装するには二通りの方向性が考えられる。
    |
    |   䞀぀は zsh の様に PS1 の色・スタむルの指定を %[] の䞭でやっお貰うずいう方法である。
    |   これならば TERM に䟝存せずに解析できるので良い。䜆し、これは bash に非互換なので、
    |   bash から䜕も蚭定を倉えずに移る、ずいう事ができなくなる。たた、% の指定に察応し始めるず、
    |   その他の zsh の指定に぀いおも察応しないず収たりが悪い。党お実装しようず重うず倧倉である。
    |
    |   もう䞀぀は PS1 を頑匵っお解析しお、ESC [ ... m から SGR の指定を取り出す方法である。
    |   珟実的には ESC [ m 以倖で SGR を解釈する端末が存圚するずは思えないから、
    |   これでも良い気がする。

    これも bleopt_suppress_bash_output=1 の実装により重芁性が䜎䞋した。
    䞀応 bleopt_suppress_bash_output= の問題点ずしお残しお眮くが、簡単な䞀行の説明に収める。

    | 2013-06-08
    |
    | * <bug> source を実行しおいる間に C-c をしお䞭断しようずするずその儘動きが止たる。
    |   通垞のルヌプなどで時間が掛かっおいる堎合に C-c で止たる様にするには
    |   trap return INT 等ずすれば良かったが、source の内郚で時間が掛かっおいる堎合には、
    |   C-c で止めようずするずそのたた党䜓の動きが止たっおしたう様である。
    |
    |   序でに関数内のルヌプで時間が掛かっおいる堎合に関しおも調べおみたが、
    |   こちらは C-c で正垞に䞭断する事が出来るようである。
    |
    |   + 2013-06-11 12:29:07
    |     改めお詊しおみたら、ちゃんず停止はする様である。
    |     accept-line.exec でルヌプ構文を䜿わずに再垰に曞き換えたがその事が圱響を䞎えたかも知れない?
    |     或いは、これは前に詊した時の勘違い?
    |
    |     しかしながらたた䟋によっお .ble-stty.enter が実行されおいない様である。
    |     䜕故か分からないが凊理の流れ的には正しくできおいる気がする。
    |     しかし、凊理の順番が入れ替わっおいる気がする。
    |     exec.recursive から先に出力されるべき物が、プロンプトの衚瀺よりも埌になっおいる。
    |     埌で再床調べ盎す必芁がある?

    これは gexec の実装の際に色々詊しお trap - DEBUG の方向性で解決する事にした。
    これによっおどんな堎合でも確実に停止できるのではないかず考えおいる。
    具䜓的に source を䜿っお怜蚌した蚳ではないが、関数では充分にテストしたので倧䞈倫だず考えおいる。
    もし問題があったら改めおその時に考える事にしお、この項目も削陀する事にする。

  * <bug> info.draw で特殊文字が改行に跚っおいる時の座暙蚈算 [#D0161]

    䟋えば CR などの特殊文字を ^M ず衚瀺しおいるが、これが改行に跚っお衚瀺される。
    その時の座暙がずれる。(そもそも改行に跚っお衚瀺されるのが誀り?)

    →空癜を挿入する様にしおいたのだが、挿入する空癜の長さを空癜を挿入した埌の倀で蚈算しおいた。
    ぀たり空癜を挿入する必芁がないずいう解釈になっおいた。匏の評䟡の順序を正しい物に倉曎した。

  * <bug> update-positions で dend-dbeg が負になるず譊告が出る [#D0160]
    →プロンプトの内容に倉曎があった際に初期䜍眮 x y が倉わる。
    その時の dbeg=0 の蚭定の際に dend や dend0 を正しく蚭定しおいなかった。

2015-02-22

  * <bug> word の内容倉化を怜知する事のバグ [#D0159]

    - transpose-chars 等を甚いた堎合 word の内容が倉化しおも word の着色が曎新されないのではないか?
      →コヌドを芋た所、単語内郚で倉曎が起こった堎合にはちゃんず ble-syntax/parse/touch-updated-word しおいる。
      単語の終端点を巻き蟌んだ倉項の堎合には、吊応なく parse で倉曎される筈なのでここで touch する必芁はない。
      ぀たり、珟状のコヌドでも問題が起こる事はないように思われる。

      ず思ったが正しくできおいない。
      echo 'd'is't' で真ん䞭の is を tranpose しお芋たが、どうも期埅通りに動いおいない様だ。
      ず思っお調べたら、そもそも transpose した時には単語の切り出し自䜓に倱敗しおいる様だ。
      長さ 0 になっおいる。途䞭で解析が終わっおいる為であろう。

    - 解析が単語の途䞭で終わった時に word が壊れない様にする為には?

      これは真面目に考えなければ察応方法が分からないので埌で考える。
      (そもそも単語が終了した所で前の䜍眮 word[wbegin] に曞き蟌むずいうのが混乱の元なのかも。
      デヌタ圢匏から考え盎した方が良いのかもしれない。)

      眺めおいたら簡単に曞き換えられそうだったので曞き換えた。
      _ble_syntax_word[]は単語の先頭ではなくお単語の終端に眮く事にした。動いおいる。
      _ble_syntax_word を甚いた dirty 拡倧にも察応した。
      埌 dirty 拡倧の郚分に問題を芋぀けたのでその郚分も修正した。

  * <bug> .ble-line-info.draw を䜿った時行がずれる [#D0158]

    これは新しい描画関数で出力する様にした時に出力の順序を倉えた所為だった。
    出力をバッファリングしおいる時には、その最䞭で別の耇雑な関数を呌んではいけない。
    内郚で独自に出力を行うかも知れず出力の順序
    (ず _ble_edit_x, _ble_edit_y の参照順序) が倉わるからである。

  * <bug> for や do に色が着かない? [#D0157]

    _ble_syntax_word_umin, _ble_syntax_word_umax の問題の様だ
    → ctx-redirect/check-word-end で wbegin=-1 を蚭定した埌に touch しおいた所為で、
    _ble_syntax_word_umin=-1 になっおしたい、範囲が無効化されおいた様だ。
    ble-syntax/parse/touch-updated-word に assertion を远加した。

  * 描画の高速化2: 珟圚の䞍具合ず layer に察する察応 [#D0156]

    | x 珟圚 update-positions で䜍眮が倉化しただけの郚分に察しおも衚瀺甚の SGR 付き文字列を曎新しおいる。
    |   これは省略できる筈。改行やタブなどで出力内容に倉化のある郚分に぀いおは別に蚘録しお埌で合成しお衚瀺する。
    |
    | x transpose-chars 等を甚いた堎合 word の内容が倉化しおも word の着色が曎新されないのではないか?
    |
    | x word の属性が解陀されおもそれが衚瀺に反映されない。

    先ず、word の属性が解陀された時の動䜜に぀いお考える事にする。これは layer の実装方法にも関わっおくる。
    word の属性が解陀された時、元々其凊にあった属性を埩元したい。
    これは _ble_syntax_attr を参照しお再床倀を曞き蟌めば簡単に実珟はできる。
    しかし、今埌 ble-syntax ずは独立した圢で様々な着色を行う事になるず思われる。
    その際に _ble_syntax_attr やら曎にその埌に付加される word の着色に察しお毎回参照したり蚈算したりするのは珟実的ではない。
    様々な着色を分離した圢で実装する為にはちゃんずした仕組みが必芁になる。

    改めお考えるにこの問題は、「word の着色をしおも、抂念的にはその䞋には syntax による着色が残っおいる」のに、
    それが word の着色によっお倱われおしたっおいるずいう事である。぀たり、syntax による着色は䟝然ずしお
    有効であり、word の着色が戻った時にたた有効になる物であるのに、それを䞊曞きしお消しおしたっおいるずいう事である。
    本来は、word の着色やら syntax の着色やらを党お内郚的に保持しおおいお、衚瀺の時に有効な物を遞択しお着色するずいう事が必芁である。
    ぀たり、簡単に蚀うず layer 機胜が必芁になるずいう事である。

    しかし、layer 機胜を実装するに圓たっお考えるべき事がある。効率である。
    珟状で䜕ずかぎりぎりで珟実的な速床で衚瀺できるようになっおいるが、
    layer の機胜を愚盎に実装した堎合、珟圚の高速化に䜿っおいる方法がそのたたでは䜿えないのでかなり重くなる。
    珟圚の方法を䜕ずか適甚しようずしおも結構面倒な操䜜が必芁であり、どれぐらい遅くなるかは未知数である。

    ここでは耇数の方法に぀いお考え、たた、layer ずしおどの皋床の機胜が必芁に成るであろうかを敎理する。
    もしかするず完党に layer の様なおおがかりな仕組みは実装しなくおも良いかも知れない。

    a 始めに考えた方法は、各 layer で着色された文字列を保持しおおき、
      衚瀺の際に有効な layer の郚分をぱちぱち぀なぎ合わせお実装するずいう物である。
      しかし、これは同じ layer に属する郚分は連続しおいる筈だ、ずいう仮定に基づいおいる。
      様々な layer が滅茶苊茶に混ざり合っおいる堎合には华っお遅くなる。
      たた、衚瀺の際に぀なぎ合わせを実行するので郚分曎新であっおも
      文字列の長さ (ずいうか正確には䞊䜍 layer の着色範囲の数) に比䟋する時間が必芁になる。

      そもそも圓初は「遞択範囲の着色」や「括匧の察応」の着色が念頭にあった。
      これらは粟々1぀か2぀の着色範囲しか持たないので、
      どんなに文字列が長くなったずしおも繋ぎ替えの操䜜の階数は䞀定数に保たれる。
      しかし今埌「各コマンドに察応した匕数の着色」などに察応するずなるず、
      これらも新しい layer ずしお実装する必芁があるし、か぀、
      文字列の長さに比䟋しお぀なぎ目も増えおいく。

      郚分曎新やカヌ゜ル移動だけでも䞀定の繋ぎ替えの操䜜が必芁になるのは問題である。
      この方法は党く珟実的ではない。しかし、この方法を改良すれば䜕ずかなる可胜性はある。

    b 次に考えた方法は各 layer に぀いお色の配列を保持し、
      それを甚いお衚瀺する偎で最終的な文字列を䞀぀構築するずいう方法である。
      そしお郚分曎新の際には、各 layer の倉曎範囲を集蚈しお最終的な文字列自䜓を曞き換える。

      これが䞀番自然な実装に思われるが倚少問題点が存圚する。
      「括匧の察応」の堎合には離れた2点で局所的な曎新が実行される為、
      単玔な倉曎最小点ず倉曎最倧点の間を党お曎新するずいう方法にしおいるず、
      倉曎範囲が無駄に倧きくなっおしたう。特に線集文字列党䜓を囲むような括匧の堎合に
      毎回党䜓を曎新するのず同じ事になり非珟実的である。

      この堎合の察策は二぀考えられる。
      1 䞀぀は倉曎範囲の管理方法を単玔な最小点・最倧点のペアではなくもっず詳现な物に倉曎するずいう方法。
      2 もう䞀぀は、「括匧の察応」や「遞択範囲」などの広い領域を cover する layer の堎合には、
        自身の曎新の特性を知っおいる筈で、そちらに線集文字列の update を任せるずいう方法。

      普通は 1 の方向に進みそうな物だが、これだず実装が耇雑になる。
      ずいうかどの様なデヌタ圢匏にするのが良いのかも良く考えなければならない。
      単玔に (begin,end)* の様な構造にするず䟋えばしたしたに曎新した時に曎新範囲が耇雑になる。
      したしたに近い時は耇数の範囲ペアをくっ぀けお䞀぀の倉曎範囲ペアにしおしたう方が効率が良い。
      しかし、この様にするず倉曎範囲の合成も無駄に耇雑になる。华っお合成操䜜に蚈算時間が掛かるかもしれない。
      ずいうか 1 ず 2 を組み合わせお、(1) 耇雑な着色をする物に関しおは (begin,end) を䞀組だけ報告させお、
      (2) 離れた点での着色になる物に関しおは (begin,end) を分割しお報告させるなど、
      倉曎範囲の報告を各 layer に任せおしたえば良いのかも知れない。
      倉曎範囲ペアがそれ皋沢山にならないのであれば
      倉曎範囲の合成に぀いおも耇雑な事を考えずに玠盎に実装しお良い。

      それでも未だ埮劙な点がある。
      b.1 倉曎範囲が分かったずしおも、どの layer が有効なのかの情報がないので、
        描画文字列を曎新する際に䞊の layer から順番に描画属性が適甚されおいるかを確認しなければならない。
        それも各文字に぀いおこれを実行する必芁がある。

        しかし、これは別の方法を甚いたずしおもルヌプの順序が異なっおいるだけで等䟡な事をする
        必芁があるのかも知れない?? でもこの方法だず b.2 に挙げる様な layer の最適化が適甚できない。

        倉曎範囲 pair に layer 情報を付加しお察策するずしおも、
        layer から着色が削陀された堎合に぀いおは、
        結局着色が削陀された郚分に぀いおどの仮想の layer が有効になるのかを蚈算しなければならない。
        特に䞋局の layer が耇雑になっおいるかもしれないし、
        隣の倉曎範囲 pair ず地続きになっおいる可胜性を考えおくっ぀ける事もできるかもしれないし#1、
         など色々ず再蚈算が耇雑になっおしたう。layer 情報を付加しおも効果は限定的であろう。
        # #1 はこういう事である。局3 の属性を削陀した時。曎に局2、局1に぀いおも倉曎がある。
        # 曎新範囲 <22><1><111> (曎新の際に参照する範囲)
        # 倉曎操䜜 <33333><111>
        # å±€3      .......
        # å±€2      <-->
        # å±€1        <-------->
        # 倉曎操䜜ずしおは二぀の範囲であるが、
        # 実際に曎新の際に参照する属性が茉っおいる郚分はより䞋局で分裂しおいる。
        # 結果ずしお䞉぀の倉曎範囲が埗られる事になるが、よく芋るず<1> ず隣の <111> の
        # 範囲は同じ layer を参照しおいるので無駄に範囲が分裂しおいる事になる。
        # これらの無駄に分裂した物をくっ぀ける事ができるか、或いはくっ぀けた方が良いのかずいう事である。
        # この様な分裂は倧した問題ではない様にも思えるが本圓にそうだろうか。考えおみるず、
        # 最倧で党 layer での削陀範囲の合蚈x2 個の無駄な分裂が起こる やはり倧した問題ではない気がする。
        # n^(layer 数) 等の様なスケヌルだったら考え物だった、線集箇所の数に比䟋する皋床なら問題ない。

      b.2 region (遞択範囲) だずか括匧の察応だずかはその着色を保持するのに配列を甚意するたでの事は無い。
        region に関しおは珟圚の mark ず point だけで完党に蚘述できるし、括匧の察応に関しおは
        配列の䞭は殆どの時に空である。ずいうか、遞択範囲の方も遞択しない限り空である。

        これらの sparse な配列に察しおも党お描画属性が蚭定されおいないか確認するのは無駄だ。

      b.3 遞択範囲が解陀された時など、以前の状態に戻したくなった時に、
        たた党お描画文字列を構築し盎す必芁がある。

        しかしながら、以前に蚈算したのず同じ物を蚈算するのは気にくわないずいう事を陀けば、
        これに぀いおは倧した問題点ではない様にも思う。ずいうのも以前の状態に戻したくなるずいう状況は
        頻繁には生じないからである。

        これに぀いおはおたけ的に解決できたら良いずいう指暙で良いだろう。
        (これに぀いお簡単な解決ができる方法の方が、
        将来的に別の問題が起こった時にも解決しやすい・汎甚的だろうずいう皋床の目安ずする。)

    c 以䞊を螏たえお (もしかしたら华っお非効率かも知れないが) もう䞀぀の方法に぀いおも挙げる

      各 layer で「その layer 以䞋の描画属性を適甚した状態の文字列」を管理する方法である。
      倉曎があった堎合には、䞋の layer から順に倉曎範囲を䞊の layer に䌝達し、
      䞋の layer は該圓郚分の倉曎を自分の持っおいる描画文字列に察しお適甚する。

      しかしこの方法は既に挙げた問題を解決できおいない。倚少実装が楜になるだろうずいうだけである。

      c.x1 耇数の離れた倉曎範囲がある堎合に぀いおの解決策にはなっおいないので、
        結局耇数の倉曎範囲 pair を扱う事になる。
      c.x2 次に、䞋局の layer の描画文字列の切り貌りをする為には、
        index 情報が必芁 (各文字の衚瀺に゚スケヌプシヌケンスを含めお䜕文字䜿っおいるか) であり、
        これらも独立した配列ずしお管理しなければならない。
        䟋え遞択範囲などの様な単玔な描画属性に察しおであっおも、だ。
      c.o1 被芆されお実際には衚瀺状態に倉化を䞎えない䞋局の layer の曎新が䞊郚に䌝達されない、
        ずいうのは䞀぀の利点ではある。しかし、その様な倉化がある堎合は皀であるし、
        結局内郚的には䞋局の layer の保持する文字列に察する曎新が行われおいる。

      少しこの方法に改良を入れお考えおみる。
      「その layer 以䞋の描画属性を適甚した文字の配列」ず考える。
      䞀番䞊の layer でなければ繋げた文字列をそのたた䜿うずは限らない。
      それならばそもそも繋げなくおも良いのではないか。
      この様にしおおけば index 情報を別に芚えおおく必芁はなくなる。
      パラメヌタ展開に index を指定するだけで任意の郚分列を取り出す事ができる。
      これで c.x2 の問題はなくなる。

      | 䜆しカヌ゜ル移動をする時の為に index 情報は芚えおおく必芁がある?
      | ずも思ったが、これも IFS= a="${cs[*]:i}" b=${#a} 等ずしおしたえば良い気がする。
      | そもそもカヌ゜ル移動は䞀回のキヌ入力に察しお 1 回しか実行しないのだから、
      | 垞に党おの䜍眮に぀いおのカヌ゜ル䜍眮の為の index を保持しおいる必芁は党くない。
      | そればかりか、そもそも出力文字列に SCOSC SCORC を埋め蟌む圢でカヌ゜ル䜍眮を
      | 衚珟する必芁性があるのかすら疑問である (䞀応この様にしおおけば、䜕凊か別の堎所から
      | 出力があった堎合 (や ble.sh の座暙蚈算のバグがあった堎合に)、
      | ずれおも倧䞈倫ずいうのはあるが。)
      |   ずいう事なので毎回 ${cs[*]::i} 等ずしお文字列を連結しお長さを数えれば良い。ず
      | 思ったが、連結たでするぐらいであれば ${cs[*]::i}$SCOSC${cs[*]:i} ずすれば良いだけの気が。
      | 所で、この方法に頌っおいる時に、文字列が長くなるず効率二床の皋床の圱響があるかは
      | 気になる所である。䞀般に線集はそれ皋の速床で行われる事は無いが、カヌ゜ル移動は、
      | キヌボヌドの抌しっぱなし等によっお盞圓の速床で入力される可胜性がある。埓っお、
      | 線集の際には効率的に問題にならなくおも、カヌ゜ル移動の際の効率に圱響を䞎える可胜性は残る。
      |
      | 远蚘: 珟状の実装で index 情報を蚘録しおいるのは元々は別にカヌ゜ル䜍眮を任意に
      | 取り出す為ではなかった。これは、キャッシュした文字列を任意に切り貌りできる様に
      | する為の物であった。埌で、これがカヌ゜ル移動の際に SCOSC を挿入する䜍眮ずしお
      | 掻甚できる事に気付いた為に䜿っおいるだけの事である (ずは蚀っおも他に "効率的" に
      | SCOSC の挿入䜍眮を決める方法、たたは、カヌ゜ル䜍眮の確実な埩元方法は分からないが。)
      |
      | たた、連結した文字列は䞀番最埌の layer だけで保持する事にすればよい。
      | →そう思ったが、連結した文字列を埌で再利甚しようず思ったら結局 index 情報が必芁になる。
      | index 情報を䞀緒に管理しながら既存の文字列を切り貌りするのず、
      | 最埌のレむダヌが出しおきた配列党䜓を連結するのずどちらの方が効率的かずいう話になる。
      | 配列党䜓の連結でもそんなに問題はないかも知れない?
      |
      | 少し時間を蚈枬しおみる事にする:
      |
      | a=({1..100000})
      | time IFS= eval 'b="${a[*]}"'
      | real    0m0.077s
      | bash の割に驚異的な速床である。
      |
      | time c="${a[*]::10000}""$ins""${a[*]:10000}"
      | real    0m0.200s
      | 倚少時間が掛かる。でも 10 䞇の芁玠を連結しおいる事を考えれば充分な速床だ。
      | コマンドラむンに 100k も文字を曞き蟌む事などない。10k でも倚すぎる。
      |
      | index 情報によっお文字列 b の䞭に斌ける index が分かっおいる堎合:
      | time c="${b::40000}""$ins""${b:40000}"
      | real    0m0.053s
      | 文字列にすれば滅茶苊茶速い、ずいう蚳でもない様だ。
      | (ずいうかマルチバむトで蚘憶しおいるから文字数を数え䞊げなければならない、
      | ずいう事なのだろうか?)
      |
      | 曎に index 情報を甚いおいるので、index 情報の曎新も行わなければならない。
      | これだけ巚倧な配列になっおくるず index 情報の shift にも盞圓の時間が掛かるだろう。
      | (䜕しろスクリプトで for でルヌプを回さなければならない。)
      |
      | 色々考えるに index 情報を管理するのは効率的に駄目だ。
      | SCOSC でカヌ゜ル䜍眮を管理したいず思う堎合、
      | カヌ゜ル移動の際にも文字列を連結しなければならないのは惜しいが、
      | この蟺りはカヌ゜ル移動を実際にやっおみお遅ければ SCOSC は䜿うのを止めお、
      | ble.sh による座暙蚈算を信甚しお update-positions のデヌタを元にカヌ゜ルの䜍眮を動かす事にする。

      結論
      - 各 layer 毎に「その layer 以䞋で蚈算される描画属性を適甚した文字の配列」を管理・曎新する
      - 実装の為に描画属性を持たない文字の配列も甚意する。
      - 連結枈文字列をキャッシュするのはやめる
      - index 情報の管理も行わない
      - カヌ゜ル移動の際は以䞋の 2 通りが考えられる
        - 配列の連結を甚いお SCOSC を埋め蟌む (毎回党文字列を出力する)
        - update-positions を信甚しおカヌ゜ルを蚈算した䜍眮に動かす

      | 曎に、もう䞀぀考えるべき事ずしお各文字の䞀぀䞀぀に぀いお描画属性を付加するか、
      | 同じ属性の文字が続いおいる限りは描画属性の付加を省略するか、ずいう事である。
      | 各文字䞀぀䞀぀に察しお描画属性を適甚するず出力が無駄に長くなっおしたう。
      | しかし、同じ属性の文字が続いおいる限りは付加を省略する、ずいう圢だず
      | 切り貌りをする際に切った点に新しく描画属性を远加しなければならないので、
      | 各点に斌ける描画属性を別に管理する必芁があるずいう事が問題になる。
      |
      | ナヌザから芋えなくおも、䜙り汚い出力はしたくないので、
      | 各点に斌ける描画属性を管理する方向性を考えたい。
      | さお、これはどの様に管理するのがよいかずいう事になる。
      |
      | A 䞀番簡単な方法は各点に斌ける描画属性を配列に栌玍しおおくずいう方法である。
      |   䞋局 layer から䞊局 layer たで、各局でその局以䞋の集玄結果を配列ずしお保持するずいう事である。
      |   しかし、これは update がある床に各 layer で描画属性の配列をコピヌ・曞き換えしなければならず、倧倉だ。
      |   特に、遞択範囲や括匧察応の堎合にはこの様な配列を管理し、䞀々曞き換えを行うのは非効率に思われる。
      |
      | B そうではなく、各 layer に぀いお "描画属性を返す関数" を実装しおその䞭で最も適した方法で
      |   属性倀を蚈算し返すようにするずいうのも䞀぀の手である。
      |   耇雑な色付けを行っおいる堎合には、単に内郚で描画属性の配列を管理する様にすればよい。
      |   さお、各 layer で独立に描画属性を管理する堎合 (぀たり、より䞋の layer の倀に぀いお関知しない時)、
      |   䞋局 layer ぞの問い合わせを順次行う必芁がある (勿論、これは関数の呌出偎で行う)。
      |   これの overhead に぀いおも倚少気になるが、
      |   そもそも曎新時の切り貌り自䜓そんなに沢山の箇所で行うずは思わないので、気にしない。
      |
      |   (寧ろ党おの点に぀いお描画属性を即座に返せる様に配列で管理するずいう A の方が無駄である。)

      結局、描画属性を埌で必芁ずする頻床は小さいずしお B を採甚する事にする。
      ぀たり、各 layer に぀いお指定した䜍眮での描画属性倀を返す関数を甚意させる。
      描画属性倀が蚭定されず䞋䜍の layer に任せる堎合には空文字列もしくは -1 を返させる。

      さお、この様な実装を行うず決めたからには、再床描画甚出力の生成関数を実装し盎さなければならない 。
      埌、既に曞いたコヌドも利甚できる様に、既に曞いたコヌドを利甚する layer も䜜った方が良い。
      或いは先にそれを曞いおから実装を始める。

      各 layer に関する関数名は ble-highlight-layer:*/* の圢匏にする。
      ble-edit.sh は耇雑化しお来たので、これらのコヌドは ble-color.sh の方に実装する事にする。
      ble-color.sh は圓初 highlighter の類を蚘述する目的で䜜ったが、
      新しく ble-syntax.sh を䜜成した事で䜿われなくなった機胜などが沢山ある。
      これらを敎理・統合する目的もある。

      実装した。動いおいる様なので差し替えた。

    取り敢えず今回の実装で以䞋の項目は解決した。

    | x 珟圚 update-positions で䜍眮が倉化しただけの郚分に察しおも衚瀺甚の SGR 付き文字列を曎新しおいる。
    |   これは省略できる筈。改行やタブなどで出力内容に倉化のある郚分に぀いおは別に蚘録しお埌で合成しお衚瀺する。

    元々の目的である

    | x word の属性が解陀されおもそれが衚瀺に反映されない。

    に関しおは未だ実装しおいない。レむダヌの仕組みを敎えたは良いが、各レむダヌを実装する必芁はある。
    word の属性を蚭定しおいるレむダヌをどの様に実装するのが良いかはたた別の問題である。
    これに぀いおは項目を改めお埌で考える事にする。

2015-02-21

  * 描画甚のシヌケンス構築を高速化する [#D0155]

    色々考えた結果、最終的に (a) 描画甚のシヌケンスず
    (b) TAB 等の䜍眮を制埡しながら出力する update-positions を合成しなければならないので、
    a, b の䞡方を高速に合成可胜な圢に改良する必芁があるずいう結論に到る。

    update positions の偎に関しおは、
    出力の文字が事前に予枬䞍可胜な物は TAB 等限られおいるので、
    予枬䞍可胜な物に関しおだけ合成時に特別な凊理を行うずいう方向で行く。
    ぀たり、描画甚の偎で予枬可胜な文字に぀いおのシヌケンスを生成しおしたう
    (予枬䞍可胜な物に関しおは適圓な可胜性の高そうな文字列を入れおおく)。
    update positions 偎では出力する文字に関しおは、
    特別な凊理を行った物に぀いおだけ蚘録を行う事にする。

    珟状の update-positions の実装に぀いお

    | さお update positions では耇雑な事を行っおいお lc だずか lg だずかの蚈算も行っおいる。
    | これらの動䜜に぀いお今䞀床確認しおからでないず update positions を匄れない。
    | 確認事項に぀いおは以䞋の通り。
    | - lc lg の詳现な動䜜に぀いお。
    |   䟋えば行頭や行末での凊理、耇数文字で構成される文字の堎合は?
    | - lc lg で蚈算した結果を䜿っおいる箇所は䜕凊か?
    |   それらの堎所に圱響が出ない様に曞き換える必芁がある。
    |
    | 取り敢えず䜕凊で䜿っおいるかに぀いお調べる事にする。
    | 先ず update-positions の䞭で出力しおいる物は lc lk lj g である。
    |
    | | - _ble_line_text_cache_lc に぀いおは、update-positions 及びその䞭から呌び出される
    | |   save-cursor で蚭定されおいる。そしお、.ble-line-text.construct で参照されお
    | |   倉数 lc の戻り倀を蚭定するのに䜿われおいる。lc は .ble-line-text.construct の戻り倀か、
    | |   或いは線集文字列が空の堎合にはプロンプトの構築によっお蚈算された倀になる可胜性もある。
    | |   lc はそのたた _ble_line_cur 配列の第2芁玠(base0)に栌玍される。
    | |   _ble_line_cur[2] は .ble-edit-draw.update-adjusted の䞭で取り出されお、
    | |   .ble-text.c2s を通しおから READLINE_LINE に蚭定される。
    | |
    | | - _ble_line_text_cache_lk は update-positions 及び save-cursor で蚭定される。
    | |   .ble-line-text.construct の䞭の初期の方に lk に代入されおいる。
    | |   lk は .ble-line-text.construct の䞭のルヌプで参照されおいるが倉曎はされおいない。
    | |   %%どうやら _ble_line_text_cache は lk の蚈算のキャッシュずしお働いおいる様子である。%%
    | |   曎に export する様なコヌドの残骞も残っおいる様だが関連するコヌドが芋圓たらないので、
    | |   これに関しおは廃止されおから久しい、或いは、䜕か曞きかけお取りやめたずいう可胜性が高い。
    | |   さお、改めおよく芋おみるず lk は lg を抜出する為に䜿われおいる。぀たり、
    | |   カヌ゜ルの䞀぀前の文字を出力する時に䜿う lg が䜕かを蚈算する為には、
    | |   カヌ゜ルの䞀぀前の文字の文字 index が必芁になりそれが lk になっおいるずいう事である。
    | |   lk はその他の甚途では䜿われおいない。
    | |
    | | - _ble_line_text_cache_lj はコメントの説明を芋おもこれたた䜕の甚途の為にあるのか分からない倉数である。
    | |   実際に䜿われおいる所を芋るず、倚分これは以前に高速化を行おうずしお実装し曞けお終わった機胜である。
    | |   改めおもう少し解釈を曞いおおく事にする。珟圚の実装では党おの文字に぀いお䞀々蚈算を行っおいる。
    | |   しかし ASCII の印字可胜文字が続いおいる堎合には毎回蚈算しなくおも䜍眮や文字の蚈算は唯単に
    | |   increment しお行っお蚭定するだけである。なので、その様な堎合には最埌の ASCII 文字たで
    | |   蚈算を抑えおおいお、最埌の ASCII 文字たでいった時にそれたで溜めおいた蚈算を䞀気に行う事ができる。
    | |   lj は連続する印字可胜文字の最初の䜍眮を保持しおいるず考えれば良い。
    | |   或いは、もっず実際的な機胜ずしおは次に本来の蚈算を実行するべき index ずいう事になる。
    | |   これがコメントに曞かれおいた説明である。
    | |
    | |   しかしながら、䞀気に蚈算を行うず蚀っおも、カヌ゜ル䜍眮蚈算は簡単にはできないので
    | |   結局毎回蚈算をする事になっおいるずいう具合である。今は垞に lj=i-1 の状態でルヌプが回っおいる。
    | |   カヌ゜ル䜍眮蚈算に぀いおも䞀気に行うコヌドを曞いたら (或いは、単玔な increment を続けられる
    | |   ずいう事が分かる範囲を蚈算しお、その範囲内だけで䞀気に行う様にしたら) lj を実際に遅延させるコヌドに
    | |   移行する予定であったのだろうず予想される。
    | |
    | |   䜕れにしおもこの倉数は実装の詳现ずいうか、最適化の為に甚意した物であるので、
    | |   今回䜍眮から実装し盎すにあたっおこの機胜を継承する必芁性はない。
    | |   この倉数に぀いお実装は未だ䞍完党であるし、䌌たような機胜が必芁になればたた新しく考え盎した方が良さそうである。
    | |
    | | - _ble_line_text_cache_g _ble_line_text_cache_ei
    | |   䜕ずこの配列は珟圚は䜿甚されおいない。珟圚の実装では .ble-text-line.construct の䞭で
    | |   _ble_region_highlight_table から盎接 g を読み取っお䜿っおいる。
    | |   元々は任意のカヌ゜ル䜍眮にある g を取埗する為に䜿っおいたずいう事だろうか。
    | |   しかしそれは _ble_region_highlight_table から読み取れば良い事だし、
    | |   そればかりか _ble_region_highlight_table からの lg の読み出しですら、
    | |   描画SGRず update-positions の合成のルヌプを毎回するので、その䞭でおたけ的に凊理しおいる。
    | |
    | |   ず思ったが、もしかするずこれは最適化によっお消えた倉数ではなくお、
    | |   最適化の為に導入しようずしお結局導入には到らなかった倉数なのではないだろうか。
    | |   _ble_line_text_cache_ei ずいう䌌た様な䜍眮で定矩されおいお䜿われおいない倉数があるので、
    | |   倚分そう蚀う事だろう。これらの倉数は未だ䜿われおいない倉数である。
    | |
    | | - _ble_line_text_cache_cs の意味は明確である。衚瀺の為に出力される文字である。
    | |   䜿い方も単玔で .ble-line-text.update-positions で倀を fill しお、
    | |   .ble-line-text.construct の合成のルヌプで䞭身を読み出すずいう物だ。
    | |   䞊蚘の2行以倖では参照も代入もされおいない。
    | |
    | | - _ble_line_text_cache_x, _ble_line_text_cache_y は _ble_line_text_cache_lc
    | |   ず党く同じ経路を蟿っお、別の関数で䜿われおいる。
    | |   ぀たり、cx cy ずいう倉数に䞀旊入っお _ble_edit_cur に栌玍され、
    | |   その埌其凊から読み出されお䜿われおいる。
    |
    | たずめるず、
    | - _ble_line_text_cache_x, _ble_line_text_cache_y, _ble_line_text_cache_cs
    |   が䞻な蚈算の目的である。
    | - _ble_line_text_cache_lc, _ble_line_text_cache_lk
    |   は巊偎にある文字の文字コヌドず sgr を求めるのに䜿う。
    |   文字幅などの情報は出力しない。
    | - _ble_line_text_cache_lj _ble_line_text_cache_g _ble_line_text_cache_ei
    |   は実装しかけお䞭断しおいる機胜の為の倉数の様に思われる。気にしなくおよさそう。
    |
    | さお、次にしらべるべきなのは lc ず lk の凊理方法の詳现に぀いおである。
    | - 巊偎に耇数文字からなる文字があった堎合や、
    |   改行があった堎合の取り扱いはどうなっおいるのか
    |   →耇数文字からなる文字があった堎合にはその最埌の文字を READLINE_LINE に蚭定しおいる。
    |
    |
    | - 巊偎の文字の開始䜍眮 (x y) の管理はどうなっおいるのか
    |   →これは単に文字コヌド lc から蚈算される幅を䜿っおカヌ゜ル䜍眮を ESC [ D
    |   で埌退させるだけずいう実装になっおいる。なので lc さえあれば良いずいう考えだ。
    | - 出力する sgr は本圓に垞に巊偎の文字の物で良いのか。
    |   もしそうならば䜕故 i-1 等ではなく lk ずいう倉数が存圚するのか。
    |   →行頭の堎合には右偎の文字 (なければ空癜) を READLINE_LINE に蚭定しお
    |     READLINE_POINT=0 を蚭定する様になっおいる。
    |
    | * lc が "文字列" ではなくお単䞀の "文字" である理由
    |   READLINE_POINT に蚭定する倀を蚈算する必芁があるから。
    |   文字列であっおも各文字に぀いおバむト長を蚈算すれば READLINE_POINT を蚈算できるが面倒だ。
    |   単䞀の文字だけずいうルヌルにしおおけば䞀回 c2bc を呌び出すだけで枈む。
    |
    | * lj で蚈算を遅延しおいる理由
    |
    |   これは行頭の文字が来た段階では右偎に来る文字を予枬できないからである。
    |   右偎の文字が確定しおから lc を蚈算する。
    |
    |   > 改めお芋おみるず lj 呚りの実装が少し耇雑になっおいる。
    |   > カヌ゜ル䜍眮が行頭にあるのが䜕回か続くず lj が曎新されずに続く事になる。
    |   > これは䞀䜓䜕の為の物だろうか???
    |   > 行頭が䜕回か続くずその埌で䞀気に曎新が実行される。
    |   >
    |   > lj が䜕の為にあるのか挞くわかった。これは「カヌ゜ルが行頭にある堎合には
    |   > 巊偎にある文字ではなくお右偎にある文字の情報を返す」ずいう仕様に関係しおいる。
    |   > 行頭に文字がある時には未だ次に文字が来るのか別の改行文字が来るのか分かっおいない。
    |   > 右偎に通垞文字が来た堎合にはそれで良いが、改行文字が来た堎合には改行を出力する蚳にも行かないから、
    |   > 代わりに空癜文字を出力する事にするのである。そしおそれど同時に READLINE_POINT を 0 にする。

    珟状の実装がどうなっおいるかに぀いおは倧䜓分かった。䞀番凊理を耇雑にしおいるのは lc lk の蚈算である。
    然し、ここで思ったのだが䜕故 lc lk を毎回蚈算しおキャッシュしおいるのかずいう事である。
    x や y に関しおは初めから順に蚈算しお环積しおいかなければ蚈算する事ができない。
    なのでカヌ゜ルを移動するたびに蚈算するよりは前に蚈算した物を再利甚した方が速い。
    しかし lc lk に関しおは x y cs のキャッシュさえ残っおいればどの様な物になるかはその堎で蚈算できる。
    ルヌプの䞭で环積的に蚈算し、その時の状態をキャッシュする仕組みにしおいるず先読みができないのでアルゎリズム的に苊しくなるが、
    x y cs を党お update した埌に必芁な所だけ蚈算するずいう事にすれば先読みも䜕もあった物ではなく簡単に蚈算できる。
    それに分離した方が bleopt_suppress_bash_stdout に応じお蚈算するかしないかの遞択もできる。

    取り敢えず x y cs だけを蚈算しおその埌でカヌ゜ル䜍眮の lc lk だけを蚈算する様に簡単化した version の
    .ble-line-text.construct を䜜成しおみる事にする。
    →様々なバグや bash の䞍具合が途䞭で芋付かった為に随分ず䞭断しおしたったが、
      .ble-line-text.construct の単玔 version は盎ぐに実装できた。

    さお䜿っおみるずバグが出おきた。C-u 等をした時に衚瀺内容が倉になる。
    保持しおいる文字列は正垞の様だから、shift に倱敗しおいるのではないかずいう気がする。
    ず思ったが、そもそも送られおくる BLELINE_RANGE_UPDATE の時点で倉だ。
    10 文字ある文字列の 5 文字目で C-u を実行した堎合 (0 0 5) 等ずなる筈だが、
    (9 10 9) ずいう倀が入っおいる。ずいうか、これは最埌に远加した文字の分である。

    䜕凊で倉な事になっおいるのか調べる。
    先ず ble-edit/dirty-range/update の呌出を調べる。
    ble-edit/dirty-range/update 0 0 5 等ずなっお正しい倀が蚭定されおいる様に芋える。
    では結果の _ble_edit_str_dbeg の類はどうなっおいるか? →これも問題ない。

    分かった。やはり .ble-line-text.construct が悪かった。
    dirty<=0 の時に shift が行われおいなかった。
    (9 10 9) ずいう物が衚瀺されおいる様に芋えおいたのは、前回の shift の時に出力した物を芋おいただけであった。
    dirty<=0 の時には shift がそもそも行われおいないので、その前埌に蚭眮した出力にも匕っかかっおいなかったずいう事である。
    これを修正したらすぐに動くようになった。

    次に、.ble-line-text/update-highlight-layer を実装した。
    これは曎新の必芁のある郚分だけ出力デヌタを曎新する物である。
    特に、色付けの倉わった文字の郚分に぀いお再蚈算を行う。
    珟圚は update-positions によっお䜍眮が倉曎された郚分に぀いおも再蚈算を行っおいるが、
    これは将来的に削陀しお、update-positions による曎新は別の所で凊理する予定である。

    さお、新しく実装したはいいが動きが倉だ。
    特定の状態にある時にカヌ゜ルを移動するだけでも䜍眮がどんどんずれおいく。
    ず思ったら、これは dbeg<0 なのにこれを倉曎開始点ずしおしたっおいる所があった為だった。
    単に dbeg>=0 を付け忘れおいただけですぐに盎った。

    未だカヌ゜ルの移動が遅いず思っお色々詊しおいたら、
    どうやら ble-syntax-hightlight+syntax の䞭が重い。
    parse は曎新された範囲だけに察しお凊理をしおいるので遅い筈はない。
    ずいうかカヌ゜ルの移動の時には呌び出されない。ずいう事は、
    その埌の属性倀の適甚が重いずいう事になる。
    取り敢えず umin, uend を甚いおその範囲だけ属性倀を曎新する様にした。
    それでも遅い。どうも word に察しおの凊理が重い様である。
    良く考えたら毎回各 word に察しおファむルかどうかの刀定を行っおいる。
    これは確かに重かろう。修正した。

    さお。次の問題。属性倀の適甚を _ble_syntax_attr_umin  uend
    の間に限った事によっお問題が生じおいる。
    "word による着色" がなくなった時に再び属性倀を _ble_syntax_attr から
    埩元しなければならないが、 "word による着色" は _ble_syntax_attr_umin
    等の管理の範囲倖である。これを正しく実装する為にはやはり layer の様な仕組みが必芁ずなる。
    しかし layer の仕組みを実装するに圓たっおどの様にすれば良いかに぀いおは申し越し考える必芁がある。

    ここでは、以䞋の問題点を挙げお䞀旊閉じる事にする。
    - "word による着色" がなくなった時にその郚分の着色がなくなるべき

2015-02-20

  * bash-3.1 ESC [ の受信に぀いお [#D0154]

    bash-3.1 での ESC [ を受信する為に、以前の修正で ESC [ を CSI に倉換しおいた。
    然し、今回 bash-4.3 で C-@ を受信する為に C-@ (0) を UTF-8 の 2-byte 笊号で受信し盎す様にした。
    この方法を甚いれば ESC [ も "ESC の 2-byte 笊号" + "[" ずしお受信し盎す事ができる筈だ。
    この様にすれば ble-decode-char に特別なコヌドを曞き蟌んで
    CSI を無理矢理 ESC [ に戻す等ずいう事をしなくおも枈みコヌドも綺麗になる。

    倉曎した。正しく動䜜しおいる。

  * <bug> C-x a 等に察しお x が読み取られる。 [#D0153]

    ble-decode-byte を芋おみた所ちゃんず 24 97 が受信されおいるのでこれは bind の問題ではない。
    その埌の文字の凊理の問題か、キヌの凊理の問題である。

    今床は .ble-decode-char の方で䜕が受信されおいるかを確認する。
    UTF-8 decode に問題があるずは思われないので、ここでも 24 97 になっおいる筈である。
    →果たしお 24 97 になっおいる。OK

    今床は .ble-decode-key の方で受信されおいる物を確認する。
    67108984 97 が受信されおいる。67108984 は 16 進数に盎すず、0x4000078 である。
    これは Ctrl フラグず 78 = 'X' の組合せになっおいる。この時点でも問題点は内容に思われる。
    ずするず問題があるのは .ble-decode-key の䞭で行われおいる凊理だろうか。

    ず思ったら今迄の凊理にかなり問題があるずいう事が分かった。
    ずいうか段々思い出しおきた。色々曞き換えようず思っお匄っおいる途䞭で䞭断しおいたような気がする。
    (或いは、蚳が分からなくなったが取り敢えず動いおいるから良いずいう事にしたのだったか。)

    - 先ず、.ble-decode-key.invoke の KEYS に代入される倀に぀いお。
      ${var//_/ } ではなく ${var//_/} になっおいるので key 分割に倱敗する。

    - .invoke-default で最埌に入力された文字だけを芋お既定の関数を呌び出しおいる。これは倉だ。
      ずいうかそもそも invoke-default はこのタむミングで呌び出すべき物なのかも謎である。

    - たた、.ble-decode-key.invoke に倱敗した時に _ble_decode_key__seq をクリアしおいるので、
      .ble-decode-key.invoke && return
      fallback
      ずした時に fallback に蟿り着く時には _ble_decode_key__seq の情報が消えお無くなっおいる。
      _ble_decode_key__seq= は呌出偎で凊理する事にする。

    - 䞀臎に倱敗したずいう゚ラヌを出力しおから途䞭䞀臎する物がないかを探玢しおいる。
      倱敗したず衚瀺したのに䜕かを実行するのは倉ではないか?
      でも耇数のキヌからなるシヌケンスで倱敗した堎合にはその耇数のキヌに぀いお゚ラヌメッセヌゞが衚瀺されお欲しい。

      䟋えば、䞀臎に倱敗した時に
      1 遡っお適甚できるシヌケンスがないか探す。芋付かればそれを凊理しお終わり
      2 もし任意のキヌに察する既定の動䜜が蚭定されおいれば、それを凊理しお終わり
      3 䜕も蚭定されおいなければ党䜓のキヌに぀いおの゚ラヌメッセヌゞを衚瀺する
      ず蚀う凊理にすれば良いのではないかず思う。x

      さお、これを実装する為には 遡っお適甚できるシヌケンスが芋付かっお実行した時点で制埡を呌出元に戻したい。
      が、珟圚の emit の再垰呌び出しの方法だずそれができない。emit 関数を再実装する必芁がある様に思う。

    たた良く分からなくなった。䜕が望たしい動䜜なのだろうか。
    ble_opt_error_kseq_discard の意味を倉えた方が良い様な気がしおきた。
    珟圚の実装を芋るず ble_opt_error_kseq_discard になっおいる堎合は郚分䞀臎がある堎合でも捚おる事になっおいる。
    しかしそうではなくお、郚分䞀臎すら芋付からなかった時に残っおいる
    キヌの列をどの様に凊理するかずいうのを制埡したいのではないか。
    郚分䞀臎に぀いお凊理しないようにしたいのであれば、そもそも keymap にそういう物を登録しない様にすれば良いだけの話である。
    keymap に色々蚭定しおおいおから、ble_opt_error_kseq_discard で郚分䞀臎なバむンドを
    on/off にするずいう䜿い方も可胜ではあるが盎芳的ではないし、䜕が䟿利であるのかも分からない。

    ここで、ble_opt_error_kseq_discard は郚分䞀臎も芋付からなかった堎合に残っおいる出力を捚おる為の蚭定ずする事にする。

    再実装した。すっきりした。

  * <bug> C-@ を受信できおいない @ bash-4.3 [2015-02-11] [#D0152]

    > * bash-4.3 C-@ に぀いお
    >
    >   bash-4.3 になっお bind -x が䞉文字以䞊に察しお䜿える様に bugfix されたが、
    >   同時に C-@ を含むような系列に察しお bind が正しく凊理されなくなった。
    >   珟圚 bash-4.3 においお C-@ を捕捉する事は出来おいない。

    bind -X を芋るず確かに
      "\C-@": "ble-decode-byte:bind 0"
    が登録されおいるのだが受信できない様だ。

    $ bash
    $ bind '"\C-@":"test"
    $ bind -s | less
    $ bind -x '"\C-@":"echo test"'
    $ bind -X | less

    ずここたで来お C-@ を抌したら
    bash_execute_unix_command の゚ラヌが発生するずいう事に気付いた。
    (ちら぀きを抑える為に bash の出力を殺したのは良くなかったかも知れない)
    →bash の出力をファむルに曞き出しお、それをチェックする事にした。
      ゚ラヌを吐き出しおいればそれを visible-bell で衚瀺する。

    仕様がないので "C-@ *" に関しおも党お登録する事にした。
    →"C-@ *" に割り圓おおも駄目なようだ。
      ずいうか C-@ を䜕床も抌しおも C-@ を続けおいる限りぱラヌも起きない。
      ぀たり C-@ に関連しお bash は䜕か特別な凊理をしおいる? 気がする。

    % 2015-02-19
    %
    % 珟圚の所 bash-4.3 においお keymap が芋付かりたせんでしたず衚瀺されるのは
    % C-@ だけなので、keymap が芋付かりたせんでした゚ラヌを受信したら C-@
    % を受信したずいう事にしおしたうずいうのも䞀぀の手である。
    % これは既に bash-3 で C-d を受け取るのに䜿甚しおいる方法を䜿えば良い。

    念のため他の version ではどうなっおいるかも調べおおく。
    bash-4.2 は C-@ は普通に受信できる。bash-4.0 でも普通に受信できる。
    bash-3.2 OK。bash-3.1 OK。やはり bash-4.3 だけで C-@ が受信できない。

    bind -x ではなく単に bind '"\C-@":"hello"' 等ずするず正しく受信できるず分かった。
    ならば bind '"\C-@":"\xC0\x80"' 等ずしおしたえば問題ない。
    "\xC0\x80" は UTF-8 の衚珟方匏で 0 を衚す。
    (䜆し、UTF-8 は或る code point を衚すのに最小の長さの笊号化を芁求するので、
    䞊蚘は正しくない、或いは、正芏化されおいない衚珟、ずいう事になる。
    䜕れにしおも、これは盎埌に .ble-decode-char+UTF-8 で 0 に翻蚳される䞀時的な物なので問題はない。)
    →これで呆気なく動くようになった。

2015-02-19

  * <bug> 4.3, 3.1 い぀の間にかに日本語が入力できなくなっおいる。い぀から? [#D0151]

    3.1 は別の問題であった。独立した項目にする。

    4.3 では無効なシヌケンスですずいう(自分で曞いた)゚ラヌメッセヌゞが出る
    3.1, 3.2 では謎の文字が入力される。ずいうか ^# ず衚瀺される。
    4.0 では䜕故か入力できる。"あ" ずすれば 227 129 130 が UTF-8 で受信されおいる。
    4.2 でも入力できる。

    あ E3 81 82

    ず思っおいたらいよいよ党おの version で読み取れなくなった。
    今迄読み取れおいたのは䜕だったのか 。良く分からない。
    .ble-text.c2s ず .ble-text.s2c を匄っただけの筈だが䜕故だろう。
    スクリプトが行けないのかず思っお色々詊したがよく分からない。

    ず思っおいたらそもそも受信しおいる byte が 129 130 だけになっおいた。227 が䜕凊かに消えおいる。
    ずいうか ESC にも bind できおいない。色々ずおかしい。

    䜕でか分かった。bind に䜿う文字をどの様に生成するかが関係しおいた。
    bind に䜿う文字は utf-8 で゚ンコヌドしお枡しおは行けない。
    盎接バむトを指定するか、そうでなければ゚スケヌプシヌケンスを甚いお枡す必芁がある。
    盎接バむトを指定するず別の文字ずくっ぀いたりしお倉な事になりそうなので専ら゚スケヌプシヌケンスを甚いる事にする。


    2015-02-20
      ず思ったら今床は \C-_ \C-[ \C-] \C-^ 等が動䜜しなくなった。
      \C-@ も今迄゚ラヌメッセヌゞが衚瀺されおいたのに、今は bell が鳎る。
      ず調べおみたら、この郚分の倉曎が原因になっおいた。
      通垞文字たでも゚スケヌプシヌケンスを甚いお衚珟しおしたった為に、
      \C-_ \C-[ \C-] \C-^ が \C-\135, etc になっおしたっおいた。
      ゚スケヌプシヌケンスにするのは 127 以䞊の文字 (8bit 文字 + DEL) だけにしお解決した。

  * <bug> bash-3.1, .ble-text.s2c が日本語に察しお正しく働いおいなかった。 [#D0150]

    先ず 3.1, 3.2 で化けおいる事に぀いお。
    内郚的には正しく入力できおいる様なのでこれは簡単に解決できるだろう。

    ^# 等ずいう文字はないよ?? ず思ったが、恐らく C-# ずデコヌドされおいるのだろう。
    ず思ったがやはり倉だ。info.draw でも ^# ず衚瀺されおいるこの文字は䞀䜓䜕か?
    info.draw では特別なデコヌドは行っおいない筈である。
    改めおみおみるず文字コヌドに぀いお 0 以䞊であるずいう仮定に基づいた凊理になっおいる。
    負の文字コヌドになっおいるのであろう。
    そしおそれは文字デコヌドの゚ラヌフラグが立っおいる事を瀺す?
    ず思っお ble_decode_Erro を確認したが別に笊号ビットではなかった。
    ずいうか笊号ビットを立おるような富豪はないように芋える。^# ずは䞀䜓䜕なのか 。

    うヌん。そしお実際に出力しおみるず正しく "あ" ず入力されおいる様子である。
    衚瀺だけが倉になっおいるずいう事の様である。これは䞀䜓どういう事なのか 。
    改めお芋おみるず .ble-text.s2c が怪しい。
    実際に詊しおみたら果たしお -29 ずいう倀を吐き出しおいる。

    そしおこれがどの様に実装されおいるかずいうず結局
      printf '%d' "'あ"
    の様な事をしおいる。これを実行しおみるず確かに -29 ず衚瀺される。
    これは utf-8 で "あ" を構成する初めのバむト 227 を signed char で解釈した時の倀である。
    さお、ずすれば bash-3 で unicode の文字コヌドを取埗する正しい方法を考える必芁がある。
    詊しに
      /usr/bin/printf '%d' "'あ"
    等ずしおみたら、227 ず衚瀺されお、倉な文字が䜙っおいるずいう゚ラヌを出力した。䜿えない。

    bash-3.1, 3.2 では "${a:b:c}" の圢匏ではバむト単䜍ではなく文字単䜍の操䜜しかできないし困った 。
    decode しおしたったのが問題だったずいう事なのか。でも、補間の堎合など ble-decode-byte
    以倖を通しお入力される文字列もあり、これらも正しく衚瀺する為には ble-decode-byte+UTF-8
    で逐次キャッシュを䜜成するずいう方法は䜿えない。やはりちゃんず蚈算する方法が必芁である。

    うヌん。どうやら
    while read -n 1 a; do printf '%d' "'$a"; done <<<"${text:i:1}"
    ずすれば䜕ずかできる様ではある。fork するよりは速いだろうか。

    或いは、c2s があるならば二分法で攻めるずいう手もあるかもしれない。幞い utf-8 は順序を保存する。
    ず思ったが c2s 自䜓が bash-3 では絶望的に遅いので二分法はしたくない。

  * <bug> bash-4.2 が segfault する。算術匏䞭の配列芁玠に関係しお。 [#D0149]

    | 䜕凊で萜ちるのかず調べおみたら .ble-edit-draw.redraw の䞭である。
    | 曎に調べおみるず以䞋の様な䜕の倉哲もない郚分である。
    |
    | local dbeg dend dend0
    | ((dbeg=BLELINE_RANGE_UPDATE[0],
    |   dend=BLELINE_RANGE_UPDATE[1],
    |   dend0=BLELINE_RANGE_UPDATE[2]))
    |
    | ず、ここで思い出したのだが䜕かの bash の version が、
    | 䞀぀の算術匏の䞭で耇数の配列参照を行うず萜ちるずいう問題があった様な 。
    | 少し詊しおみた: ((x=arr[1],y=arr[2])) これで萜ちる。
    | これは面倒臭い。かなり倧幅な曞き換えをしなければならない。
    | ずいうか patch を圓おるんだったらこの動䜜に぀いおも patch を圓おお欲しい。

    算術匏の䞭で配列を䜿うず segfault する問題に぀いお。

    | 算術匏の䞭で配列芁玠を参照するず、次の token に添字が適甚されおいる様だ。
    |
    | 算術匏の䞭で配列芁玠を参照しお代入するず segmentation fault する。
    | 算術匏の䞭で2回以䞊配列芁玠の倀を参照するず segmentation fault する。
    | 䟋えば ((x=arr[1],y=arr[2])) で萜ちる。
    | 代入するのは平気な様である。たた、参照するず必ず萜ちる蚳でも無い様だ。
    |
    | 配列でない倉数に察しおも同様に萜ちる。
    | 評䟡時ずいうよりは構文解析時に萜ちおいるのかも知れない。
    | 括匧で括っおも駄目だし、カンマ以倖で区切っおも駄目。let でも駄目。'' で囲んでも駄目。
    | 結局、安党に評䟡する為には、耇数の参照がない様にするべきなのか?
    |
    | 調べたら http://osdir.com/ml/bug-bash-gnu/2013-01/msg00042.html に報告が䞊がっおいる。
    | http://osdir.com/ml/bug-bash-gnu/2013-01/msg00043.html で解決したずいう事になっおいるが。。
    | 4.2.39 で少なくずも゚ラヌが発生しおいた様だ。手蚱の bash-4.2 は 4.2.53 なのだが。。
    | もしかしお 4.3 には適甚されたけれども 4.2 には結局適甚されなかったずいう事か?
    |
    | 所で䞊蚘ペヌゞで報告されおいる ((a=b[1],b=1)) ずいう匏を詊しおみたが、これでも萜ちる。
    | ぀たり、配列に察する参照を耇数回行った事が問題ではないずいう事。。うヌん。
    | どの様な時に萜ちおどの様な時に萜ちないのか。。
    |
    | うヌん。gdb で芋るず配列添字が来るはずの所に次の tok が来おいる。
    | 䟋えば ((a=b[1],b,c=1)) ずするず問題なく動く。
    | ((a=b[1],c,d=1)) でもOK。評䟡結果も異垞はないように芋える。
    | たた ((a=b[1],0,c=1)) ずするず萜ちる。((a=b[1],0)) は OK。
    | ((a=b[1],c,d=b[2])) も OK。
    | ずいうか䜕故か分からないが配列に察する代入を実行しようずしおいる?
    | ぀たり、"配列添字" が次の tok にも適甚されおしたっおいるずいう事か?
    |
    | ((a=b[1],1+1,d=b[2])) これは萜ちるが、
    | ((a=b[1],c+1,d=b[2])) これはOK。
    | ((x=(c=123,a=b[1],c+1))) これもOK。評䟡結果 $x も問題ない。
    |
    | 所で速床比范を行っおみる。
    | ((a=arr[i%3]));((b=arr[i%2+1]))
    | ((a=arr[i%3],dummy,b=arr[i%2+1]))
    | 殆ど違いはない様だ。dummy= ずしお挟んだ方が埮劙に速いずいう皋床。

    䜕れにしおも ble-syntax.sh で倧量の算術匏を䜿っおしたったから、
    これは倧倉な曞き換えだ ず思っお実際に曞き換えおみた所、
    意倖ずクラッシュのパタヌンになっおいる匏は少ない様だ。
    曞き換えたら簡単にはクラッシュしなくなったので取り敢えずはこれで䞀件萜着ずする。

    党おの実行パスに぀いお詊した蚳ではないので未だクラッシュする眠が残っおいるかもしれないが、
    それは萜ちおから考えれば良いずいう事にする。

  * ble-decode.sh: bind C-x の倉曎 [#D0148]

    改めおテストしおみた所 C-x 単䜓に察しお bind しお segfault するのは 4.2 だけの様だから、
    bash-4.2 の時にだけ "C-x *" のペアで bind する事にした。
    ペアで登録しおいるず2文字目が入力されるたで C-x が届かないので、
    その他の bash の version では "C-x" 単䜓で bind する事にする。
    (ずはいい぀぀、emacs keymap の蚭定だず C-x C-x 等の key binding があるので結局は
    ble.sh の内郚で 1 文字目の C-x が pending する事になる蚳だが)。

    たた、これに䌎っお既定で bind されおいる "\C-x *" が䞊曞きされなくなるので、
    bind -sp で列挙した物を党お bind -r する事にした。
    今迄は "\e" で始たる物しか bind -r しおいなかったが、そんなに速床が倉わる物でもないだろう。

    + C-x は 4.2 だけの問題化ず思いきや、3.1 がクラッシュした。

      改めお耇数の version で確認を取る事にする。
      3.1 は先に述べたように萜ちた。具䜓的には C-x C-b C-b 等ずしお萜ちた。
      3.2 も同様に C-x C-b で萜ちる。4.0 も同様に萜ちる。
      結局 C-x C-b 等ず打っお萜ちないのは bash-4.3 だけである。

      結果ずしお bash-4.2 の時にだけ "C-x *" ではなくお、
      bash-4.2 以䞋の時は党お "C-x *" で bind する事にした。


  * <bug> 日本語を入力するず䜍眮がずれる @ 4.0 bleopt_suppress_bash_output= [#D0147]

    →どうも 4.0 は 3 ず同じ様に bind -x の前埌でプロンプトを消去する様だ。
      ずいう事で bind 前埌のコヌドを 3 ず共通の物にした。

    たた、C-d を捕捉する事もできおいない。これに぀いおも察応した。
    ず思ったら、どうも C-d が捕捉できなかったのは、bind 前埌のコヌドを
    3 ず共通の物にした所為で IGNOREEOF が蚭定されおしたった所為であった。
    4.0 では READLINE_LINE が存圚するからわざわざ IGNOREEOF を蚭定する必芁はない。
    4.1 甚のコヌドず同じように READLINE_LINE を蚭定すれば良い。

    ずいう事で bind 前埌のコヌドの分岐を増やす事にした。
    bash の bind -x 関数の呌出の前のプロンプトの消し方に応じお _ble_bash>=40100 で分岐するのず、
    bash が READLINE_LINE 倉数を甚意しおいるかどうかに応じお _ble_bash>=40100 で分岐するのを区別する。

    しかしそれでも未だログアりト時のメッセヌゞの衚瀺䜍眮が倉になっおいる気がする。
    その他のコマンドの実行の時にはずれおいないからそれ皋問題ずいう蚳でもない。
    これは埌で察凊する事にする。■

  * <bug> 4.0 日本語を入力するず (( の䞭で日本語を䜿ったずいう文句が出る。 [#D0146]
    どこかの算術匏に文字列が玛れ蟌んでいるのだろうか。

    ず思ったら関係ない所を盎したら䜕故か動くようになった。
    ず思ったが、盎した箇所は adjusted をするかどうか、
    ぀たり READLINE_LINE を甚いお bash の出力を制埡するかどうかの郚分である。
    ぀たり、問題点は adjusted の郚分である。
    もう䞀床 READLINE_LINE を甚いる様に正しく修正しお詊しおみる。これで問題が再珟するはず。

    再珟した。カヌ゜ルの䜍眮ず出力されるタむミングから蚀っお、
    これは明らかに adjusted の䞭から発生しおいる。
    adjusted の䞭身は匄っおいないから lc の蚈算方法を倉曎した事が原因であるのは明らかである。

    どうやら .ble-text.c2w が $ret 倉数に倀を返すはずなのが䜕も倀を蚭定しおいない様である。
    前回の倀の "あ" ずいうのが残っおいる。
    もっず調べおみるず、どうも ret に予め "あ" 等の文字列が入っおいるず
    ret を蚈算する為の筈の算術匏の評䟡に倱敗しおしたう様である。
    ret は代入される偎なので予め入っおいる倀が䜕であれ関係ない等ず思っおいたが、
    良く考えおみたら算術匏の評䟡の方法䞊 ret の䞭身を展開しおたで数匏ずしお解釈する筈で、
    ret に䜕が入っおいるか分からない状態で算術匏を起動するのは危険ずいう事である。

    ble-decode-byte+UTF-8 でも䌌たような問題がないかず確認しおみたら、
    歀方の方は党く問題はなかった。こちらは蚈算した倀を䜿っおそのたた
    decode-char を呌び出す様になっおいお、
    倖郚の関数が甚意した倉数に倀を蚭定しお制埡を返すずいう方匏ではないので、
    未初期化の倉数が算術匏の䞭に登堎するずいう事は無い。

  * <bug> bleopt_suppress_bash_output= にした時にプロンプトが二重になる [#D0145]

    暫く bash の出力を抑制しお凊理を行う様にしおいたが、
    詊しに bleopt_suppress_bash_output= を再床蚭定しお動かしおみた所、
    bash がプロンプトを出力する様になっおいた 。
    䜕故だろう。bind/tail の盎埌に PS1 をファむルに出力しおも PS1 は空だ。
    bash が PS1 の内容を芚えおいるずいう事だろうか?
    でも同じ version で少し前には正しく動いおいたはずである。

    どうも blerc デフォルトの .bashrc をロヌドした時になる様だ。
    しかし䜕故だろうか。䜕か倉な PROMPT_COMMAND が蚭定されおいるのかずも思ったがそういう蚳でもない。

    どうやら bind -x したコヌドの内郚で PS1 を匄っおも反映されない様だ。
    倖で PS1 を蚭定する必芁があるずいう事。
    今迄は ble.sh ロヌド時に PS1= を蚭定しおいたので、それがずっず生きおいお動いおいたが、
    .bashrc をロヌドするず PS1 に新しく倀が蚭定されおしたうので駄目ずいう事。

    よく考えたら、今迄もプロンプトが衚瀺されおからすぐに入力をしたりするず
    衚瀺が乱れるなど思い圓たる事が他にもある。プロンプトが衚瀺されるのが ble.sh をロヌドした盎埌なのに
    その埌に未だ .bashrc 等の凊理を行っおいたのが原因である。
    その時間差の間に䜕かを入力した事によっお衚瀺がずれおいた。

    思うに ble.sh のロヌド・初期化ず、実際にアクティブにする attach の操䜜を分離すべきである。
    ble-initialize ble-attach ble-detach 関数を定矩する事にした。
    たた ble.sh に noattach の匕数を枡した堎合には、その堎での attach をしない様にした。
    必芁な堎合は埌で ble-attach を呌び出しお貰う事にする。

    →これで䞀応 bleopt_suppress_bash_output= の時にも動䜜する様になった。
      bash-3.1 の堎合にも C-d を正しく捕捉できない事を陀けば正しく動䜜する様になった様に芋える。
      (ずはいい぀぀やはりちら぀きは気になる。)

  * <bug> ble-detach が動かない [#D0144]

    たずめ
    - awk の゚ラヌメッセヌゞが tmp/$$.bind.save に混入しおいた
    - awk の -v var=value の䞭の value ぱスケヌプシヌケンスが解釈される
    - bash-4.3 bind -X で衚瀺されるコマンドは特別な゚スケヌプがされおいお bind -x では䜿えない

    > 色々あるが取り敢えず $_ble_term_fghr ず蚀った類の物が盎接衚瀺されおいる。
    >
    > 埌、awk を呌び出そうずしたり䜕か倉だ。取り敢えず分かり易い所から。
    > $$.bind.save の䞭を芗いおみる ず思ったら awk の゚ラヌメッセヌゞが bind.save の䞭に混入しおいる:
    > awk: 譊告: ゚スケヌプシヌケンス `\'' は `'' ず同等に扱われたす
    >
    > するべき事は、
    > - awk の゚ラヌメッセヌゞは別の所に出力されるべき
    >   gawk の幟぀かの version からは "/dev/fd/数字" を甚いる事ができるのでそれが利甚できる。
    >   䜆し少し叀い version の gawk で動かなければ結局これは積極的には採甚できない。
    > - メッセヌゞの通り゚スケヌプシヌケンス \' に察する凊理を行う。
    >
    > 䜕ず awk -v APOS="'\\''" 'BEGIN{print APOS;exit}' だけで゚ラヌになる 。
    > awk -v apos="'" 'BEGIN{print apos "\\" apos apos; exit}' ぱラヌにならない。
    > ぀たり -v で枡したパラメヌタに含たれる゚スケヌプシヌケンスを解釈するずいう事???
    > 調べおみたら POSIX レベルでそう動䜜する事になっおいる様だ。
    > [[bash - Should awk expand escape sequences in command-line assigned variables? - Stack Overflow>http://stackoverflow.com/questions/13808909/should-awk-expand-escape-sequences-in-command-line-assigned-variables]]
    >
    > 1回 ble-detach しお再び ble-attach するずたたプロンプトが2重になる。
    > →これは .ble-edit/edit/attach での guard が1回しかロヌドされない事を前提ずした物だった事による。修正した。
    >
    > 1回 ble-detach しお再び ble-attach しお、曎に ble-detach するず
    > detach できおいない。それに加えお "bash: : コマンド芋付かりたせん" ずいう゚ラヌになる。
    > コマンドを実行しようずするず実行できずに、実行コヌド党䜓を䞀぀のファむルず芋做しお実行しようずしおいる??
    >
    > ず思ったら ble-decode-byte:bind が埩元察象に入っおいた。
    > 埩元察象に入らない様に awk でチェックしおいたはずなのにず思っお確認したら
    > ble-decode-bind ず指定しおいた事によりチェックが正しく機胜しおいなかった。
    > たた、それずは別に埩元の仕方にも問題がある。
    > "à": "ble-decode-byte:bind 224; eval \\\"$_ble_decode_bind_hook\\\""
    > 等ず、過剰に゚スケヌプされおいる。これに぀いおもう少し詳しく。
    >
    > 始めに attach した盎埌には bind -spX するず以䞋の様になる。
    > "\C-@\C-@": "ble-decode-byte:bind 0 0; eval \"$_ble_decode_bind_hook\""
    > その埌で ble-detach しおもこの結果は倉わらない。
    > この次に ble-attach した埌に bind.save を芋るず
    > bind -x '"\C-@)": "ble-decode-byte:bind 0 41; eval \"$_ble_decode_bind_hook\""'
    > 等ずなっおいる。問題はない様に芋える。が、これで登録するず先皋の様な事になるずいう事か。
    >
    > →色々 bind -X の出力を調べるずコマンドの䞭に制埡文字が含たれおいるず゚スケヌプされる様だ。
    >   先ず " ず \ は \" ず \\ に倉換されおいる。たた DEL は \C-? になり ESC は \e になる。
    >   それ以倖の制埡文字 (031) は \C-なんずか の圢に倉換される。
    >   これらを元の文字に埩元する簡䟿な方法は存圚しない様に思われる (bash の機胜を䜿ったずしおも)。
    >   仕方がないので awk で倉換のコヌドを曞く。面倒なので gsub を繰り返し適甚する方針で。
    > →これで取り敢えず正しい bind -x コヌドを出力する事ができる様になった。
    >
    > さお、これを解決したらすっかり ble-detach が動くようになった。
    > bleopt_suppress_bash_output=1 でもちゃんず問題なく動いおいる様に芋える。
    > 䜕床も ble-attach, ble-detach を繰り返しおも動いおいる。

2015-02-18

  * 履歎展開の察応 [#D0143]

    ^string1^string2^ の圢匏の履歎展開の堎合、順に入力しおも履歎展開ず認識されない。
    ずいうか :x 等の modifiers も順に入力しおも履歎展開に含たれない。

    解析再開点を履歎展開の盎前に眮いおおくか、䜕らかの単語?ずしお取り扱わないず駄目。
    (「この点たでは stat に倀を蚭定しない」ずいう倉数を甚意しお、
    先読みを実行した堎合にその倉数に倀を蚭定するずいうのも興味深い方法である。)

    埌、詊しお気付いた事だが !!$:a 等ず定矩されおいない修食子を指定するず、
    単に履歎展開をせずに実行されるのかず思いきや、履歎展開の゚ラヌになっおコマンドが実行できない。
    この゚ラヌ報告ず敎合性のある色付けにしたい。
    結局、履歎展開に぀いおも内郚の文法構造を気にしお実装するずいう事になるのだろうか。

    他にも s/../../ や ^..^..^ は途䞭で䞭断するず空文字列を指定したずしお解釈される事も分かった。
    説明曞に曞かれおいない動䜜が色々あるが、この動䜜であれば华っお順に入力しおいけば
    正しく党䜓が履歎展開ずしお解釈される。
    適圓に実装したが珟状で倧䜓OKなのではないかずいう気がする。

  * CSI → ESC [ 翻蚳に぀いお [#D0142]

    珟圚 bash-3.1 ESC [ → CSI や、ESC ESC → ... を default keymap に蚭定しおいるが、
    その他の keymap の時に凊理されないのは問題である。
    䟋えば isearch の時に bash-3 では矢印キヌが䜿えない事になる。
    もっず前の段階で倉換をするべきなのではないか?

    charmap はそう切り替わる物でもないので charmap のレベルで受け取った CSI を
    ESC [ に倉曎するずいう方法があるず良い。できればハヌドコヌドするのではなく䞀般的な枠組ずしお。
    →ず思ったが䞀般的な枠組にするず匷力すぎる様に思うので取り敢えずは
      char==91 に察しおハヌドコヌドしお介入する事にした @ .ble-decode-char
      (utf-8 CSI を送信する様な端末があった堎合にもこれで察応できた事になる が、そんな端末があるかは䞍明。)

  * <完> bash-3 で C-d を捕捉する方法? [#D0141]

    今は IGNOREEOF を倧きな倀にしお即座にログアりトされない様にしおいる。
    所で C-d を抌すず
      Use "exit" to leave the shell.
    だずか
      ログアりトする為には exit を入力しお䞋さい
    だずか
      シェルから脱出するには "exit" を䜿甚しおください。
    だずか蚀ったメッセヌゞが出力される。

    珟圚 bleopt_suppress_bash_stdout を蚭定しおいる堎合には
    bash の゚ラヌメッセヌゞはファむルに曞き蟌たれるので、
    このファむルを読み取る事で C-d を抌した事を怜知する事は出来る。

    䜆し、抌された事が怜知できるのは C-d が抌された埌に初めお別のキヌが抌された時である。
    C-d では䜕もむベントが起きおくれないので。

    匷匕な手だが、垞にファむルを監芖する子プロセスを䜜成しお、ファむルに Use "exit" ... が曞き蟌たれたら
    シグナルを $$ に送っおそこで凊理するずいう手が䜿えるかも知れない。
    しかし子プロセスで垞にファむルを開いお確認するのでリ゜ヌスを食う。䜙り䜿いたくない方法である。

    たた或いは bash の゚ラヌ出力先にコプロセスを眮いおおきそこで受信をするずいう手も 。
    こちらの方が未だたしである。もしかしおこれで行けるんじゃないか ず思っお実装しおみた。
    動いおいる ず思いきやすぐに゚ラヌを吐いお終了する。
      trap -- 'myfunc' USR1
    するだけでも゚ラヌになっお死ぬので、行っおいる凊理の問題ではなさそう。
    代わりに RTMIN を䜿っおみたがそれでも同じ゚ラヌが発生する。
      trap -- 'echo hello' USR1
    ずいう皋床であれば䜕も起きない。trap の䞭で関数を呌び出すのが駄目ずいう事だろうか。

    もしかしおシグナルハンドラの凊理䞭にシグナルハンドラが呌び出されおいる??
    或る皋床凊理に時間が掛かる関数を蚭定するず゚ラヌになっお死ぬずいう事だろうか??
    →必芁な時にだけ呌び出す様に倉曎したら動くようになった
      (ずはいい぀぀もシグナルによっお動䜜しおいるので流石に遅い。しかし䜕ずか動いおいるので良しずする。)
    →ず思ったが内郚で呌び出しおいる mv を止めたらそんなに遅くはなくなった。fork はやはり重いずいう事か。

    > 2013-06-13
    >
    >   * 制限: bash-3 では C-d を捕捉する事ができない。

    取り敢えずこれは解決したずしお良いだろう。

  * ble-edit.sh, ble-decode.sh: bugfix, bash-3 でカヌ゜ルキヌの類が動かない。履歎が読み蟌たれおいない。 [#D0140]

    これらの原因は同じ物であった。高速化の為にコヌドを生成しおそれを盎接 source しおいたが、
    その為に source ずプロセス眮換を組み合わせたのがいけなかった様だ。
    bash-3 では source はプロセス眮換から読み取っおくれない。
    (パむプからは読み取らないずいうポリシヌなのか、
    或いはシヌクできないず実行できないずいう事なのか分からないが。)

    source <( ... ) を eval -- "$( ... )" に倉曎。

2015-02-17

  * ble-syntax (ble-syntax-highlight+syntax): 入れ子゚ラヌの色の範囲 [#D0139]
    䟋えば "(( echo" 等の堎合。
    閉じおいない入れ子構造がある堎合に、入れ子構造の開始字句を゚ラヌ色にしおいる。
    しかし、䞀文字目しか色を付けおいない為、入れ子開始の字句が耇数文字で構成される堎合に䞍栌奜である。
    字句単䜍で色を付けられるように fill-g 関数を修正し、それを甚いる事にした。

  * ble-edit.sh (accept-line): - で始たるコマンドを実行できない。 [#D0138]
    履歎展開の為にコマンドを history に枡した時に history ぞのオプションずしお解釈されおいた。
    ずいうか eval も - で始たるコマンドを扱えないし、history -s で履歎に登録する事もできない。
    eval に関しおは -- 以降はコマンド郚分ずしお解釈される様なのでそれを甚いる。
    よく bash の man を読んでみたら組み蟌みコマンドの章の䞀番䞊の郚分に -- に぀いお曞かれおいた。

  * <bug> ble-syntax.sh: 1"$1" ず入力しおから先頭の 1 を消すず単語情報が壊れる。 [#D0137]
    単語の長さが再蚈算されおいない事による物ず思われるが良く分からない。

    萜ち着いお珟圚の実装でどの様な振る舞いになるはずかに぀いお考える。
    1"$1" の時は 1 の郚分に単語情報が栌玍されおいる。
    ここで 1 を削陀するず単語情報も消えお無くなる。
    次に 1 の郚分から解析が始たるがこの時に新しく単語の開始点が蚭眮される。(長さ 0)
    所が (単語の開始点が前回ず䞀緒である為) 単語の末端に達する前に解析が終了する。

    さお埌段で前方の単語ぞの参照を保持しおいるはずで、
    参照しおいる単語開始点が線集の察象だった時は dirty 範囲をそこたで拡倧する手はずになっおいた筈だが。
    芋おみるず線集の察象かどうかの刀定が [i1,i2) になっおいる。
    これは単語の先頭で線集が行われた堎合にその単語は線集されおいないずいう刀定である。
    これに぀いおはもう少し考え他方がよいのかも知れないが
    単玔そうな [i1,i2] に倉曎する事にする。(単玔な物の方が倧抂自然である。)

    % どの様にしなければならないかずいうず。
    % 単語情報を削陀しおその堎に新しく単語情報を远加する堎合、

  * <bug> ble-syntax.sh: ${1}1${1} の状態で真ん䞭の 1 の盎前に空癜を入れるず壊れる。 [#D0136]
    他の郚分に空癜を入れたり空癜以倖の文字を入れおも䜕も起こらないが、
    該圓箇所に 1 を入れた時にだけ壊れる。

    詊行錯誀
    > これに぀いおも珟圚の実装でどうなっおいるのかに぀いお調べる。
    >
    > 先ず shift の際に䜕が起こるかに぀いお。${1}2${3} → ${1} 2${3}
    > ずずらした事で単語の先頭 (${1}の前) に察する参照が曎新される事は無い。
    > 単語の先頭は線集䜍眮よりも前にあるからである。
    >  よく考えたら、${3 を読み取ろうずした時点で inest/wbegin の倀が䞀臎しおしたうので
    > 其凊で単語の読み取りが終了しおしたう事になる。
    > 別の単語の䞭にいながら局所的に同䞀の文法状態になる事が原因で途䞭で解析が終了しおいるずいう事だ。
    >
    > 本圓か? ではなぜ echo ""2${3} → echo "" 2${3} の時には問題が発生しないのか?
    > 残っおいる情報
    >   ${ を読み取る盎前の wbegin は "" の先頭にある。
    >   ${ を読み取る盎前の inest は -1 である。
    >   ${ たで読み取った時の wbegin は -1 である。
    >   ${ たで読み取った時の inest は ${ の先頭の䜍眮にある。
    > 新しい解析
    >   ${ を読み取る盎前の wbegin は 2 の先頭にある。
    >   ${ を読み取る盎前の inest は -1 である。ここは䞍䞀臎なのでここで停止する事は無い。
    >   ${ たで読み取った時の wbegin は -1 である。
    >   ${ たで読み取った時の inest は ${ の先頭の䜍眮にある。ここで䞀臎する気がするのだが 。
    > dirty-range の拡倧も考慮に入れる事にする。
    >   dirty-range の拡倧は wbegin/inest の参照先が線集範囲内にある時に発生する。
    >   ${ の倖偎では wbegin inest は垞に wbegin=0 inest=-1 になっおいる。
    >   これは dirty range の拡倧には寄䞎しない。
    >   ${ の内偎では wbegin inest は -1 及び ${} の先頭になっおいる。
    >   そしおこの先頭 of ${ は線集の察象ではない。぀たり dirty-range の拡倧は起きない。
    > →もっず色々詊しおみた結果
    >   (字句単䜍1)(字句単䜍2)(字句単䜍N)${3} の時に、
    >   字句単䜍1 の盎埌に空癜を挿入する堎合は OK で、
    >   字句単䜍2以埌の盎埌に空癜を挿入する堎合に駄目になるずいう事が分かった。

    原因
    "(字句単䜍1)(字句単䜍2)(字句単䜍N)${3}" に空癜挿入 の際:
    - 字句単䜍1の盎埌に空癜を挿入する堎合には再開点が単語の先頭になり、
      単語の先頭も線集察象ずしおマヌクされる為に単語党䜓が曎新察象になり問題が発生しないずいう事の様だ。
    - しかし、字句単䜍2 の盎埌に空癜を挿入する堎合には再開点は字句単䜍2の先頭になり、
      単語党䜓は曎新の察象ずは芋做されない事になる(ここたでは期埅しおいる動䜜である)。
      所が、その埌で内偎のネスト状態に入った所で局所的に前回の解析ず同じ状態になり停止するずいう事のようだ。
    - たた、字句単䜍N の盎埌に空癜を挿入した堎合には ${3} 党䜓が曎新察象になるのでやはり問題は発生しない。

    察凊

    局所的な文脈の䞀臎ではなくお党䜓的な文脈の䞀臎たで考慮しないず問題が残る。
    䟋えば珟圚の実装ではネストレベルが異なる堎合でもネストの開始䜍眮さえ同じであれば文脈が䞀臎したず解釈しおしたう。
    実装圓初には「ネストの開始䜍眮さえ䞀臎しおいれば文脈的には同じ構造に戻ったず芋做しおも良い」
    ずいう想定を行っおいたが実際にはネストの開始䜍眮が同じであっおも文脈の構造が倉化した可胜性があるずいう事だ。

    䟋えば (CTX_EXPR の䞭で) ( を䞊曞きしお [ にした堎合などがこれに含たれるのではないかず思う。
    これは類䌌のたた別の問題だ。珟圚の文脈情報に開始括匧の情報を含めおいない事による。
    開始括匧の察応たで䞀臎しおいるかどうかを確認する為には [inest] の type が同じかどうかたで確認しなければならない。
    これの比范を怠っおいる事は結構䞍味い。

    結局、现心の泚意を払っおすれすれで実装するのではなく、安党確実な方法を採る方が良い。
    ぀たり、珟圚のネスト情報を芪たで党郚含めた圢で蚘録しお䞀臎するか確認を行う。
    その為のネスト情報をどの様に蚘録するのが良いか?

    > 䞀番簡単なのは stat に党おの情報を入れおしたう事である。しかしもう少し効率化できないだろうか。
    > 再開の為に必芁なのは stat に珟圚蚘録しおいる 3 ぀組だけである。
    > 埌は自動的に pop によっお情報が埩元されおいく。
    > さお、stat には3぀組しか蚘録しない様にしお、
    > 曎に比范を行う為にその堎で inest を蟿っお stat を掘り返す事にするのは非効率である。
    > 代わりに初期の nest 状態だけ埩元しお、
    > その埌は push/pop する時に nest 状態を曎新するずいうのはどうだろう。
    > しかし、この方法で珟圚の解析の nest 状態を曎新する事は出来るが、
    > 前回の解析の nest 状態を远跡する事は出来ない。push/pop の情報は蚘録しおいないからだ。
    >
    > 仕方がないので stat に党おを蚘録しおしたう事にする。
    > 幞い _ble_syntax_stat を参照しおいるのは殆ど ble-syntax/parse だけなので、
    > この関数内での取り扱い方法だけ倉曎すればOKである。
    > ず思ったが もし stat にネストの党階局を蚘録しおいるず shift が滅茶苊茶な事になる。
    >
    > ずいうか珟圚 _ble_syntax_nest に察しおは shift を実行しおいないがこれに぀いおも shift する必芁があるずいう事か。
    > 前回䜿った _ble_syntax_nest は今回は䜿わないので shift を実行する意味はなかったのである。

    うヌん。面倒だ。取り敢えず動くようにする為には
    1. _ble_syntax_nest もシフトする様にする
    2. _ble_syntax_nest を掘り返しお文脈が䞀臎するかどうか確認する
    ずいう事になる。掘り返すのは効率的かどうかは疑問だが取り敢えず実装する。
    (今迄問題にならなかった事から、そもそもそんなに掘り返さなくおもすぐに䞍䞀臎になるのかも。
    改めお考えおみるに其凊たで性胜の劣化になる様にも思われないのでこれで良い事にする)。

2015-02-16

  * ble-syntax.sh: 単語終了刀定の凊理の倉曎 [#D0135]

    ble-syntax/parse/word-end の刀定は
    字句単䜍の開始時ではなくお字句単䜍の読み取りの終了時にするべき?
    ずいうのも単語を郚分線集するずその単語の長さが 0 になっおしたうから。
    これは単語を郚分線集した時の曎新範囲が兞型的にその単語の末端たでになるので、
    解析もその単語の末端たでで終了しおしたう事が倚いから。
    然し乍ら、word-end は次の字句単䜍の読み取りの際に呌び出されるので
    その字句単䜍の終端を蚭定する機䌚がないずいう事になる。

    % しかし、もし word-end の刀定を字句単䜍の終端時に行う事にするず
    % 別の問題が発生する。単語の末尟に字句を远加した時に単語が䌞匵しおくれない。
    % ずいうのも字句の盎前で既に単語が終了しおいる事になっおいるからである。

    再開した時に正しく再開できる様にする為の簡単な条件は、
    その点での解析状態が次の文字に䟝存しおはならない、ずいう事である。
    しかしそれは少々無理がある。次の文字が分からなければ
    字句単䜍がそこで終わるのかどうかさえ定かではない為である。
    そこで、珟圚は解析の再開は倉曎のあった点ではなく「その点よりも前の最近の再開点」ずしおいる。

    埓っお、其凊で単語が終了するかどうかの刀定もやり盎されるのではないかずいう気がする。
    䟋えば、単語の末尟に文字を远加する事を考える。文字を远加した時に解析の再開は
    远加した文字の箇所で起こる蚳ではない。远加䜍眮の䞀぀前の再開点から開始される。
    そしお䞀぀前の再開点の時点では未だ単語は終了しおいない事になっおいる筈だから、
    正しく単語は䌞匵されるず期埅される。
    なので、取り敢えず字句単䜍の終わりの時点で単語の終了を刀定する様に曞き換えおみお動くか芋る。

    呆気なく動いおいる。歀方の方が実装ずしおも単玔だし自然である。
    →初めは CTX_CMDI の類の文脈が成功した時しか単語の終了刀定をしおいなかったが、
      実際に色々やっおみるず、nest から抜けた堎合や
      CTX_CMDI の文脈で認識されない゚ラヌ文字があった堎合にも
      そこに単語の終了が来る可胜性があるずいう事に気付いたので、
      任意の ctx の凊理の埌に単語終了刀定を眮く事にした。
    →今埌、"ctx の凊理の埌の ctx" に応じお適切な単語終了刀定を行える様に
      WORDEND[ctx] 的な配列に関数を入れる事にしおも良いかも知れない。

  * ble-edit.sh (_ble_edit_str, ble-edit/dirty-range): 倉曎範囲の合成に぀いお [#D0134]

    入力文字列に察する郚分倉曎があった時に、党䜓を蚈算し盎すのは非効率である。
    どの様な倉曎があったのかを蚘録しおおき、倉曎がなかった郚分の蚈算に぀いおは省略するのが埗策である。
    その為には郚分倉曎を䜕らかの方法で衚珟・蚘録しおおかなければならない。
    ここでは str1 → str2 ぞの倉曎操䜜を
      str2="${str1::beg0}$ins${str1:end0}"
    の圢に䞀般化しお考える事にする。
    この時 str1 の [beg0,end0] の範囲が str2 の [beg,end] になったず考える。
    beg=beg0 であり end=beg0+${#ins} である。この時倉曎範囲を
      (beg, end, end0) の䞉぀組みで衚す事ができる。

    今考えたいのはこの様な倉曎操䜜を 2 回行っお str3 を埗た時に、
    str1 から str3 ぞの郚分倉曎をどの様な䞉぀組みで衚せるかずいう事である。
    ※勿論自明な解ずしお (0, ${#str3}, ${#str1}) 等を考える事ができるが、
      今はできるだけ共通郚分を長くしたい、
      ぀たり、倉曎郚分の長さ end-beg を最小にしたいのである。

    匏で考えようずしたが匏の䞊での堎合分けが面倒だ。
      str1 -(dbeg dend dend0)→ str2 -(beg end end0)→ str3 の時
      i2 = i1<begA?i1: i1<endA0?-1: i1+(endA-endA0)
      i3 = i2<begB?i2: i2<endB0?-1: i2+(endB-endB0)

    蚘号的に堎合分けするのではなく、もう少し具䜓的に堎合分けを考えた方が良い。
      str1 = A [ B ] C → str2 = A | X | C ずなったずする。
      曎に str3 に入る時に䜕凊に切れ目が入るか ("[]" で衚す) で分類できる。
      (1) str3 = A0 [A1] A2 |     X      |     C
      (2) str3 = A0 [A1     | X0]     X1 |     C
      (3) str3 = A0 [A1     |     X      | C0] C1
      (4) str3 = A          | X0 [X1] X2 |     C
      (5) str3 = A          | X0     [X1 | C0] C1
      (6) str3 = A          |     X      | C0 [C1] C2
      先ず beg は明らかに min(begA, begB) である。
      次に end は max(endA-endB0+endB, endB) である。
      end0 は end から逆算できる。或いは end の由来を考えお堎合分けすれば良い。
      end が endA-endB0+endB の時は endA0 がそのたた end0 になる。
      end が endB の時は end0 = endB0-endA+endA0 になる。

      匏で曞くず:
      beg = min(begA,begB)
      end = endB + max(endA-endB0,0)
      end0= endA>endB0? endA0 : endB0-endA+endA0
          = endA0 - (endA-endB0>0?0:endA-endB0)

      敎理するず:
      beg = min(begA,begB)
      end = endB
      end0= endA0
      if((del=endA-endB0)>0)
        end+=del;
      else
        end0-=del;

    数匏での間接参照?
      alpha=111 beta=alpha*2 pref=bet
      echo $((${pref}a))
      → ちゃんず 222 になる。。bash-4.3, bash-4.1, bash-3.1 で確認した。

2015-02-13

  * <完> グロヌバルで実行するずいう事? [#D0133]

    % 次の様な関数で eval すればグロヌバルで評䟡できるかも。
    % 少し詊した段階では問題は生じおいない。
    %
    % geval () { trap -- "$*" RTMAX; kill -RTMAX $$; }
    %
    % + 䜕ずゞョブ管理にも正しく登録される様である。
    %   グロヌバルな倉数は勿論定矩される。
    %
    % + 返华倀に぀いおは流石に kill の戻り倀ずしおは入っおいないが䞭で適圓に拟えば良い。
    %   geval () { trap -- "$*"$'\n'"echo exit=\$?" RTMAX; kill -RTMAX $$; }
    %   (改行で区切る様にしないず $* が & や ; で終わっおいた時に文法゚ラヌになる。)
    %
    %   埌 trap の内容を埩元する為に
    %   | originalTrap="$(trap -p RTMAX INT)"
    %   | ...
    %   | trap - RTMAX INT
    %   | test -n "$originalTrap" && eval "$originalTrap"
    %   等ずするず良いかもしれない。
    %
    %   䜆し、この様にコマンド実行䞭だけ ble の甚意した trap を実行しおいるず、
    %   コマンド実行䞭はナヌザの trap した内容が実行されないずいう事に泚意する。
    %   (倖郚コマンドの堎合には bash ではなく倖郚コマンドがシグナルを受け取れるので問題ないが、
    %   シェル関数の堎合にはナヌザが予め蚭定した trap でシグナルを受け取る筈だ。)
    %
    % + C-z 時の返华倀 → OK 拟える
    %   C-c 時の返华倀 → 駄目。拟えない。これは今迄ず同じ。なので INT に trap する。
    %   INT の埩元もした方が良い? → $(trap -p RTMAX INT) ずするだけなので気にしなくお良い。
    %
    % + jobs で kill -RTMAX $$ ず衚瀺される。
    %   ずいっおも kill -RTMAX の埅ち状態ずいう蚳ではないようだ。
    %   蚌拠に geval の次のコマンドは geval 内のコマンドで C-z した盎埌に実行されるし、
    %   たた、geval 内郚で二぀の less を呌び出しお䞡方ずも C-z しおも正しく実行される。

    ず思ったら幻想だった。そもそもグロヌバルで実行しおいない。
    珟圚の文脈のたたでシグナルハンドラが呌び出されおいる様だ。
    ぀たり、シグナルハンドラが関数内の環境に圱響を䞎えられるずいう事。

    今の所グロヌバルで実行できるのは bind -x だけしかない気がする。
    しかし bind -x した物を呌び出す為にはナヌザに䜕か入力をしお貰わないずいけない。
    (入力を再珟する方法が有れば良いがそれをシェル内から実行する方法はない気がする)。
    或いは䜕ずかしお readline の accept-line を呌び出す事ができればよいが。

    うヌん。汚い方法ではあるが、
    bind -x で "ble-decode-byte:bind 1 2 3; eval \"$_ble_onafter_bind\""
    等ずしお任意の物を倖で実行できる様にしおおくずか。。
    →この方針で実装しおみた。存倖問題なく動いおいる。

  * <完> 珟圚の C-c のトラップの実装に関する疑問 [#D0132]

    return で良いのか? return が䜿えない堎合があるかも?
    →サブシェルを䜜らずに同じプロセスで実行する堎合、
      内偎の環境になるのは関数か source しかない。
      ぀たり、䞀番倖偎でない限りは return が䜿える。
      ぀たり、珟状の様に関数内で実行しおいる限りは return は垞に䜿えるずいう事。

    return で正しく抜ける事ができるのか?
    䞀番内偎の 関数/source しか抜けられないのでは?
    或いは、入れ子になっおいる堎合に誰が受信するのか?

    | 実隓
    |
    | trap INT はどの様な堎合に働くのか?
    | 盎接 $ sleep 10 に察しお C-c しおも trap されない。trap が動く条件は? 色々詊した。
    | 䜕か倉だ。殆どの堎合で動かない様に思われる。
    | bind -x の䞭からだずたた違った結果になるのか、それずも珟圚の実装は問題があるのか 。
    | $ trap -- 'echo INT $a' SIGINT
    | $ sleep 10 →×
    | $ : $(sleep 10) →○
    | $ echo 10 && sleep 10 →×
    | $ sleep 10 && echo 10 →×
    | $ (sleep 10) && echo 10 →×
    | $ func1() { sleep 10;}; func1→×
    | $ プロンプトが衚瀺されおいる時に C-c→○
    | $ for ((i=0;i<100000;i++)); do :; done→○䞭断する
    |   ルヌプ内では trap できお、しかも自動的に䞭断されるずいう事
    | $ fib1() { (($1<=1)) && eval $2=1 && return; fib1 $(($1-1)) ${2}L ; fib1 $(($1-2)) ${2}R; let $2=${2}L+${2}R; }; fib 20 x→○䞭断する
    |   関数の再垰呌び出しも trap できお、しかも自動的に䞭断されるずいう事
    | $ trap 'echo INT $2=${!2};return' INT; fib 20 x→○䞭断しない
    |   →䜕床 C-c を抌しおも最埌たで抜けられない 。return があるかないかで動䜜が異なる様だ。
    | $ for ((i=0;i<100000;i++)); do :; done→○䞭断する
    |   →これは単玔に return ができない為に return をしなかった堎合ず同じ動䜜をしおいるずいう事。
    |     結局 trap の動䜜は return コマンドを曞いたか曞かなかったかではなく、実際に return しおいるかしおいないかを芋おいる。
    |
    | 分かった事
    | - trap INT は珟圚の文脈 (関数内/source内) で最倧1回だけ実行される
    |   子プロセスが INT を受け取った堎合などには受け取らない。
    | - 唯単に trap INT するだけの堎合、シェル内で行われおいる党おの凊理が自動的に䞭断される
    | - trap INT の䞭で return 等を実行した堎合は、return の埌で凊理が続行される
    |
    | これを受けお C-c を受信した時にどの階局たで抜けるかをコントロヌルする方法は:
    | - 䞀気にシェルの凊理を終了したい堎合には trap の䞭で return 等を曞かない。
    | - 䞀぀䞊の関数・source に戻りたい堎合は trap の䞭で return を曞く。
    | - 䜆し、関数呌出を沢山行っおいる堎合 C-c で抜ける事ができなくなる可胜性がある。埓っお return は曞かない方が良い。
    |   任意の階数の関数・source を抜ける方法はない。

    結論

    珟圚の実装は関数の再垰呌び出しなどを C-c で停止する事ができない。
    →実際に詊しおみた for ルヌプは抜けるが再垰呌び出しはその堎では抜けられない。
      (䞀応各再垰呌び出しは抜けおいる様である。その為に、
      C-c をするず fib1 の結果が倉わる (前回の呌出の時の結果が残っおいるず正しい結果になるが))
    →これは C-c によっおシェル内の無限ルヌプを止める事ができなくなる可胜性がある事を瀺す。よくない。

      trap で $_ble_hook_INT 等ずしお埌凊理をする関数を付け加え、return はしない様にするべき?
      →これだず local で倉数が被芆されおいる堎合などに正しく察凊できない。
        たあ _ble_... を宣蚀しなければ倧䞈倫である。

    実際にその様に実装しおみたら問題がある。
    どうやら bind -x の䞭で実行しおいる堎合には return しないずそのたた実行が継続する様である。
    return するず珟圚の呌出階局だけは抜ける事ができるので以前はその様に実装しおいたずいう事か。
    以䞋はその前提で曞いおみたコヌド。結局これは䜿えないずいう事になった。
    > &pre(agh-prog-bash){
    > function .ble-edit/exec2/eval-prologue {
    >   .ble-stty.leave
    >
    >   # 履歎眮換
    >   set -H
    >
    >   # C-c に察する trap
    >   _ble_edit_exec_original_trapint="$(trap -p INT)"
    >   trap .ble-edit/exec/eval-TRAPINT INT
    >   trap 'echo INT' INT
    > }
    > function .ble-edit/exec2/eval {
    >   # BASH_COMMAND に return が含たれおいおも倧䞈倫な様に関数内で評䟡
    >   .ble-edit.accept-line.exec.setexit
    >   eval "$BASH_COMMAND"
    > }
    > function .ble-edit/exec2/eval-TRAPINT {
    >   # eval 䞭にシェルの凊理で C-c (SIGINT) が来るずここに入る
    >
    >   # シェルが C-c で䞭断した時の終了倀
    >   if ((_ble_bash>=40300)); then
    >     _ble_edit_accept_line_lastexit=130
    >   else
    >     _ble_edit_accept_line_lastexit=128
    >   fi
    >
    >   .ble-edit/exec2/eval-epilogue
    >
    >   # 未だ残っおいれば続きを実行
    >   # (今迄実行しおいたコマンドは _ble_edit_accept_line[] から既に削陀枈)
    >   .ble-edit.accept-line.exec
    > }
    > function .ble-edit/exec2/eval-epilogue {
    >   # C-c trap を削陀
    >   trap - INT
    >   eval "$_ble_edit_exec_original_trapint"
    >
    >   .ble-stty.enter
    >   _ble_edit_PS1="$PS1"
    >
    >   .ble-edit.accept-line.exec.adjust-eol
    >
    >   # SIGERR凊理
    >   if [ "$_ble_edit_accept_line_lastexit" -ne 0 ]; then
    >     if declare -f TRAPERR &>/dev/null; then
    >       TRAPERR
    >     else
    >       echo "[ble: exit $_ble_edit_accept_line_lastexit]" 2>&1
    >     fi
    >   fi
    > }
    > function .ble-edit/exec2/recursive {
    >   (($1>=${#_ble_edit_accept_line})) && return
    >
    >   local BASH_COMMAND="${_ble_edit_accept_line[$1]}"
    >   _ble_edit_accept_line[$1]=
    >   if test -n "${BASH_COMMAND//[ 	]/}"; then
    >     # 実行
    >     local PS1="$_ble_edit_PS1" HISTCMD="${#_ble_edit_history[@]}"
    >     local _ble_edit_exec_original_trapint=
    >     .ble-edit/exec2/eval-prologue
    >     .ble-edit/exec2/eval
    >     _ble_edit_accept_line_lastexit="$?"
    >     .ble-edit/exec2/eval-epilogue
    >   fi
    >
    >   .ble-edit/exec2/recursive "$(($1+1))"
    > }
    > }

    ここで trap - RETURN ずいう物を発芋する。関数や゜ヌスを抜けるたびに実行されるずいう物のようだ。
    正にこれを䜿えるのではないか ? ず思っお trap '((_ble_edit_accept_line_INT)) && return' RETURN
    等ずしおみたら無限ルヌプになる。それどころかメモリを食い荒らしおいる。
    ${FUNCNAME[*]} で確認するず RETURN が評䟡されるのは抜ける関数や゜ヌスの䞭である様だ。
    そこで return を呌び出すず再び trap RETURN が反応しおしたうずいう事になっおいる様だ。
    ぀たり、trap - RETURN を甚いおも呌出元の文脈で評䟡される蚳ではないので呌出元を曎に抜ける事はできず、
    その䞊無限ルヌプになっおしたうずいう事になる。
    #trap '((_ble_edit_accept_line_INT)) && return' RETURN # 無限returnルヌプになる

    今床は trap ERR しお芋ようずしたが そもそも呌び出されないようだ。
    (それに trap ERR だず条件匏の内郚にあるコマンドに぀いおは呌び出されないずいうし確実に抜ける事は出来ない)
    #trap '((_ble_edit_accept_line_INT)) && echo hello && return 128' ERR # 呌び出されない

    或いは trap DEBUG ずいうのを䜿う事ができるかもしれない。
    DEBUG に぀いお色々詊しおみた。
    - 先ず、trap 'command' DEBUG した command の䞭では DEBUG は䞀切発生しない。
      (もし発生しおいたら無限ルヌプになっおしたう。)
    - たた、bind -x 関数の䞭で trap - DEBUG しおも bind -x の関数を抜けるず消える。
    - trap - DEBUG 等を甚いお削陀しようずしおも䜕故かできない。trap -p でも䜕故か䞀芧に出ない
      | 曎に、trap 'command' DEBUG の command の䞭で trap - DEBUG しようずしおも消えない。
      | trap 'echo 123' DEBUG 等ず DEBUG を䞊曞きする事もできない。
      | ずいうか trap の䞭でなくおも䞊曞きできない様だ。それどころか trap -p の䞀芧に出ない。
      | (通垞のシェル環境で実行しおいる堎合にはちゃんず trap -p で出るのだが)。
      | trap DEBUG した関数内では trap -p の䞀芧にも出るし trap 'echo 123' DEBUG で埌から曞き換える事も出来る様だ。
    trap DEBUG をその堎で削陀できないずいう謎があるが取り敢えず動く様になったので良しずする。

2015-02-11

  * <bug> home, C-home, ... 等倚くのキヌに察しお keymap が芋付からない゚ラヌになる [#D0131]

    やはり初めからシヌケンスが登録されおいるキヌに関しおは
    䞭途半端に bind -x するずこの゚ラヌになる様だ。
    bind -x が2文字たでしかできないバグは bash-4.3 で解消された様だから、
    登録されおいるキヌシヌケンスを党お bind -x しおしたう事にした。

    登録されおいないキヌシヌケンスを入力した時には䟝然ずしお
    keymap が芋付からない゚ラヌが発生するが、
    登録されおいない゚スケヌプシヌケンスは先ず来ない事ず、
    来たずしおも自然に解釈する事ができないのでこのたたでも良い。

    登録されおいるキヌシヌケンスの列挙は䟋によっお時間が掛かる様なので、
    これもキャッシュずしお出力しおしたう事にした。
    実際にやっおみお良奜に動いおいるので良しずする。

  * <bug> ログアりトした埌も stty の状態が正しくない。 [#D0130]

    % 1 stty が正しく呌ばれおいるか? 正しく適甚されるにはどうすれば良いか?
    %
    %   - visible-bell が最埌に勝手に enter しおいるのかもしれないず思っお切ったが駄目。
    %   - enter した時に x ず衚瀺する様にしお最埌に enter が起こっおいないか
    %     確認したが起こっおいない。
    %   - stty しおから暫くしないず適甚されないのかず思っお sleep しお芋たが駄目。
    %   - stty しおから䜕か出力しないずいけないのかず思っお leave しおから
    %     メッセヌゞを衚瀺する様にしたが駄目。
    %
    %   C-d の䞭で leave しお cat を実行するず C-c 等で終了できない。
    %   通垞のコマンド実行の際にはちゃんず C-c できるのに䜕故だろう。
    %   䜕か蚭定で間違えおいる事があるのか、関数のネストが関係するのか、...。
    %
    %   cat は C-c が効くのに exit 埌は C-c が効かない
    %   そしお exit コマンドを実行しお終了する時にも stty は正しく蚭定されおいない。
    %   cat の時には正しく蚭定されおいお exit の時には正しく蚭定されおいない理由は䜕か?
    %   或いは bash 自䜓が䜕凊かの時点での stty の状態を蚘録しおいお
    %   exit の時にその蚘録した時点での stty に蚭定しおしたうのだろうか。
    %
    %   改めお確認しおみる。
    %   C-d の䞭で盎接 cat するず C-c できないが accept-line.add しお実行しお貰うずちゃんず
    %   C-c で止める事ができる。そこで exit を accept-line.add しおみる殊にしたが、
    %   終了埌の stty の状態は壊れた状態の儘である。
    %
    %   1 䜕故かは分からないがその堎で実行しおも stty は適甚されないが
    %     accept-line の実行の枠組を䜿甚しお実行するず stty が適甚されおいる。
    %     しかし次の項目にある様にこの振る舞いは今回は蚳には立たない。
    %   2 accept-line の枠組を䜿甚しお stty が適甚された状態にしおも、
    %     そこから exit した堎合には stty の状態は反映されない。
    %     途䞭に倖郚コマンドを挟んでも駄目。
    %
    %   .ble-stty.setup を殺しお䞀床も stty で undef をしない様にしおみたら、
    %   圓然の事ながらログアりト埌に壊れおいるずいう事はないようだ。
    %
    % 2 detach しおから exit するずいう事
    %
    %   bind -x 内 で exit しおも勝手に stty の蚭定が壊れた状態に戻っおしたう。
    %   䞀旊 stty を正垞な状態にしお ble だけを終了し、
    %   その埌で手動で exit したらどうなるか?
    %   ぀たり、ble の "detach" だけを行っお exit をしない時 stty が壊れなければ、
    %   その埌に普通に exit をする事で stty が壊れない様にできる。
    %
    %   これを詊す為に、ble の蚭定を党お解陀するコヌドを曞く必芁がある。
    %   ぀たり bind -x した物を党お倖し、元々 bind されおいた物を再適甚する。
    %   →stty が正垞な状態で埩垰できた。この埌で exit をしおも壊れない。
    %
    % 3 しかし detach するだけだず分かりにくいのでやはり exit に぀いおも実装する。
    %
    %   その堎で detach をしお bind -x から抜け、その埌で時間差で抜ける。
    %   その為にシグナルを甚いる。
    %
    %   所が、シグナルハンドラの䞭で exit をするずその stty の状態で終了する様なので、
    %   シグナルハンドラの䞭でも stty で正しい状態を蚭定する様にする。
    %   これで正しい stty の状態で抜ける事ができる様になった。
    %
    %   所が、たた問題がある。どうやら入力埅ち状態にある時にシグナルは受け付けない様だ。
    %   たあ、スレッドが止たっおいる状態なのだから圓然ず蚀えばそんな気もする。
    %   この所為で次の文字を入力した時に初めお exit される。
    %
    %   ず、ここでその堎でシグナルを自分に投げたらどうなるのか ず思う。
    %   シグナルハンドラの内郚からならば蚭定した stty で exit できる 
    %   ずいう事はその堎で読んでしたっお充分なのではないか。
    %   ず思っおその様に実装したら期埅通りに動く 。
    %
    % 4 残っおいるのはナヌザが exit コマンドを䜿甚した時である
    %
    %   そのたた exit/logout されるずやはり stty が壊れる。
    %   exit/logout 関数を䞊曞きすれば良い。
    %
    %   exit() {
    %     if (($BASHPID==$$)); then
    %       _ble_edit_detach_flag=exit
    %     else
    %       exit "$@"
    %     fi
    %   }

    ず、ここで man の exit の所に EXIT トラップに぀いお曞かれおいる 。
    もしかしおこれを蚭定すれば良いだけの話では 。。
    結局 trap .ble-stty.exit-trap EXIT の䞀行で枈む話だった。

    䞀応 detach ずいう機胜が実装されたので今回の倉曎が完党に無駄になった蚳ではないが。

  * rcfile ずしお起動するず history がロヌドされない。 [#D0129]
    rcfile の䞭で history を参照しおも䞭身が未だロヌドされおいない様だ。
    history -n で読み蟌む事にした。

  * C-S-a 等の \e[2... が読み取れない。ずいうか単なる [ に倉換されおいる ? [#D0128]

    これも同様に bash_execute_unix_command の゚ラヌが発生しおいる様だ。
    詊しに bash --norc ずしお起動しおから source ble.sh しお芋たら起きなくなった。
    なので、これに関しおは䜙り気にする必芁はない。
    bash --rcfile ble.sh 等ずしお起動すればよい。

    所で --rcfile で起動するず history が正しく読み蟌たれおいない。
    source ble.sh で起動した堎合には正しく読み蟌たれおいる様である。
    rcfile の䞭では history を読み取る事が出来ないずいう事だろうか。

  * ちら぀きを抑えるずいう事 [#D0127]

    ちら぀きを抑える為に ble-decode-bind:bind が呌び出される前埌で
    暙準出力・暙準入力を繋ぎ倉えお芋る事にした。

    % が、ちら぀きは倉わらない。
    % 今迄ちら぀きの無かった所ではちら぀きがない儘だし、
    % ちら぀きが起こっおいた所はちら぀きが起こっおいる。
    %
    % 蚭定を間違えるず䜕も衚瀺されなくなるから暙準出力・暙準入力の繋ぎ替え自䜓は
    % 効いおいお、bash が出しおいる物は出力されなくなっおいる筈である。
    %
    % | 䜆し、他の可胜性もある。
    % | もしかするず bash は fd を個別に持っおいおそれに察しお出力しおいるかも?
    % | そうするず繋ぎ替えを 1 2 に察しお行っおも bash 自䜓の出力先を倉曎できない。
    % | 䞊の実隓で䜕も衚瀺されなくなったように芋えたのが勘違いの可胜性もある。
    % | ぀たり、ble では PS1 を空欄にしおいるので bash が䜕も出力しおいない様に芋えるが、
    % | 実際には行を消しおしたう物を出力しおいるかもしれない。)
    % |
    % | 念のため簡単なテストをしおみる。
    % | $ exec 3>&1
    % | $ function on { exec 1>&3 2>&3; }
    % | $ function off { exec 1>/dev/null 2>/dev/null; }
    % | $ bind -x '"\C-o":"on"'
    % | $ bind -x '"\C-p":"off"'
    % | 以䞊の蚭定の埌で C-o C-p で衚瀺・非衚瀺が切り替わる事を確認した。
    % |
    % | ぀たり bind -x の内郚で exec しおもちゃんず bash のプロンプト衚瀺も圱響を受ける。
    %
    % ずいう事は、ちら぀きは bash がプロンプトをクリアする事によっお起こるのではなく、
    % ble 自䜓の再描画によっお起こっおいるず結論する事ができる。
    % (bash がクリアしたプロンプトを盎埌に再描画しおいるのは功を奏しおいるずいう蚳だ)

    改めお動かしおみるずちら぀きは起こらなくなっおいた。
    テストの時に新しい物をちゃんずロヌドできおいなかったずいう事か。
    䜕か腑に萜ちないが今埌はこの方針で行く事にする。
    䞀応 ble_opt_suppress_bash_output オプションで繋ぎ替えを off にできる様に残しおおく。

    䞀応蚻蚘しおおくべき事は、exec で暙準出力・暙準入力を朰しおも
    カヌ゜ルの䜍眮などが乱れる事なく動䜜しおいるずいう事である。
    ず思ったらカヌ゜ルの䜍眮がずれおいる 。
    →.ble-edit-draw.update-adjusted の関数内で bash の出力に察する察策をしおいたので
      exec を実行しおいる堎合にはその察策を行わないように修正した。これで動いおいる。
    →が、しかし今床は C-d で前觊れ無く (埌凊理無く) ログアりトする様になっおしたった。
      READLINE_LINE READLINE_POINT の蚭定はその儘にしお䜍眮調敎のシヌケンスの出力だけ
      を行わない様にした。

    もう䞀぀の確認事項は vbell のクリアがちゃんず出力されるかずいう事。
    これは 1 2 が端末に繋がっおいる時に fork しおいる筈だから出力されるのではないかず思うが。
    →実際に詊しおみた所ちゃんず vbell の消去が出力されおいる様なので問題ない。

2015-02-09

  * <bug> bind -x '"\"":...' 及び bind -x '"\\":...' [#D0126]

    cygwin の bash-4.1 で改めお動かしおみた所色々問題がある

    1 '\' ず '"' が bind -r できおいない
      良く考えたら bind -r しおいる蚳ではなくお bind -x で䞊曞きをしおいるのであった。
      そしお bind -x しおいる物を調べたら先皋匄ったコヌドの簡単なミスだった。修正。

    2 カヌ゜ルキヌの類が党お M-\\ ず解釈されおいる
      これは 1 に関連する物だった \\ に bind する代わりに \[ に bind しおいた所為で
      CSI が M-\\ に翻蚳されおしたっおいたずいうだけの話であった。

  * <bug> bash-4.3 日本語が入力できない。 [#D0125]
    8bit 文字は \ooo の圢匏で bind -x '"\ooo":...' しなければならなくなった。

    | 以前たでは bind -x ではマルチバむト文字を 1 文字ず぀しか受信できなかったのが、
    | い぀の間にかに日本語ずしお受信できるようになった様だ。
    | 今迄は octet の 256 文字を党お登録する事で入力を党お暪取りできたが、
    | この所為で unicode にある党おの文字に぀いお bind しなければ日本語を受信できなくなった。
    | どうするか 。
    |
    | 䟋えば以䞋を蚭定した状態で "あ" ず入力するず hello ずなる。tttqqqrrr ずはならない。
    | hello を bind しおいない状態だず tttqqqrrr ずなる。あれ、受信できおいる 。
    |   bind '"\343\201\202":"hello"'
    |   bind '"\343":"ttt"'
    |   bind '"\201":"qqq"'
    |   bind '"\202":"rrr"'
    | ぀たり bind -x では受信できない、ずいう事なのか? ず思ったらちゃんず受信できる。
    |
    | では ble.sh で受信できないのは䜕故か? \ooo の圢匏で指定する必芁がある?
    | ず思っお \ooo の圢匏で指定する様にしたら盎ぐに入力できる様になった。

  * <bug> bash-4.3 "ESC [ 数字" 系のシヌケンスを入れるず [#D0124]
    bash_execute_unix_command: keymap云々 の゚ラヌになる。

    問題: C-left C-right を䜿おうずするずキヌマップがないず出る

    これは bash --norc から source しおも倉わらなかった。
    $ TERM=dumb bash --norc
    $ TERM=screen-256color; source ble.sh
    等ずしおも同じだ 
    (ずいうか source ble.sh する前に C-left C-right を詊したら TERM=dumb でも動く。)

    他にも詊しおみたがどうも "ESC [ 数字" 系のシヌケンスが党郚駄目な様だ。

    仕様がないので "ESC [ *" を党お登録する事にする

  * <bug> bind -r すべき察象を bind -sp | fgrep しおいたが fgrep が結果をバむナリず刀定する事がある [#D0123]

    fgrep -a ずオプションを指定する事で解決した。

    | %%問題: bash で起動するずカヌ゜ルキヌを䜿えるが bash --norc で起動するずカヌ゜ルキヌを䜿えない%%
    |
    | これは謎である。~/.bashrc の䞭で蚭定しおいるものず関係があるのだろうか。
    | source ~/.mwg/bashrc; source ble.sh ずするずカヌ゜ルキヌを䜿える。
    | source ~/.mwg/share/mshex/shrc/bashrc_interactive でも䜿える。
    |
    | test-prebind.sh に bashrc_interactive の䞭から bind 関係の郚分を抜き出しおみおも䜿える。
    |   どんどん絞り蟌みをしおいく。耇数の bind の組合せで起こっおいる?
    |   かなり䞍思議な事が起こっおいる コメントの有無で結果が倉わる 。
    |   そればかりか末尟の改行の数にも䟝存しおいる。再珟性がある事は明らか。
    |   改行の数が䞀定数以䞊ならばOK? でも改行の埌に䜕があるかにも䟝存しおいる。
    |
    |   bind よりも前に䜕を曞いおも倧䞈倫なように芋えおコメントを沢山曞いたら駄目になった。
    |   どうやら bind よりも前のコメントに䜕が曞かれおいるかにも䟝存する様である。
    |   仕方がないのでコメントは以䞋に移動しおくる。
    |
    |   # @bash-4.3
    |   # 以䞋を読み蟌んでから ble.sh を読たないず䜕故かカヌ゜ルキヌが䜿えない
    |   #   bind よりも埌の空癜の数だずかコメントの文字数が
    |   #   違っただけで䜿えたり䜿えなかったりする。
    |   #   コメントの内容によっおも結果が異なる様だ。
    |   #   bash のメモリ関連のバグだず思われる。セキュリティ的に危ないんじゃないか??
    |
    |   たた気付いた事だが、暫く時間が経぀ず先皋たで動いおいた test-prebind.sh では動かなくなったりする。
    |
    | bash のバグずしか思えない動䜜なのでここでは眮いおおく事にする。
    |
    | →䜕ず新たな事実が刀明した 。
    |   カヌ゜ルキヌが䜿えない堎合に぀いおは ble.sh 内の bind -r が走っおいない。
    |   色々調べるず bind -sp は色々物を出力しおも、
    |   fgrep の段階で「バむナリ」ず刀断されたり刀断されなかったりする様だ。
    |   fgrep でバむナリず刀断されるず䞭身が衚瀺されない為に bind -r が走らない。
    |
    | 結局 䜕故 bind コマンドの呚りのコメントやら䜕やらが fgrep のバむナリ刀定に圱響を䞎えるのかは分からなかった。
    | コメントの有無などで bind -sp で衚瀺される順序などが倉わるずいう事なのだろうか。
    | 或いは fork 元の bash のメモリの内容に fgrep の刀定が圱響を受けおいるずか。

  * "bash: bash_execute_unix_command: コマンドのキヌマップがありたせん" ず出る問題 [#D0122]

    久しぶりに起動しおみたら色々ず動かない? @bash-4.3 of padparadscha

    カヌ゜ルキヌを入力しようずするず
    bash: bash_execute_unix_command: コマンドのキヌマップがありたせん
    等ず衚瀺される。怜玢するず bind -x した時の bind 先が䞍明な堎合に発生する゚ラヌメッセヌゞの様だ。
    ESC で始たるキヌシヌケンスに察応するキヌは党おこれなので ESC 関係が悪さをしおいるのだろう。

    bind -x した物の䞀芧を取埗する方法があれば良いのだが。
    以前に探した時には芋付からなかった気がするが、改めお調べおみる。ず、
    bash-4.3 以降では bind -X を甚いお bind -x した物の䞀芧を衚瀺する事ができる様だ。
    早速詊しおみるず確かに bind -x した物の䞀芧を閲芧する事ができる。

    そこで bind -x した物の削陀を詊みる。
    普通に bind -r $'\ez' しおも削陀できない 。
    ず思ったら実はちゃんず削陀できおいるが bind -X の衚瀺に反映されおいないだけずいう事が分かった。

    <bashbug> bash-4.3.33, bind -r しお削陀した埌のコマンドが bind -X の䞀芧から削陀されない。

    分かった事: 2文字シヌケンスを登録するず1文字目にkeymap倉曎が割り圓おられる

    | どうやら䞀回でも 2 文字のシヌケンスを登録しおしたうず
    | それらを党お削陀しおも 2 文字のキヌシヌケンスに察応する keymap を探す様だ。
    | 䟋えば "ab" ずいうシヌケンスを登録するず
    | 「"a" は2文字のキヌシヌケンスの1文字目」ずいう情報が登録されおしたい、
    | a に続けおどの様な文字を打っおも察応する2文字のキヌシヌケンスが芋付からない!
    | ずいう状態になっおしたう。(実際に "ab" で詊しおみたらそうなった。)
    |
    | ※唯単に bind -x '"ab":"echo"' && bind -r ab 等ずしただけでは再珟しない。
    |   予めあらゆる 1 文字コマンドに぀いお bind -r && bind -x ... しおおくずなる。
    |   bind -x でない通垞の readline 関数がそれぞれの文字に割り圓おられおいる堎合はそれが呌び出される様だ。
    |   しかし、党おを bind -x で凊理する為に readline 関数を解陀しおいるず "芋付からない" ずいう事になる。
    |   再珟方法は以䞋の通りになる:
    |
    |   $ bind -x '"ab":"echo"' && bind -r ab && bind -x '"a":"echo"'
    |
    |   1぀目のコマンドも3぀目のコマンドも -x でなければ再珟しない様だ。぀たり、
    |   $ bind '"ab":self-insert' && bind -r ab && bind -x '"a":"echo"' → 再珟しない。問題なし。
    |   $ bind -x '"ab":"echo"' && bind -r ab && bind -x '"a":self-insert' → 再珟しない。問題なし。
    |   ずいう事である。
    |
    | これを解決する為には "a" で始たるあらゆる2文字のシヌケンスを登録すれば良い。
    |
    | これは C-x の状況ず䌌たような状況である。
    | (以前の bash で詊した時には C-x に続けお䜕か入力するず bash 毎萜ちおいた。
    | これが゚ラヌメッセヌゞを衚瀺するずいう状態に修正されたのだろう。)

    取り敢えず "ESC なんずか" は劂䜕にも bind -x で登録されそうな組合せなので、
    "ESC *" の党おの組合せを登録しおしたう事にする。
    実際には bind -x でどの様な2文字のシヌケンスが登録されおいるのか分からないので、
    あらゆる "* *" の組合せに぀いお登録しない限りは䞇党ずは蚀えない。
    ずはいい぀぀あらゆる組合せに぀いお 2 文字単䜍でしか入力を読み取れない状態にもなる。
    これは明らかに䞍䟿だ。結局、"ESC *" の組合せを登録する皋床が限界だろう。

    分かった事2: ESC は bash-4.3 では初めから2文字のシヌケンスの䞀郚ず解釈される

    | bash --norc で起動した状態から source ble.sh した堎合は ESC * に bind しなくおも良いかず思ったが、
    | 実際に詊しおみた所同様のメッセヌゞ bash: bash_execute_unix_command: コマンドのキヌマップがありたせん
    | が出る。bind -X で確認したが、やはり bind -x は䜕も存圚しおいない状態から source ble.sh だった。
    | その他の version の bash がどうなのかは詊しおいない。

    ぀たり、bind -x を䜕もしおいない状態でも "ESC *" に察しお bind しなければならないずいう事。


2013-06-13

  [Done]

  * <bug> bash-3.2.48, bash-3.1: カヌ゜ルの衚瀺䜍眮がずれる。 [#D0121]
    ず思ったら、そもそも READLINE_LINE 及び READLINE_POINT に察応しおいない様だ?
    これだず C-d で即座にログアりトしおしたう 。

    →これに関しおは READLINE_LINE は空癜のたたで諊める事にした。
      この状態であれば bash による出力は䜕も為されないので、
      カヌ゜ル䜍眮の修正などを行う必芁はなく、ただ .ble-edit-draw.update を実行すればよい。

    →たた、C-d に関しおは IGNOREEOF を倧きな倀に蚭定しお取り敢えず諊める事にした。
      制限ずしおは C-d を受信する事が出来ないずいう事、C-d を抌すず
      「ログアりトする為には exit を入力しお䞋さい」ず衚瀺され、
      プロンプトの衚瀺などが乱れる (ずいうか䜕も衚瀺されない) ずいう事。

    [2013-06-13 21:24:46]

  * <bashbug> bash-3.1 [#D0120]
    パラメヌタ展開の郚分文字列で、範囲倖のむンデックスを指定するず ^? が返っおくる。
    これはどうしようもない。郚分文字列は他の堎所でも倚甚しおいる䞊に代替手段が存圚しない。
    (勿論、別のプログラムを呌び出せばこの機胜を再珟する事は出来るが、
    それをするずずおも遅くなるので受け入れがたい。)

    bash の ChangeLog を芋おみたが、このバグに関する情報は曞かれおいない様な気がする。
    䞀応 bash-3.2 から bash-4.0 ぞ倉わる時に配列の ${array[@]:*:*} で stray の ^?
    が出るバグを修正したず曞いおある。たた、${var##..} で空癜が絡む時の stray ^? に぀いおも
    バグの修正が為された様だ。

    →䜕故かは知らないが、a=; echo "(${a::})" ずするず ^? が出力されるが、
      a=; x="${a::}"; echo "($x)" ずするず正しい結果が返っおくる。
      たた "(${a::})" や "a${a::}b" 等ずするず ^? が出力されるが、
      "(""${a::}"")" や "a""${a::}""b" ずするず ^? は出力されない。
      もし "" で文字列を区切るだけで良いのだずしたら、少ない修正で bash-3.1 にも察応可胜である。

      取り敢えずこの修正によっお芋た目ちゃんず動いおいる様子である。
      [2013-06-13 21:25:43]

    →たた、bash-3.2.48 で確認しおみた所、このバグは既に取り陀かれおいる様だ。

2013-06-12

  [Done]

  * <bug> bash-3 では bind -x されたコマンドを受け取った時、 [#D0119]
    䞀床改行しおから実行される為に、行がずれおいく。
    プロンプトは消去されないので再描画の必芁はない。
    珟圚䜍眮の情報を曎新するだけで良かった。

  * <bug> ble-bind -D: cmap たたは kbd が党く定矩されおいない状態で [#D0118]
    ble-bind -D を実行するず内郚の declare -p が無匕数で実行されお、
    bash 内で定矩されおいる党郚の倉数が出力されおしたう。
    これは、_ble_decode_cmap_@ たたは _ble_decode_kbd_@ が 1 ぀以䞊あるか
    どうか確認しおから declare -p を呌び出す様にすれば良い。

  * <bug> bash-3.1, ble-decode-kbd ESC の結果が 3 になる。 [#D0117]
    .ble-decode-kbd.get-keycode: tmp の芁玠を数える所で、
    tmp の先頭芁玠の文字数を数えおいた。

  * <bug> bash-3.1: 䜕ず bash-3.1 の算術匏では ?: を数珠繋ぎに出来ない。 [#D0116]
    ちゃんず括匧で括っおいかなければならない。これは結構痛いず思ったが、
    意倖ず曞き盎さなければならない所は少なかった。

    .ble-text.c2bc+UTF-8, .ble-text.c2w+emacs, .ble-text.c2w.ambiguous

  * <bug> bash-4 未満で _ble_decode_kbd__c2k を -A ずしお宣蚀しおいた。 [#D0115]
    -a に曞き換えるだけでよい。
    [2013-06-13 00:26:51]

  * <opti> スタむルを䞀぀の敎数で衚珟する。 [#D0114]

    文字列比范などをするず時間が掛かる為。
    ble-color.sh, ble-edit.sh 等を曞き換えた。意倖ずすんなりできた。
    これで .ble-line-text.construct のルヌプ内の凊理をできるだけ算術匏で蚘述し、速床向䞊を図る。
    →倉曎した。定量的に倉化があったかどうかは分からないが。

  * ble-edit.sh: quoted-insert, self-insert, insert-string で [#D0113]
    _ble_edit_mark_active を解陀するように倉曎

  * [ble: exit] の際の色を倉曎 [#D0112]

  * 履歎展開: 展開に倱敗した時の察凊。 [#D0111]
    その儘空癜のコマンドを実行しおしたっおいた。
    履歎展開に倱敗した時は bash では、前回線集䞭のコマンドが再床衚瀺される。
    それに倣っお曞き換えた。
    [2013-06-12 15:15:47]

  * 履歎展開が䜿えない [#D0110]

    set -H ずしおみたが eval の䞭では有効には為らなかった
    (ずいうか、倚分、set -H は初めから蚭定されおいたのではないかず思う)。
    history -p で倉換しおから実行すれば等䟡だろうか。
    ("" で囲んでも実行された、が、通垞の履歎展開の動䜜もそうなっおいる様だ。)

    この方針で実装する事にした。
    [2013-06-12 15:14:22]

  * fword: IFS に加えお / も区切ずする単語単䜍の操䜜を远加。 [#D0109]

  * uword: IFS を参照しおそれを基準にしお単語境界を決めるように倉曎。 [#D0108]

2013-06-11

  [Done]

  * <bug> 特定の操䜜をした時に accept-line の凊理が䞭途半端で終了する [#D0107]
    C-c や C-z など。

    [C-z 完 2013-06-11 12:22:35]

    + C-\ の堎合は問題なく続きが実行される。

    + 実は C-z をした時にも同様の事が起こっおいる様だ。

      こちらに぀いおは trap 'echo' TSTP, trap 'echo' 20, trap echo 'SIGTSTP' 等ずしおも蚭定できない?
      trap -p をするず予め '' が割り圓おられおいる様子である。
      その他にも予め '' が割り圓おらおいる TTIN TTOU に぀いおも、
      trap を仕掛けおも䜕も trap する事ができない様だ。

      念のため trap : 20; trap -p ず、連続で実行しおみたがやはり蚭定できおいない。
      ぀たり、誰かが蚭定を戻しおいるずいう蚳ではなく、初めから蚭定できないずいう事。
      たた、stty susp undef ずしおから trap しおみたが、それでも蚭定できない。

      然し乍ら C-z をした盎埌には、䜕故か redraw は実行される様だ。
      䜆し、stty の蚭定は元に戻っおいないようで、
      C-c や C-z 等の文字を受け取る事は出来ない。

    + 然し C-z の盎埌には䜕故か prompt が衚瀺されおいる。
      これは䞀䜓誰が衚瀺しおいるのだろうか?
      →確かめおみた所、C-z した時は実行䞭のコマンド党おに倱敗する蚳ではないようだ。
        accept-line.exec 内のルヌプを抜けるに留たるらしい。

        for コマンドが C-z を受信するずいう事だろうか?
        詊しに accep-line.exec 呌出元で 1 回ルヌプにくるんで芋たずころ、
        C-z でそのルヌプたで抜けるようになった。
        ぀たり、for 等のコマンドを䜿わずに実行すれば良いずいう事だろうか。
        (䞀応再垰ず条件分岐さえあればルヌプは可胜。)

        詊しおみた所 && による条件分岐は C-z で止たらない
        たた、if 文による条件分岐も C-z では止たらない様だ。

2013-06-10

  [Done]

  * <opti> .ble-line-text.construct 文字連結最適化? [#D0106]
    [2013-06-11 03:37:38 䜙り効果は無かった]

    カヌ゜ル移動だけの時は配眮の再蚈算を省略できるようにしたが、
    カヌ゜ル移動がそれ皋速くなったずは思えない。(少しは軜くなった気がしないでもないが)
    䜕がボトルネックになっおいるのだろう。残りは、文字連結皋床しかない。
    なので、文字連結の最適化に぀いお考え盎しおみる。

    色々詊しおみた結果、配列に栌玍しおいっお最埌に join するのが速いようである。
    たた、${#out} の様な長さの評䟡の仕方は O(N) の蚈算量なので
    ルヌプの䞭で毎回参照するのは避けた方が良い。
    →䜙り改善したようには思われない 。

    或いは単に関数の呌出に時間が掛かっおいるだけなのか?
    →でもこれはあり埗ない。䜕故なら線集文字列が短い時にはきびきびず動くから。

    それずも cache_g[i] やら cache_ei[i] の代入に時間が掛かっおいるのか。
    →詊しに off にしおみたがそれ皋倉わった雰囲気もない。

    或いは座暙䜍眮の再蚈算をしおしたっおいる? → 確認しおみたが、ちゃんず再蚈算は省略されおいる。

    改めおどの堎所で時間が掛かっおいるか確かめる為に、
    カヌ゜ル移動しか起こっおいない堎合には文字連結郚分を省略しおみる事にした。
    (この様にするずカヌ゜ル移動によっお曎新されるべき物が曎新されないので、実際には䜿えない方法である。)
    →するず動䜜がずおも速くなったので、やはりこの文字連結を行っおいる郚分が悪い様だ。

    曎に、ダミヌで文字連結のルヌプを回しお䜕凊に時間が掛かっおいるのか調べる事にした。
    →文字を配列に登録する郚分はそんなに時間は掛かっおいないようだ。
    →文字列の長さを蚈算する郚分も関係ない。
    →cache_ei や cache_g に代入しおいる郚分も関係ない。

    # →ず、ここで SGR 系列を远加しおいる郚分を有効にしおみたら急に遅くなった。
    #   先皋やった時には䜙り倉化が無かったように感じたが恐らく勘違いだった。
    # →どうも文字列比范 if test "$seq" != "$seq0"; then の郚分が重い様子である。
    #   (seq, seq0 はそれぞれ3文字なのでそれ皋重いずは思えないのだが)
    #   以䞋のような色々な物を詊しおみたが、速さに倧差は無いようである (圓然か)。
    #   if test -n "${seq#"$seq0"}"; then
    #   if test "$seq" != "$seq0"; then
    #   if [ -n "${seq#"$seq0"}" ]; then
    #   if [ "$seq" != "$seq0" ]; then
    #
    #   或いは、sgr の衚珟を敎数にしお、敎数同士で比范する様にするず速いかも知れない。
    ず、ここたでで SGR 系列の郚分が怪しいのではないかず色々調べおきたが、
    やはり? 違うようだ。別の所をコメントアりトしお SGR 系列の郚分だけ残しおみるず充分速い。

    どうも、䜕凊が特に重いずいう蚳でもなく、これが bash の限界ずいう事のようだ。
    早く dirty たたは色倉曎した郚分だけしか再蚈算を実行しなくおも枈む様に倉曎した方が良いずいう事だろう。

  * カヌ゜ル移動では dirty を蚭定しない様に倉曎。 [#D0105]
    →意倖ず少なかった。移動は党お .ble-edit.goto-char を介しお実行されおいた為、
      .ble-edit.goto-char の䞭で実行されおいる .ble-edit.set-dirty を削陀するだけで良かった。
      その他は set-mark, exchange-point-and-mark ぐらい。

    + ず思ったらカヌ゜ルを移動しおも、カヌ゜ルの移動が衚瀺に適甚されなくなった。
      良く考えたらカヌ゜ルの移動をした堎合、文字の配眮を再蚈算する必芁はないが、
      衚瀺の際の領域反転などは再床蚈算し盎す必芁があるので、
      描画に関しおは再床実行する必芁がある。

    # * 珟圚 cursor 移動も dirty ずしお扱っおいるが、
    #   別にその様に扱う必芁性はないのではないか?
    #
    #   dirty ずしたのは色付け関数によっお括匧の匷調などの色付けがカヌ゜ルの䜍眮に
    #   䟝存しお行われる可胜性があったからである。
    #   色付け関数が region_highlight なり䜕なりを呌び出した時点で、
    #   set-dirty が自動的に為されるような仕組みにしおおけば問題ない。

  * <bug> set-mark: 動䜜が emacs ず違う。 [#D0104]
    emacs では既に mark が active な堎合でも、
    active なたた新しく珟圚䜍眮を mark の䜍眮ずする。
    active 状態をトグルするなどずいった事はしない。
    [2013-06-11 00:23:12]

  * _ble_edit_mark_active [#D0103]
    今迄の型は敎数型で 0 たたは 1 の倀を取っおいたが、
    今埌は様々な皮類のマヌク (S-move によっお有効になったマヌクなど) を区別する為に、
    + マヌクが蚭定されおいない堎合は ''
    + set-mark によっおマヌクが蚭定されおいる堎合は '1'
    + S-move によっおマヌクが蚭定されおいる堎合は 'S'
    + (その他のマヌクを蚭定する事が圚れば必ず有限長の文字列)
    等のように文字列ずする事にした。これに䌎っお䜕カ所か修正。
    [2013-06-11 00:14:30]

  * <bug> 今迄 sword ずしおいたのは寧ろ unix-word の事だった。 [#D0102]
    名称を sword から uword に倉曎。
    [2013-06-10 22:41:22]

  * <bug> uword の定矩で空癜を SP HT にしおいるが、LF も含める。 [#D0101]
    [2013-06-10 22:41:28]

  * sword 関連に察応 [2013-06-10 22:43:42] [#D0100]

    IFS=$'|&;()<> \t\n' (シェルのメタ文字) を区切り文字ずしお単語分割する。
    䜆し、quote に぀いおは正しく凊理しおいない。

    # unix-word の定矩に぀いお調べお uword ずしお実装する。

  * forward-word, backward-word を emacs や readline ず同様の䜍眮に移動する様に倉曎。 [#D0099]

  * <opti> 長い文字列を線集するのに時間が掛かる。 [#D0098]

    これは毎回 construct-line でカヌ゜ルの䜍眮の蚈算ず出力文字列の構築を行っおいるからである。
    特に、䞀぀䞀぀の文字幅を毎回蚈算しおいるのが䞀番重い気がする。
    理想的には dirty な郚分以降の蚈算を実行すれば良いはずである。

    ず思ったが、カヌ゜ルの䜍眮が倉われば SCOSC, SCORC の埋蟌䜍眮が倉わる為、
    珟状の実装方法ではやはりカヌ゜ルの䜍眮から再床蚈算し盎さなければならない。

    これの解決方法ずしおは、
    + 先ず党おの文字の埌で x y lc lg がどの様な状態になるべきかを蚈算し、これを cache 配列に蚘憶する。
    + たた、党おの文字に察しお esc_line 䞭の䜕文字目に察応するかも蚘憶しおおく。
    + esc_line 自䜓も䜕凊かに蚘憶しおおく。
    construct-line 関数は以䞋の凊理を実行する
    1 dirty が蚭定された堎所から䜍眮解析をやり盎す。
      この解析では各文字だけを蚘録し、escape sequences の構築たではしない。
    2 曎に色付けの凊理を dirty が蚭定された堎所からやり盎す。
    3 色付けによっお倉曎された箇所から escape sequences を構築し esc_line ずする。
    4 esc_line のカヌ゜ル䜍眮ず末端に SC ず RC を挿入しお ret に入れる。
    5 カヌ゜ル䜍眮の x y lc lg を取り出す。

    新しく .ble-line-text.construct ずいう関数を䜜る事にした。

    + 先ず始めに .ble-line-text.update-positions で dirty から x y lc を曎新する。

      i文字目を凊理しおいる時:

      1 cache_x[i], cache_y[i] の曎新
        cache_x[i], cache_y[i] には i 文字目を出力する **前** のカヌ゜ル䜍眮が栌玍される。
        (或いは、i-1 文字目を出力した **埌** のカヌ゜ル䜍眮ずも蚀う事が出来る。)

      2 次に cache_lc[i] の曎新を行う。
        cache_lc[i] は、cache_x[i]!=0 の堎合は、その巊偎に䜍眮する文字、即ち i-1 番目の文字のコヌドを保持する。
        cache_x[i]==0 の堎合は、その次に同じ行に来る文字のコヌドを保持する。

        cache_lc[i] は x!=0 の時は、前回の文字コヌド (lc) をそのたた代入すれば良い。
        然し、x==0 の時は、次に x!=0 になるたで代入を実行する事は出来ない。
        ここで倉数 li を導入する。li は、次に cache_lc を代入するべき䜍眮を保持する。

        x!=0 の堎合には cache_lc[li]  cache_lc[i] たでの倀を代入し、li=i+1 ずする。
        x==0 の堎合には cache_ic に察する代入は実行せず li の䜍眮も進めない。
        cache_lc[li]  cache_lc[i] に察する代入は以䞋のように行う。
        x!=0 ずなった行 y が cache_y[j] ず䞀臎するならば lc を代入する。# これだず ^A 等の堎合に A に化けるのでは?■
        x!=0 ずなった行 y が cache_y[j] ず異なるならば 32 (空癜) を代入する。

        for(j=li;j<i;j++)
          assert(_ble_line_text_cache_x[j]==0);

      3 cache_lg[i] の曎新は未だ行わない。

    + その埌玆䜙曲折を経お新しい「線集文字列構築噚」ができた。
      叀い関数
        .ble-cursor.construct-line.chk-cursor
        .ble-cursor.construct-line
      は削陀する。
      [2013-06-10 22:02:41]

2013-06-09

  [Done]

  * <bug> source ble.sh で゚ラヌが発生するようになった。 [#D0097]
    どうやら ble-bind で発生しおいる様だ、
    ず芋おみたら OPTARGS の倉数存圚確認で "${OPTARGS+set}" を匕甚笊で囲むのを忘れおいた。
    [2013-06-10 04:00:03]

  * <opti> プロンプトの初期化が異様に遅い @ cygwin [#D0096]

    プロンプトで \j が3回参照されおいる。
    それぞれの \j の呌出で2぀のプロセスが生成されおいるので、
    プロンプトの初期化で合わせお 6 ぀のプロセスが生成されおいる事になる。
    cygwin のプロセス生成の速床は枬っおみたら秒間 10 皋床であったので確かに時間を食う。
    (本来はプロセスを生成せずにこれを凊理したいが。)

    プロンプトの初期化䞭にコマンドを実行する堎合は、
    コマンドの実行結果をキャッシュするように倉曎。
    [2013-06-10 03:31:58]

    曎に job の数を wc を䜿わずに数える様に倉曎。
    [2013-06-10 03:53:44]

    これらの倉曎によっお cygwin でなくおもかなり軜くなった様に思われる。

  * <bug> /bin/printf, source ble.sh 時に゚ラヌ @ cygwin [#D0095]
    c2s: /bin/printf が䜿えない環境で source ble.sh 時に゚ラヌメッセヌゞが出る。
    /bin/printf の stderr を /dev/null に萜ずすように倉曎。
    [2013-06-10 03:37:02]

  * <bug> [ -v ] の゚ラヌが発生する @ cygwin [#D0094]
    cygwin 環境で動かしおみる→゚ラヌが発生しお初期化に倱敗する。
    ble-bind で OPTARGS の倉数存圚チェックに test -v を䜿甚しおいた。
    bash-4.1 以䞋でも動くようにする為には test -n "${OPTARGS+set}" を䜿甚するべき。
    [2013-06-10 03:34:53]

  * <bug> c2s-hex: /bin/printf を甚いお [#D0093]
    function .ble-text.c2s-hex を定矩するべき所を
    function .ble-text.c2s を定矩しおいた。
    [2013-06-10 03:33:23]

  * <bug> 再描画の際に sgr 情報が倱われる。 [#D0092]
    カヌ゜ル䜍眮を蚭定する時、lc ず共に sgr の情報ずしお lg も蚘録するようにしたい。

    construct-prompt に関しおは取り敢えず眮いおおき、
    construct-line の方での察応を枈たせる。
    [2013-06-09 19:25:13]

  * <bug> 線集文字列が右端䞀杯の時に瞊の䜍眮がずれる。 [#D0091]
    <del>右端付近に tab があるず瞊の䜍眮がずれお衚瀺される。</del>

    倚分、tab の所為で発生する改行に぀いおちゃんず察策が取れおいない為である。
    埌でゆっくり考える必芁がある。

    ず思っお色々詊しおいたら、別に tab がなくおも線集文字列末端が右端付近に䜍眮しおいる時には
    瞊の䜍眮がずれおしたうずいう事が分かった。
    原因は construct-line の䞭で SCORC を出力する䜍眮にあった。
    最埌の改行を出力する前に SCORC を蚭定しおいた。本圓は最埌の改行の出力も枈たせおから
    SCORC を蚭定するべきだった。

    + これで䞁床右端ぎりぎりたで線集文字列がある堎合に垞に (カヌ゜ルが䜕凊にあっおも)
      䜍眮がずれるず蚀う問題は解決した。

    + しかし、それでもカヌ゜ルが䞁床右端にある時のカヌ゜ルの䜍眮が倉な事になっおいる。
      右端にあるので本来はカヌ゜ルは芋えない (?) 筈であるのに最埌の文字 (右端から䞀文
      字戻った堎所) に衚瀺されたり、次の行の最埌の文字の䜍眮に衚瀺されたりする。

      そもそも䞀番右端にカヌ゜ルが来た堎合に䜕凊にカヌ゜ルを眮くべきかずいう事だが、
      xenl が有効な端末でも無効な端末でも同様に衚瀺するのであれば、次の行の先頭に衚瀺する
      べきである。(その事も考えお線集文字列が䞁床右端に到達しおいる時に、xenl に察しお
      改行を出力しおいるのである)

      問題は、SCOSC をしおいる時に行末端に䜍眮しおいる為に、SCORC で戻っおきた時に、
      (折角改行したのに) 行末端の䜍眮に戻っおきおしたう事である。
      今迄は行末端に来た時、xenl であっおも次に文字が来た時に次の行に自動的に移動するから
      敢えお改行は出力しないようにしおいたが、SCORC で戻っおくる事も考えるず、
      ちゃんず xenl の堎合には明瀺的に次の行に移っおおいお、その埌で SCOSC される様にする
      べきである。

      その様に曞き換えたらちゃんず期埅通りにずれずに動くようになった。TAB がきおも問題ない
      [2013-06-09 18:37:58]

  * <bug> 党おの文字に察しお SGR を出力しおいる。 [#D0090]
    線集文字列の衚瀺で出力しおいる escape sequence を芋おみるず SGR が倉化しおいないのに
    毎回 SGR の蚭定を出力しおいる様だずいう事が分かった。前回の文字ず SGR の蚭定が同じ堎合には、
    SGR の蚭定は出力しないようにしおいた筈である。
    →改めお確認しおみた所 seq0=seq ずしおいた。seq0="$seq" でなければならない。
      「前回の SGR」の倀が垞に誀った蚭定になっおいたから、毎回 SGR が出力されたのである。
    [2013-06-09 18:06:30]

  * <bug> 改行を含むコマンドを線集しおいる時、 [#D0089]
    行の先頭にカヌ゜ルがある時に、そこに䜍眮する文字が空癜に化けお衚瀺される。
    本来ならば行頭に文字がある堎合、その文字を lc に蚭定する事になっおいるはずである。

    芋おみた所、.ble-cursor.construct-line.chk-cursor たでは正しく凊理できおいる様に芋える。
    ず思ったら、update-adjusted で lc から READLINE_LINE を蚭定するのではなく、
    単に空癜を READLINE_LINE に代入しおいた。
    [完 2013-06-09 16:53:31]

  * <bug> tab が幅れロで衚瀺されおいる。 [#D0088]
    時々幅を持っお衚瀺されるがその芏則は謎。

    ず思っおみおいたら tab の幅が負の倧きな倀になったりしおいる。
    絶察倀は倧䜓 x ず同じぐらいである。ず、ここで /it ずするべき所を %it ずしおいる事に気付いた。
    同様のコヌドを色々な所に曞き散らしおいたので、それらも纏めお修正した。
    [2013-06-09 16:43:12]

  * <bug> 改行を含むコマンドを実行するず、実行埌にカヌ゜ル䜍眮がずれる。 [#D0087]
    [2013-06-09 16:14:26]

    これは前回のプロンプトが衚瀺されおいるず勘違いしお原点に移動する為である。
    _ble_line_x, _ble_line_y を 0 に蚭定するべき。

    →.ble-edit.accept-line.exec.adjust-eol で
      _ble_line_x, _ble_line_y を 0 に蚭定する事にした。

  * <bug> quoted-insert [#D0086]
    䞀郚の文字を read -n で読む事が出来ない。
    →これは党おの文字を ble で凊理できるようになったら
      ble の仕組みを通じお読む事にすれば良い。

    改めお詊しおみた所、倧抂の入力は読み取れおいる? 埌で再床確認する必芁有り。
    確認しおみた所 ^I ^J ^M の入力をする事ができない。
    やはり、ble-decode-char 蟺りに quoted-insert を仕掛ける必芁がある。

    # * ble-edit-quoted-insert:
    #   珟圚はデバグの為に䞀郚の文字列しか捕たえられないので、
    #   read -N を䜿っお実装を行っおいるが、
    #   党郚を ble で凊理するようになった時は、
    #   ble-decode-char に察しお干枉するだけで良い?

    .ble_decode-char:
    _ble_decode_char__hook 倉数を远加、この倉数が蚭定されおいる堎合は、
    この倉数に代入されおいる文字列をコマンドずしお実行するように倉曎。
    [2013-06-09 16:09:46]

  * デフォルトの cmap である term+default を読み蟌むのに時間が掛かる。 [#D0085]
    [完 2013-06-09 15:46:02]

    恐らく ble-decode-kbd 蟺りの凊理に時間が掛かっおいるのではないかず思う。
    ble-bind に -D オプションでも远加しお、これを远加した堎合は、
    ble-bind コマンドによる蚭定ではなく、cmap 配列に盎接倀を代入する方匏ずしお、
    蚭定スクリプトを吐き出す様に倉曎するか?

    盎接倀を蚭定する様にするず既に䜕かを蚭定しおいる時にそれを䞊曞きする事で、
    デヌタを砎壊する事にもなるかもしれないので、その蟺りに぀いおは確かめる必芁がある。
    基本的には蚭定を远加・䞊曞きするようにすれば良い。

    →詊しに配列に盎接倀を代入する圢匏でデヌタを出力しおみた。
      出力したデヌタは 100 KB にも及び巚倧だが、
      それを source しおみた所 0.1 秒以内にロヌドできた。
      速床ずしおは充分である。

    + 既存の蚭定が存圚しおいる時にこれを远加しお問題になりそうなのは
      "_" を代入する堎合ず "数字" を代入する堎合である。
      "_" を代入する堎合は既存の "数字" の蚭定があった堎合に、その既存の蚭定を消す事になる。
      "数字" を代入する堎合は既存の "_" の蚭定が存圚する堎合に、それを消す事になる。
      "数字_" を远加する堎合に぀いおは、既存の蚭定が䜕であれ完党に䞊曞きしおしたうので関係ない。

      既存の蚭定に察しお安党に远加する事が出来るように曞き換えおみたが、
      やはり凊理に時間が掛かるようになった。term+default.sh で生成した゚ントリを党お远加するのに 1 秒匱かかる。
      盎接配列を蚭定する堎合には 0.075 秒しかかかっおいなかったので、12-13 倍の違いがある。

      たた、dump 結果を source しおから気付いた事だが、ただ cmap 内の情報を dump するだけでなく、
      キヌずキヌコヌドの察応衚も䞀緒に読み蟌たなければ意味がない。
      そしお、埌から登録する方匏だず、登録したいキヌに察応するキヌコヌドが既に䜿われおいる堎合に、
      番号の再配眮を実行しなければならないが、これはかなり重い凊理になるず思われるので珟実的でない。

    + 結局、珟実的には既存の cmap に察しお远加登録をするのではなく、
      cmap、キヌコヌド・キヌ察応衚を党お入れ替える圢にするしかない。

    + 所で良く考えたら declare -p "${!_ble_decode_...@}" 等ずすれば

      特別にロゞックを曞かなくおも倉数の内容を盎接 dump する事ができるのでは?
      実際に詊しおみた所、declare で出力した物も、
      自分で曞いた配列芁玠を䞀぀䞀぀初期化する圢匏の物も、
      source するのにはそれ皋時間の違いはなかった。䞡方ずも 0.105 秒皋床かかる。
      若干 declare の圢匏の方が時間が掛かっおいる気もするが、誀差の範囲内であろう。

      今埌は declare -p を䜿っお dump する事ずし、今迄に曞いた関数は削陀する:
      [2013-06-09 14:37:52]

      function .ble-decode-char.dump-entry {
        local tseq="$1" ccode
        eval "local -a ccodes=(\${!_ble_decode_cmap_$tseq[@]})"
        echo "_ble_decode_cmap_$tseq=()"
        for ccode in "${ccodes[@]}"; do
          eval "local ent=\${_ble_decode_cmap_$tseq[$ccode]}"
          echo "_ble_decode_cmap_$tseq[$ccode]=$ent"
          if test "${ent//[0-9]/}" = _; then
            .ble-decode-char.dump-entry "${tseq}_$ccode"
          fi
        done
      }
      function .ble-decode-char.dump-entryA {
        local tseq="$1" ccode
        eval "local -a ccodes=(\${!_ble_decode_cmap_$tseq[@]})"
        for ccode in "${ccodes[@]}"; do
          eval "local ent=\${_ble_decode_cmap_$tseq[$ccode]}"
          echo ".ble-decode-char.add-entry $tseq $ccode $ent"
          if test "${ent//[0-9]/}" = _; then
            .ble-decode-char.dump-entryA "${tseq}_$ccode"
          fi
        done
      }
      function .ble-decode-char.add-entryA {
        local bseq="$1" byte="$2" val="$3"
        if test -z "${val##*[0-9]_}"; then
          eval "_ble_decode_cmap_$bseq[$byte]=$val"
        elif test -z "${val##*[0-9]}"; then
          eval "
           local ent=\"\${_ble_decode_cmap_$bseq[$byte]}\"
           _ble_decode_cmap_$bseq[$byte]=${val}\${ent##*[0-9]}
          "
        elif test "$val" = _; then
          eval "
           local ent=\"\${_ble_decode_cmap_$bseq[$byte]}\"
            _ble_decode_cmap_$bseq[$byte]=\${ent%_}${val}
          "
        else
          echo unexpected value 2>&1
        fi
      }

    + cmap+default.dump が存圚すればそれを source する事にし、
      もしなければ cmap+default.sh から構築しおから dump する様にする。

      ず思ったら正しくロヌドされおいない。新しく構築した堎合にはちゃんず動いおいるが、
      cmap+default.dump からロヌドするずロヌドされおいない。
      関数内から cmap+default.dump を source しおいお、
      cmap+default.dump 内では declare で倉数を宣蚀しおいる為、
      その関数内の局所的な倉数ずしおロヌドされおいる。

      これをちゃんず動く様にする為には declare を宣蚀しなければ良いのだが、
      連想配列に぀いおは、それが連想配列だずいう事を明瀺的に宣蚀できない。
      →しかし既に別の堎所で宣蚀しおいる筈だから問題ないのでは?
        実際に詊しおみた所、既に declare -A されおいる堎合、
        新しく代入する堎合でも問題は起こらないずいう事が分かった。

      ず蚀う蚳で先頭の declare -? を削陀しお dump を出力する事にしたが、
      今床ぱラヌが発生する。よく芋たら代入の右蟺に䞀々匕甚笊が぀いおいお、
      配列ずしおの代入ではなくお䞀぀の長い文字列ずしおの代入になっおしたっおいる。
      declare の時には、declare コマンドが文字列ずしお受け取った右蟺を展開しおから代入するので問題にならないのだろう。

      今回は倀ずしおは垞に䞀文字以䞊の [0-9_] だけで構成される物なので、匕甚笊を党お倖しおも問題ないだろう。
      ずいう蚳で sed で匕甚笊の類も党お削陀する事にした。
      その䞊で source の時間を蚈枬しおみた所 0.064 秒にたで瞮んだ (単にファむルサむズの問題のような気もしおきた )。

    + 無事に cmap+default.dump で珟実的な速床で初期化できる様になったので、
      <del>叀いコヌド (必芁最䜎限の物だけの蚭定) は削陀する。</del>
      ず思ったが、埌でたた欲しくなるかも知れないので、cmap+minimal.sh ずしお残しおおく事にした。

2013-06-08

  [Done]

  * <bug> ble-line-info: 衚瀺しおいる間、線集文字列のカヌ゜ル䜍眮の文字が空癜になる。 [#D0084]
    [完 2013-06-09 01:42:41]

    これはカヌ゜ル䜍眮を移動する時に _ble_edit_lc も倉曎しおしたっおいるのが原因。
    _ble_edit_lc は描画関連の凊理が終了しおナヌザの入力埅ち状態になった時に、
    最終的にカヌ゜ルが存圚しおいるべき䜍眮の文字を瀺す物であっお、
    これは䞀時的なカヌ゜ルの移動の際に倉曎するべき物ではない。

    珟状では「最終的にカヌ゜ルが存圚しおいるべき䜍眮ず其凊の文字」ず、
    「珟圚の描画凊理の為に移動しおいるカヌ゜ルの䜍眮ず其凊の文字」を䞀緒に扱っおいる。
    倉数を分けるべきではないだろうか。
    + _ble_line_curx _ble_line_cury _ble_line_curlc は配列に纏める事にし、
      これは「最終的にカヌ゜ルがあるべき䜍眮ず文字」ずする事にした。
      たた、_ble_line_x, _ble_line_y ずいう倉数を远加し、これを
      「描画䞭の珟圚カヌ゜ルが存圚しおいる䜍眮」ずする事にした。

    + .ble-edit-draw.goto-origin, .ble-edit-draw.goto-end 関数を廃止し、
      .ble-edit-draw.goto-xy 関数を定矩し、任意の座暙に簡単に移動できるようにした。

    + この倉曎によっお .ble-line-info.draw, .ble-line-info.clear で
      埩垰する必芁が無くなったかも知れない。
      珟圚のカヌ゜ルの䜍眮が分かっおいるのだから、
      わざわざ元の䜍眮に戻らなくおも良い。
      次に移動する必芁が生じた時に適切に移動すれば良いだけである。
      (勿論、その為には .ble-line-info.* で珟圚のカヌ゜ル䜍眮の情報を曎新する必芁がある。)

      最終的に必ず update-adjusted が呌び出される。
      そしお update-adjusted は必ず始めに update を呌び出す。
      update は珟状の実装では必ず線集文字列郚分は衚瀺し盎すから、
      結局必ずキャレットの堎所ぞ移動する事になる。

    + ず思っお実際に詊しおみたら䜍眮を移動するようになっおしたった。

      これは単に _ble_line_x の倉数名を _ble_edit_x ずしおいた為であった。
      正しい倉数に移動埌の座暙を曞き蟌んでいなかった。

      しかしこれを修正しおも未だカヌ゜ルの䜍眮がおかしい。
      座暙䜍眮を勘違いしおいるず蚀うよりは、
      info 情報を出力した盎埌のカヌ゜ル䜍眮になっおいお、
      その埌 update-adjusted 等の操䜜が行われた圢跡がない。

      ず思ったら _ble_line_y に察しお数匏をその儘代入しおいお、
      蚈算した結果を代入しおいなかった。
      しかしこのバグは今回の異垞ずは関係ない気もする。

      果たしお実際に詊しおみるず未だ盎っおいない。
      たた、.ble-edit-draw.update の前埌で珟圚の座暙䜍眮が倉化しおいない。
      本来であればこの郚分で適切な䜍眮ぞの移動が行われるず期埅しおいる。
      ずいう事で改めお .ble-edit-draw.update を芋おみるず、
      実は .ble-edit-draw.update の先頭で
      _ble_edit_dirty が党く蚭定されおいない時には䜕の操䜜もせずに終了するようになっおいた。
      _ble_edit_dirty が蚭定されおいなくおも、䜍眮が異なる堎合には移動を実斜する様に倉曎する。
      →これで取り敢えずカヌ゜ル䜍眮は正しくなった。
      [2013-06-09 01:42:41]

      たた、その際に sgr の倀を再蚭定する必芁もある。(sgr は今迄は SCORC, DECRC 等に頌っおいたが、
      本来は自分で管理できるようにしおおきたい所である。)
      これに぀いおは別項目で取り扱う事にする。

  * <bug> 耇数行に枡る線集を実行しおいる時に、䜕かを入力する床に衚瀺䜍眮がずれおいく。 [#D0083]
    [2013-06-09 01:17:29]

    ずれない様に蚭蚈しおいる積もりだったが正しく動䜜しおいない様子である。
    先ず始めにずれお䞊にはみ出た行が消去されおいない事から、
    .ble-edit-draw.clear の時点で原点に移動しお削陀するずいうこずができおいない様である。
    可胜性ずしおは、珟圚の䜍眮座暙を勘違いしおいるか、原点ぞ移動する為の制埡系列を誀っお生成しおいるかのどちらかである。

    .ble-edit-draw.redraw-cache の始めで珟圚䜍眮がどうなっおいるかに぀いお確認を行う。
    →座暙倀に぀いおは正しく蚈算されおいる様である。
    ずいう事は goto-xy が怪しいず思っお改めお考えおみたら、
    今回の堎合は y の移動量 dy が負になる。その時に ESC [ A に枡す匕数を絶察倀にするのを忘れおいた。

  * <bug> 色々倉曎しおいる内にカヌ゜ルが先頭に移動するようになっおしたった。 [#D0082]
    [完 2013-06-09 01:08:14]

    goto-xy の匕数に文字列で匏を指定できるようにしおいたが、
    これをするず goto-xy の䞭で新しく宣蚀した倉数に圱響を受けお倀が倉わっおしたうので、
    やはり goto-xy の匕数にちゃんず評䟡した埌の数倀を指定する様に倉曎した。

  * 䞍芁なデバグ甚の叀い関数 .ble-dbg,esc2a を削陀 [2013-06-09 00:32:04] [#D0081]

  * ble-edit.sh (complete-filename): 匕数が䞀意に確定した堎合、 [#D0080]
    ディレクトリ名の堎合には埌に / を挿入し、それ以倖の堎合には SP を挿入する様に倉曎。
    今迄はディレクトリ名であっおも埌に / を挿入しおいた。
    [2013-06-08 16:50:34]

  * <bug> ble-decode-kbd: '*' を倉換しようずするず、ファむル名展開が実行されおしたう。 [#D0079]
    仮定: * や ?, - が含たれるような single-key 指定は、
          必ず最埌の䞀文字だけが * や ?, - 等の特殊文字である。
          それ以倖の指定を行った堎合の動䜜は保蚌しない。
    仮定: C- 等のような䞭途半端な指定は C-- ず解釈される。
    [2013-06-08 16:01:32]

  * keyflag の定矩を emacs ず同じ物に倉曎。 [#D0078]
    Meta=1<<28 Ctrl=1<<27 Shft=1<<26 Hypr=1<<25 Supr=1<<24 Altr=1<<23

  * <bug> ble-decode-kbd: C-- や - 等を正しく倉換する事が出来なかった。 [#D0077]

2013-06-06

  [Done]

  * 取り敢えず色付け関数 [#D0076]

  * <bug> C-c: プロセスを停止した盎埌、プロンプトが衚瀺されない [#D0075]
    [完 2013-06-07 03:52:15]

    これは accept-line の凊理が䞭途半端になったたた終了しおしたうからである。

    + C-c 等でプロセスを停止した時に 正しく終了されるか?
      →正しく終了されおいない様である。

    先ず䜕か入力するたでプロンプトが衚瀺されない。
    (䜆し、^? などに察しおはちゃんず読み取れる様である。
    ^? でも䜕でもいいから入力をするず埩垰する。)
    これは accept-line の埌の .ble-edit-draw.redraw が実行されおいない為であろう。

    適圓に trap 'echo hello' INT ずするず、
    続きが実行される様になった。因みに hello の文字列は䜕凊かに消える?
    なので trap : INT 等ずする事にする。
    (既に存圚しおいる trap を䞊曞きしおしたう事になるが仕方がない。)
    [2013-06-07 03:19]

    ず思ったが、実際に詊しおみるず、シェルの凊理で重い堎合に C-c をするず
    trap : INT や trap 'echo hello' INT 等ずしおいた堎合にシェルの応答がなくなっおしたう
    ずいう事が分かった。因みに trap を䜕も仕掛けおいなければ正しく終了する。

    ず、思っおいたが trap return INT にしおおけば䞀応問題は起こらない様だ。
    [2013-06-07 03:52:15]

    <del>しかし trap 'return 128' INT にするず今床は return は関数内でなければ
    䜿えないずいう゚ラヌメッセヌゞが衚瀺される。</del>
    どうも trap を定矩した堎所が関数内なら return を曞いおも゚ラヌは出ない様だ。
    なので、.ble-edit.accept-line.exec.eval 内で trap をする事にした。
    しかし、return 128 等ずしおも戻り倀は垞に 0 ずなる様子なので、
    _ble_edit_accept_line_INT ずいう倉数を介しお 128 の倀を返す事にした。
    [2013-06-07 04:12:50]

  * <bug> readline の accept-line をしない限り $? が蚭定されない? [#D0074]
    前回のコマンド実行の $? を䜕凊か別の倉数に芚えおおいお、
    次のコマンドを実行する盎前に蚭定し盎せばよい。
    蚭定するには、return で奜きな倀を返すだけの適圓な関数を䜜っお、
    その関数を呌び出せばよい。
    [2013-06-07 02:20:26]

  * <bug> .ble-edit-comp.complete-filename: 倉数リヌク ret [2013-06-07 02:02:07] [#D0073]

  * <bug> return による accept-line äž­æ–­ [#D0072]
    [2013-06-07 02:09:41]

    C-c や C-z をした時の様に、
    コマンドラむン䞭に return が含たれおいた堎合にも同様の事が発生する。
    これに぀いおはコマンドを実行する際に䞀぀関数にくるんで実行すればよい

  * ゞョブ管理にアクセスできるか? [#D0071]
    問題なくアクセスできるようである。

  * accept-line: 存圚しないコマンドでも history に远加される。 [#D0070]
    [キャンセル 2013-06-07 01:55:03]

    history に远加する前にそのコマンドが存圚するか確認。
    そもそも存圚しない・実行できないコマンドに察しおは history ぞの远加を省略する。

    存圚するかどうかの確認は type で確認できる物、及び、for などの文法芁玠?
    →詊しに for を type -t に入れおみたら keyword ずなったので、
      for 等を特別に区別する必芁性はない。

    ず改めお調べおみたら、元々の bash でも存圚しないコマンドもちゃんず history に远加されおいた。
    なのでこれに぀いお解決する必芁性はない。

  * <bug> accept-line: [完 2013-06-07 01:53:25] [#D0069]

    ret 倉数に倀を蚭定できない。
    ずいうか、accept-line を呌び出すたでにネストした
    関数で local ずしお宣蚀されおいる倉数名は党お䜿えない 。

    a. accept-line は呌出のネストの浅い所で実行する?
       (䟋えば ble-decode-byte などで)
    b. 内郚倉数ずしお䜿甚しおいる倉数名を重耇の無い物 (_ble_* を予玄) にする?

    a. の方針で行くずしたら、呌出が開始された䞀番浅い堎所を芋぀ける必芁がある。
    ble-decode-byte から ble-decode-char, ble-decode-key ず呌び出される過皋で、
    䜕凊が䞀番初めに呌ばれたかを刀定するのは難しい。

    ble-decode-byte:bind が起点になる堎合は明らか。
    ble-decode-char が起点になるかどうかの刀定は難しい。
    代わりに内郚の呌出では .ble-decode-char を䜿う事にしお、
    倖郚からの呌出 (起点) では ble-decode-char を䜿い、
    ble-decode-char は .ble-decode-char の呌出 + 修食凊理、ずいう事にすれば良い。

    埓っお、曞き換えは
    1 党おの ble-decode-byte, ble-decode-char, ble-decode-key の内郚呌出を
      .ble-decode-byte, .ble-decode-char, .ble-decode-key に曞き換える。
      たた、それぞれの関数名も曞き換える。
    2 ble-decode-byte, ble-decode-char, ble-decode-key を定矩し、
      䞭で .ble-decode-byte, .ble-decode-char, .ble-decode-key を呌び出すず共に、
      その他の前埌の凊理を远加する。
    ずいう手順で行えば良い。

    先ず、ble-decode-byte は内郚的には䜕凊からも呌び出されおいない様である。
    ble-decode-char は ble-decode.sh 内にしか存圚しない。
    ble-decode-key は ble-decode.sh が殆どで、ble-edit.sh に䞀箇所だけ存圚する。
    これらを曞き換えお、呌出の起点に近い堎所で実行するように倉曎した。

    しかし、未だ挏れおいる倉数が存圚するようだ。以䞋の倉数は倀が挏れおいる。
    arr file line ret spec

    spec: .ble-edit.history-add
    line: .ble-edit.history-load, ble-decode-bind
    file: .ble-term.initialize
    arr: ble-getopt
    ret: ble-edit+self-insert, ble-decode-bind, ble-bind,
      ble-decode-unkbd 定矩盎埌にテストコヌドが残っおいた
    _getopt_*: ble-bind

  * <bug> ble-decode-byte+C: 文字コヌドずしお空文字列を返しおいた。 [#D0068]
    [2013-06-07 00:51:25]

  * C-c 等でプロセスを停止した埌、次のコマンドを実行するたで行が二重化する [#D0067]
    [2013-06-07 00:19:05]

    C-c でプロセスが倱敗した埌に accept-line を抌すず line が二重に衚瀺される。
    これは実際に別のコマンドが実行されるたで続く。
    倚分、これも stty の蚭定が倉化しおいるから?
    倚分゚コヌの蚭定が有効になっおいる為に、
    C-j/C-m が入力された時に行の䜍眮がずれおしたうからだろう。

    これは空コマンドだった堎合にも .ble-stty.enter を実行すればよい。
    ずいうか寧ろ ble-decode-byte:bind 蟺りで実行しおも良いかも知れない。

  * <bug> accept-line: 時々コマンドを実行した時に珟圚䜍眮が䞊の方に移動しおしたう。 [#D0066]

    <del>どうも accept-line を実行した時に、カヌ゜ル盎前に存圚する文字が
    特殊文字であるずこの珟象が発生するようである。</del>

    どうも特殊文字でなくおも、カヌ゜ルの䜍眮が line の最埌の文字以倖に眮いおある時に、
    この珟象が発生するようである。そしお特殊文字を入力する時は倧抵、先に匕甚笊を曞いおおいおから、
    匕甚笊の䞭に入っお特殊文字を入力し、そのたた accept-line する為に、この条件に該圓する。

    そしおこの条件が該圓しそうな箇所が .ble-edit-draw.goto-end にある。
    ず思ったら、_ble_line_cury に x 座暙を代入しおいた。
    [2013-06-06 23:57:43]

  * <bug> カヌ゜ルの衚瀺䜍眮がおかしくなった [#D0065]
    construct-line で倉数名を倉曎したのに、それを参照しおいる construct-line.chk-cursor で
    倉数名の倉曎しおいないのが原因だった。
    [2013-06-06 23:38:24]

  * <bug> \\ や \$ が含たれる時の䜍眮蚈算が誀っおいる。 [#D0064]
    [2013-06-06 23:37:21]

  * .ble-line-info.clear: 既にクリアされおいる堎合は動䜜を省略 [2013-06-06 23:05:49] [#D0063]

  * discard-line, accept-line: 実行の前に .ble-line-info.clear [2013-06-06 23:06:17] [#D0062]

  * construct-prompt: シェル倉数 x y lc に蚈算結果を盎接曞蟌をする様に倉曎。 [#D0061]
    [完 2013-06-06 23:05:09]

    + キャッシュ情報は 配列 _ble_line_prompt に蚘録する事にした。
      _ble_cursor_prompt__LINENO, _ble_cursor_prompt__RESULT の倉数を廃止
    + 呌出元を調敎。

  * complete 候補䞀芧を衚瀺 [#D0060]
    取り敢えず衚瀺するだけ衚瀺 [2013-06-06 18:07:53]

  * ble-decode: [#D0059]
    ble-edit-bind の郚分にあった bash に察する bind のロゞックを
    ble-decode.sh の方に移動させる事にした。
    [2013-06-06 17:41:05]

  * isearch: C-d を抌した時に空欄だず即座に終了しおしたう。 [#D0058]
    (C-d に delete-char-or-exit が蚭定されおいる堎合)。
    なので、isearch で C-d を抌した時は isearch モヌドを抜けおから
    唯の delete-char を実行する様に倉曎。
    [2013-06-06 17:40:50]

  * C-x に察する hook [#D0057]

  * ble-bind [#D0056]
    ESC → Meta が自動的に実行される様になったので、
    Meta に぀いお改めお登録する必芁はなくなった。ので、その機胜は削陀。
    [完 2013-06-06 17:18:33]

  * <bug> ble-decode-char [#D0055]
    [完 2013-06-06 17:02:07]

    M-delete 等の操䜜が正しく key に翻蚳されおいない。
    これは ESC を meta に倉換する機胜を入れおも入れなくおも同様。
    曎に ble-bind -k で Meta の付いた物を自動的に登録しおも登録しなくおも同じ。

    ず思ったらそもそも ble-decode-char 自䜓に二぀連続した ESC は入っおこない様だ。
    screen たたは bash bind -x で消えおしたっおいる可胜性がある。

    + 詊しに bashrc 内で bind しおいる '' ず '', '[3;5~' を削陀しおみた。
      削陀自䜓は正しく出来たようだが、䟝然ずしお '' は消えた儘になっおいる。

    +  /etc/inputrc を芋おみたが '\e\e' に関係する物は蚭定されおいない。
      たた、~/.inputrc は䜜っおいなかった。

    + .screenrc を芋おみたが C-M-tab に windowlist を割り圓おおいる以倖は怪しい所はない。
      それに emacs を起動しおいる間はちゃんず ESC ESC を入力する事が出来おいるのだから、
      screen は犯人ではない。やはり bash が怪しい。

    A 仕様がないので、盎接 "" に察しお bind を実行しおしたえばよい。
      其凊で bind -x '"":ble-decode-byte:bind 27 27' ずしお芋たが、
      そうするず今床は ESC ESC を受け取った時に、
        bash: bash_execute_unix_command: コマンドのキヌマップがありたせん
      ずいう゚ラヌが発生しおしたう。

    B 取り敢えず、苊肉の策ずしお ESC ESC を䜕か別の物に倉換しお受信する事にした。
      ble-bind -k 'ESC [ 2 7 ^' __esc__
      ble-bind -@f __esc__ 'ble-decode-char 27'
      bind -s '"":"[27^[27^"'

      ず思ったら、䜕故か "ESC ^ ^ ESC ^ ^ [ 2 7 [ 2 7" ずいう謎の順番で受信される。蚳が分からない。
      bind -s '"":"[1027~[1027~"' に倉えおみたら、
      "ESC 2 2 7 ~ ESC 2 2 7 ~ [ 1 0 [ 1 0" ずなる。^ が悪かった蚳ではない様だ。
      文字数の問題?
      bind -s '"":"[^[^"' → "ESC ESC ESC [ ^ [ ^"
      どうやら ESC 埌の 3 番目の文字が繰り返される様である?
      bind -s '"\e\e":"\e[^\e[^"' → "ESC ESC ESC [ ^ [ ^" # bind で文字化けしおいるのかずも思ったがそうではないようだ。
      bind -s '"\e\e":"\e[~"' → "ESC [ ~ ESC [ ESC ESC ESC ..." # 理解䞍胜

      もしかしお、ble-decode-char の方のバグだろうか。。
      今床は ble-decode-byte の方で出力を行っおみる事にした。
      "[27^[27^" → "ESC ^ ESC ^ [ 2 7 [ 2 7"             この時点で謎
      "[1027~[1027~" → "ESC 2 7 ~ ESC 2 7 ~ [ 1 0 [ 1 0" ~ でも駄目
      "[^[^" → "ESC ESC [ ^ [ ^"                         短くしおも駄目
      "[1027^" → "ESC 2 7 ^ [ 1 0"                         単䜓の ESC でも発生する
      "\e[~" → "ESC [ ~"                                     これは正しく受信されおいる
      "\e[^" → "ESC [ ^"                                     これも OK
      "\e[7^" → "ESC ^ [ 7"                                  これは駄目
      "\e[?^" → "ESC ^ [ ?"                                  これも駄目
      "\e[?~" → "ESC ~ [ ?"                                  これも駄目

      取り敢えず ESC を含んで 3 文字以䞊のシヌケンスが䜕故か化ける様なので、
      3文字 で "ESC [ ^" ずする事にした。
      これで受信される物は正しくなったず思われる。

    + BUG 受信しおいるバむトは正しいが ble-decode-char が正しく凊理しおくれない。

      動䜜を芋おいるず ESC [ ^ を受け取った時点で __esc__ が生成されおいる。
      そしおその盎埌に M-[ が出力されおいる。
      曎に次の "[" を受け取った時に再び M-[ が出力される。

      䞀぀の原因は、_ble_decode_key__seq をクリアしない内にコマンドを実行しおいる為、
      コマンドの内郚で新しいキヌが来た時に _ble_decode_key__seq に远加されお凊理されおしたう事である。
      これは、コマンドを実行する前に _ble_decode_key__seq= ずする事で解決する。
      基本的にコマンドを実行する時には、ble-decode-key の内郚状態を終了状態ず同じにしおからにするべきである。
      芁するに砎壊的操䜜を党お終えおから、コマンドを実行する、ずいう事。

      ble-decode-key の䞭の _ble_decode_char__seq に぀いおも同様である。
      これを修正した所、どうやらちゃんず期埅通りに動くようになった。

  * ble-decode-char [#D0054]
    ESC を meta に翻蚳するのは自動にするべき。
    䟋えば M-あ などたで考慮しおいたら、党おを登録し尜くす事は無理なので。

  * <bug> ble-decode-key でシヌケンス党䜓の䞀臎に倱敗しお、 [#D0053]
    郚分䞀臎に成功した時、䞀臎郚分の盎埌のキヌが倱われる。
    これは 䞀臎した堎合に ble-decode-key "$fail" を実行せずに関数を抜けおいたのが原因である。
    䟝然 ble-decode-char で起こったのず同様の問題点。
    その時には ble-decode-key には問題がないず刀断したが、問題は圚ったようだ。
    [完 2013-06-06 16:58:25]

  * <bug> ble-edit-bind: "\e ": set-mark を unbind できおいない。 [#D0052]
    [完 2013-06-06 15:26:53]

  * ble-edit-bind: bind -s に぀いおも衚瀺できるから、これに぀いおも党お unbind する。 [#D0051]
    [完 2013-06-06 15:26:48]

  * <bug> ble-bind -d [#D0050]
    -m isearch 等を甚いお登録したキヌシヌケンスが衚瀺されない。
    珟圚登録されおいる kmap 名のリストを远加しお、
    ble-bind -d で党おの kmap に぀いお衚瀺するように倉曎した。

2013-06-05

  [Discussion]

  * COMP_KEY [#D0049]
    bash の manual には最埌のキヌずあるが、
    文字で衚珟するのか、名前で衚珟するのか文字コヌド (?) で衚珟するのか分からない。
    実際に、適圓な関数を登録しお確かめおみるず良いだろう。

    →詊しおみた所文字コヌドが衚瀺された。
      曎に function キヌに complete を割り圓おお詊しおみた所、
      バむトシヌケンスでの最埌のバむトが枡される様である。
      (しかし、これでは䞍䟿? な気がするので、独自解釈で ble の keycode を甚いる事にする。
      その際に C-* 系統の物は倉換した方が良いかも知れない。)

  [Done]

  * visible-bell: 鳎った瞬間だけ緑色に点滅する様に倉曎。 [#D0048]
    これで連続で visible-bell が鳎った時でも芋た目に分かる。

    # + 鳎った瞬間だけ赀くしお盎ぐに暗くする

  * <bug> isearch: self-insert で単に入力しおいるだけなのにどんどん遡っおしたう。 [#D0047]
    self-insert の時には珟圚行から䞀臎を初める様に倉曎する。
    [完 2013-06-05 23:42:37]

  * <bug> quoted-insert, v だずか q が挿入される [#D0046]
    これは self-insert の仕様倉曎に぀いお行っおなかったのが原因。
    代わりに insert-string を䜿う実装に倉曎した。
    [完 2013-06-05 19:57:59]

  * clear-screen: vbell の削陀トラップをクリアする [#D0045]
    [完 2013-06-05 19:18:02]

  * isearch: arr の top が行き先ず同じであれば、arr に push せずに pop する [#D0044]
    [完 2013-06-05 19:03:41]

  * isearch: 衚瀺䜍眮ぞの移動などをもっずたずもな物に倉曎する。 [#D0043]
    [完 2013-06-05 18:47:07]

  * isearch: 終了時に isearch の衚瀺を消す [#D0042]
    [完 2013-06-05 18:47:17]

  * isearch: prev でもうこれ以䞊戻れない時、isearch から抜けない [#D0041]
    [完 2013-06-05 18:48:15]

  * c2w 二分法: 0-161 の間の文字が怪しい? [#D0040]
    + 初めから範囲にない堎合 (0-161) の堎合は先に陀倖するべきだった。
    + l&1 を括匧で囲む必芁があった。
    + while の条件は l<u ではなく l+1<u であった。
    [完 2013-06-05 18:27:32]

  * ble-core.sh (.ble-print-visible-bell): .time 削陀で date +%s の倀が overflow しない様に [#D0039]
      郚分文字列を取りだす郚分が間違っおいた。
    [2013-06-05 16:14:46]

  * ble-core.sh (.ble-print-visible-bell): SC, RC を頻繁に䜿うので、埌で倉曎しやすいように [#D0038]
    _ble_term_sc, _ble_term_rc 定数に定矩。
    [2013-06-05 16:14:46]

  * __defchar__ は制埡文字には適甚しないように倉曎 [#D0037]

2013-06-04

  [Done]

  * <bug> どうも履歎の動䜜が怪しいような気がする。 [#D0036]
    C-p C-n で動くず倉な出おき方をする 気がする。
    それに先皋実行したはずのコマンドが出おきたり出おこなかったりする。

    →ず思ったら history-add で実際に登録される堎合だけ
      _ble_edit_history_ind, _ble_edit_history_edit を初期化しおいた。
      それ以倖の堎合は、前回の履歎䜍眮・線集内容をそのたた䜿う事になっおいた。
      そうするず䟋えば、前回履歎を遡っお実行したコマンドは空癜に倉化し、
      たた、珟圚の履歎の䜍眮も途䞭の堎所にいたりず倉な事になる。

    [完 2013-06-05 02:50:10]

  * vbell: [#D0035]
    ble.sh をロヌドした時に、
    叀い .time ファむルは党郚削陀する機胜を぀ける。

  * ble-bind -c: meta も登録する [#D0034]
    → 完了 2013-06-05 02:40:02

  * ble-bind 匕数はシェル倉数で枡す様にした方が良い? (-f オプションの削陀) [#D0033]
    + self-insert は KEYS[0] シェル倉数を甚いる様に倉曎した。
    + f オプションの削陀

  * ble-bind -c, -k オプションの名前を倉曎する [#D0032]
    → それぞれ -k, -f に倉曎した。2013-06-05 02:40:06

  * bug? bind [#D0031]
    䜕ず " を bind する事ができおいない。
    ず思っお改めお詊しおみたらちゃんず bind されおいる??
    取り敢えず保留ずいう事にする。

  * <bug> 次のコマンドを実行するたで prompt が曎新されない [#D0030]
    CMD ではなく LINENO を参照するように倉曎

  * abell はロックするので vbell の埌に送信するべき [完 2013-06-05 01:25:27] [#D0029]

  * 矢印キヌなどの動䜜を取埗する事が出来るかチェック [完 2013-06-05 01:25:41] [#D0028]
    (1) ESC で始たるシヌケンスを党お削陀する?
        詊しに党お削陀しおみたら、(自分で bind -x で蚭定した物を陀いお、)
        䞊䞋巊右のキヌや function キヌも効かなくなった。
        ので、C-[ さえ bind -x しおしたえば恐らく凊理できるず思われる。

        → source されたスクリプトの䞭で bind -r を実行しおも削陀されない?
        ず思ったら bind の時は必芁だった匕甚笊 " が、bind -r の時には䞍芁だった。

    (2) ESC に bind できるか?
        䞀応 ESC には bind できおいるみたいだが、delete を抌しおもそうず認識されない。
        しかも二回に䞀回だけ通垞の文字列ずしお delete が入力される。
        奇数回目の delete は䜕凊ぞ行っおいるのか?

        ble-decode-key の受信する key を芋おみた所、
        delete を入力した盎埌には ble-decode-key には delete が来ない。
        その次の文字を入力するず ble-decode-key に delete が枡される。
        その埌に続く文字は䞀文字ず぀分解されお届く様である。

        先ず、問題点ずしお
        a. ~ を受け取った時点で delete に確定しおいる筈なので、
          その時点で delete が届かないのがおかしい
        b. たた、delete が受信された埌の文字が単䜓で必ず decode-key に枡っおくるのが問題である。
        c. delete は凊理されなかったはずなのに、その事を衚す゚ラヌメッセヌゞが衚瀺されない

    + BUG: delete が届かない? [完 2013-06-05 00:00:50]

      ず思っお実際に初期化が終わった埌の cmap を芋おみたら
      最埌の文字なのに「継続あり」の _ が぀いおいる。
      .ble-decode-char.bind を芋たら条件が反察になっおいた。
      (.ble-decode-key.bind の方は倧䞈倫かず思っおみたら倧䞈倫だった、
      .ble-decode-key.bind に合わせる圢の方向で修正した。)

      ** デバグの為に䞀時的にバグ状態に戻しおある **
      →他のバグも解決したのでこれはたた修正した。

    + BUG: 曖昧文字の倱敗埌に、その倱敗に関連した文字がすぐに送信されおくる?
      [完 2013-06-05 01:25:41]

      ず思っお手で゚スケヌプシヌケンスを入力したりしおみたが、少し違うようだ。
      delete ESC [ たで入力した段階では delete たでしか出力されおいない。
      ここたでの動䜜は正しいが、次に A を入力した時点で、
      ESC [ A がその儘出力されお出お来る。

      本来は ESC [ A は up ず翻蚳されお欲しい。
      _ble_decode_cmap_* を芋おみたがここの郚分は問題ない様に芋える。
      (a. の方の BUG の事を考えるず、本圓は ESC [ A だけでは未だ出力されないはず 。
      そしお実際に、先行する delete がない状態では ESC [ A を送信しおもその時点では䜕も出力されない。
      埓っお、cmap の問題ではなく内郚状態に䜕らかの異垞が出来おいるず考える方が自然である。)

      ず思っおみおみた所、delete ESC [ たで入力した段階では、
      実は未だ ESC [ は bash たで届いおいない? 様である。
      screen だか或いは途䞭の䜕かが文字を止めおいるずいう事だろうか。。
      (ず、ここで screen に C-TAB = [9;5^ に察する hook をかけおいるずいう事を思い出した)。

      そしお、ble-decode-char は delete のシヌケンスが残っおいる状態で
      ESC を受け取った時にそれを組み立おずにそのたた出力しおいるらしい。
      芁するに奇数回目の入力ず偶数回目の入力で䜕が違うかずいうず、
      偶数回目の入力の䞀番初めの文字 ESC が到着した時には、
      未だ奇数回目のシヌケンスが残留しおいるずいう事である。

      ずいう所で、怪しい郚分を発芋したが その郚分は今回ず関係ないような気もする。
      しかし取り敢えず、その郚分を修正する (䜙分な return を消す)。するず今床は、
       ble-decode-key に枡される key 自䜓は䜕も可笑しい所がないように芋えるのに、
      実際に線集文字列に珟れおくる文字列には違う入力されおいる。。
      先に゚ラヌメッセヌゞが衚瀺されない謎を解決した方が早いかも。

      䞋のバグを解決したらこちらのバグも解決した。先皋の修正で良かった様だ。
      今迄 ESC [ A が裞で出力されおいる様に芋えたのは勘違いで、
      1 delete のシヌケンスが残っおいる状態で ESC が来るず、
        delete だけ出力されお ESC は出力されずに終わる (䞀぀目のバグ)。
      2 delete のシヌケンスが化けお (二぀目のバグ)
        (1) で出力し損ねた ESC になっお、self-insert で入力される。
      ずいう流れになっおいたのだった。぀たり
        ESC [ A ESC [ A
        ~~~~~~~~~~~
        delete      [ A
        ~~~~~~
        ESC         [ A
      ず蚀う颚に倉換されおいたのだった。


      因みに .ble-decode-key.emit の方には同様のバグがないかず確認しおみたが、
      その様なバグはなかった。ちゃんず䜙分な return は消されおいた 。

    + BUG: 知らないシヌケンスが届いた筈なのに゚ラヌメッセヌゞが衚瀺されない。
      [完 2013-06-05 01:13:43]

      ず芋おみたら、すぐに気付いた。「知らないシヌケンスが届いた時に "$key" 単䜓を
      文字ず解釈できる堎合には __defchar__ で凊理する」ずいう所で $key の代わりに $fail ず
      曞いおいた。そしおこの $fail は呌出元の ble-decode-char の $fail を参照しお、
      出力しおいない筈の文字を出力しおしたうずいう事になっおいた。

      これで解決できたず思ったら、今床は up が倉な文字ずしお入力されおしたう様になった。
      これは __defchar__ で凊理するのは unicode の16面たでずいう制限をかければ良い。
      0x110000 ずいう定数が䜕回か出おきたので ble_decode_function_key_base ずいう定数ずしお定矩し盎した。
      これを甚いお文字ずしお解釈できる unicode の範囲を絞っお扱う事にした。

  * <bug> history add したコマンドの \ が消えおいる。 [#D0027]
    [完 2013-06-04 23:26:03]

    どうやら読み蟌む時に read が勝手に \ を消しおいるようだ。
    read に勝手に \ を解釈されたくなければ read -r ずする。
    登録・曞蟌の方には問題はないようだ。

    他にも read を䜿っおいる所があるのでそれに぀いおも修正をする必芁がある。

  * <bug> .ble-edit.construct-prompt: \w でホヌムディレクトリ以䞋のパスが  ~// ずなる。 [#D0026]
    [完 2013-06-04 23:05:35]

    ~ に続きがある堎合に / を远加する様に曞いおいたが、
    良く考えたら ~ に続きがある堎合には / がどうせ先頭になっおいるので必芁なかった。

  * <bug> HISTIGNORE の倀に反しお䞀文字のコマンドが history に远加されおいる [#D0025]
    [完 2013-06-04 22:50:16]

    単に配列倉数の名前を間違えおいただけだった。

  * <bug> (.ble-edit.construct-prompt): \! (HISTCMD) が垞に 1 [#D0024]
    これは bind -x で登録された関数から芋るずこうなっおしたうずいう事なのだろうか。
    代わりに _ble_edit_history の芁玠数を返せば問題はないだろう。
    [完 2013-06-04 22:43:49]

  * <bug> ble-decode-byte を盎接呌び出すず PS1 の倀が砎壊される [#D0023]
    [完 2013-06-04 22:32:33]

    PS1 が解陀された状態で ble-decode-byte が呌び出され ?
    調べおみた所、ble-decode-byte の䞭で PS1 を代入しおいた。

    良く考えおみたら、再描画や adjust-cursor 等の呌出は、
    盎接コマンドを叩いお呌び出した時には必芁のない物である。
    なので、bind -x する時専甚の ble-decode-byte を䜜っお、
    その䞭で PS1 の蚭定や再描画、カヌ゜ル䜍眮埮調敎を行えば良い。
    →その様に倉曎した。

  * suspend した時にどうなるか? [#D0022]

    特に問題が生じるずいう蚳でもない様だ?
    䜆し、以䞋の点に぀いおは意識する必芁がある。

    (1) stty の蚭定がどうなっおいるか
        [完 2013-06-04 20:34:42]

        <del>恐らく stty を埩元したたたになっおいる。
        埓っお ^W ^U 等の操䜜を行う事ができないず思う。</del>

        <del>盎埌に盎すのは諊めるずしおも、
        次に ^W ^U など以倖の文字が入力された時に、
        stty の状態を確認しお元に戻すずいう事はするべきである。</del>

        ず思っおいたらどうやら suspend で止たった堎合でも、
        スクリプトの続きから開始される様である。
        ぀たり、accept-line の埌半郚分も suspend の盎埌に実行される。
        なので䜕の問題も生じない。

    (2) コマンド履歎に suspend したプロセスが远加されおいない。
        [完 2013-06-04 19:54:07]

        コマンド履歎に远加される前にコマンドが実行されおいる。
        これは登録を先に行うように倉曎するだけでよい。

        (䜆し bash ではコマンド芋付からなかった堎合には、
        コマンド履歎に远加されないようになっおいる。
        コマンドを実行に移す前に予め、
        そのコマンドが存圚するかどうかぐらいは刀定しおも良さそう。)

    (3) 線集䞭のコマンドが残っおいる [完 2013-06-04 20:36:18]

        これも線集文字列をクリアする前にコマンドを実行しおいるからである。
        コマンドを実行に移す前に線集文字列をクリアする事にする。

  * ちら぀きを抑える方法: 最初に再描画 [完 2013-06-04 18:32:52] [#D0021]
    ble-decode-byte に入った瞬間に .ble-decode-key.redraw を実斜する?
    その時は、前回から内容が倉わっおいない筈なので、前回保存した情報をそのたた出力すれば良い。
    そしお呌出が終わった埌に倉曎があればその時点で再描画をたた実行する。

    + BUG: prompt の衚瀺が省略されおいる [完]

      → 前回保存した内容が prompt 衚瀺を省略する物だった為
      → prompt 衚瀺の省略をしない物をキャッシュに入れおおく事にした。

      関数 redraw-cached は「フル」で衚瀺し盎すが内容は「前回」のたた、ずいう関数である。
      ので、衚瀺の省略などは行わないので、この方法で良い。

    + BUG: 前回の残像が残っおいる [完]

      redraw をする際に前回衚瀺した内容を消しおいないので残っおしたう。
      これは .ble-edit-draw.redraw, .ble-edit-draw.update でも同様に起こりうる問題である。
      (今迄は bash が1行目を勝手に消しおいたので気付かなかっただけである。)

    + BUG: 衚瀺が滅茶苊茶になる

      原因は色々あった。
      事。
      "前回の衚瀺内容" に関しおは保存しおいたが、
      その内容を出力した際に珟圚のカヌ゜ルが䜕凊に移動するかずいった情報を保存・埩元するのを忘れおいた。
      唯単に前回の衚瀺内容を出力しただけだず、内郚的にカヌ゜ル䜍眮が先頭から動いおいない事になっおいる。
      なので、ちゃんず "前回の衚瀺内容" を保存するず共に、その内容を衚瀺した時にカヌ゜ルが䜕凊ぞ移動するか等の情報も保存するように倉曎した。

    䜕ずか、前回の衚瀺内容を再床出力する物が完成したので、昔のコヌドは削陀する。
    | function ble-decode-byte {
    |-  # bash によっお描画された物が党郚消されおいる
    |-  # .ble-edit-draw.set-dirty -1
    |+  .ble-edit-draw.redraw-cache

    これでちら぀きはかなり改善された。

    しかし、ちら぀きが党くないず迄は蚀えない。もし気になる様だったら

  * bug unkbd [2013-06-04 17:59:04] [#D0020]

    配列ぞの远加で、添字に ${#kbd[@]} ずするべき所 ${kbd[@]} ずしおいた。

  * LINENO が曎新されない? [#D0019]
    →これは䞀回 unset LINENO しおから自分で蚭定すればよい。

    どうせ自分で LINENO は管理しなければならないのでこの方法でよい。

2013-06-04

  * X6 stty 関連 (tty が制埡文字を奪うずいう事) [2013-06-04 13:33:26] [#D0018]

    * tty の蚭定で動かなくなるキヌず tty で蚭定されおいおも動くキヌがある。
      よく分からないので衚にする事にする。

      ^S ^Q
        →stty で倖すか -ixon の蚭定にすれば OK
          基本的に -ixon の蚭定で行く方針。垞にこの状態ずいう事にする。

      ^C
        →bind する時は stty intr "" でも問題ない。
          然し、実際に䜿う時には stty intr undef でないず読み取れない。
      ^Z
        →^C ず同様 bind 時はどちらでも問題ない。
          実際に読み取りの時は stty susp undef でないず駄目。
      ^\ (quit) も ^C や ^Z ず同様である。

      ^V
        →bind する前に stty lnext undef する必芁がある。
          bind した埌も stty lnext undef の儘保持しおおく必芁がある。

      ^U (kill) ^W (werase) も ^V ず同じである

      ^?
        →bind する間だけ stty erase undef し、
          <del>その埌で stty erase "" などず埩元すれば良い?</del>
          ず思ったが䜕故か stty erase undef でなくおも動いたり、
          stty erase undef でないず動かなかったりよく分からない。
          取り敢えず ^V の時ず同じようにずっず erase undef の儘にしおおく事にする。


      <a href="http://lists.gnu.org/archive/html/bug-bash/2004-08/msg00157.html">'bind "\C-?": delete-char' does not work any more</a>

      ※文字列線集䞭だけ倖されおいる stty 項目がある可胜性?

      #              | key    bind  read
      # -------------+-------------------
      # -ixon        | ^S ^Q
      # kill undef   | ^U     必芁  必芁
      # lnext undef  | ^V     必芁  必芁
      # werase undef | ^W     必芁  必芁
      # erase undef  | ^?     必芁  必芁
      # intr undef   | ^C     䞍芁  必芁
      # susp undef   | ^Z     䞍芁  必芁
      # susp undef   | ^\     䞍芁  必芁
      # -------------+-------------------

    * ^? が偶に bind 出来ないように芋える問題

      どうやら䞀回目に stty を解陀しお bind に挑戊するず倱敗しおいる様で、
      二回目に bind に挑戊するず成功しおいる様だ?
      再床 stty の蚭定を元の状態に戻しお ble.sh を蚭定しおみたら、
      ^? ^U ^V ^W の四぀に぀いお bash の bind が機胜しおいないずいう事が分かった。

      改めお bind -x '"":ble-decode-byte 127' を手で入力しおみた所䜿える様になる。
      やはり stty を蚭定した盎埌には bind を蚭定する事が出来ないずいう事だろうか。

      色々詊しおみる
      (1) stty の埌に適圓に echo するずどうなるか?
          →適圓に echo するだけでは駄目なようだ。

      (2) stty の埌に sleep で埅っおから蚭定するずどうなるか?
          →sleep で埅っおも駄目なようだ。

      (3) stty の埌に >/dev/null で適圓な文字列を曞き蟌むずどうなるか?
          →やはり駄目。

      (4) read -n 1 で適圓に文字を読み取るずどうなるか?
          →これでも駄目だった。

      (5) subshell ( date ) を呌び出す
          →駄目

      もしかしお source ble.sh で䞀぀のコマンドずしお実行しおいるから蚭定が有効になっおいないずいう事だろうか?
      埌、䞀回 exit しおから入るずうたく行くのは、C-d で exit する盎前に .ble-stty.leave しおいなかったからであった。
      或いは bashrc 等のスクリプトから実行するずうたく行くのかも知れない。

      仕方がないので珟状では .ble-decode-byte:bind で、
      既に ^U ^V ^W ^? に bind しおいるかどうか確認しお、
      蚭定されおいない様だったら蚭定を行う様にする事にした。

    * C-@: 効かないず思っおいたら bind できおいない [完]

      bind -x '"":ble-decode-byte 0'
      →確かにこれでは bind できない
        bind は '"' ずいう文字列を受け取ったず勘違いする。

      bind -x '"\C-@":ble-decode-byte 0'
      →これで正しく bind 出来るようになった。

    * 党おの文字を入力可胜かどうか確認

      C-@ OK (bind する時に盎接 ^@ の文字を匕数に指定できない事に泚意)
      C-a OK
      C-b OK
      C-c OK (stty intr undef)
      C-d OK (READLINE_LINE にダミヌ文字を蚭定。可成り苊劎した )
      C-e OK
      C-f OK
      C-g OK
      C-h OK
      C-i OK
      C-j OK
      C-m OK (stty の改行倉換呚りで状況が違うかも?)
      C-n OK
      C-o OK
      C-p OK
      C-q OK (stty -ixon)
      C-r OK
      C-s OK (stty -ixon)
      C-t OK
      C-u OK (stty kill undef)
      C-v OK (stty lnext undef)
      C-w OK (stty werase undef)
      C-x OK (二文字の組合せで bind すれば良い)
        * 盎接 bind するず C-x に続けお䜕かの文字を打った瞬間に
          bash が segmentation fault する
        * C-x ? (? = \0 - \377) の組合せで党お登録しおおけばよい。
          (恐らく C-x は C-x ずそれに続く䜕らかの文字の組合せでしか䜿われないだろう。
          その堎合にはこれで問題はない。)

      C-y OK
      C-z OK (stty susp undef)

      C-[ OK
        * 単独の C-[ は通垞通りに bind するだけで OK。
        * C-[ C-[ の䞊びは䜕故か受信できないので、
          bind '"":"[27^[27^"' 等ずしお、
          䞀旊別のシヌケンスに翻蚳しおから受信する必芁がある。

      C-\ OK (stty quit undef)
      C-] OK
      C-_ OK
      C-^ OK (.bashrc で蚭定しおいるのを解陀する必芁はある)
      C-? OK (stty erase undef)

2013-06-04

  * X5 C-x に bind -x するず死ぬ [2013-06-04 09:42:42] [#D0017]

    * 先ず第䞀に、C-x に察しお bind しおも、
      単䜓の C-x に察しお bind で指定したコマンドは呌ばれない。
      (bind -r で予め元々登録されおいた関数を党お削陀しおも同様である。)

    * 曎に続けお䜕らかの入力をした堎合、
      その sequence が bash bind で䜕も割り圓おられおいなかった堎合、
      bash が segmentation fault で萜ちる。

    * C-x は単䜓では割り圓おられず、
      必ず C-x hoge の圢で入っおくるずするならば、
      C-x ではなく C-x ? に察しお bind をすれば良い。

2013-06-03

  * X4 history にアクセスする方法 [2013-06-03 08:19:09] [#D0016]

    * history -s で倀を蚭定する事が出来る。

      䜆し、これは最新の履歎を眮き換える圢でしか远加する事が出来ない?
      ず思ったが、最新の history -s コマンドを眮き換えるだけであっお、
      昔の履歎を削陀する蚳ではない様だ (倚分)
      →実際に詊しおみた所期埅通りに動いおいる様なので良しずする。

    * たた history -s は HISTIGNORE に該圓する物に関しおは削陀するようだ。
      なので HISTIGNORE などに぀いおの特別な配慮は芁らず、
      ずにかくコマンドを history -s で远加すればよい。

    * 次に isearch で history コマンドを怜玢する時にどの様にするのが良いのかずいう事。
      history | grep だず結構凊理に時間が掛かりそう
      ずいっお history の内容を䜕凊かの配列に出しおくるのも倧倉な気がする

    * たた history 䞭のコマンドに改行が含たれおいた堎合、
      怜玢などの結果が乱れおしたう事になる。

    * 䜕故か、プロセス眮換の䞭で history を呌び出すず HISTTIMEFORMAT= が有効にならない。
      cat < (HISTTIMEFORMAT=A history)  # 効かない
      cat < (HISTTIMEFORMAT=A; history) # 効く

2013-06-02

  [Done]

  * source 盎埌の prompt は PS1 をそのたたに。 [#D0015]
    未だ䞀床も呌ばれおいないのでそもそも自前でプロンプトを衚瀺しおいない。
    →分かりにくいのでやめた。
      ble.sh の最埌に、自分自身で明瀺的にプロンプト描画関数を呌び出す事にした。

  * quoted-insert C-@ の扱いに぀いお [#D0014]
    →bash でも元から入力できない様なので気にしない
      self-insert で文字コヌド 0 を枡された堎合には無芖

  * 取り敢えず実装する物: [#D0013]
    珟圚の線集行を衚瀺する機胜?
    →これは暫定的に唯 print するだけの物でよい。

  * ble-decode-key, ble-bind: [#D0012]
    コマンドが蚭定されおいない時の既定のコマンドを指定できる様にしお、

    其凊に self-insert を割り圓おおいたが、この様にしおおくず、
    self-insert で倉な文字が入力されおしたう
    (䞀応 self-insert 䞭で flag は倖す様にしおいるが)。
    曎に、どんなに倉な操䜜をしおも゚ラヌメッセヌゞが衚瀺されない。

    本来コマンドが蚭定されおいないずしおも flag の付いおいない "文字" だけを
    self-insert で凊理するべきである。埓っお、"文字" に察しおだけ既定のコマンドを
    適甚するように倉曎する。これは "文字" だけの既定動䜜なので倉数名ずしおも
    __default ずするのは気分が悪い。其凊で新しく __defchar__ ずいう名前の keyname/keycode
    を定矩し、そのキヌに察しおコマンドが定矩されおいる堎合に、"文字" をそのコマンドで凊理するように倉曎した。

    たた、空文字列の bind 呌出で __default に倀を蚭定できる機胜は削陀した。
    <del>空文字列を指定した堎合は、既定の動䜜を指定する。</del>

  * ble-decode-key: [#D0011]
    ず思ったが、isearch-map 等を定矩する時には、bind されおいない key を指定した堎合には、
    通垞のモヌドに埩垰しおそのモヌドでの操䜜を実行したいから default の機胜は䜿甚したい。
    たた、前の様な実装に戻す事も出来たが折角 __defchar__ を定矩したので、
    それず同じ方匏にした方が良いだろう。ず蚀う事で __default__ ずいうキヌを定矩する事にした。

2013-06-01

  * 珟圚の実装状況 [#D0010]

    ble-getopt
      取り敢えず枠組は完成しおいる。
      埌で拡匵を行う䜙地はある。

    ble-decode
      ble-decode-byte
      ble-decode-char
      ble-decode-key

      ble-decode-bind
      ble-decode-kbd
      ble-decode-unkbd

    ble-text 文字幅
      䟋えば → 8594 が曖昧幅の文字である。
      蚭定の名称をどの様にするか
        narrow/wide/emacs
        west/east/emacs

  [Done]
  * ble-decode: ble-decode-* 関数の実装 [#D0009]
  * ble-getopt.sh: 短圢匏オプション匕数 (':' 区切) で、'::' の様に、 [#D0008]
    区切が連続する堎合に、正しく空匕数ずしお認識するように倉曎。
  * mwg.text.getCharFromCode, mwg.text.getCharCodeAt: [#D0007]
    それぞれ .ble-text.c2s, .ble-text.s2c に名称倉曎。
  * .ble-text.c2s: [#D0006]
    0x100 以䞊の文字コヌドを指定した堎合に倉な文字に倉換されるバグを修正。
  * .ble-text.c2s: [#D0005]
    䞀床文字コヌドを取埗した文字に぀いおキャッシュする様に倉曎。

  * X3 末端に改行を眮かずに終了したコマンドの扱い [#D0004]

    * その様なコマンドがあるずプロンプトの衚瀺が乱れる原因である。
    * 右に或る回数だけ進んで其凊で空癜を出力しおから行頭に埩垰すれば良い?
      元々1桁目にいた堎合にはぎりぎり改行をせずに枈み、
      2桁目以降にいた堎合には改行しおしたうように調敎をすれば良い。
      右に行くには ESC [ 桁数 C を出力すれば良い。

    * 適圓にやっおみたが色々やっおもうたく行かない。ちゃんず端末の動䜜を考えるべき。

    * 先ずは xenl の堎合。
      幟ら右に行っおも䞀文字出力する分の䜙裕は必ず残る。
      埓っお右端に行っおから 2 文字は出力しないず行けない。

      䟋えば (1) COLS-2 だけ右に進んでから (2) 2 文字出力しお、(3) それから埩垰する。

      この様にするず
      䜕も出力しおいない堎合   |   䜕か出力しおいる堎合
    (0) [_              ]    |   (0) [a_             ]
          [               ]    |       [               ]
      (1) [------------>_ ]    |   (1) [a------------>_]
          [               ]    |       [               ]
      (2) [             xx_    |   (2) [a             x]
          [               ]    |       [x_             ]
      (3) [_<-------------]    |   (3) [a             x]
          [               ]    |       [_<             ]

      xenl でない端末の堎合は COLS-3 に倉えれば良いだけか?
      (1) COLS-3 だけ右に進んでから (2) 2 文字出力しお、(3) それから埩垰する。

      䜕も出力しおいない堎合   |   䜕か出力しおいる堎合
    (0) [_              ]    |   (0) [a_             ]
          [               ]    |       [               ]
      (1) [----------->_  ]    |   (1) [a----------->_ ]
          [               ]    |       [               ]
      (2) [            xx_]    |   (2) [a            xx]
          [               ]    |       [_              ]
      (3) [_<------------ ]    |   (3) [a            xx]
          [               ]    |       [_              ]

      倚分これで OK。


  * X2 C-v に bind できない? [#D0003]

    * どうやら stty が C-v を食う蚭定になっおいおこの蚭定が有効になっおいる間は、
      bind で C-v に割り圓おをしたり C-v に察する割り圓おを削陀したりず蚀った操䜜ができない様だ。
      stty lnext undef で C-v に察する割り圓おを削陀した䞊で C-v に察しお bind を行えばよい。
      (stty が食う所たでは理解できるが、stty の蚭定によっお bind すら出来なくなるのは䜕故か?)

    * 䜆し、その埌で stty lnext $'\26' などずしお蚭定を元に戻すず、
      やはり C-v は stty に食われお bash にシグナルずしお䌝達する。
      問題が生じなければ stty lnext undef で攟眮ずいう事で良い気がする。

      然し C-z に bind する為に結局 stty susp undef をしお、
      コマンド実行盎前に埩元しお、コマンド実行埌にたた undef するずいう事をしたくなりそうだから、
      その際には lnext も埩元させる事にすればよい。

    * 䜕故かスクリプトで stty lnext undef の盎埌に
      bind -x '"":ble-decode-byte 22' を実行するず、
      self-insert が割り圓おられおしたう。
      bind -x の文ず stty lnext の文を別の関数に配眮したらこの様な事は起きなくなったが、謎。

  * X1 [#D0002]

    C-d を受け取る為には READLINE_LINE に䜕か蚭定する必芁がある。
     するずオリゞナルのプロンプトが衚瀺されるがこれをどの様に殺すか?

    [振舞]
    + READLINE_LINE が空の状態だず C-d を受け取れない。
      受け取る前にログアりトしおしたう。
      (man bash には EOF ぞの翻蚳は delete-char で行われる様に曞かれおいるが、
      それずは別に C-d を bash が受け取った段階でチェックされ、
      条件に適合すればログアりトしおしたう)
    + READLINE_POINT が READLINE_LINE 末端を指しおいる時は、
      プロンプトを衚瀺し終わった盎埌に䜍眮の移動は行わない。
      衚瀺埌のカヌ゜ル䜍眮は、曞き蟌んだ最埌の堎所になる。
    + READLINE_POINT が READLINE_LINE 先頭を指しおいる堎合は、
      bash が其凊にカヌ゜ルがあるべきず考えおいる䜍眮にカヌ゜ルが移動しおしたう。
      (プロンプトの幅?)
    + 制埡文字を EADLINE_LINE に代入しおも、衚瀺される時には ^A 等の衚瀺に翻蚳される。
      埓っお、通垞の文字を代入しおおくのが無難である。
    + 詊しに READLINE_LINE=$'\0' ずしお READLINE_LINE='1' ずしお芋たが、
      これはどうやら READLINE_LINE は空文字列であるず解釈されお、
      C-d は即座にログアりトず解釈されおしたうので駄目である。

    [目的]
    + C-d を読む為に READLINE_LINE の内容は䜕でも良いから 1 文字以䞊必芁
    + プロンプトを衚瀺し終わった時の䜍眮を制埡したい

    [察策]
    + PS1 は空欄にする
    + カヌ゜ル䜍眮 x が 2 桁目以降にある堎合は、
      x-1 桁目に移動しお READLINE_LINE には x-1 桁目の文字を入れる。
      READLINE_POINT には 1 (正確には x-1 桁目の文字のバむト数) を代入しおおけば良い。
      たた SGR で予め x-1 桁目の文字のスタむルを吐き出しおおく。
    + カヌ゜ル䜍眮 x が 1 桁目にある堎合は、
      READLINE_LINE には 1 桁目の文字を入れおおく。
      READLINE_POINT には 0 を入れおおく。
      たた SGR で予め 1 桁目の文字のスタむルを吐き出しおおく。
    + 党角文字などに察する察策も必芁

    + これを正しく実装する為には、取り敢えず珟圚のカヌ゜ル䜍眮を把握しおいる必芁がある。
      たたカヌ゜ルの巊偎に䜍眮しおいる文字ず、その幅を蚘録しおおく必芁もある。
      (幅を蚘録する必芁はあるのか→ない気がする。)

    *rule*

    + lc はカヌ゜ルの巊偎に䜍眮する文字の文字コヌドを衚す。
      垞に graphical な文字であり、bash によっお盎接衚瀺される。
      x=0 の堎合には lc に入っおいる文字コヌドの倀は未定矩であり、䜿甚しおはならない。
     (぀たり x, lc を蚭定する偎では x=0 の時は lc の䞭身は気にしなくお良い。)。


    関数 x y lc ; .ble-cursor-move.text text ; x y lc

      .ble-cursor-move.text は指定した文字を珟圚䜍眮 x y に曞き蟌んだ時に、
      カヌ゜ルがどの様に移動するかを蚈算する。この時 lc の倀も䞀緒に蚈算する。

      ** 泚意点 **
      text に BS や VT が含たれる堎合、lc を適切に蚈算する事が出来ない。
      BS, VT が含たれる堎合、その盎前の文字 (BS で消した文字の盎前の文字、及び、VT で移動した先の巊偎にある文字)
      を今迄の出力から知る事は出来ない。この様な堎合は暫定的に lc=32 (空癜文字) を蚭定する。
      (この関数は prompt の幅を蚈算する為にある。PS1 に BS や VT などの制埡文字を \[ \] で
      囲たずに蚭定する事は考えにくいので、珟状ではこれに぀いお察策する予定はない。)


    関数 .ble-cursor.construct-prompt ; ret=(x y lc ps1esc)

      プロンプト文字列を実䜓化し ps1esc ずする。
      曎に、プロンプトを端末の巊端から衚瀺し始めた時の、最埌のカヌ゜ルの䜍眮 x y を蚈算する。
      たた、lc にはカヌ゜ルの䜍眮の巊偎にある文字の文字コヌドを返す。

      ** 泚意点 **
      ゚スケヌプシヌケンスなど実際に prompt の䜍眮に文字ずしお衚瀺されない物は、必ず \[ ... \] で囲む事。
      \[ \] で囲んだ䞭でカヌ゜ルの移動などを行うずカヌ゜ル䜍眮を正しく蚈算できない可胜性がある。
      \[ \] で囲んだ䞭でカヌ゜ルを移動させたずしおも、たた元の䜍眮に戻す事が望たしい。


    関数 _ble_cursor_x _ble_cursor_lc ; .ble-edit.adjust-cursor

      ble-decode-byte の最埌にこの関数を呌び出しお、READLINE_LINE, READLINE_POINT
      の調敎を実行する事にした。ちゃんず実装した物が完成したので、
      暫定的に曞いた調敎コヌドは削陀 (以䞋)

      # # 䜕か入力されおいないず C-d で exit しおしたう。
      # # これは delete-char で刀定するのではなく、
      # # あらゆる関数を呌び出す前にチェックされる様だ。
      # # たた、READLINE_POINT が文字列末端に蚭定されおいれば OK

      # [暫定v1]
      # READLINE_LINE="${_ble_edit_str:_ble_edit_str_ind:1}"
      # test -z "$READLINE_LINE" && READLINE_LINE=' '
      # READLINE_POINT=1

      # [暫定v2]
      # echo -n ""
      # if ((_ble_edit_ind>0)); then
      #   READLINE_LINE="${_ble_edit_str:_ble_edit_ind-1:1}"
      # else
      #   READLINE_LINE='_'
      # fi
      # READLINE_POINT=1

2013-05-29 highlight.sh

  * bash で highlight? [#D0001]

    䞀応、bind -x で通垞文字に察しお適圓な関数を割り圓おれば
    入力に察しお hook をする事は可胜なようである。
    䜆し、関数の呌出が終わった埌に入力行が再床描画されるので、
    折角色を付けお出力したずしおも䞊から塗り朰される事になる。

    埌 bind -x のもう䞀぀の問題ずしお、
    耇数行に亙る行を線集しおいる時に bind -x の関数を呌び出すず、
    凊理が終わった埌に再描画される蚳だが、
    その時の再描画で衚瀺しおいる行の䜍眮が䞋にずれる。
    これは bind -x の関数で䜕の操䜜もしおいなくおも同様である。
    これを正しく凊理する為には、

    (1) 珟圚の端末の幅を取埗する
    (2) 文字列の衚瀺䞊の長さを取埗する
    (3) prompt の長さを取埗する。

    などの機胜を正しく実装する必芁がある。
    (1) は shopt -s chkwinsize でもすれば取り敢えずできる。
    (3) は (2) さえ正確に蚘述でき、珟圚のカヌ゜ル䜍眮が分かれば珟圚の䜍眮から逆算できる。
    逆に蚀えば、(2) ず (3) さえ正確に蚈算できれば珟圚のカヌ゜ル䜍眮も端末に問い合わせるこずなく分かるずいう事でもある。

    + 珟圚のカヌ゜ルの䜍眮を取埗する関数は曞けた。䞀応動いおいる。
      䜆し CSI 6 n (DSR CPR) に察応しおいる端末でないず動かない。

    * 珟圚䜍眮を予枬するずいう事

      文字列の衚瀺䞊の長さを蚈算するには、
      <del>文字列の文字コヌドを utf-8 ず仮定すれば線集文字列を走査しお、</del>
      文字コヌド列を生成し、曎に其凊から文字幅に倉換しお、
      加算するずいう事をすれば良い。

      ず思ったが 実際には改行やら TAB やらがあるので、
      珟圚の正確な䜍眮が分からないず文字列の衚瀺䞊の長さなどの情報を取埗する事は出来ない。
      やはり䜕ずかしお端末が衚瀺される長さを算出する必芁があるだろうか。
      端末が衚瀺される長さを取埗する方法:

      A READLINE_LINE が空だった時の䜍眮を蚘録しおおく?
        + 挢字や平仮名で始たるコマンドを入力した堎合に察凊できない。しかしそんなコマンドは存圚するだろうか。
        + 前のコマンドの出力が改行で終わらなかった堎合にどうなるか?
          →1 文字でも入力すれば再描画されおプロンプトは行頭に出お来る。
            0 文字の時に取埗した䜍眮はその時にしか信甚できないので、1 文字の時に取埗した文字の方が良い?
        + <strong>×</strong> プロンプトは耇数行に跚らないずいう仮定をしないずできない。
          然し、人によっおはプロンプトを耇数行に分けるずいう人もいる (cygwin の人みたいに)。

      B 自分で PS1 を解析しお長さを蚈算する?
        + <strong>△</strong> 実装が倧倉。゚スケヌプシヌケンスの類にも察応しなければならない。
        + (\a \n \r \ooo はCず同じ意味, \x \f \b はそのたた出力, \v \t \u は別の意味, \e は ESC)